source: git/Singular/subexpr.cc @ 06ab6e5

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