source: git/Singular/subexpr.cc @ c4d065

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