source: git/Singular/subexpr.cc @ 737a68

spielwiese
Last change on this file since 737a68 was 737a68, checked in by Oleksandr Motsak <motsak@…>, 13 years ago
CHG: moved libpolys/polys/polys.h to kernel/polys.h & updated includes ADD: moved (definition of) currRing/rChangeCurrRing to kernel/polys.cc!?
  • 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
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(ppNoether);
628    else if ((rtyp==VMINPOLY)&& \
629                    nCoeff_is_Extension(currRing->cf) && \
630                    (!nCoeff_is_GF(currRing->cf)))
631      x=(void *)p_Copy(currRing->cf->extRing->minideal->m[0],
632                      currRing->cf->extRing );
633    data=NULL;
634    return x;
635  }
636  void *d=Data(); // will also do a iiCheckRing
637  if ((!errorreported) && (d!=NULL)) return slInternalCopy(this,t,d,e);
638  return NULL;
639}
640
641//void * sleftv::CopyD()
642//{
643  //if ((rtyp!=IDHDL)&&(e==NULL)
644  //&&(rtyp!=VNOETHER)&&(rtyp!=LIB_CMD)&&(rtyp!=VMINPOLY))
645  //{
646  //  void *x=data;
647  //  data=NULL;
648  //  return x;
649  //}
650//  return CopyD(Typ());
651//}
652
653attr sleftv::CopyA()
654{
655  attr *a=Attribute();
656  if ((a!=NULL) && (*a!=NULL))
657    return (*a)->Copy();
658  return NULL;
659}
660
661char *  sleftv::String(void *d, BOOLEAN typed, int dim)
662{
663#ifdef SIQ
664  if (rtyp==COMMAND)
665  {
666    ::Print("##command %d\n",((command)data)->op);
667    if (((command)data)->arg1.rtyp!=0)
668      ((command)data)->arg1.Print(NULL,2);
669    if (((command)data)->arg2.rtyp!=0)
670      ((command)data)->arg2.Print(NULL,2);
671    if (((command)data)->arg3.rtyp==0)
672      ((command)data)->arg3.Print(NULL,2);
673    PrintS("##end\n");
674    return omStrDup("");
675  }
676#endif
677  if (d==NULL) d=Data();
678  if (!errorreported)
679  {
680    char *s;
681    const char *n;
682    if (name!=NULL) n=name;
683    else n=sNoName;
684    int t=Typ();
685    switch (t /*Typ()*/)
686    {
687        case INT_CMD:
688          if (typed)
689          {
690            s=(char *)omAlloc(MAX_INT_LEN+7);
691            sprintf(s,"int(%d)",(int)(long)d);
692          }
693          else
694          {
695            s=(char *)omAlloc(MAX_INT_LEN+2);
696            sprintf(s,"%d",(int)(long)d);
697          }
698          return s;
699
700        case STRING_CMD:
701          if (d == NULL)
702          {
703            if (typed) return omStrDup("\"\"");
704            return omStrDup("");
705          }
706          if (typed)
707          {
708            s = (char*) omAlloc(strlen((char*) d) + 3);
709            sprintf(s,"\"%s\"", (char*) d);
710            return s;
711          }
712          else
713          {
714            return omStrDup((char*)d);
715          }
716
717        case POLY_CMD:
718        case VECTOR_CMD:
719          if (typed)
720          {
721            char* ps = pString((poly) d);
722            s = (char*) omAlloc(strlen(ps) + 10);
723            sprintf(s,"%s(%s)", (t /*Typ()*/ == POLY_CMD ? "poly" : "vector"), ps);
724            return s;
725          }
726          else
727            return omStrDup(pString((poly)d));
728
729        case NUMBER_CMD:
730          StringSetS((char*) (typed ? "number(" : ""));
731          if ((rtyp==IDHDL)&&(IDTYP((idhdl)data)==NUMBER_CMD))
732          {
733            nWrite(IDNUMBER((idhdl)data));
734          }
735          else if (rtyp==NUMBER_CMD)
736          {
737            number n=(number)data;
738            nWrite(n);
739            data=(char *)n;
740          }
741          else if((rtyp==VMINPOLY)&&(rField_is_GF(currRing)))
742          {
743            nfShowMipo(currRing->cf);
744          }
745          else
746          {
747            number n=nCopy((number)d);
748            nWrite(n);
749            nDelete(&n);
750          }
751          s = StringAppendS((char*) (typed ? ")" : ""));
752          return omStrDup(s);
753
754        case BIGINT_CMD:
755          {
756          StringSetS((char*) (typed ? "bigint(" : ""));
757          number nl=(number)d;
758          n_Write(nl,coeffs_BIGINT);
759          s = StringAppendS((char*) (typed ? ")" : ""));
760          return omStrDup(s);
761          }
762
763        case MATRIX_CMD:
764          s= iiStringMatrix((matrix)d,dim, currRing);
765          if (typed)
766          {
767            char* ns = (char*) omAlloc(strlen(s) + 40);
768            sprintf(ns, "matrix(ideal(%s),%d,%d)", s,
769                    ((ideal) d)->nrows, ((ideal) d)->ncols);
770            omCheckAddr(ns);
771            return ns;
772          }
773          else
774          {
775            return omStrDup(s);
776          }
777
778        case MODUL_CMD:
779        case IDEAL_CMD:
780        case MAP_CMD:
781          s= iiStringMatrix((matrix)d,dim, currRing);
782          if (typed)
783          {
784            char* ns = (char*) omAlloc(strlen(s) + 10);
785            sprintf(ns, "%s(%s)", (t/*Typ()*/==MODUL_CMD ? "module" : "ideal"), s);
786            omCheckAddr(ns);
787            return ns;
788          }
789          return omStrDup(s);
790
791        case INTVEC_CMD:
792        case INTMAT_CMD:
793        {
794          intvec *v=(intvec *)d;
795          s = v->String(dim);
796          if (typed)
797          {
798            char* ns;
799            if (t/*Typ()*/ == INTMAT_CMD)
800            {
801              ns = (char*) omAlloc(strlen(s) + 40);
802              sprintf(ns, "intmat(intvec(%s),%d,%d)", s, v->rows(), v->cols());
803            }
804            else
805            {
806              ns = (char*) omAlloc(strlen(s) + 10);
807              sprintf(ns, "intvec(%s)", s);
808            }
809            omCheckAddr(ns);
810            omFree(s);
811            return ns;
812          }
813          else
814            return s;
815        }
816
817        case RING_CMD:
818        case QRING_CMD:
819          s  = rString((ring)d);
820
821          if (typed)
822          {
823            char* ns;
824            if (t/*Typ()*/ == QRING_CMD)
825            {
826              char* id = iiStringMatrix((matrix) ((ring) d)->qideal, dim,
827                              currRing);
828              ns = (char*) omAlloc(strlen(s) + strlen(id) + 20);
829              sprintf(ns, "\"%s\";%sideal(%s)", s,(dim == 2 ? "\n" : " "), id);
830            }
831            else
832            {
833              ns = (char*) omAlloc(strlen(s) + 4);
834              sprintf(ns, "\"%s\"", s);
835            }
836            omFree(s);
837            omCheckAddr(ns);
838            return ns;
839          }
840          return s;
841        case RESOLUTION_CMD:
842        {
843          lists l = syConvRes((syStrategy)d);
844          s = lString(l, typed, dim);
845          l->Clean();
846          return s;
847        }
848
849        case PROC_CMD:
850        {
851          procinfo* pi = (procinfo*) d;
852          if((pi->language == LANG_SINGULAR) && (pi->data.s.body!=NULL))
853            s = (pi->data.s.body);
854          else
855            s = (char *)"";
856          if (typed)
857          {
858            char* ns = (char*) omAlloc(strlen(s) + 4);
859            sprintf(ns, "\"%s\"", s);
860            omCheckAddr(ns);
861            return ns;
862          }
863          return omStrDup(s);
864        }
865
866        case LINK_CMD:
867          s = slString((si_link) d);
868          if (typed)
869          {
870            char* ns = (char*) omAlloc(strlen(s) + 10);
871            sprintf(ns, "link(\"%s\")", s);
872            omFree(s);
873            omCheckAddr(ns);
874            return ns;
875          }
876          return s;
877
878        case LIST_CMD:
879          return lString((lists) d, typed, dim);
880
881        default:
882          if(t> MAX_TOK)
883          {
884            blackbox *bb=getBlackboxStuff(t);
885            if (bb!=NULL) return bb->blackbox_String(bb,d);
886          }
887    } /* end switch: (Typ()) */
888  }
889  return omStrDup("");
890}
891
892
893int  sleftv::Typ()
894{
895  if (e==NULL)
896  {
897    switch (rtyp)
898    {
899      case IDHDL:
900        return IDTYP((idhdl)data);
901      case ALIAS_CMD:
902         {
903           idhdl h=(idhdl)data;
904           return  ((idhdl)h->data.ustring)->typ;
905         }
906      case VECHO:
907      case VPRINTLEVEL:
908      case VCOLMAX:
909      case VTIMER:
910      case VRTIMER:
911      case VOICE:
912      case VMAXDEG:
913      case VMAXMULT:
914      case TRACE:
915      case VSHORTOUT:
916        return INT_CMD;
917      case VMINPOLY:
918        return NUMBER_CMD;
919      case VNOETHER:
920        return POLY_CMD;
921      //case COMMAND:
922      //  return COMMAND;
923      default:
924        return rtyp;
925    }
926  }
927  int r=0;
928  int t=rtyp;
929  if (t==IDHDL) t=IDTYP((idhdl)data);
930  else if (t==ALIAS_CMD) { idhdl h=(idhdl)IDDATA((idhdl)data); t=IDTYP(h); }
931  switch (t)
932  {
933    case INTVEC_CMD:
934    case INTMAT_CMD:
935      r=INT_CMD;
936      break;
937    case IDEAL_CMD:
938    case MATRIX_CMD:
939    case MAP_CMD:
940      r=POLY_CMD;
941      break;
942    case MODUL_CMD:
943      r=VECTOR_CMD;
944      break;
945    case STRING_CMD:
946      r=STRING_CMD;
947      break;
948    default:
949    {
950      blackbox *b=NULL;
951      if (t>MAX_TOK)
952      {
953        b=getBlackboxStuff(t);
954      }
955      if ((t==LIST_CMD)||((b!=NULL)&&BB_LIKE_LIST(b)))
956      {
957        lists l;
958        if (rtyp==IDHDL) l=IDLIST((idhdl)data);
959        else             l=(lists)data;
960        if ((0<e->start)&&(e->start<=l->nr+1))
961        {
962          Subexpr tmp=l->m[e->start-1].e;
963          l->m[e->start-1].e=e->next;
964          r=l->m[e->start-1].Typ();
965          e->next=l->m[e->start-1].e;
966          l->m[e->start-1].e=tmp;
967        }
968        else
969        {
970          //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
971          r=NONE;
972        }
973      }
974      else
975        Werror("cannot index type %s(%d)",Tok2Cmdname(t),t);
976      break;
977    }
978  }
979  return r;
980}
981
982int  sleftv::LTyp()
983{
984  lists l=NULL;
985  int r;
986  if (rtyp==LIST_CMD)
987    l=(lists)data;
988  else if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
989    l=IDLIST((idhdl)data);
990  else
991    return Typ();
992  //if (l!=NULL)
993  {
994    if ((e!=NULL) && (e->next!=NULL))
995    {
996      if ((0<e->start)&&(e->start<=l->nr+1))
997      {
998        l->m[e->start-1].e=e->next;
999        r=l->m[e->start-1].LTyp();
1000        l->m[e->start-1].e=NULL;
1001      }
1002      else
1003      {
1004        //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
1005        r=NONE;
1006      }
1007      return r;
1008    }
1009    return LIST_CMD;
1010  }
1011  return Typ();
1012}
1013
1014void * sleftv::Data()
1015{
1016  if ((rtyp!=IDHDL) && iiCheckRing(rtyp))
1017     return NULL;
1018  if (e==NULL)
1019  {
1020    switch (rtyp)
1021    {
1022      case ALIAS_CMD:
1023      {
1024        idhdl h=(idhdl)data;
1025        return  ((idhdl)h->data.ustring)->data.ustring;
1026      }
1027      case VECHO:      return (void *)si_echo;
1028      case VPRINTLEVEL:return (void *)printlevel;
1029      case VCOLMAX:    return (void *)colmax;
1030      case VTIMER:     return (void *)getTimer();
1031      case VRTIMER:    return (void *)getRTimer();
1032      case VOICE:      return (void *)(myynest+1);
1033      case VMAXDEG:    return (void *)Kstd1_deg;
1034      case VMAXMULT:   return (void *)Kstd1_mu;
1035      case TRACE:      return (void *)traceit;
1036      case VSHORTOUT:  return (void *)(currRing != NULL ? currRing->ShortOut : 0);
1037      case VMINPOLY:   if (currRing != NULL &&
1038                           nCoeff_is_Extension(currRing->cf)&&
1039                           !nCoeff_is_GF(currRing->cf))
1040                       /* Q(a), Fp(a), but not GF(q) */
1041                         return (void *)currRing->cf->extRing->minideal->m[0];
1042                       else
1043                         return (void *)currRing->cf->nNULL;
1044      case VNOETHER:   return (void *) ppNoether;
1045      case IDHDL:
1046        return IDDATA((idhdl)data);
1047      case POINTER_CMD:
1048        return IDDATA((idhdl)data);
1049      case COMMAND:
1050        //return NULL;
1051      default:
1052        return data;
1053    }
1054  }
1055  /* e != NULL : */
1056  int t=rtyp;
1057  void *d=data;
1058  if (t==IDHDL)
1059  {
1060    t=((idhdl)data)->typ;
1061    d=IDDATA((idhdl)data);
1062  }
1063  else if (t==ALIAS_CMD)
1064  {
1065    idhdl h=(idhdl)IDDATA((idhdl)data);
1066    t=IDTYP(h);
1067    d=IDDATA(h);
1068  }
1069  if (iiCheckRing(t))
1070    return NULL;
1071  char *r=NULL;
1072  int index=e->start;
1073  switch (t)
1074  {
1075    case INTVEC_CMD:
1076    {
1077      intvec *iv=(intvec *)d;
1078      if ((index<1)||(index>iv->length()))
1079      {
1080        if (!errorreported)
1081          Werror("wrong range[%d] in intvec(%d)",index,iv->length());
1082      }
1083      else
1084        r=(char *)((*iv)[index-1]);
1085      break;
1086    }
1087    case INTMAT_CMD:
1088    {
1089      intvec *iv=(intvec *)d;
1090      if ((index<1)
1091         ||(index>iv->rows())
1092         ||(e->next->start<1)
1093         ||(e->next->start>iv->cols()))
1094      {
1095        if (!errorreported)
1096        Werror("wrong range[%d,%d] in intmat(%dx%d)",index,e->next->start,
1097                                                     iv->rows(),iv->cols());
1098      }
1099      else
1100        r=(char *)(IMATELEM((*iv),index,e->next->start));
1101      break;
1102    }
1103    case IDEAL_CMD:
1104    case MODUL_CMD:
1105    case MAP_CMD:
1106    {
1107      ideal I=(ideal)d;
1108      if ((index<1)||(index>IDELEMS(I)))
1109      {
1110        if (!errorreported)
1111          Werror("wrong range[%d] in ideal/module(%d)",index,IDELEMS(I));
1112      }
1113      else
1114        r=(char *)I->m[index-1];
1115      break;
1116    }
1117    case STRING_CMD:
1118    {
1119      // this was a memory leak
1120      // we evalute it, cleanup and replace this leftv by it's evalutated form
1121      // the evalutated form will be build in tmp
1122      sleftv tmp;
1123      tmp.Init();
1124      tmp.rtyp=STRING_CMD;
1125      r=(char *)omAllocBin(size_two_bin);
1126      if ((index>0)&& (index<=(int)strlen((char *)d)))
1127      {
1128        r[0]=*(((char *)d)+index-1);
1129        r[1]='\0';
1130      }
1131      else
1132      {
1133        r[0]='\0';
1134      }
1135      tmp.data=r;
1136      if ((rtyp==IDHDL)||(rtyp==STRING_CMD))
1137      {
1138        tmp.next=next; next=NULL;
1139        //if (rtyp==STRING_CMD) { omFree((ADDRESS)data); }
1140        //data=NULL;
1141        d=NULL;
1142        CleanUp();
1143        memcpy(this,&tmp,sizeof(tmp));
1144      }
1145      // and, remember, r is also the result...
1146      else
1147      {
1148        // ???
1149        // here we still have a memory leak...
1150        // example: list L="123","456";
1151        // L[1][2];
1152        // therefore, it should never happen:
1153        assume(0);
1154        // but if it happens: here is the temporary fix:
1155        // omMarkAsStaticAddr(r);
1156      }
1157      break;
1158    }
1159    case MATRIX_CMD:
1160    {
1161      if ((index<1)
1162         ||(index>MATROWS((matrix)d))
1163         ||(e->next->start<1)
1164         ||(e->next->start>MATCOLS((matrix)d)))
1165      {
1166        if (!errorreported)
1167          Werror("wrong range[%d,%d] in intmat(%dx%d)",
1168                  index,e->next->start,
1169                  MATROWS((matrix)d),MATCOLS((matrix)d));
1170      }
1171      else
1172        r=(char *)MATELEM((matrix)d,index,e->next->start);
1173      break;
1174    }
1175    default:
1176    {
1177      blackbox *b=NULL;
1178      if (t>MAX_TOK)
1179      {
1180        b=getBlackboxStuff(t);
1181      }
1182      if ((t==LIST_CMD)||((b!=NULL)&&(BB_LIKE_LIST(b))))
1183      {
1184        lists l=(lists)d;
1185        if ((0<index)&&(index<=l->nr+1))
1186        {
1187          if ((e->next!=NULL)
1188          && (l->m[index-1].rtyp==STRING_CMD))
1189          // string[..].Data() modifies sleftv, so let's do it ourself
1190          {
1191            char *dd=(char *)l->m[index-1].data;
1192            int j=e->next->start-1;
1193            r=(char *)omAllocBin(size_two_bin);
1194            if ((j>=0) && (j<(int)strlen(dd)))
1195            {
1196              r[0]=*(dd+j);
1197              r[1]='\0';
1198            }
1199            else
1200            {
1201              r[0]='\0';
1202            }
1203          }
1204          else
1205          {
1206            Subexpr tmp=l->m[index-1].e;
1207            l->m[index-1].e=e->next;
1208            r=(char *)l->m[index-1].Data();
1209            e->next=l->m[index-1].e;
1210            l->m[index-1].e=tmp;
1211          }
1212        }
1213        else //if (!errorreported)
1214          Werror("wrong range[%d] in list(%d)",index,l->nr+1);
1215      }
1216      else
1217        Werror("cannot index type %s(%d)",Tok2Cmdname(t),t);
1218      break;
1219    }
1220  }
1221  return r;
1222}
1223
1224attr * sleftv::Attribute()
1225{
1226  if (e==NULL) return &attribute;
1227  if ((rtyp==LIST_CMD)
1228  ||((rtyp==IDHDL)&&(IDTYP((idhdl)data)==LIST_CMD)))
1229  {
1230    leftv v=LData();
1231    return &(v->attribute);
1232  }
1233  return NULL;
1234}
1235
1236leftv sleftv::LData()
1237{
1238  if (e!=NULL)
1239  {
1240    lists l=NULL;
1241
1242    if (rtyp==LIST_CMD)
1243      l=(lists)data;
1244    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1245      l=IDLIST((idhdl)data);
1246    if (l!=NULL)
1247    {
1248      if ((0>=e->start)||(e->start>l->nr+1))
1249        return NULL;
1250      if (e->next!=NULL)
1251      {
1252        l->m[e->start-1].e=e->next;
1253        leftv r=l->m[e->start-1].LData();
1254        l->m[e->start-1].e=NULL;
1255        return r;
1256      }
1257      return &(l->m[e->start-1]);
1258    }
1259  }
1260  return this;
1261}
1262
1263leftv sleftv::LHdl()
1264{
1265  if (e!=NULL)
1266  {
1267    lists l=NULL;
1268
1269    if (rtyp==LIST_CMD)
1270      l=(lists)data;
1271    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1272      l=IDLIST((idhdl)data);
1273    if (l!=NULL)
1274    {
1275      if ((0>=e->start)||(e->start>l->nr+1))
1276        return NULL;
1277      if (e->next!=NULL)
1278      {
1279        l->m[e->start-1].e=e->next;
1280        leftv r=l->m[e->start-1].LHdl();
1281        l->m[e->start-1].e=NULL;
1282        return r;
1283      }
1284      return &(l->m[e->start-1]);
1285    }
1286  }
1287  return this;
1288}
1289
1290BOOLEAN assumeStdFlag(leftv h)
1291{
1292  if ((h->e!=NULL)&&(h->LTyp()==LIST_CMD))
1293  {
1294    return assumeStdFlag(h->LData());
1295  }
1296  if (!hasFlag(h,FLAG_STD))
1297  {
1298    if (!TEST_VERB_NSB)
1299      Warn("%s is no standard basis",h->Name());
1300    return FALSE;
1301  }
1302  return TRUE;
1303}
1304
1305/*2
1306* transforms a name (as an string created by omAlloc or omStrDup)
1307* into an expression (sleftv), deletes the string
1308* utility for grammar and iparith
1309*/
1310void syMake(leftv v,const char * id, idhdl packhdl)
1311{
1312  /* resolv an identifier: (to DEF_CMD, if siq>0)
1313  * 1) reserved id: done by scanner
1314  * 2) `basering` / 'Current`
1315  * 3) existing identifier, local
1316  * 4) ringvar, local ring
1317  * 5) existing identifier, global
1318  * 6) monom (resp. number), local ring: consisting of:
1319  * 6') ringvar, global ring
1320  * 6'') monom (resp. number), local ring
1321  * 7) monom (resp. number), non-local ring
1322  * 8) basering
1323  * 9) `_`
1324  * 10) everything else is of type 0
1325  */
1326#ifdef TEST
1327  if ((*id<' ')||(*id>(char)126))
1328  {
1329    Print("wrong id :%s:\n",id);
1330  }
1331#endif
1332  idhdl save_ring=currRingHdl;
1333  v->Init();
1334  if(packhdl != NULL)
1335  {
1336  //  Print("setting req_packhdl to %s\n",IDID(packhdl));
1337    v->req_packhdl = IDPACKAGE(packhdl);
1338  }
1339  else v->req_packhdl = currPack;
1340//  if (v->req_packhdl!=basePack)
1341//    Print("search %s in %s\n",id,v->req_packhdl->libname);
1342  idhdl h=NULL;
1343#ifdef SIQ
1344  if (siq<=0)
1345#endif
1346  {
1347    if (!isdigit(id[0]))
1348    {
1349      if (strcmp(id,"basering")==0)
1350      {
1351        if (currRingHdl!=NULL)
1352        {
1353          if (id!=IDID(currRingHdl)) omFree((ADDRESS)id);
1354          h=currRingHdl;
1355          goto id_found;
1356        }
1357        else
1358        {
1359          v->name = id;
1360          return; /* undefined */
1361        }
1362      }
1363      else if (strcmp(id,"Current")==0)
1364      {
1365        if (currPackHdl!=NULL)
1366        {
1367          omFree((ADDRESS)id);
1368          h=currPackHdl;
1369          goto id_found;
1370        }
1371        else
1372        {
1373          v->name = id;
1374          return; /* undefined */
1375        }
1376      }
1377      if(v->req_packhdl!=currPack)
1378      {
1379        h=v->req_packhdl->idroot->get(id,myynest);
1380      }
1381      else
1382      h=ggetid(id);
1383      /* 3) existing identifier, local */
1384      if ((h!=NULL) && (IDLEV(h)==myynest))
1385      {
1386        if (id!=IDID(h)) omFree((ADDRESS)id);
1387        goto id_found;
1388      }
1389    }
1390    if (yyInRingConstruction)
1391    {
1392      currRingHdl=NULL;
1393    }
1394    /* 4. local ring: ringvar */
1395    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest)
1396    /*&& (!yyInRingConstruction)*/)
1397    {
1398      int vnr;
1399      if ((vnr=r_IsRingVar(id, currRing))>=0)
1400      {
1401        poly p=pOne();
1402        pSetExp(p,vnr+1,1);
1403        pSetm(p);
1404        v->data = (void *)p;
1405        v->name = id;
1406        v->rtyp = POLY_CMD;
1407        return;
1408      }
1409    }
1410    /* 5. existing identifier, global */
1411    if (h!=NULL)
1412    {
1413      if (id!=IDID(h)) omFree((ADDRESS)id);
1414      goto id_found;
1415    }
1416    /* 6. local ring: number/poly */
1417    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest))
1418    {
1419      BOOLEAN ok=FALSE;
1420      /*poly p = (!yyInRingConstruction) ? pmInit(id,ok) : (poly)NULL;*/
1421      poly p = pmInit(id,ok);
1422      if (ok)
1423      {
1424        if (p==NULL)
1425        {
1426          v->data = (void *)nInit(0);
1427          v->rtyp = NUMBER_CMD;
1428          #ifdef HAVE_PLURAL
1429          // in this case we may have monomials equal to 0 in p_Read
1430          v->name = id;
1431          #else
1432          omFree((ADDRESS)id);
1433          #endif
1434        }
1435        else if (pIsConstant(p))
1436        {
1437          v->data = pGetCoeff(p);
1438          pGetCoeff(p)=NULL;
1439          pLmFree(p);
1440          v->rtyp = NUMBER_CMD;
1441          v->name = id;
1442        }
1443        else
1444        {
1445          v->data = p;
1446          v->rtyp = POLY_CMD;
1447          v->name = id;
1448        }
1449        return;
1450      }
1451    }
1452    /* 7. non-local ring: number/poly */
1453    {
1454      BOOLEAN ok=FALSE;
1455      poly p = ((currRing!=NULL)     /* ring required */
1456               && (currRingHdl!=NULL)
1457               /*&& (!yyInRingConstruction) - not in decl */
1458               && (IDLEV(currRingHdl)!=myynest)) /* already in case 4/6 */
1459                     ? pmInit(id,ok) : (poly)NULL;
1460      if (ok)
1461      {
1462        if (p==NULL)
1463        {
1464          v->data = (void *)nInit(0);
1465          v->rtyp = NUMBER_CMD;
1466          #ifdef HAVE_PLURAL
1467          // in this case we may have monomials equal to 0 in p_Read
1468          v->name = id;
1469          #else
1470          omFree((ADDRESS)id);
1471          #endif
1472        }
1473        else
1474        if (pIsConstant(p))
1475        {
1476          v->data = pGetCoeff(p);
1477          pGetCoeff(p)=NULL;
1478          pLmFree(p);
1479          v->rtyp = NUMBER_CMD;
1480          v->name = id;
1481        }
1482        else
1483        {
1484          v->data = p;
1485          v->rtyp = POLY_CMD;
1486          v->name = id;
1487        }
1488        return;
1489      }
1490    }
1491    /* 8. basering ? */
1492    if ((myynest>1)&&(currRingHdl!=NULL))
1493    {
1494      if (strcmp(id,IDID(currRingHdl))==0)
1495      {
1496        if (IDID(currRingHdl)!=id) omFree((ADDRESS)id);
1497        h=currRingHdl;
1498        goto id_found;
1499      }
1500    }
1501    if((v->req_packhdl!=basePack) && (v->req_packhdl==currPack))
1502    {
1503      h=basePack->idroot->get(id,myynest);
1504      if (h!=NULL)
1505      {
1506        if (id!=IDID(h)) omFree((ADDRESS)id);
1507        v->req_packhdl=basePack;
1508        goto id_found;
1509      }
1510    }
1511  }
1512#ifdef SIQ
1513  else
1514    v->rtyp=DEF_CMD;
1515#endif
1516  /* 9: _ */
1517  if (strcmp(id,"_")==0)
1518  {
1519    omFree((ADDRESS)id);
1520    v->Copy(&sLastPrinted);
1521  }
1522  else
1523  {
1524    /* 10: everything else */
1525    /* v->rtyp = UNKNOWN;*/
1526    v->name = id;
1527  }
1528  currRingHdl=save_ring;
1529  return;
1530id_found: // we have an id (in h) found, to set the data in from h
1531  if (IDTYP(h)!=ALIAS_CMD)
1532  {
1533    v->rtyp = IDHDL;
1534    v->flag = IDFLAG(h);
1535    v->attribute=IDATTR(h);
1536  }
1537  else
1538  {
1539    v->rtyp = ALIAS_CMD;
1540  }
1541  v->name = IDID(h);
1542  v->data = (char *)h;
1543  currRingHdl=save_ring;
1544}
1545
1546int sleftv::Eval()
1547{
1548  BOOLEAN nok=FALSE;
1549  leftv nn=next;
1550  next=NULL;
1551  if(rtyp==IDHDL)
1552  {
1553    int t=Typ();
1554    if (t!=PROC_CMD)
1555    {
1556      void *d=CopyD(t);
1557      data=d;
1558      rtyp=t;
1559      name=NULL;
1560      e=NULL;
1561    }
1562  }
1563  else if (rtyp==COMMAND)
1564  {
1565    command d=(command)data;
1566    if(d->op==PROC_CMD) //assume d->argc==2
1567    {
1568      char *what=(char *)(d->arg1.Data());
1569      idhdl h=ggetid(what);
1570      if((h!=NULL)&&(IDTYP(h)==PROC_CMD))
1571      {
1572        nok=d->arg2.Eval();
1573        if(!nok)
1574        {
1575          leftv r=iiMake_proc(h,req_packhdl,&d->arg2);
1576          if (r!=NULL)
1577            memcpy(this,r,sizeof(sleftv));
1578          else
1579            nok=TRUE;
1580        }
1581      }
1582      else nok=TRUE;
1583    }
1584    else if (d->op=='=') //assume d->argc==2
1585    {
1586      if ((d->arg1.rtyp!=IDHDL)&&(d->arg1.rtyp!=DEF_CMD))
1587      {
1588        nok=d->arg1.Eval();
1589      }
1590      if (!nok)
1591      {
1592        const char *n=d->arg1.name;
1593        nok=(n == NULL) || d->arg2.Eval();
1594        if (!nok)
1595        {
1596          int save_typ=d->arg1.rtyp;
1597          omCheckAddr((ADDRESS)n);
1598          if (d->arg1.rtyp!=IDHDL)
1599          syMake(&d->arg1,n);
1600          omCheckAddr((ADDRESS)d->arg1.name);
1601          if (d->arg1.rtyp==IDHDL)
1602          {
1603            n=omStrDup(IDID((idhdl)d->arg1.data));
1604            killhdl((idhdl)d->arg1.data);
1605            d->arg1.Init();
1606            //d->arg1.data=NULL;
1607            d->arg1.name=n;
1608          }
1609          d->arg1.rtyp=DEF_CMD;
1610          sleftv t;
1611          if(save_typ!=PROC_CMD) save_typ=d->arg2.rtyp;
1612          if (::RingDependend(d->arg2.rtyp))
1613            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&currRing->idroot);
1614          else
1615            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&IDROOT);
1616          memcpy(&d->arg1,&t,sizeof(sleftv));
1617          omCheckAddr((ADDRESS)d->arg1.name);
1618          nok=nok||iiAssign(&d->arg1,&d->arg2);
1619          omCheckIf(d->arg1.name != NULL,  // OB: ????
1620                    omCheckAddr((ADDRESS)d->arg1.name));
1621          if (!nok)
1622          {
1623            memset(&d->arg1,0,sizeof(sleftv));
1624            this->CleanUp();
1625            rtyp=NONE;
1626          }
1627        }
1628      }
1629      else nok=TRUE;
1630    }
1631    else if (d->argc==1)
1632    {
1633      nok=d->arg1.Eval();
1634      nok=nok||iiExprArith1(this,&d->arg1,d->op);
1635    }
1636    else if(d->argc==2)
1637    {
1638      nok=d->arg1.Eval();
1639      nok=nok||d->arg2.Eval();
1640      nok=nok||iiExprArith2(this,&d->arg1,d->op,&d->arg2);
1641    }
1642    else if(d->argc==3)
1643    {
1644      nok=d->arg1.Eval();
1645      nok=nok||d->arg2.Eval();
1646      nok=nok||d->arg3.Eval();
1647      nok=nok||iiExprArith3(this,d->op,&d->arg1,&d->arg2,&d->arg3);
1648    }
1649    else if(d->argc!=0)
1650    {
1651      nok=d->arg1.Eval();
1652      nok=nok||iiExprArithM(this,&d->arg1,d->op);
1653    }
1654    else // d->argc == 0
1655    {
1656      nok = iiExprArithM(this, NULL, d->op);
1657    }
1658  }
1659  else if (((rtyp==0)||(rtyp==DEF_CMD))
1660    &&(name!=NULL))
1661  {
1662     syMake(this,name);
1663  }
1664#ifdef MDEBUG
1665  switch(Typ())
1666  {
1667    case NUMBER_CMD:
1668#ifdef LDEBUG
1669      nTest((number)Data());
1670#endif
1671      break;
1672    case BIGINT_CMD:
1673#ifdef LDEBUG
1674      n_Test((number)Data(),coeffs_BIGINT);
1675#endif
1676      break;
1677    case POLY_CMD:
1678      pTest((poly)Data());
1679      break;
1680    case IDEAL_CMD:
1681    case MODUL_CMD:
1682    case MATRIX_CMD:
1683      {
1684        ideal id=(ideal)Data();
1685        omCheckAddrSize(id,sizeof(*id));
1686        int i=id->ncols*id->nrows-1;
1687        for(;i>=0;i--) pTest(id->m[i]);
1688      }
1689      break;
1690  }
1691#endif
1692  if (nn!=NULL) nok=nok||nn->Eval();
1693  next=nn;
1694  return nok;
1695}
1696
1697const char *iiSleftv2name(leftv v)
1698{
1699  return(v->name);
1700}
1701
1702void * sattr::CopyA()
1703{
1704  omCheckAddrSize(this,sizeof(sattr));
1705  return s_internalCopy(atyp,data);
1706}
1707
Note: See TracBrowser for help on using the repository browser.