source: git/Singular/subexpr.cc @ e050c2

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