source: git/Singular/subexpr.cc @ b1dfaf

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