source: git/Singular/subexpr.cc @ 540e8c

fieker-DuValspielwiese
Last change on this file since 540e8c was 540e8c, checked in by Hans Schoenemann <hannes@…>, 8 years ago
opt: sleftv::CleanUp (do nothing for rtyp==IDHDL)
  • Property mode set to 100644
File size: 45.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT: handling of leftv
6*/
7
8#include <kernel/mod2.h>
9
10#include <omalloc/omalloc.h>
11
12#include <misc/intvec.h>
13#include <misc/options.h>
14
15#include <coeffs/numbers.h>
16#include <coeffs/bigintmat.h>
17
18#include <coeffs/ffields.h> // nfShowMipo // minpoly printing...
19
20#include <polys/monomials/maps.h>
21#include <polys/matpol.h>
22#include <polys/monomials/ring.h>
23
24// #include <coeffs/longrat.h>
25
26#include <kernel/polys.h>
27#include <kernel/ideals.h>
28#include <kernel/GBEngine/kstd1.h>
29#include <kernel/GBEngine/syz.h>
30#include <kernel/oswrapper/timer.h>
31
32#include <Singular/tok.h>
33#include <Singular/ipid.h>
34#include <Singular/ipshell.h>
35#include <Singular/lists.h>
36#include <Singular/attrib.h>
37#include <Singular/links/silink.h>
38#include <Singular/attrib.h>
39#include <Singular/subexpr.h>
40#include <Singular/blackbox.h>
41#include <Singular/number2.h>
42
43#include <stdlib.h>
44#include <stdio.h>
45#include <string.h>
46#include <ctype.h>
47#include <unistd.h>
48
49omBin sSubexpr_bin = omGetSpecBin(sizeof(_ssubexpr));
50omBin sleftv_bin = omGetSpecBin(sizeof(sleftv));
51omBin procinfo_bin = omGetSpecBin(sizeof(procinfo));
52omBin libstack_bin = omGetSpecBin(sizeof(libstack));
53static omBin size_two_bin = omGetSpecBin(2);
54
55sleftv     sLastPrinted;
56const char sNoName[]="_";
57#ifdef SIQ
58BOOLEAN siq=FALSE;
59#endif
60
61int sleftv::listLength()
62{
63  int n = 1;
64  leftv sl = next;
65  while (sl!=NULL)
66  {
67    n++;
68    sl=sl->next;
69  }
70  return n;
71}
72
73void sleftv::Print(leftv store, int spaces)
74{
75  int  t=Typ();
76  if (errorreported) return;
77#ifdef SIQ
78  if (rtyp==COMMAND)
79  {
80    command c=(command)data;
81    char ch[2];
82    ch[0]=c->op;ch[1]='\0';
83    const char *s=ch;
84    if (c->op>127) s=iiTwoOps(c->op);
85    ::Print("##command %d(%s), %d args\n",
86      c->op, s, c->argc);
87    if (c->argc>0)
88      c->arg1.Print(NULL,spaces+2);
89    if(c->argc<4)
90    {
91      if (c->argc>1)
92        c->arg2.Print(NULL,spaces+2);
93      if (c->argc>2)
94        c->arg3.Print(NULL,spaces+2);
95    }
96    PrintS("##end");
97  }
98  else
99#endif
100  {
101    const char *n=Name();
102    char *s;
103    void *d=Data();
104    if (errorreported) return;
105
106    switch (t /*=Typ()*/)
107      {
108#ifdef SINGULAR_4_1
109        case CRING_CMD:
110          crPrint((coeffs)d);
111          break;
112        case CNUMBER_CMD:
113          n2Print((number2)d);
114          break;
115        case CMATRIX_CMD: // like BIGINTMAT
116#endif
117        case BIGINTMAT_CMD:
118          ((bigintmat *)d)->pprint(80);
119          break;
120        case UNKNOWN:
121        case DEF_CMD:
122          PrintNSpaces(spaces);
123          PrintS("`");PrintS(n);PrintS("`");
124          break;
125        case PACKAGE_CMD:
126          PrintNSpaces(spaces);
127          paPrint(n,(package)d);
128          break;
129        case NONE:
130          return;
131        case INTVEC_CMD:
132        case INTMAT_CMD:
133          ((intvec *)d)->show(t,spaces);
134          break;
135        case RING_CMD:
136        case QRING_CMD:
137        {
138          PrintNSpaces(spaces);
139          const ring r = (const ring)d;
140          rWrite(r, currRing == r);
141          break;
142        }
143        case MATRIX_CMD:
144          iiWriteMatrix((matrix)d,n,2, currRing, spaces);
145          break;
146        case MODUL_CMD:
147        case IDEAL_CMD:
148          if ((TEST_V_QRING)  &&(currRing->qideal!=NULL)
149          &&(!hasFlag(this,FLAG_QRING)))
150          {
151            jjNormalizeQRingId(this);
152            d=Data();
153          }
154          // no break:
155        case MAP_CMD:
156          iiWriteMatrix((matrix)d,n,1, currRing, spaces);
157          break;
158        case POLY_CMD:
159        case VECTOR_CMD:
160          if ((e==NULL)
161          && (TEST_V_QRING)
162          &&(currRing->qideal!=NULL)
163          &&(!hasFlag(this,FLAG_QRING)))
164          {
165            setFlag(this,FLAG_QRING);
166            poly p=(poly)d;
167            jjNormalizeQRingP(p);
168            if (p!=(poly)d)
169            {
170              d=(void*)p;
171              if ((rtyp==POLY_CMD)||(rtyp==VECTOR_CMD)) data=d;
172              else if (rtyp==IDHDL)
173              {
174                idhdl h=(idhdl)data;
175                IDPOLY(h)=p;
176                setFlag(h,FLAG_QRING);
177              }
178            }
179          }
180          PrintNSpaces(spaces);
181          pWrite0((poly)d);
182          break;
183        case RESOLUTION_CMD:
184        {
185          syStrategy tmp=(syStrategy)d;
186          syPrint(tmp,IDID(currRingHdl));
187          break;
188        }
189        case STRING_CMD:
190          PrintNSpaces(spaces);
191          PrintS((char *)d);
192          break;
193       case INT_CMD:
194          PrintNSpaces(spaces);
195          ::Print("%d",(int)(long)d);
196          break;
197       case PROC_CMD:
198         {
199           procinfov pi=(procinfov)d;
200
201           PrintNSpaces(spaces);
202           PrintS("// libname  : ");
203           PrintS(piProcinfo(pi, "libname"));
204           PrintLn();
205
206           PrintNSpaces(spaces);
207           PrintS("// procname : ");
208           PrintS(piProcinfo(pi, "procname"));
209           PrintLn();
210
211           PrintNSpaces(spaces);
212           PrintS("// type     : ");
213           PrintS(piProcinfo(pi, "type"));
214           //           ::Print("%-*.*s// ref      : %s",spaces,spaces," ",
215           //   piProcinfo(pi, "ref"));
216           break;
217         }
218       case LINK_CMD:
219          {
220            si_link l=(si_link)d;
221            PrintNSpaces(spaces);
222            ::Print("// type : %s\n", slStatus(l, "type"));
223            PrintNSpaces(spaces);
224            ::Print("// mode : %s\n", slStatus(l, "mode"));
225            PrintNSpaces(spaces);
226            ::Print("// name : %s\n", slStatus(l, "name"));
227            PrintNSpaces(spaces);
228            ::Print("// open : %s\n", slStatus(l, "open"));
229            PrintNSpaces(spaces);
230            ::Print("// read : %s\n", slStatus(l, "read"));
231            PrintNSpaces(spaces);
232            ::Print("// write: %s", slStatus(l, "write"));
233          break;
234          }
235        case NUMBER_CMD:
236        case BIGINT_CMD:
237          if (t==NUMBER_CMD)
238          {
239            number n=(number)d;
240            nNormalize(n);
241            d=n;
242          }
243          s=String(d);
244          if (s==NULL) return;
245          PrintNSpaces(spaces);
246          PrintS(s);
247          omFree((ADDRESS)s);
248          break;
249        case LIST_CMD:
250        {
251          lists l=(lists)d;
252          if (lSize(l)<0)
253          {
254             PrintNSpaces(spaces);
255             PrintS("empty list\n");
256          }
257          else
258          {
259            int i=0;
260            for (;i<=l->nr;i++)
261            {
262              if (l->m[i].rtyp!=DEF_CMD)
263              {
264                PrintNSpaces(spaces);
265                ::Print("[%d]:\n",i+1);
266                l->m[i].Print(NULL,spaces+3);
267              }
268            }
269          }
270          break;
271        }
272
273        default:
274          if (t>MAX_TOK)
275          {
276            blackbox * bb=getBlackboxStuff(t);
277            PrintNSpaces(spaces);
278            if (bb!=NULL) { bb->blackbox_Print(bb,d); }
279            else          { ::Print("Print: blackbox %d(bb=NULL)",t); }
280          }
281          else
282          ::Print("Print:unknown type %s(%d)", Tok2Cmdname(t),t);
283      } /* end switch: (Typ()) */
284    if ((store!=NULL)&&(store!=this))
285      store->CleanUp();
286  }
287  if (next!=NULL)
288  {
289    if (t==COMMAND) PrintLn();
290    else if (t!=LIST_CMD) PrintS(" ");
291    next->Print(NULL,spaces);
292  }
293  else if (t!=LIST_CMD)
294  {
295    PrintLn();
296  }
297#ifdef SIQ
298  if (rtyp!=COMMAND)
299#endif
300  {
301    if ((store!=NULL)
302    && (store!=this))
303    {
304      if((t/*Typ()*/!=LINK_CMD)
305      && (t/*Typ()*/!=PACKAGE_CMD)
306      && (t/*Typ()*/!=DEF_CMD)
307      )
308      {
309        store->rtyp=t/*Typ()*/;
310        store->data=CopyD();
311        if(attribute!=NULL)
312        {
313          store->attribute=CopyA();
314        }
315        store->flag=flag;
316      }
317    }
318  }
319}
320
321void sleftv::CleanUp(ring r)
322{
323  if (rtyp!=IDHDL)
324  {
325    if ((name!=NULL) && (name!=sNoName) && (rtyp!=ALIAS_CMD))
326    {
327      //::Print("free %x (%s)\n",name,name);
328      omFree((ADDRESS)name);
329    }
330    //name=NULL;
331    //flag=0;
332    if (data!=NULL)
333    {
334      //if (rtyp==IDHDL) attribute=NULL; // is only a pointer to attribute of id
335      s_internalDelete(rtyp,data,r);
336      //data=NULL; // will be done by Init() at the end
337    }
338    if (attribute!=NULL)
339    {
340      switch (rtyp)
341      {
342        case PACKAGE_CMD:
343        //case IDHDL:
344        case ANY_TYPE:
345        case VECHO:
346        case VPRINTLEVEL:
347        case VCOLMAX:
348        case VTIMER:
349        case VRTIMER:
350        case VOICE:
351        case VMAXDEG:
352        case VMAXMULT:
353        case TRACE:
354        case VSHORTOUT:
355        case VNOETHER:
356        case VMINPOLY:
357        case LIB_CMD:
358        case 0:
359          //attribute=NULL; // will be done by Init() at the end
360          break;
361        default:
362        {
363          attribute->killAll(r);
364        }
365      }
366    }
367  }
368  Subexpr h;
369  while (e!=NULL)
370  {
371    h=e->next;
372    omFreeBin((ADDRESS)e, sSubexpr_bin);
373    e=h;
374  }
375  //rtyp=NONE; // will be done by Init() at the end
376  if (next!=NULL)
377  {
378    leftv tmp_n;
379    do
380    {
381      tmp_n=next->next;
382      //next->name=NULL;
383      next->next=NULL;
384      next->CleanUp(r);
385      omFreeBin((ADDRESS)next, sleftv_bin);
386      next=tmp_n;
387    } while (next!=NULL);
388  }
389  Init();
390}
391
392BOOLEAN sleftv::RingDependend()
393{
394  int rt=Typ();
395  if(::RingDependend(rt) && (rt!=QRING_CMD))
396    return TRUE;
397  if (rt==LIST_CMD)
398    return lRingDependend((lists)Data());
399  if (this->next!=NULL)
400    return this->next->RingDependend();
401  return FALSE;
402}
403
404static inline void * s_internalCopy(const int t,  void *d)
405{
406  switch (t)
407  {
408#ifdef SINGULAR_4_1
409    case CRING_CMD:
410      {
411        coeffs cf=(coeffs)d;
412        cf->ref++;
413        return (void*)d;
414      }
415    case CNUMBER_CMD:
416      return (void*)n2Copy((number2)d);
417    case CMATRIX_CMD: // like BIGINTMAT
418#endif
419    case BIGINTMAT_CMD:
420      return (void*)bimCopy((bigintmat *)d);
421    case INTVEC_CMD:
422    case INTMAT_CMD:
423      return (void *)ivCopy((intvec *)d);
424    case MATRIX_CMD:
425      return (void *)mp_Copy((matrix)d, currRing);
426    case IDEAL_CMD:
427    case MODUL_CMD:
428      return  (void *)idCopy((ideal)d);
429    case STRING_CMD:
430        return (void *)omStrDup((char *)d);
431    case PACKAGE_CMD:
432      return  (void *)paCopy((package) d);
433    case PROC_CMD:
434      return  (void *)piCopy((procinfov) d);
435    case POLY_CMD:
436    case VECTOR_CMD:
437      return  (void *)pCopy((poly)d);
438    case INT_CMD:
439      return  d;
440    case NUMBER_CMD:
441      return  (void *)nCopy((number)d);
442    case BIGINT_CMD:
443      return  (void *)n_Copy((number)d, coeffs_BIGINT);
444    case MAP_CMD:
445      return  (void *)maCopy((map)d, currRing);
446    case LIST_CMD:
447      return  (void *)lCopy((lists)d);
448    case LINK_CMD:
449      return (void *)slCopy((si_link) d);
450    case RING_CMD:
451    case QRING_CMD:
452      {
453        ring r=(ring)d;
454        if (r!=NULL)
455        {
456          r->ref++;
457          //Print("s_internalCopy:+  ring %d, ref %d\n",r,r->ref);
458        }
459        return d;
460      }
461    case RESOLUTION_CMD:
462      return (void*)syCopy((syStrategy)d);
463    case DEF_CMD:
464    case NONE:
465    case 0: /* type in error case */
466      break; /* error recovery: do nothing */
467    //case COMMAND:
468    default:
469    {
470      if (t>MAX_TOK)
471      {
472        blackbox *b=getBlackboxStuff(t);
473        if (b!=NULL) return b->blackbox_Copy(b,d);
474        return NULL;
475      }
476      else
477      Warn("s_internalCopy: cannot copy type %s(%d)",
478            Tok2Cmdname(t),t);
479    }
480  }
481  return NULL;
482}
483
484void s_internalDelete(const int t,  void *d, const ring r)
485{
486  assume(d!=NULL);
487  switch (t)
488  {
489#ifdef SINGULAR_4_1
490    case CRING_CMD:
491      nKillChar((coeffs)d);
492      break;
493    case CNUMBER_CMD:
494      {
495        number2 n=(number2)d;
496        n2Delete(n);
497        break;
498      }
499    case CMATRIX_CMD: //like BIGINTMAT
500#endif
501    case BIGINTMAT_CMD:
502    {
503      bigintmat *v=(bigintmat*)d;
504      delete v;
505      break;
506    }
507    case INTVEC_CMD:
508    case INTMAT_CMD:
509    {
510      intvec *v=(intvec*)d;
511      delete v;
512      break;
513    }
514    case MAP_CMD:
515    {
516      map m=(map)d;
517      omFreeBinAddr((ADDRESS)m->preimage);
518      m->preimage=NULL;
519      /* no break: continue as IDEAL*/
520    }
521    case MATRIX_CMD:
522    case IDEAL_CMD:
523    case MODUL_CMD:
524    {
525      ideal i=(ideal)d;
526      id_Delete(&i,r);
527      break;
528    }
529    case STRING_CMD:
530      omFree(d);
531      break;
532    //case PACKAGE_CMD:
533    //  return  (void *)paCopy((package) d);
534    case PROC_CMD:
535      piKill((procinfo*)d);
536      break;
537    case POLY_CMD:
538    case VECTOR_CMD:
539    {
540      poly p=(poly)d;
541      p_Delete(&p,r);
542      break;
543    }
544    case NUMBER_CMD:
545    {
546      number n=(number)d;
547      n_Delete(&n,r);
548      break;
549    }
550    case BIGINT_CMD:
551    {
552      number n=(number)d;
553      n_Delete(&n,coeffs_BIGINT);
554      break;
555    }
556    case LIST_CMD:
557    {
558      lists l=(lists)d;
559      l->Clean(r);
560      break;
561    }
562    case LINK_CMD:
563    {
564      si_link l=(si_link)d;
565      slKill(l);
566      break;
567    }
568    case RING_CMD:
569    case QRING_CMD:
570    {
571      ring R=(ring)d;
572      if ((R!=currRing)||(R->ref>=0))
573        rKill(R);
574      #ifdef TEST
575      else
576        Print("currRing? ref=%d\n",R->ref);
577      #endif
578      break;
579    }
580    case RESOLUTION_CMD:
581    {
582      syStrategy s=(syStrategy)d;
583      if (s!=NULL) syKillComputation(s,r);
584      break;
585    }
586    case COMMAND:
587    {
588     command cmd=(command)d;
589     if (cmd->arg1.rtyp!=0) cmd->arg1.CleanUp(r);
590     if (cmd->arg2.rtyp!=0) cmd->arg2.CleanUp(r);
591     if (cmd->arg3.rtyp!=0) cmd->arg3.CleanUp(r);
592     omFreeBin((ADDRESS)d, sip_command_bin);
593     break;
594    }
595    case INT_CMD:
596    case DEF_CMD:
597    case ALIAS_CMD:
598    case PACKAGE_CMD:
599    case IDHDL:
600    case NONE:
601    case ANY_TYPE:
602    case VECHO:
603    case VPRINTLEVEL:
604    case VCOLMAX:
605    case VTIMER:
606    case VRTIMER:
607    case VOICE:
608    case VMAXDEG:
609    case VMAXMULT:
610    case TRACE:
611    case VSHORTOUT:
612    case VNOETHER:
613    case VMINPOLY:
614    case LIB_CMD:
615    case 0: /* type in error case */
616      break; /* error recovery: do nothing */
617    //case COMMAND:
618    //case COMMAND:
619    default:
620    {
621      if (t>MAX_TOK)
622      {
623        blackbox *b=getBlackboxStuff(t);
624        if (b!=NULL) b->blackbox_destroy(b,d);
625        break;
626      }
627      else
628      Warn("s_internalDelete: cannot delete type %s(%d)",
629            Tok2Cmdname(t),t);
630    }
631  }
632}
633
634void * slInternalCopy(leftv source, const int t, void *d, Subexpr e)
635{
636  if (t==STRING_CMD)
637  {
638      if ((e==NULL)
639      || (source->rtyp==LIST_CMD)
640      || ((source->rtyp==IDHDL)
641          &&((IDTYP((idhdl)source->data)==LIST_CMD)
642            || (IDTYP((idhdl)source->data)>MAX_TOK)))
643      || (source->rtyp>MAX_TOK))
644        return (void *)omStrDup((char *)d);
645      else if (e->next==NULL)
646      {
647        char *s=(char*)omAllocBin(size_two_bin);
648        s[0]=*(char *)d;
649        s[1]='\0';
650        return s;
651      }
652      #ifdef TEST
653      else
654      {
655        Werror("not impl. string-op in `%s`",my_yylinebuf);
656        return NULL;
657      }
658      #endif
659  }
660  return s_internalCopy(t,d);
661}
662
663void sleftv::Copy(leftv source)
664{
665  Init();
666  rtyp=source->Typ();
667  void *d=source->Data();
668  if(!errorreported)
669  {
670    data=s_internalCopy(rtyp,d);
671    if ((source->attribute!=NULL)||(source->e!=NULL))
672      attribute=source->CopyA();
673    flag=source->flag;
674    if (source->next!=NULL)
675    {
676      next=(leftv)omAllocBin(sleftv_bin);
677      next->Copy(source->next);
678    }
679  }
680}
681
682void * sleftv::CopyD(int t)
683{
684  if ((rtyp!=IDHDL)&&(rtyp!=ALIAS_CMD)&&(e==NULL))
685  {
686    if (iiCheckRing(t)) return NULL;
687    void *x = data;
688    if (rtyp==VNOETHER) x = (void *)pCopy((currRing->ppNoether));
689    else if ((rtyp==VMINPOLY) && nCoeff_is_algExt(currRing->cf) && (!nCoeff_is_GF(currRing->cf)))
690    {
691      const ring A = currRing->cf->extRing;
692
693      assume( A != NULL );
694      assume( A->qideal != NULL );
695
696      x=(void *)p_Copy(A->qideal->m[0], A);
697    }
698    data=NULL;
699    return x;
700  }
701  void *d=Data(); // will also do a iiCheckRing
702  if ((!errorreported) && (d!=NULL)) return slInternalCopy(this,t,d,e);
703  return NULL;
704}
705
706//void * sleftv::CopyD()
707//{
708  //if ((rtyp!=IDHDL)&&(e==NULL)
709  //&&(rtyp!=VNOETHER)&&(rtyp!=LIB_CMD)&&(rtyp!=VMINPOLY))
710  //{
711  //  void *x=data;
712  //  data=NULL;
713  //  return x;
714  //}
715//  return CopyD(Typ());
716//}
717
718attr sleftv::CopyA()
719{
720  attr *a=Attribute();
721  if ((a!=NULL) && (*a!=NULL))
722    return (*a)->Copy();
723  return NULL;
724}
725
726char *  sleftv::String(void *d, BOOLEAN typed, int dim)
727{
728#ifdef SIQ
729  if (rtyp==COMMAND)
730  {
731    ::Print("##command %d\n",((command)data)->op);
732    if (((command)data)->arg1.rtyp!=0)
733      ((command)data)->arg1.Print(NULL,2);
734    if (((command)data)->arg2.rtyp!=0)
735      ((command)data)->arg2.Print(NULL,2);
736    if (((command)data)->arg3.rtyp==0)
737      ((command)data)->arg3.Print(NULL,2);
738    PrintS("##end\n");
739    return omStrDup("");
740  }
741#endif
742  if (d==NULL) d=Data();
743  if (!errorreported)
744  {
745    char *s;
746    int t=Typ();
747    switch (t /*Typ()*/)
748    {
749        case INT_CMD:
750          if (typed)
751          {
752            s=(char *)omAlloc(MAX_INT_LEN+7);
753            sprintf(s,"int(%d)",(int)(long)d);
754          }
755          else
756          {
757            s=(char *)omAlloc(MAX_INT_LEN+2);
758            sprintf(s,"%d",(int)(long)d);
759          }
760          return s;
761
762        case STRING_CMD:
763          if (d == NULL)
764          {
765            if (typed) return omStrDup("\"\"");
766            return omStrDup("");
767          }
768          if (typed)
769          {
770            s = (char*) omAlloc(strlen((char*) d) + 3);
771            sprintf(s,"\"%s\"", (char*) d);
772            return s;
773          }
774          else
775          {
776            return omStrDup((char*)d);
777          }
778
779        case POLY_CMD:
780        case VECTOR_CMD:
781          if (typed)
782          {
783            char* ps = pString((poly) d);
784            s = (char*) omAlloc(strlen(ps) + 10);
785            sprintf(s,"%s(%s)", (t /*Typ()*/ == POLY_CMD ? "poly" : "vector"), ps);
786            omFree(ps);
787            return s;
788          }
789          else
790            return pString((poly)d);
791
792        #ifdef SINGULAR_4_1
793        case CNUMBER_CMD:
794          return n2String((number2)d,typed);
795        case CRING_CMD:
796          return nCoeffString((coeffs)d);
797        case CMATRIX_CMD:
798          {
799            bigintmat *b=(bigintmat*)d;
800            return b->String();
801          }
802        #endif
803
804        case NUMBER_CMD:
805          StringSetS((char*) (typed ? "number(" : ""));
806          if ((rtyp==IDHDL)&&(IDTYP((idhdl)data)==NUMBER_CMD))
807          {
808            nWrite(IDNUMBER((idhdl)data));
809          }
810          else if (rtyp==NUMBER_CMD)
811          {
812            number n=(number)data;
813            nWrite(n);
814            data=(char *)n;
815          }
816          else if((rtyp==VMINPOLY)&&(rField_is_GF(currRing)))
817          {
818            nfShowMipo(currRing->cf);
819          }
820          else
821          {
822            number n=nCopy((number)d);
823            nWrite(n);
824            nDelete(&n);
825          }
826          StringAppendS((char*) (typed ? ")" : ""));
827          return StringEndS();
828
829        case BIGINT_CMD:
830          {
831          StringSetS((char*) (typed ? "bigint(" : ""));
832          number nl=(number)d;
833          n_Write(nl,coeffs_BIGINT);
834          StringAppendS((char*) (typed ? ")" : ""));
835          return StringEndS();
836          }
837
838        case MATRIX_CMD:
839          s= iiStringMatrix((matrix)d,dim, currRing);
840          if (typed)
841          {
842            char* ns = (char*) omAlloc(strlen(s) + 40);
843            sprintf(ns, "matrix(ideal(%s),%d,%d)", s,
844                    ((ideal) d)->nrows, ((ideal) d)->ncols);
845            omCheckAddr(ns);
846            return ns;
847          }
848          else
849          {
850            return omStrDup(s);
851          }
852
853        case MODUL_CMD:
854        case IDEAL_CMD:
855        case MAP_CMD:
856          s= iiStringMatrix((matrix)d,dim, currRing);
857          if (typed)
858          {
859            char* ns = (char*) omAlloc(strlen(s) + 10);
860            sprintf(ns, "%s(%s)", (t/*Typ()*/==MODUL_CMD ? "module" : "ideal"), s);
861            omCheckAddr(ns);
862            return ns;
863          }
864          return omStrDup(s);
865
866        case INTVEC_CMD:
867        case INTMAT_CMD:
868        {
869          intvec *v=(intvec *)d;
870          s = v->String(dim);
871          if (typed)
872          {
873            char* ns;
874            if (t/*Typ()*/ == INTMAT_CMD)
875            {
876              ns = (char*) omAlloc(strlen(s) + 40);
877              sprintf(ns, "intmat(intvec(%s),%d,%d)", s, v->rows(), v->cols());
878            }
879            else
880            {
881              ns = (char*) omAlloc(strlen(s) + 10);
882              sprintf(ns, "intvec(%s)", s);
883            }
884            omCheckAddr(ns);
885            omFree(s);
886            return ns;
887          }
888          else
889            return s;
890        }
891        case BIGINTMAT_CMD:
892        {
893          bigintmat *bim=(bigintmat*)d;
894          s = bim->String();
895          if (typed)
896          {
897            char* ns = (char*) omAlloc0(strlen(s) + 40);
898            sprintf(ns, "bigintmat(bigintvec(%s),%d,%d)", s, bim->rows(), bim->cols());
899            omCheckAddr(ns);
900            return ns;
901          }
902          else
903            return omStrDup(s);
904        }
905
906        case RING_CMD:
907        case QRING_CMD:
908          s  = rString((ring)d);
909
910          if (typed)
911          {
912            char* ns;
913            if (t/*Typ()*/ == QRING_CMD)
914            {
915              char* id = iiStringMatrix((matrix) ((ring) d)->qideal, dim,
916                              currRing);
917              ns = (char*) omAlloc(strlen(s) + strlen(id) + 20);
918              sprintf(ns, "\"%s\";%sideal(%s)", s,(dim == 2 ? "\n" : " "), id);
919            }
920            else
921            {
922              ns = (char*) omAlloc(strlen(s) + 4);
923              sprintf(ns, "\"%s\"", s);
924            }
925            omFree(s);
926            omCheckAddr(ns);
927            return ns;
928          }
929          return s;
930        case RESOLUTION_CMD:
931        {
932          lists l = syConvRes((syStrategy)d);
933          s = lString(l, typed, dim);
934          l->Clean();
935          return s;
936        }
937
938        case PROC_CMD:
939        {
940          procinfo* pi = (procinfo*) d;
941          if((pi->language == LANG_SINGULAR) && (pi->data.s.body!=NULL))
942            s = (pi->data.s.body);
943          else
944            s = (char *)"";
945          if (typed)
946          {
947            char* ns = (char*) omAlloc(strlen(s) + 4);
948            sprintf(ns, "\"%s\"", s);
949            omCheckAddr(ns);
950            return ns;
951          }
952          return omStrDup(s);
953        }
954
955        case LINK_CMD:
956          s = slString((si_link) d);
957          if (typed)
958          {
959            char* ns = (char*) omAlloc(strlen(s) + 10);
960            sprintf(ns, "link(\"%s\")", s);
961            omFreeBinAddr(s);
962            omCheckAddr(ns);
963            return ns;
964          }
965          return s;
966
967        case LIST_CMD:
968          return lString((lists) d, typed, dim);
969
970        default:
971          if(t> MAX_TOK)
972          {
973            blackbox *bb=getBlackboxStuff(t);
974            if (bb!=NULL) return bb->blackbox_String(bb,d);
975          }
976    } /* end switch: (Typ()) */
977  }
978  return omStrDup("");
979}
980
981
982int  sleftv::Typ()
983{
984  if (e==NULL)
985  {
986    switch (rtyp)
987    {
988      case IDHDL:
989        return IDTYP((idhdl)data);
990      case ALIAS_CMD:
991         {
992           idhdl h=(idhdl)data;
993           return  ((idhdl)h->data.ustring)->typ;
994         }
995      case VECHO:
996      case VPRINTLEVEL:
997      case VCOLMAX:
998      case VTIMER:
999      case VRTIMER:
1000      case VOICE:
1001      case VMAXDEG:
1002      case VMAXMULT:
1003      case TRACE:
1004      case VSHORTOUT:
1005        return INT_CMD;
1006      case VMINPOLY:
1007        data=NULL;
1008        return NUMBER_CMD;
1009      case VNOETHER:
1010        data=NULL;
1011        return POLY_CMD;
1012      //case COMMAND:
1013      //  return COMMAND;
1014      default:
1015        return rtyp;
1016    }
1017  }
1018  int r=0;
1019  int t=rtyp;
1020  void *d=data;
1021  if (t==IDHDL) t=IDTYP((idhdl)d);
1022  else if (t==ALIAS_CMD)
1023  { idhdl h=(idhdl)IDDATA((idhdl)data); t=IDTYP(h);d=IDDATA(h); }
1024  switch (t)
1025  {
1026#ifdef SINGULAR_4_1
1027    case CMATRIX_CMD:
1028    {
1029      bigintmat *b=(bigintmat*)d;
1030      if ((currRing!=NULL)&&(currRing->cf==b->basecoeffs()))
1031        return NUMBER_CMD;
1032      else
1033        return CNUMBER_CMD;
1034    }
1035#endif
1036    case INTVEC_CMD:
1037    case INTMAT_CMD:
1038      r=INT_CMD;
1039      break;
1040    case BIGINTMAT_CMD:
1041      r=BIGINT_CMD;
1042      break;
1043    case IDEAL_CMD:
1044    case MATRIX_CMD:
1045    case MAP_CMD:
1046      r=POLY_CMD;
1047      break;
1048    case MODUL_CMD:
1049      r=VECTOR_CMD;
1050      break;
1051    case STRING_CMD:
1052      r=STRING_CMD;
1053      break;
1054    default:
1055    {
1056      blackbox *b=NULL;
1057      if (t>MAX_TOK)
1058      {
1059        b=getBlackboxStuff(t);
1060      }
1061      if ((t==LIST_CMD)||((b!=NULL)&&BB_LIKE_LIST(b)))
1062      {
1063        lists l;
1064        if (rtyp==IDHDL) l=IDLIST((idhdl)d);
1065        else             l=(lists)d;
1066        if ((0<e->start)&&(e->start<=l->nr+1))
1067        {
1068          Subexpr tmp=l->m[e->start-1].e;
1069          l->m[e->start-1].e=e->next;
1070          r=l->m[e->start-1].Typ();
1071          e->next=l->m[e->start-1].e;
1072          l->m[e->start-1].e=tmp;
1073        }
1074        else
1075        {
1076          //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
1077          r=DEF_CMD;
1078        }
1079      }
1080      else
1081        Werror("cannot index type %s(%d)",Tok2Cmdname(t),t);
1082      break;
1083    }
1084  }
1085  return r;
1086}
1087
1088int  sleftv::LTyp()
1089{
1090  lists l=NULL;
1091  int r;
1092  if (rtyp==LIST_CMD)
1093    l=(lists)data;
1094  else if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1095    l=IDLIST((idhdl)data);
1096  else
1097    return Typ();
1098  //if (l!=NULL)
1099  {
1100    if ((e!=NULL) && (e->next!=NULL))
1101    {
1102      if ((0<e->start)&&(e->start<=l->nr+1))
1103      {
1104        l->m[e->start-1].e=e->next;
1105        r=l->m[e->start-1].LTyp();
1106        l->m[e->start-1].e=NULL;
1107      }
1108      else
1109      {
1110        //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
1111        r=NONE;
1112      }
1113      return r;
1114    }
1115    return LIST_CMD;
1116  }
1117  return Typ();
1118}
1119
1120#ifdef SINGULAR_4_1
1121static snumber2 iiNumber2Data[4];
1122static int iiCmatrix_index=0;
1123#endif
1124void * sleftv::Data()
1125{
1126  if ((rtyp!=IDHDL) && iiCheckRing(rtyp))
1127     return NULL;
1128  if (e==NULL)
1129  {
1130    switch (rtyp)
1131    {
1132      case ALIAS_CMD:
1133      {
1134        idhdl h=(idhdl)data;
1135        return  ((idhdl)h->data.ustring)->data.ustring;
1136      }
1137      case VECHO:      return (void *)(long)si_echo;
1138      case VPRINTLEVEL:return (void *)(long)printlevel;
1139      case VCOLMAX:    return (void *)(long)colmax;
1140      case VTIMER:     return (void *)(long)getTimer();
1141      case VRTIMER:    return (void *)(long)getRTimer();
1142      case VOICE:      return (void *)(long)(myynest+1);
1143      case VMAXDEG:    return (void *)(long)Kstd1_deg;
1144      case VMAXMULT:   return (void *)(long)Kstd1_mu;
1145      case TRACE:      return (void *)(long)traceit;
1146      case VSHORTOUT:  return (void *)(long)(currRing != NULL ? currRing->ShortOut : 0);
1147      case VMINPOLY:
1148        if ( (currRing != NULL)  && nCoeff_is_algExt(currRing->cf) && !nCoeff_is_GF(currRing->cf))
1149        {
1150          /* Q(a), Fp(a), but not GF(q) */
1151          const ring A = currRing->cf->extRing;
1152
1153          assume( A != NULL );
1154          assume( A->qideal != NULL );
1155
1156          return (void *)A->qideal->m[0];
1157        }
1158        else
1159          return (void *)currRing->cf->nNULL;
1160
1161      case VNOETHER:   return (void *) (currRing->ppNoether);
1162      case IDHDL:
1163        return IDDATA((idhdl)data);
1164      case COMMAND:
1165        //return NULL;
1166      default:
1167        return data;
1168    }
1169  }
1170  /* e != NULL : */
1171  int t=rtyp;
1172  void *d=data;
1173  if (t==IDHDL)
1174  {
1175    t=((idhdl)data)->typ;
1176    d=IDDATA((idhdl)data);
1177  }
1178  else if (t==ALIAS_CMD)
1179  {
1180    idhdl h=(idhdl)IDDATA((idhdl)data);
1181    t=IDTYP(h);
1182    d=IDDATA(h);
1183  }
1184  if (iiCheckRing(t))
1185    return NULL;
1186  char *r=NULL;
1187  int index=e->start;
1188  switch (t)
1189  {
1190    case INTVEC_CMD:
1191    {
1192      intvec *iv=(intvec *)d;
1193      if ((index<1)||(index>iv->length()))
1194      {
1195        if (!errorreported)
1196          Werror("wrong range[%d] in intvec %s(%d)",index,this->Name(),iv->length());
1197      }
1198      else
1199        r=(char *)(long)((*iv)[index-1]);
1200      break;
1201    }
1202    case INTMAT_CMD:
1203    {
1204      intvec *iv=(intvec *)d;
1205      if ((index<1)
1206         ||(index>iv->rows())
1207         ||(e->next->start<1)
1208         ||(e->next->start>iv->cols()))
1209      {
1210        if (!errorreported)
1211        Werror("wrong range[%d,%d] in intmat %s(%dx%d)",index,e->next->start,
1212                                           this->Name(),iv->rows(),iv->cols());
1213      }
1214      else
1215        r=(char *)(long)(IMATELEM((*iv),index,e->next->start));
1216      break;
1217    }
1218    case BIGINTMAT_CMD:
1219    {
1220      bigintmat *m=(bigintmat *)d;
1221      if ((index<1)
1222         ||(index>m->rows())
1223         ||(e->next->start<1)
1224         ||(e->next->start>m->cols()))
1225      {
1226        if (!errorreported)
1227        Werror("wrong range[%d,%d] in bigintmat %s(%dx%d)",index,e->next->start,
1228                                                     this->Name(),m->rows(),m->cols());
1229      }
1230      else
1231        r=(char *)(BIMATELEM((*m),index,e->next->start));
1232      break;
1233    }
1234#ifdef SINGULAR_4_1
1235    case CMATRIX_CMD:
1236    {
1237      bigintmat *m=(bigintmat *)d;
1238      if ((index<1)
1239         ||(index>m->rows())
1240         ||(e->next->start<1)
1241         ||(e->next->start>m->cols()))
1242      {
1243        if (!errorreported)
1244        Werror("wrong range[%d,%d] in matrix %s(%dx%d)",index,e->next->start,
1245                                                     this->Name(),m->rows(),m->cols());
1246      }
1247      else
1248      {
1249        iiNumber2Data[iiCmatrix_index].cf=m->basecoeffs();
1250        iiNumber2Data[iiCmatrix_index].n=BIMATELEM((*m),index,e->next->start);
1251        r=(char*)&iiNumber2Data[iiCmatrix_index];
1252        iiCmatrix_index=(iiCmatrix_index+1) % 4;
1253      }
1254      break;
1255    }
1256#endif
1257    case IDEAL_CMD:
1258    case MODUL_CMD:
1259    case MAP_CMD:
1260    {
1261      ideal I=(ideal)d;
1262      if ((index<1)||(index>IDELEMS(I)))
1263      {
1264        if (!errorreported)
1265          Werror("wrong range[%d] in ideal/module %s(%d)",index,this->Name(),IDELEMS(I));
1266      }
1267      else
1268        r=(char *)I->m[index-1];
1269      break;
1270    }
1271    case STRING_CMD:
1272    {
1273      // this was a memory leak
1274      // we evalute it, cleanup and replace this leftv by it's evalutated form
1275      // the evalutated form will be build in tmp
1276      sleftv tmp;
1277      tmp.Init();
1278      tmp.rtyp=STRING_CMD;
1279      r=(char *)omAllocBin(size_two_bin);
1280      if ((index>0)&& (index<=(int)strlen((char *)d)))
1281      {
1282        r[0]=*(((char *)d)+index-1);
1283        r[1]='\0';
1284      }
1285      else
1286      {
1287        r[0]='\0';
1288      }
1289      tmp.data=r;
1290      if ((rtyp==IDHDL)||(rtyp==STRING_CMD))
1291      {
1292        tmp.next=next; next=NULL;
1293        //if (rtyp==STRING_CMD) { omFree((ADDRESS)data); }
1294        //data=NULL;
1295        d=NULL;
1296        CleanUp();
1297        memcpy(this,&tmp,sizeof(tmp));
1298      }
1299      // and, remember, r is also the result...
1300      else
1301      {
1302        // ???
1303        // here we still have a memory leak...
1304        // example: list L="123","456";
1305        // L[1][2];
1306        // therefore, it should never happen:
1307        assume(0);
1308        // but if it happens: here is the temporary fix:
1309        // omMarkAsStaticAddr(r);
1310      }
1311      break;
1312    }
1313    case MATRIX_CMD:
1314    {
1315      if ((index<1)
1316         ||(index>MATROWS((matrix)d))
1317         ||(e->next->start<1)
1318         ||(e->next->start>MATCOLS((matrix)d)))
1319      {
1320        if (!errorreported)
1321          Werror("wrong range[%d,%d] in matrix %s(%dx%d)",
1322                  index,e->next->start,
1323                  this->Name(),
1324                  MATROWS((matrix)d),MATCOLS((matrix)d));
1325      }
1326      else
1327        r=(char *)MATELEM((matrix)d,index,e->next->start);
1328      break;
1329    }
1330    default:
1331    {
1332      blackbox *b=NULL;
1333      if (t>MAX_TOK)
1334      {
1335        b=getBlackboxStuff(t);
1336      }
1337      if ((t==LIST_CMD)||((b!=NULL)&&(BB_LIKE_LIST(b))))
1338      {
1339        lists l=(lists)d;
1340        if ((0<index)&&(index<=l->nr+1))
1341        {
1342          if ((e->next!=NULL)
1343          && (l->m[index-1].rtyp==STRING_CMD))
1344          // string[..].Data() modifies sleftv, so let's do it ourself
1345          {
1346            char *dd=(char *)l->m[index-1].data;
1347            int j=e->next->start-1;
1348            r=(char *)omAllocBin(size_two_bin);
1349            if ((j>=0) && (j<(int)strlen(dd)))
1350            {
1351              r[0]=*(dd+j);
1352              r[1]='\0';
1353            }
1354            else
1355            {
1356              r[0]='\0';
1357            }
1358          }
1359          else
1360          {
1361            Subexpr tmp=l->m[index-1].e;
1362            l->m[index-1].e=e->next;
1363            r=(char *)l->m[index-1].Data();
1364            e->next=l->m[index-1].e;
1365            l->m[index-1].e=tmp;
1366          }
1367        }
1368        else //if (!errorreported)
1369          Werror("wrong range[%d] in list %s(%d)",index,this->Name(),l->nr+1);
1370      }
1371      else
1372        Werror("cannot index %s of type %s(%d)",this->Name(),Tok2Cmdname(t),t);
1373      break;
1374    }
1375  }
1376  return r;
1377}
1378
1379attr * sleftv::Attribute()
1380{
1381  if (e==NULL) return &attribute;
1382  if ((rtyp==LIST_CMD)
1383  ||((rtyp==IDHDL)&&(IDTYP((idhdl)data)==LIST_CMD))
1384  || (rtyp>MAX_TOK)
1385  || ((rtyp==IDHDL)&&(IDTYP((idhdl)data)>MAX_TOK)))
1386  {
1387    leftv v=LData();
1388    return &(v->attribute);
1389  }
1390  return NULL;
1391}
1392
1393leftv sleftv::LData()
1394{
1395  if (e!=NULL)
1396  {
1397    lists l=NULL;
1398    blackbox *b=getBlackboxStuff(rtyp);
1399
1400    if ((rtyp==LIST_CMD)
1401    || ((b!=NULL)&&(BB_LIKE_LIST(b))))
1402      l=(lists)data;
1403    else if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1404      l=IDLIST((idhdl)data);
1405    else if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)>MAX_TOK))
1406    {
1407      b=getBlackboxStuff(IDTYP((idhdl)data));
1408      if (BB_LIKE_LIST(b)) l=IDLIST((idhdl)data);
1409    }
1410    else if (rtyp==ALIAS_CMD)
1411    {
1412      idhdl h=(idhdl)data;
1413      l= (lists)(((idhdl)h->data.ustring)->data.ustring);
1414    }
1415    if (l!=NULL)
1416    {
1417      if ((0>=e->start)||(e->start>l->nr+1))
1418        return NULL;
1419      if (e->next!=NULL)
1420      {
1421        l->m[e->start-1].e=e->next;
1422        leftv r=l->m[e->start-1].LData();
1423        l->m[e->start-1].e=NULL;
1424        return r;
1425      }
1426      return &(l->m[e->start-1]);
1427    }
1428  }
1429  return this;
1430}
1431
1432#if 0
1433leftv sleftv::LHdl()
1434{
1435  if (e!=NULL)
1436  {
1437    lists l=NULL;
1438
1439    if (rtyp==LIST_CMD)
1440      l=(lists)data;
1441    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1442      l=IDLIST((idhdl)data);
1443    if (l!=NULL)
1444    {
1445      if ((0>=e->start)||(e->start>l->nr+1))
1446        return NULL;
1447      if (e->next!=NULL)
1448      {
1449        l->m[e->start-1].e=e->next;
1450        leftv r=l->m[e->start-1].LHdl();
1451        l->m[e->start-1].e=NULL;
1452        return r;
1453      }
1454      return &(l->m[e->start-1]);
1455    }
1456  }
1457  return this;
1458}
1459#endif
1460
1461BOOLEAN assumeStdFlag(leftv h)
1462{
1463  if (h->e!=NULL)
1464  {
1465    leftv hh=h->LData();
1466    if (h!=hh) return assumeStdFlag(h->LData());
1467  }
1468  if (!hasFlag(h,FLAG_STD))
1469  {
1470    if (!TEST_VERB_NSB)
1471    {
1472      if (TEST_V_ALLWARN)
1473        Warn("%s is no standard basis in >>%s<<",h->Name(),my_yylinebuf);
1474      else
1475        Warn("%s is no standard basis",h->Name());
1476    }
1477    return FALSE;
1478  }
1479  return TRUE;
1480}
1481
1482/*2
1483* transforms a name (as an string created by omAlloc or omStrDup)
1484* into an expression (sleftv), deletes the string
1485* utility for grammar and iparith
1486*/
1487void syMake(leftv v,const char * id, package pa)
1488{
1489  /* resolv an identifier: (to DEF_CMD, if siq>0)
1490  * 1) reserved id: done by scanner
1491  * 2) `basering` / 'Current`
1492  * 3) existing identifier, local
1493  * 4) ringvar, ringpar, local ring
1494  * 5) existing identifier, global
1495  * 6) monom (resp. number), local ring: consisting of:
1496  * 6') ringvar,  ringpar,global ring
1497  * 6'') monom (resp. number), local ring
1498  * 7) monom (resp. number), non-local ring
1499  * 8) basering
1500  * 9) `_`
1501  * 10) everything else is of type 0
1502  */
1503#ifdef TEST
1504  if ((*id<' ')||(*id>(char)126))
1505  {
1506    Print("wrong id :%s:\n",id);
1507  }
1508#endif
1509  idhdl save_ring=currRingHdl;
1510  v->Init();
1511  if(pa != NULL)
1512  {
1513    v->req_packhdl = pa;
1514  }
1515  else v->req_packhdl = currPack;
1516//  if (v->req_packhdl!=basePack)
1517//    Print("search %s in %s\n",id,v->req_packhdl->libname);
1518  idhdl h=NULL;
1519#ifdef SIQ
1520  if (siq<=0)
1521#endif
1522  {
1523    if (!isdigit(id[0]))
1524    {
1525      if (strcmp(id,"basering")==0)
1526      {
1527        if (currRingHdl!=NULL)
1528        {
1529          if (id!=IDID(currRingHdl)) omFreeBinAddr((ADDRESS)id);
1530          h=currRingHdl;
1531          goto id_found;
1532        }
1533        else
1534        {
1535          v->name = id;
1536          return; /* undefined */
1537        }
1538      }
1539      else if (strcmp(id,"Current")==0)
1540      {
1541        if (currPackHdl!=NULL)
1542        {
1543          omFreeBinAddr((ADDRESS)id);
1544          h=currPackHdl;
1545          goto id_found;
1546        }
1547        else
1548        {
1549          v->name = id;
1550          return; /* undefined */
1551        }
1552      }
1553      if(v->req_packhdl!=currPack)
1554      {
1555        h=v->req_packhdl->idroot->get(id,myynest);
1556      }
1557      else
1558      h=ggetid(id);
1559      /* 3) existing identifier, local */
1560      if ((h!=NULL) && (IDLEV(h)==myynest))
1561      {
1562        if (id!=IDID(h)) omFreeBinAddr((ADDRESS)id); /*assume strlen(id) <1000 */
1563        goto id_found;
1564      }
1565    }
1566    if (yyInRingConstruction)
1567    {
1568      currRingHdl=NULL;
1569    }
1570    /* 4. local ring: ringvar */
1571    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest)
1572    /*&& (!yyInRingConstruction)*/)
1573    {
1574      int vnr;
1575      if ((vnr=r_IsRingVar(id, currRing->names,currRing->N))>=0)
1576      {
1577        poly p=pOne();
1578        pSetExp(p,vnr+1,1);
1579        pSetm(p);
1580        v->data = (void *)p;
1581        v->name = id;
1582        v->rtyp = POLY_CMD;
1583        return;
1584      }
1585      if((n_NumberOfParameters(currRing->cf)>0)
1586      &&((vnr=r_IsRingVar(id, (char**)n_ParameterNames(currRing->cf),
1587                              n_NumberOfParameters(currRing->cf))>=0)))
1588      {
1589        BOOLEAN ok=FALSE;
1590        poly p = pmInit(id,ok);
1591        if (ok && (p!=NULL))
1592        {
1593          v->data = pGetCoeff(p);
1594          pGetCoeff(p)=NULL;
1595          pLmFree(p);
1596          v->rtyp = NUMBER_CMD;
1597          v->name = id;
1598          return;
1599        }
1600      }
1601    }
1602    /* 5. existing identifier, global */
1603    if (h!=NULL)
1604    {
1605      if (id!=IDID(h)) omFreeBinAddr((ADDRESS)id);  /*assume strlen(id) <1000 */
1606      goto id_found;
1607    }
1608    /* 6. local ring: number/poly */
1609    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest))
1610    {
1611      BOOLEAN ok=FALSE;
1612      /*poly p = (!yyInRingConstruction) ? pmInit(id,ok) : (poly)NULL;*/
1613      poly p = pmInit(id,ok);
1614      if (ok)
1615      {
1616        if (p==NULL)
1617        {
1618          v->data = (void *)nInit(0);
1619          v->rtyp = NUMBER_CMD;
1620          #ifdef HAVE_PLURAL
1621          // in this case we may have monomials equal to 0 in p_Read
1622          v->name = id;
1623          #else
1624          omFreeBinAddr((ADDRESS)id);
1625          #endif
1626        }
1627        else if (pIsConstant(p))
1628        {
1629          v->data = pGetCoeff(p);
1630          pGetCoeff(p)=NULL;
1631          pLmFree(p);
1632          v->rtyp = NUMBER_CMD;
1633          v->name = id;
1634        }
1635        else
1636        {
1637          v->data = p;
1638          v->rtyp = POLY_CMD;
1639          v->name = id;
1640        }
1641        return;
1642      }
1643    }
1644    /* 7. non-local ring: number/poly */
1645    {
1646      BOOLEAN ok=FALSE;
1647      poly p = ((currRing!=NULL)     /* ring required */
1648               && (currRingHdl!=NULL)
1649               /*&& (!yyInRingConstruction) - not in decl */
1650               && (IDLEV(currRingHdl)!=myynest)) /* already in case 4/6 */
1651                     ? pmInit(id,ok) : (poly)NULL;
1652      if (ok)
1653      {
1654        if (p==NULL)
1655        {
1656          v->data = (void *)nInit(0);
1657          v->rtyp = NUMBER_CMD;
1658          #ifdef HAVE_PLURAL
1659          // in this case we may have monomials equal to 0 in p_Read
1660          v->name = id;
1661          #else
1662          omFreeBinAddr((ADDRESS)id);
1663          #endif
1664        }
1665        else
1666        if (pIsConstant(p))
1667        {
1668          v->data = pGetCoeff(p);
1669          pGetCoeff(p)=NULL;
1670          pLmFree(p);
1671          v->rtyp = NUMBER_CMD;
1672          v->name = id;
1673        }
1674        else
1675        {
1676          v->data = p;
1677          v->rtyp = POLY_CMD;
1678          v->name = id;
1679        }
1680        //if (TEST_V_ALLWARN /*&& (myynest>0)*/
1681        //&& ((r_IsRingVar(id, currRing->names,currRing->N)>=0)
1682        //  || ((n_NumberOfParameters(currRing->cf)>0)
1683        //     &&(r_IsRingVar(id, (char**)n_ParameterNames(currRing->cf),
1684        //                        n_NumberOfParameters(currRing->cf))>=0))))
1685        //{
1686        //// WARNING: do not use ring variable names in procedures
1687        //  Warn("use of variable >>%s<< in a procedure in line %s",id,my_yylinebuf);
1688        //}
1689        return;
1690      }
1691    }
1692    /* 8. basering ? */
1693    if ((myynest>1)&&(currRingHdl!=NULL))
1694    {
1695      if (strcmp(id,IDID(currRingHdl))==0)
1696      {
1697        if (IDID(currRingHdl)!=id) omFreeBinAddr((ADDRESS)id); /*assume strlen (id) <1000 */
1698        h=currRingHdl;
1699        goto id_found;
1700      }
1701    }
1702    if((v->req_packhdl!=basePack) && (v->req_packhdl==currPack))
1703    {
1704      h=basePack->idroot->get(id,myynest);
1705      if (h!=NULL)
1706      {
1707        if (id!=IDID(h)) omFreeBinAddr((ADDRESS)id); /*assume strlen(id) <1000 */
1708        v->req_packhdl=basePack;
1709        goto id_found;
1710      }
1711    }
1712  }
1713#ifdef SIQ
1714  else
1715    v->rtyp=DEF_CMD;
1716#endif
1717  /* 9: _ */
1718  if (strcmp(id,"_")==0)
1719  {
1720    omFreeBinAddr((ADDRESS)id);
1721    v->Copy(&sLastPrinted);
1722  }
1723  else
1724  {
1725    /* 10: everything else */
1726    /* v->rtyp = UNKNOWN;*/
1727    v->name = id;
1728  }
1729  currRingHdl=save_ring;
1730  return;
1731id_found: // we have an id (in h) found, to set the data in from h
1732  if (IDTYP(h)!=ALIAS_CMD)
1733  {
1734    v->rtyp = IDHDL;
1735    v->flag = IDFLAG(h);
1736    v->attribute=IDATTR(h);
1737  }
1738  else
1739  {
1740    v->rtyp = ALIAS_CMD;
1741  }
1742  v->name = IDID(h);
1743  v->data = (char *)h;
1744  currRingHdl=save_ring;
1745}
1746
1747int sleftv::Eval()
1748{
1749  BOOLEAN nok=FALSE;
1750  leftv nn=next;
1751  next=NULL;
1752  if(rtyp==IDHDL)
1753  {
1754    int t=Typ();
1755    if (t!=PROC_CMD)
1756    {
1757      void *d=CopyD(t);
1758      data=d;
1759      rtyp=t;
1760      name=NULL;
1761      e=NULL;
1762    }
1763  }
1764  else if (rtyp==COMMAND)
1765  {
1766    command d=(command)data;
1767    if(d->op==PROC_CMD) //assume d->argc==2
1768    {
1769      char *what=(char *)(d->arg1.Data());
1770      idhdl h=ggetid(what);
1771      if((h!=NULL)&&(IDTYP(h)==PROC_CMD))
1772      {
1773        nok=d->arg2.Eval();
1774        if(!nok)
1775        {
1776          nok=iiMake_proc(h,req_packhdl,&d->arg2);
1777          this->CleanUp(currRing);
1778          if (!nok)
1779          {
1780            memcpy(this,&iiRETURNEXPR,sizeof(sleftv));
1781            memset(&iiRETURNEXPR,0,sizeof(sleftv));
1782          }
1783        }
1784      }
1785      else nok=TRUE;
1786    }
1787    else if (d->op=='=') //assume d->argc==2
1788    {
1789      if ((d->arg1.rtyp!=IDHDL)&&(d->arg1.rtyp!=DEF_CMD))
1790      {
1791        nok=d->arg1.Eval();
1792      }
1793      if (!nok)
1794      {
1795        const char *n=d->arg1.name;
1796        nok=(n == NULL) || d->arg2.Eval();
1797        if (!nok)
1798        {
1799          int save_typ=d->arg1.rtyp;
1800          omCheckAddr((ADDRESS)n);
1801          if (d->arg1.rtyp!=IDHDL)
1802          syMake(&d->arg1,n);
1803          omCheckAddr((ADDRESS)d->arg1.name);
1804          if (d->arg1.rtyp==IDHDL)
1805          {
1806            n=omStrDup(IDID((idhdl)d->arg1.data));
1807            killhdl((idhdl)d->arg1.data);
1808            d->arg1.Init();
1809            //d->arg1.data=NULL;
1810            d->arg1.name=n;
1811          }
1812          d->arg1.rtyp=DEF_CMD;
1813          sleftv t;
1814          if(save_typ!=PROC_CMD) save_typ=d->arg2.rtyp;
1815          if (::RingDependend(d->arg2.rtyp))
1816            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&currRing->idroot);
1817          else
1818            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&IDROOT);
1819          memcpy(&d->arg1,&t,sizeof(sleftv));
1820          omCheckAddr((ADDRESS)d->arg1.name);
1821          nok=nok||iiAssign(&d->arg1,&d->arg2);
1822          omCheckIf(d->arg1.name != NULL,  // OB: ????
1823                    omCheckAddr((ADDRESS)d->arg1.name));
1824          if (!nok)
1825          {
1826            memset(&d->arg1,0,sizeof(sleftv));
1827            this->CleanUp();
1828            rtyp=NONE;
1829          }
1830        }
1831      }
1832      else nok=TRUE;
1833    }
1834    else
1835    {
1836      sleftv tmp; tmp.Init();
1837      int toktype=iiTokType(d->op);
1838      if ((toktype==CMD_M)
1839      ||( toktype==ROOT_DECL_LIST)
1840      ||( toktype==RING_DECL_LIST))
1841      {
1842        if (d->argc <=3)
1843        {
1844          if (d->argc>=1) nok=d->arg1.Eval();
1845          if ((!nok) && (d->argc>=2))
1846          {
1847            nok=d->arg2.Eval();
1848            d->arg1.next=(leftv)omAllocBin(sleftv_bin);
1849            memcpy(d->arg1.next,&d->arg2,sizeof(sleftv));
1850            d->arg2.Init();
1851          }
1852          if ((!nok) && (d->argc==3))
1853          {
1854            nok=d->arg3.Eval();
1855            d->arg1.next->next=(leftv)omAllocBin(sleftv_bin);
1856            memcpy(d->arg1.next->next,&d->arg3,sizeof(sleftv));
1857            d->arg3.Init();
1858          }
1859          if (d->argc==0)
1860            nok=nok||iiExprArithM(&tmp,NULL,d->op);
1861          else
1862            nok=nok||iiExprArithM(&tmp,&d->arg1,d->op);
1863        }
1864        else
1865        {
1866          nok=d->arg1.Eval();
1867          nok=nok||iiExprArithM(&tmp,&d->arg1,d->op);
1868        }
1869      }
1870      else if (d->argc==1)
1871      {
1872        nok=d->arg1.Eval();
1873        nok=nok||iiExprArith1(&tmp,&d->arg1,d->op);
1874      }
1875      else if(d->argc==2)
1876      {
1877        nok=d->arg1.Eval();
1878        nok=nok||d->arg2.Eval();
1879        nok=nok||iiExprArith2(&tmp,&d->arg1,d->op,&d->arg2);
1880      }
1881      else if(d->argc==3)
1882      {
1883        nok=d->arg1.Eval();
1884        nok=nok||d->arg2.Eval();
1885        nok=nok||d->arg3.Eval();
1886        nok=nok||iiExprArith3(&tmp,d->op,&d->arg1,&d->arg2,&d->arg3);
1887      }
1888      else if(d->argc!=0)
1889      {
1890        nok=d->arg1.Eval();
1891        nok=nok||iiExprArithM(&tmp,&d->arg1,d->op);
1892      }
1893      else // d->argc == 0
1894      {
1895        nok = iiExprArithM(&tmp, NULL, d->op);
1896      }
1897      this->CleanUp();
1898      memcpy(this,&tmp,sizeof(tmp));
1899    }
1900  }
1901  else if (((rtyp==0)||(rtyp==DEF_CMD))
1902    &&(name!=NULL))
1903  {
1904     syMake(this,name);
1905  }
1906#ifdef MDEBUG
1907  switch(Typ())
1908  {
1909    case NUMBER_CMD:
1910#ifdef LDEBUG
1911      nTest((number)Data());
1912#endif
1913      break;
1914    case BIGINT_CMD:
1915#ifdef LDEBUG
1916      n_Test((number)Data(),coeffs_BIGINT);
1917#endif
1918      break;
1919    case POLY_CMD:
1920      pTest((poly)Data());
1921      break;
1922    case IDEAL_CMD:
1923    case MODUL_CMD:
1924    case MATRIX_CMD:
1925      {
1926        ideal id=(ideal)Data();
1927        omCheckAddrSize(id,sizeof(*id));
1928        int i=id->ncols*id->nrows-1;
1929        for(;i>=0;i--) pTest(id->m[i]);
1930      }
1931      break;
1932  }
1933#endif
1934  if (nn!=NULL) nok=nok||nn->Eval();
1935  next=nn;
1936  return nok;
1937}
1938
1939const char *iiSleftv2name(leftv v)
1940{
1941  return(v->name);
1942}
1943
1944void * sattr::CopyA()
1945{
1946  omCheckAddrSize(this,sizeof(sattr));
1947  return s_internalCopy(atyp,data);
1948}
1949
Note: See TracBrowser for help on using the repository browser.