source: git/Singular/subexpr.cc @ 8e7e6d4

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