source: git/Singular/subexpr.cc @ 018dec

spielwiese
Last change on this file since 018dec was 018dec, checked in by Hans Schoenemann <hannes@…>, 13 years ago
sleftv::SetData removed git-svn-id: file:///usr/local/Singular/svn/trunk@13635 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
129std::string toPrintString(gfan::ZCone const &c, char *nameOfCone)
130{
131  std::stringstream s;
132  gfan::ZMatrix i=c.getInequalities();
133  gfan::ZMatrix e=c.getEquations();
134  s<<nameOfCone<<"[1]:"<<std::endl;
135  s<<c.ambientDimension()<<std::endl;
136  s<<nameOfCone<<"[2]:"<<std::endl;
137  s<<toPrintString(i,6,"   ");
138  s<<nameOfCone<<"[3]:"<<std::endl;
139  s<<toPrintString(e,6,"   ");
140  return s.str();
141}
[26364de]142#endif
[d4df72]143
[0e1846]144void sleftv::Print(leftv store, int spaces)
145{
146  int  t=Typ();
147  if (errorreported) return;
148#ifdef SIQ
149  if (rtyp==COMMAND)
150  {
151    command c=(command)data;
152    char ch[2];
153    ch[0]=c->op;ch[1]='\0';
[85e68dd]154    const char *s=ch;
[2c89d2]155    if (c->op>127) s=iiTwoOps(c->op);
[0e1846]156    ::Print("##command %d(%s), %d args\n",
157      c->op, s, c->argc);
158    if (c->argc>0)
159      c->arg1.Print(NULL,spaces+2);
160    if(c->argc<4)
161    {
162      if (c->argc>1)
163        c->arg2.Print(NULL,spaces+2);
164      if (c->argc>2)
165        c->arg3.Print(NULL,spaces+2);
166    }
167    PrintS("##end");
168  }
169  else
170#endif
171  {
[2ba9a6]172    const char *n=Name();
173    char *s;
174    void *d=Data();
175    if (errorreported)
176      return;
177    if ((store!=NULL)&&(store!=this))
178      store->CleanUp();
[a3432c]179
[2ba9a6]180    switch (t /*=Typ()*/)
[0e1846]181      {
182        case UNKNOWN:
183        case DEF_CMD:
184        case PACKAGE_CMD:
[490a23b]185          PrintNSpaces(spaces);
186          PrintS("`");PrintS(n);PrintS("`");
[0e1846]187          break;
188        case NONE:
189          return;
190        case INTVEC_CMD:
191        case INTMAT_CMD:
[6d3ffec]192          ((intvec *)d)->show(t,spaces);
[0e1846]193          break;
194        case RING_CMD:
195        case QRING_CMD:
[490a23b]196          PrintNSpaces(spaces);
[0e1846]197          rWrite((ring)d);
198          break;
199        case MATRIX_CMD:
200          iiWriteMatrix((matrix)d,n,2,spaces);
201          break;
202        case MODUL_CMD:
203        case IDEAL_CMD:
[6c4db17]204          if ((TEST_V_QRING)  &&(currQuotient!=NULL))
205          {
206            jjNormalizeQRingId(this);
207            d=Data();
208          }
209          // no break:
210        case MAP_CMD:
[0e1846]211          iiWriteMatrix((matrix)d,n,1,spaces);
212          break;
213        case POLY_CMD:
214        case VECTOR_CMD:
[6c4db17]215          if ((TEST_V_QRING)  &&(currQuotient!=NULL))
216          {
217            jjNormalizeQRingP(this);
218            d=Data();
219          }
[490a23b]220          PrintNSpaces(spaces);
[0e1846]221          pWrite0((poly)d);
222          break;
[dfc6b54]223        case RESOLUTION_CMD:
224          syPrint((syStrategy)d);
[a3432c]225          break;
[0e1846]226        case STRING_CMD:
[490a23b]227          PrintNSpaces(spaces);
228          PrintS((char *)d);
[0e1846]229          break;
230       case INT_CMD:
[490a23b]231          PrintNSpaces(spaces);
232          ::Print("%d",(int)(long)d);
[0e1846]233          break;
[4f80bb]234#ifdef HAVE_FANS
235       case CONE_CMD:
[7ec0614]236       //case FAN_CMD:
[4f80bb]237          PrintNSpaces(spaces);
238          {
239            char *s = String();
240            ::PrintS(s);
241            omFree(s);
242          }
243          break;
244#endif /* HAVE_FANS */
[2ba9a6]245       case PROC_CMD:
246         {
247           procinfov pi=(procinfov)d;
[490a23b]248
249           PrintNSpaces(spaces);
250           PrintS("// libname  : ");
251           PrintS(piProcinfo(pi, "libname"));
[17681b]252           PrintLn();
[490a23b]253
254           PrintNSpaces(spaces);
255           PrintS("// procname : ");
256           PrintS(piProcinfo(pi, "procname"));
[17681b]257           PrintLn();
[490a23b]258
259           PrintNSpaces(spaces);
260           PrintS("// type     : ");
261           PrintS(piProcinfo(pi, "type"));
[a3432c]262           //           ::Print("%-*.*s// ref      : %s",spaces,spaces," ",
263           //   piProcinfo(pi, "ref"));
264           break;
[2ba9a6]265         }
[46d09b]266       case POINTER_CMD:
267         { package pack = (package)d;
[17681b]268         PrintNSpaces(spaces);
[490a23b]269         PrintS("// PointerTest\n");
[17681b]270         PrintNSpaces(spaces);
[490a23b]271         ::Print("// %s\n",IDID(pack->idroot));
[46d09b]272         //::Print(((char *)(pack->idroot)->data), spaces);
273         break;
274         }
[0e1846]275       case LINK_CMD:
276          {
277            si_link l=(si_link)d;
[17681b]278            PrintNSpaces(spaces);
[490a23b]279            ::Print("// type : %s\n", slStatus(l, "type"));
[17681b]280            PrintNSpaces(spaces);
[490a23b]281            ::Print("// mode : %s\n", slStatus(l, "mode"));
[17681b]282            PrintNSpaces(spaces);
[490a23b]283            ::Print("// name : %s\n", slStatus(l, "name"));
[17681b]284            PrintNSpaces(spaces);
[490a23b]285            ::Print("// open : %s\n", slStatus(l, "open"));
[17681b]286            PrintNSpaces(spaces);
[490a23b]287            ::Print("// read : %s\n", slStatus(l, "read"));
[17681b]288            PrintNSpaces(spaces);
[490a23b]289            ::Print("// write: %s", slStatus(l, "write"));
[d754b7]290          break;
[0e1846]291          }
292        case NUMBER_CMD:
[84a6a7]293        case BIGINT_CMD:
[0e1846]294          s=String(d);
295          if (s==NULL) return;
[17681b]296          PrintNSpaces(spaces);
[0e1846]297          PrintS(s);
[c232af]298          omFree((ADDRESS)s);
[0e1846]299          break;
300        case LIST_CMD:
301        {
302          lists l=(lists)d;
303          if (l->nr<0)
[17681b]304          {
305             PrintNSpaces(spaces);
[490a23b]306             PrintS("empty list\n");
[17681b]307          }
[0e1846]308          else
309          {
310            int i=0;
311            for (;i<=l->nr;i++)
312            {
313              if (l->m[i].rtyp!=DEF_CMD)
314              {
[17681b]315                PrintNSpaces(spaces);
[490a23b]316                ::Print("[%d]:\n",i+1);
[0e1846]317                l->m[i].Print(NULL,spaces+3);
318              }
319            }
320          }
321          break;
322        }
323#ifdef TEST
324        default:
325          ::Print("Print:unknown type %s(%d)", Tok2Cmdname(t),t);
326#endif
327      } /* end switch: (Typ()) */
328  }
329  if (next!=NULL)
330  {
331    if (t==COMMAND) PrintLn();
332    else if (t!=LIST_CMD) PrintS(" ");
333    next->Print(NULL,spaces);
334  }
335  else if (t!=LIST_CMD)
336  {
337    PrintLn();
[a3432c]338  }
[0e1846]339#ifdef SIQ
340  if (rtyp!=COMMAND)
341#endif
342  {
343    if ((store!=NULL)
344    && (store!=this)
345    && (t/*Typ()*/!=LINK_CMD)
346    && (t/*Typ()*/!=RING_CMD)
347    && (t/*Typ()*/!=QRING_CMD)
[46d09b]348    && (t/*Typ()*/!=POINTER_CMD)
[0e1846]349    && (t/*Typ()*/!=PACKAGE_CMD)
350    && (t/*Typ()*/!=PROC_CMD)
[6ae4f5]351    && (t/*Typ()*/!=DEF_CMD)
[0e1846]352    )
353    {
354      store->rtyp=t/*Typ()*/;
355      store->data=CopyD();
[3074334]356      if((e!=NULL)||(attribute!=NULL))
357      {
358        store->attribute=CopyA();
359      }
360      if (e==NULL)
361      {
362        store->flag=flag;
363      }
364      //else
365      //{
366      //}
[0e1846]367    }
368  }
369}
370
[16acb0]371void sleftv::CleanUp(ring r)
[0e1846]372{
[ea947e]373  if ((name!=NULL) && (name!=sNoName) && (rtyp!=IDHDL) && (rtyp!=ALIAS_CMD))
[0e1846]374  {
375    //::Print("free %x (%s)\n",name,name);
[c232af]376    omFree((ADDRESS)name);
[0e1846]377  }
[f2dff02]378  //name=NULL;
379  //flag=0;
[0e1846]380  if (data!=NULL)
381  {
382    switch (rtyp)
383    {
384      case INTVEC_CMD:
385      case INTMAT_CMD:
386        delete (intvec *)data;
387        break;
388      case MAP_CMD:
[c232af]389        omFree((ADDRESS)((map)data)->preimage);
[0e1846]390        ((map)data)->preimage=NULL;
391        // no break: kill the image as an ideal
392      case MATRIX_CMD:
393      case MODUL_CMD:
394      case IDEAL_CMD:
[17681b]395        if ((((long)data) & 3)==0)
396        {
[ff7e529]397          if(r!=NULL) id_Delete((ideal *)(&data),r);
[17681b]398        }
[0e1846]399        break;
400      case STRING_CMD:
[ff7e529]401        omFree((ADDRESS)data);
[0e1846]402        break;
403      case POLY_CMD:
404      case VECTOR_CMD:
[fa79909]405        if (r!=NULL) p_Delete((poly *)(&data),r);
[0e1846]406        break;
407      case NUMBER_CMD:
[fa79909]408        if (r!=NULL) n_Delete((number *)(&data),r);
[0e1846]409        break;
[84a6a7]410      case BIGINT_CMD:
411        nlDelete((number *)(&data),r);
412        break;
[0e1846]413      case LIST_CMD:
[dbb955]414        ((lists)data)->Clean(r); // may contain ring-dep data
[0e1846]415        break;
416      case QRING_CMD:
417      case RING_CMD:
418        rKill((ring)data);
419        break;
[2ba9a6]420      case PROC_CMD:
[a3432c]421        piKill((procinfov)data);
422        break;
[0e1846]423      case LINK_CMD:
424        slKill((si_link)data);
425        break;
426      case COMMAND:
427      {
428        command cmd=(command)data;
429        if (cmd->arg1.rtyp!=0) cmd->arg1.CleanUp();
430        if (cmd->arg2.rtyp!=0) cmd->arg2.CleanUp();
431        if (cmd->arg3.rtyp!=0) cmd->arg3.CleanUp();
[631c4c]432        omFreeBin((ADDRESS)data, sip_command_bin);
[0e1846]433        break;
434      }
[dfc6b54]435      case RESOLUTION_CMD:
[fa79909]436        if (r!=NULL) syKillComputation((syStrategy)data,r);
[dfc6b54]437        break;
[0e1846]438#ifdef TEST
439      // the following types do not take memory
440      // or are not copied
441      case IDHDL:
442      case PACKAGE_CMD:
443      case ANY_TYPE:
444      case VECHO:
445      case VPRINTLEVEL:
446      case VCOLMAX:
447      case VTIMER:
[f2dff02]448      case VRTIMER:
[0e1846]449      case VOICE:
450      case VMAXDEG:
451      case VMAXMULT:
452      case TRACE:
453      case VSHORTOUT:
454      case VNOETHER:
455      case VMINPOLY:
456      case 0:
457      case INT_CMD:
458        break;
459      default:
460        ::Print("CleanUp: unknown type %d\n",rtyp);  /* DEBUG */
[a3432c]461#endif
[0e1846]462    } /* end switch: (rtyp) */
[ff7e529]463    //data=NULL; // will be done by Init() at the end
[0e1846]464  }
465  if (attribute!=NULL)
466  {
467    switch (rtyp)
468    {
[46d09b]469      case POINTER_CMD:
[0e1846]470      case PACKAGE_CMD:
471      case IDHDL:
472      case ANY_TYPE:
473      case VECHO:
474      case VPRINTLEVEL:
475      case VCOLMAX:
476      case VTIMER:
[7a7652]477      case VRTIMER:
[0e1846]478      case VOICE:
479      case VMAXDEG:
480      case VMAXMULT:
481      case TRACE:
482      case VSHORTOUT:
483      case VNOETHER:
484      case VMINPOLY:
[7a7652]485      case LIB_CMD:
[0e1846]486      case 0:
[ff7e529]487        //attribute=NULL; // will be done by Init() at the end
[0e1846]488        break;
489      default:
490      {
491        attr t;
492        while (attribute!=NULL)
493        {
494          t=attribute->next;
[2dbaba4]495          attribute->kill(currRing);
[0e1846]496          attribute=t;
497        }
498      }
499    }
500  }
501  Subexpr h;
502  while (e!=NULL)
503  {
504    h=e->next;
[c232af]505    omFreeBin((ADDRESS)e, sSubexpr_bin);
[0e1846]506    e=h;
507  }
[ff7e529]508  //rtyp=NONE; // will be done by Init() at the end
[0e1846]509  if (next!=NULL)
510  {
[df4422]511    leftv tmp_n;
512    do
513    {
514      tmp_n=next->next;
515      //next->name=NULL;
516      next->next=NULL;
[16acb0]517      next->CleanUp(r);
[c232af]518      omFreeBin((ADDRESS)next, sleftv_bin);
[df4422]519      next=tmp_n;
520    } while (next!=NULL);
[0e1846]521  }
[f2dff02]522  Init();
[0e1846]523}
524
[4cbe5d]525BOOLEAN sleftv::RingDependend()
526{
527  int rt=Typ();
[df5fc1]528  if(::RingDependend(rt) && (rt!=QRING_CMD))
[4cbe5d]529    return TRUE;
530  if (rt==LIST_CMD)
531    return lRingDependend((lists)Data());
[a3bc95e]532  return FALSE;
[4cbe5d]533}
534
[a1a595]535static inline void * s_internalCopy(const int t,  void *d)
[0e1846]536{
[dfc6b54]537  switch (t)
[0e1846]538  {
539    case INTVEC_CMD:
540    case INTMAT_CMD:
541      return (void *)ivCopy((intvec *)d);
542    case MATRIX_CMD:
543      return (void *)mpCopy((matrix)d);
544    case IDEAL_CMD:
545    case MODUL_CMD:
546      return  (void *)idCopy((ideal)d);
547    case STRING_CMD:
[c232af]548        return (void *)omStrDup((char *)d);
[46d09b]549    case POINTER_CMD:
550      return d;
[daeb6d]551    case PACKAGE_CMD:
552      return  (void *)paCopy((package) d);
[0e1846]553    case PROC_CMD:
[2ba9a6]554      return  (void *)piCopy((procinfov) d);
[0e1846]555    case POLY_CMD:
556    case VECTOR_CMD:
557      return  (void *)pCopy((poly)d);
558    case INT_CMD:
559      return  d;
560    case NUMBER_CMD:
561      return  (void *)nCopy((number)d);
[84a6a7]562    case BIGINT_CMD:
563      return  (void *)nlCopy((number)d);
[0e1846]564    case MAP_CMD:
565      return  (void *)maCopy((map)d);
566    case LIST_CMD:
567      return  (void *)lCopy((lists)d);
[e6969d]568    case LINK_CMD:
569      return (void *)slCopy((si_link) d);
[2f12a6f]570    case RING_CMD:
571    case QRING_CMD:
572      {
573        ring r=(ring)d;
574        r->ref++;
575        return d;
576      }
[4f80bb]577#ifdef HAVE_FANS
[7ec0614]578/*    case FAN_CMD:
[4f80bb]579      {
580        Fan* fff = (Fan*)d;
581        Fan* ggg = new Fan(*fff);
582        return ggg;
[7ec0614]583      }*/
[4f80bb]584    case CONE_CMD:
585      {
[d4df72]586        gfan::ZCone* zc = (gfan::ZCone*)d;
587        gfan::ZCone* newZc = new gfan::ZCone(*zc);
588        return newZc;
[4f80bb]589      }
590#endif /* HAVE_FANS */
[dfc6b54]591    case RESOLUTION_CMD:
592      return (void*)syCopy((syStrategy)d);
[0e1846]593#ifdef TEST
594    case DEF_CMD:
595    case NONE:
596      break; /* error recovery: do nothing */
597    //case COMMAND:
598    default:
[b70e54]599      Warn("s_internalCopy: cannot copy type %s(%d)",
[a1a595]600            Tok2Cmdname(t),t);
[0e1846]601#endif
602  }
603  return NULL;
604}
605
[f71681]606
607
[a1a595]608void * slInternalCopy(leftv source, const int t, void *d, Subexpr e)
609{
610  if (t==STRING_CMD)
611  {
612      if ((e==NULL)
613      || (source->rtyp==LIST_CMD)
614      || ((source->rtyp==IDHDL)&&(IDTYP((idhdl)source->data)==LIST_CMD)))
615        return (void *)omStrDup((char *)d);
616      else if (e->next==NULL)
617      {
618        char *s=(char*)omAllocBin(size_two_bin);
619        s[0]=*(char *)d;
620        s[1]='\0';
621        return s;
622      }
623      #ifdef TEST
624      else
625      {
626        Werror("not impl. string-op in `%s`",my_yylinebuf);
627        return NULL;
628      }
629      #endif
630  }
631  return s_internalCopy(t,d);
632}
633
[0e1846]634void sleftv::Copy(leftv source)
635{
[f2dff02]636  Init();
[0e1846]637  rtyp=source->Typ();
638  void *d=source->Data();
639  if(!errorreported)
640  {
[a1a595]641    data=s_internalCopy(rtyp,d);
[24c186a]642    if ((source->attribute!=NULL)||(source->e!=NULL))
643      attribute=source->CopyA();
[3074334]644    if(source->e==NULL)
645    {
646      flag=source->flag;
647    }
648    //else
649    //{
650    //}
[24c186a]651    if (source->next!=NULL)
652    {
[c232af]653      next=(leftv)omAllocBin(sleftv_bin);
[24c186a]654      next->Copy(source->next);
655    }
[0e1846]656  }
657}
658
659void * sleftv::CopyD(int t)
660{
661  if ((rtyp!=IDHDL)&&(e==NULL))
662  {
[a3432c]663    if (iiCheckRing(t)) return NULL;
[0e1846]664    void *x=data;
665    if (rtyp==VNOETHER) x=(void *)pCopy(ppNoether);
[be0d84]666    else if ((rtyp==VMINPOLY)&& (currRing->minpoly!=NULL)&&(!rField_is_GF()))
[4c001a]667      x=(void *)nCopy(currRing->minpoly);
[0e1846]668    data=NULL;
669    return x;
670  }
[a3432c]671  void *d=Data(); // will also do a iiCheckRing
672  if ((!errorreported) && (d!=NULL)) return slInternalCopy(this,t,d,e);
[0e1846]673  return NULL;
674}
675
[2166ad3]676//void * sleftv::CopyD()
677//{
[24c186a]678  //if ((rtyp!=IDHDL)&&(e==NULL)
679  //&&(rtyp!=VNOETHER)&&(rtyp!=LIB_CMD)&&(rtyp!=VMINPOLY))
680  //{
681  //  void *x=data;
682  //  data=NULL;
683  //  return x;
684  //}
[2166ad3]685//  return CopyD(Typ());
686//}
[0e1846]687
688attr sleftv::CopyA()
689{
[13e2da]690  attr *a=Attribute();
[f4e756]691  if ((a!=NULL) && (*a!=NULL))
[13e2da]692    return (*a)->Copy();
[a3432c]693  return NULL;
[0e1846]694}
695
[a79a128]696char *  sleftv::String(void *d, BOOLEAN typed, int dim)
[0e1846]697{
698#ifdef SIQ
699  if (rtyp==COMMAND)
700  {
701    ::Print("##command %d\n",((command)data)->op);
702    if (((command)data)->arg1.rtyp!=0)
703      ((command)data)->arg1.Print(NULL,2);
704    if (((command)data)->arg2.rtyp!=0)
705      ((command)data)->arg2.Print(NULL,2);
706    if (((command)data)->arg3.rtyp==0)
707      ((command)data)->arg3.Print(NULL,2);
708    PrintS("##end\n");
[c232af]709    return omStrDup("");
[0e1846]710  }
711#endif
712  if (d==NULL) d=Data();
713  if (!errorreported)
714  {
715    char *s;
716    const char *n;
717    if (name!=NULL) n=name;
718    else n=sNoName;
[84a6a7]719    int t=Typ();
720    switch (t /*Typ()*/)
[0e1846]721    {
[4b2155]722        case INT_CMD:
[7604db]723          if (typed)
724          {
[c232af]725            s=(char *)omAlloc(MAX_INT_LEN+7);
[7447d8]726            sprintf(s,"int(%d)",(int)(long)d);
[7604db]727          }
728          else
729          {
[c232af]730            s=(char *)omAlloc(MAX_INT_LEN+2);
[7447d8]731            sprintf(s,"%d",(int)(long)d);
[7604db]732          }
733          return s;
734
[4b2155]735        case STRING_CMD:
[7604db]736          if (d == NULL)
737          {
[c232af]738            if (typed) return omStrDup("\"\"");
739            return omStrDup("");
[7604db]740          }
741          if (typed)
742          {
[c232af]743            s = (char*) omAlloc(strlen((char*) d) + 3);
[7604db]744            sprintf(s,"\"%s\"", (char*) d);
745            return s;
746          }
747          else
748          {
[c232af]749            return omStrDup((char*)d);
[7604db]750          }
[c931a2]751
[4b2155]752        case POLY_CMD:
753        case VECTOR_CMD:
[7604db]754          if (typed)
755          {
756            char* ps = pString((poly) d);
[c232af]757            s = (char*) omAlloc(strlen(ps) + 10);
[84a6a7]758            sprintf(s,"%s(%s)", (t /*Typ()*/ == POLY_CMD ? "poly" : "vector"), ps);
[7604db]759            return s;
760          }
761          else
[c232af]762            return omStrDup(pString((poly)d));
[7604db]763
[4b2155]764        case NUMBER_CMD:
[a70441f]765          StringSetS((char*) (typed ? "number(" : ""));
[4b2155]766          if ((rtyp==IDHDL)&&(IDTYP((idhdl)data)==NUMBER_CMD))
767          {
768            nWrite(IDNUMBER((idhdl)data));
769          }
770          else if (rtyp==NUMBER_CMD)
771          {
772            number n=(number)data;
773            nWrite(n);
774            data=(char *)n;
775          }
776          else if((rtyp==VMINPOLY)&&(rField_is_GF()))
777          {
778            nfShowMipo();
779          }
780          else
781          {
782            number n=nCopy((number)d);
783            nWrite(n);
784            nDelete(&n);
785          }
[a70441f]786          s = StringAppendS((char*) (typed ? ")" : ""));
[c232af]787          return omStrDup(s);
[c931a2]788
[84a6a7]789        case BIGINT_CMD:
790          {
791          StringSetS((char*) (typed ? "bigint(" : ""));
792          number nl=(number)d;
[493225]793          nlWrite(nl,NULL);
[84a6a7]794          s = StringAppendS((char*) (typed ? ")" : ""));
795          return omStrDup(s);
796          }
797
[4b2155]798        case MATRIX_CMD:
[7604db]799          s= iiStringMatrix((matrix)d,dim);
800          if (typed)
801          {
[c232af]802            char* ns = (char*) omAlloc(strlen(s) + 40);
[c931a2]803            sprintf(ns, "matrix(ideal(%s),%d,%d)", s,
[7604db]804                    ((ideal) d)->nrows, ((ideal) d)->ncols);
[c232af]805            omCheckAddr(ns);
[7604db]806            return ns;
807          }
808          else
809          {
[c232af]810            return omStrDup(s);
[7604db]811          }
812
[4b2155]813        case MODUL_CMD:
814        case IDEAL_CMD:
815        case MAP_CMD:
[7604db]816          s= iiStringMatrix((matrix)d,dim);
817          if (typed)
818          {
[c232af]819            char* ns = (char*) omAlloc(strlen(s) + 10);
[84a6a7]820            sprintf(ns, "%s(%s)", (t/*Typ()*/==MODUL_CMD ? "module" : "ideal"), s);
[c232af]821            omCheckAddr(ns);
[7604db]822            return ns;
823          }
[c232af]824          return omStrDup(s);
[7604db]825
[4b2155]826        case INTVEC_CMD:
827        case INTMAT_CMD:
828        {
829          intvec *v=(intvec *)d;
[a79a128]830          s = v->String(dim);
[7604db]831          if (typed)
832          {
833            char* ns;
[84a6a7]834            if (t/*Typ()*/ == INTMAT_CMD)
[7604db]835            {
[c232af]836              ns = (char*) omAlloc(strlen(s) + 40);
[7604db]837              sprintf(ns, "intmat(intvec(%s),%d,%d)", s, v->rows(), v->cols());
838            }
839            else
840            {
[c232af]841              ns = (char*) omAlloc(strlen(s) + 10);
[7604db]842              sprintf(ns, "intvec(%s)", s);
843            }
[c232af]844            omCheckAddr(ns);
845            omFree(s);
[7604db]846            return ns;
847          }
848          else
849            return s;
[4b2155]850        }
[7604db]851
[4b2155]852        case RING_CMD:
853        case QRING_CMD:
[7604db]854          s  = rString((ring)d);
[c931a2]855
[7604db]856          if (typed)
857          {
858            char* ns;
[84a6a7]859            if (t/*Typ()*/ == QRING_CMD)
[7604db]860            {
861              char* id = iiStringMatrix((matrix) ((ring) d)->qideal, dim);
[c232af]862              ns = (char*) omAlloc(strlen(s) + strlen(id) + 20);
[7604db]863              sprintf(ns, "\"%s\";%sideal(%s)", s,(dim == 2 ? "\n" : " "), id);
864            }
865            else
866            {
[c232af]867              ns = (char*) omAlloc(strlen(s) + 4);
[7604db]868              sprintf(ns, "\"%s\"", s);
869            }
[c232af]870            omFree(s);
871            omCheckAddr(ns);
[7604db]872            return ns;
873          }
874          return s;
[4f80bb]875#ifdef HAVE_FANS
[7ec0614]876/*        case FAN_CMD:
[4f80bb]877        {
878          Fan* fff = (Fan*)d;
879          s = fff->toString();
880          char* ns = (char*) omAlloc(strlen(s) + 10);
881          sprintf(ns, "%s", s);
882          omCheckAddr(ns);
883          omFree(s);
884          return ns;
[7ec0614]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.