source: git/Singular/subexpr.cc @ 046a94

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