source: git/Singular/subexpr.cc @ c227a2f

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