source: git/Singular/subexpr.cc @ 92d684

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