source: git/Singular/subexpr.cc @ 2d7c24

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