source: git/Singular/subexpr.cc @ bdfe704

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