source: git/Singular/subexpr.cc @ 317d77f

spielwiese
Last change on this file since 317d77f was 115281, checked in by Frank Seelisch <seelisch@…>, 13 years ago
deleted old cone/fan code git-svn-id: file:///usr/local/Singular/svn/trunk@13887 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 38.0 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)||(attribute!=NULL))
275      {
276        store->attribute=CopyA();
277      }
278      if (e==NULL)
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->attribute!=NULL)||(source->e!=NULL))
564      attribute=source->CopyA();
565    if(source->e==NULL)
566    {
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
609attr 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) return &attribute;
1181  if ((rtyp==LIST_CMD)
1182  ||((rtyp==IDHDL)&&(IDTYP((idhdl)data)==LIST_CMD)))
1183  {
1184    leftv v=LData();
1185    return &(v->attribute);
1186  }
1187  return NULL;
1188}
1189
1190leftv sleftv::LData()
1191{
1192  if (e!=NULL)
1193  {
1194    lists l=NULL;
1195
1196    if (rtyp==LIST_CMD)
1197      l=(lists)data;
1198    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1199      l=IDLIST((idhdl)data);
1200    if (l!=NULL)
1201    {
1202      if ((0>=e->start)||(e->start>l->nr+1))
1203        return NULL;
1204      if (e->next!=NULL)
1205      {
1206        l->m[e->start-1].e=e->next;
1207        leftv r=l->m[e->start-1].LData();
1208        l->m[e->start-1].e=NULL;
1209        return r;
1210      }
1211      return &(l->m[e->start-1]);
1212    }
1213  }
1214  return this;
1215}
1216
1217leftv sleftv::LHdl()
1218{
1219  if (e!=NULL)
1220  {
1221    lists l=NULL;
1222
1223    if (rtyp==LIST_CMD)
1224      l=(lists)data;
1225    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1226      l=IDLIST((idhdl)data);
1227    if (l!=NULL)
1228    {
1229      if ((0>=e->start)||(e->start>l->nr+1))
1230        return NULL;
1231      if (e->next!=NULL)
1232      {
1233        l->m[e->start-1].e=e->next;
1234        leftv r=l->m[e->start-1].LHdl();
1235        l->m[e->start-1].e=NULL;
1236        return r;
1237      }
1238      return &(l->m[e->start-1]);
1239    }
1240  }
1241  return this;
1242}
1243
1244BOOLEAN assumeStdFlag(leftv h)
1245{
1246  if ((h->e!=NULL)&&(h->LTyp()==LIST_CMD))
1247  {
1248    return assumeStdFlag(h->LData());
1249  }
1250  if (!hasFlag(h,FLAG_STD))
1251  {
1252    if (!TEST_VERB_NSB)
1253      Warn("%s is no standard basis",h->Name());
1254    return FALSE;
1255  }
1256  return TRUE;
1257}
1258
1259/*2
1260* transforms a name (as an string created by omAlloc or omStrDup)
1261* into an expression (sleftv), deletes the string
1262* utility for grammar and iparith
1263*/
1264void syMake(leftv v,const char * id, idhdl packhdl)
1265{
1266  /* resolv an identifier: (to DEF_CMD, if siq>0)
1267  * 1) reserved id: done by scanner
1268  * 2) `basering` / 'Current`
1269  * 3) existing identifier, local
1270  * 4) ringvar, local ring
1271  * 5) existing identifier, global
1272  * 6) monom (resp. number), local ring: consisting of:
1273  * 6') ringvar, global ring
1274  * 6'') monom (resp. number), local ring
1275  * 7) monom (resp. number), non-local ring
1276  * 8) basering
1277  * 9) `_`
1278  * 10) everything else is of type 0
1279  */
1280#ifdef TEST
1281  if ((*id<' ')||(*id>(char)126))
1282  {
1283    Print("wrong id :%s:\n",id);
1284  }
1285#endif
1286  idhdl save_ring=currRingHdl;
1287  v->Init();
1288  if(packhdl != NULL)
1289  {
1290  //  Print("setting req_packhdl to %s\n",IDID(packhdl));
1291    v->req_packhdl = IDPACKAGE(packhdl);
1292  }
1293  else v->req_packhdl = currPack;
1294//  if (v->req_packhdl!=basePack)
1295//    Print("search %s in %s\n",id,v->req_packhdl->libname);
1296  idhdl h=NULL;
1297#ifdef SIQ
1298  if (siq<=0)
1299#endif
1300  {
1301    if (!isdigit(id[0]))
1302    {
1303      if (strcmp(id,"basering")==0)
1304      {
1305        if (currRingHdl!=NULL)
1306        {
1307          if (id!=IDID(currRingHdl)) omFree((ADDRESS)id);
1308          h=currRingHdl;
1309          goto id_found;
1310        }
1311        else
1312        {
1313          v->name = id;
1314          return; /* undefined */
1315        }
1316      }
1317      else if (strcmp(id,"Current")==0)
1318      {
1319        if (currPackHdl!=NULL)
1320        {
1321          omFree((ADDRESS)id);
1322          h=currPackHdl;
1323          goto id_found;
1324        }
1325        else
1326        {
1327          v->name = id;
1328          return; /* undefined */
1329        }
1330      }
1331      if(v->req_packhdl!=currPack)
1332      {
1333        h=v->req_packhdl->idroot->get(id,myynest);
1334      }
1335      else
1336      h=ggetid(id);
1337      /* 3) existing identifier, local */
1338      if ((h!=NULL) && (IDLEV(h)==myynest))
1339      {
1340        if (id!=IDID(h)) omFree((ADDRESS)id);
1341        goto id_found;
1342      }
1343    }
1344    if (yyInRingConstruction)
1345    {
1346      currRingHdl=NULL;
1347    }
1348    /* 4. local ring: ringvar */
1349    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest)
1350    /*&& (!yyInRingConstruction)*/)
1351    {
1352      int vnr;
1353      if ((vnr=rIsRingVar(id))>=0)
1354      {
1355        poly p=pOne();
1356        pSetExp(p,vnr+1,1);
1357        pSetm(p);
1358        v->data = (void *)p;
1359        v->name = id;
1360        v->rtyp = POLY_CMD;
1361        return;
1362      }
1363    }
1364    /* 5. existing identifier, global */
1365    if (h!=NULL)
1366    {
1367      if (id!=IDID(h)) omFree((ADDRESS)id);
1368      goto id_found;
1369    }
1370    /* 6. local ring: number/poly */
1371    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest))
1372    {
1373      BOOLEAN ok=FALSE;
1374      /*poly p = (!yyInRingConstruction) ? pmInit(id,ok) : (poly)NULL;*/
1375      poly p = pmInit(id,ok);
1376      if (ok)
1377      {
1378        if (p==NULL)
1379        {
1380          v->data = (void *)nInit(0);
1381          v->rtyp = NUMBER_CMD;
1382          #ifdef HAVE_PLURAL
1383          // in this case we may have monomials equal to 0 in p_Read
1384          v->name = id;
1385          #else
1386          omFree((ADDRESS)id);
1387          #endif
1388        }
1389        else if (pIsConstant(p))
1390        {
1391          v->data = pGetCoeff(p);
1392          pGetCoeff(p)=NULL;
1393          pLmFree(p);
1394          v->rtyp = NUMBER_CMD;
1395          v->name = id;
1396        }
1397        else
1398        {
1399          v->data = p;
1400          v->rtyp = POLY_CMD;
1401          v->name = id;
1402        }
1403        return;
1404      }
1405    }
1406    /* 7. non-local ring: number/poly */
1407    {
1408      BOOLEAN ok=FALSE;
1409      poly p = ((currRing!=NULL)     /* ring required */
1410               && (currRingHdl!=NULL)
1411               /*&& (!yyInRingConstruction) - not in decl */
1412               && (IDLEV(currRingHdl)!=myynest)) /* already in case 4/6 */
1413                     ? pmInit(id,ok) : (poly)NULL;
1414      if (ok)
1415      {
1416        if (p==NULL)
1417        {
1418          v->data = (void *)nInit(0);
1419          v->rtyp = NUMBER_CMD;
1420          #ifdef HAVE_PLURAL
1421          // in this case we may have monomials equal to 0 in p_Read
1422          v->name = id;
1423          #else
1424          omFree((ADDRESS)id);
1425          #endif
1426        }
1427        else
1428        if (pIsConstant(p))
1429        {
1430          v->data = pGetCoeff(p);
1431          pGetCoeff(p)=NULL;
1432          pLmFree(p);
1433          v->rtyp = NUMBER_CMD;
1434          v->name = id;
1435        }
1436        else
1437        {
1438          v->data = p;
1439          v->rtyp = POLY_CMD;
1440          v->name = id;
1441        }
1442        return;
1443      }
1444    }
1445    /* 8. basering ? */
1446    if ((myynest>1)&&(currRingHdl!=NULL))
1447    {
1448      if (strcmp(id,IDID(currRingHdl))==0)
1449      {
1450        if (IDID(currRingHdl)!=id) omFree((ADDRESS)id);
1451        h=currRingHdl;
1452        goto id_found;
1453      }
1454    }
1455    if((v->req_packhdl!=basePack) && (v->req_packhdl==currPack))
1456    {
1457      h=basePack->idroot->get(id,myynest);
1458      if (h!=NULL)
1459      {
1460        if (id!=IDID(h)) omFree((ADDRESS)id);
1461        v->req_packhdl=basePack;
1462        goto id_found;
1463      }
1464    }
1465  }
1466#ifdef SIQ
1467  else
1468    v->rtyp=DEF_CMD;
1469#endif
1470  /* 9: _ */
1471  if (strcmp(id,"_")==0)
1472  {
1473    omFree((ADDRESS)id);
1474    v->Copy(&sLastPrinted);
1475  }
1476  else
1477  {
1478    /* 10: everything else */
1479    /* v->rtyp = UNKNOWN;*/
1480    v->name = id;
1481  }
1482  currRingHdl=save_ring;
1483  return;
1484id_found: // we have an id (in h) found, to set the data in from h
1485  if (IDTYP(h)!=ALIAS_CMD)
1486  {
1487    v->rtyp = IDHDL;
1488    v->flag = IDFLAG(h);
1489    v->attribute=IDATTR(h);
1490  }
1491  else
1492  {
1493    v->rtyp = ALIAS_CMD;
1494  }
1495  v->name = IDID(h);
1496  v->data = (char *)h;
1497  currRingHdl=save_ring;
1498}
1499
1500int sleftv::Eval()
1501{
1502  BOOLEAN nok=FALSE;
1503  leftv nn=next;
1504  next=NULL;
1505  if(rtyp==IDHDL)
1506  {
1507    int t=Typ();
1508    if (t!=PROC_CMD)
1509    {
1510      void *d=CopyD(t);
1511      data=d;
1512      rtyp=t;
1513      name=NULL;
1514      e=NULL;
1515    }
1516  }
1517  else if (rtyp==COMMAND)
1518  {
1519    command d=(command)data;
1520    if(d->op==PROC_CMD) //assume d->argc==2
1521    {
1522      char *what=(char *)(d->arg1.Data());
1523      idhdl h=ggetid(what);
1524      if((h!=NULL)&&(IDTYP(h)==PROC_CMD))
1525      {
1526        nok=d->arg2.Eval();
1527        if(!nok)
1528        {
1529          leftv r=iiMake_proc(h,req_packhdl,&d->arg2);
1530          if (r!=NULL)
1531            memcpy(this,r,sizeof(sleftv));
1532          else
1533            nok=TRUE;
1534        }
1535      }
1536      else nok=TRUE;
1537    }
1538    else if (d->op=='=') //assume d->argc==2
1539    {
1540      if ((d->arg1.rtyp!=IDHDL)&&(d->arg1.rtyp!=DEF_CMD))
1541      {
1542        nok=d->arg1.Eval();
1543      }
1544      if (!nok)
1545      {
1546        const char *n=d->arg1.name;
1547        nok=(n == NULL) || d->arg2.Eval();
1548        if (!nok)
1549        {
1550          int save_typ=d->arg1.rtyp;
1551          omCheckAddr((ADDRESS)n);
1552          if (d->arg1.rtyp!=IDHDL)
1553          syMake(&d->arg1,n);
1554          omCheckAddr((ADDRESS)d->arg1.name);
1555          if (d->arg1.rtyp==IDHDL)
1556          {
1557            n=omStrDup(IDID((idhdl)d->arg1.data));
1558            killhdl((idhdl)d->arg1.data);
1559            d->arg1.Init();
1560            //d->arg1.data=NULL;
1561            d->arg1.name=n;
1562          }
1563          d->arg1.rtyp=DEF_CMD;
1564          sleftv t;
1565          if(save_typ!=PROC_CMD) save_typ=d->arg2.rtyp;
1566          if (::RingDependend(d->arg2.rtyp))
1567            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&currRing->idroot);
1568          else
1569            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&IDROOT);
1570          memcpy(&d->arg1,&t,sizeof(sleftv));
1571          omCheckAddr((ADDRESS)d->arg1.name);
1572          nok=nok||iiAssign(&d->arg1,&d->arg2);
1573          omCheckIf(d->arg1.name != NULL,  // OB: ????
1574                    omCheckAddr((ADDRESS)d->arg1.name));
1575          if (!nok)
1576          {
1577            memset(&d->arg1,0,sizeof(sleftv));
1578            this->CleanUp();
1579            rtyp=NONE;
1580          }
1581        }
1582      }
1583      else nok=TRUE;
1584    }
1585    else if (d->argc==1)
1586    {
1587      nok=d->arg1.Eval();
1588      nok=nok||iiExprArith1(this,&d->arg1,d->op);
1589    }
1590    else if(d->argc==2)
1591    {
1592      nok=d->arg1.Eval();
1593      nok=nok||d->arg2.Eval();
1594      nok=nok||iiExprArith2(this,&d->arg1,d->op,&d->arg2);
1595    }
1596    else if(d->argc==3)
1597    {
1598      nok=d->arg1.Eval();
1599      nok=nok||d->arg2.Eval();
1600      nok=nok||d->arg3.Eval();
1601      nok=nok||iiExprArith3(this,d->op,&d->arg1,&d->arg2,&d->arg3);
1602    }
1603    else if(d->argc!=0)
1604    {
1605      nok=d->arg1.Eval();
1606      nok=nok||iiExprArithM(this,&d->arg1,d->op);
1607    }
1608    else // d->argc == 0
1609    {
1610      nok = iiExprArithM(this, NULL, d->op);
1611    }
1612  }
1613  else if (((rtyp==0)||(rtyp==DEF_CMD))
1614    &&(name!=NULL))
1615  {
1616     syMake(this,name);
1617  }
1618#ifdef MDEBUG
1619  switch(Typ())
1620  {
1621    case NUMBER_CMD:
1622#ifdef LDEBUG
1623      nTest((number)Data());
1624#endif
1625      break;
1626    case BIGINT_CMD:
1627#ifdef LDEBUG
1628      nlTest((number)Data());
1629#endif
1630      break;
1631    case POLY_CMD:
1632      pTest((poly)Data());
1633      break;
1634    case IDEAL_CMD:
1635    case MODUL_CMD:
1636    case MATRIX_CMD:
1637      {
1638        ideal id=(ideal)Data();
1639        omCheckAddrSize(id,sizeof(*id));
1640        int i=id->ncols*id->nrows-1;
1641        for(;i>=0;i--) pTest(id->m[i]);
1642      }
1643      break;
1644  }
1645#endif
1646  if (nn!=NULL) nok=nok||nn->Eval();
1647  next=nn;
1648  return nok;
1649}
1650
1651const char *iiSleftv2name(leftv v)
1652{
1653  return(v->name);
1654}
1655
1656void * sattr::CopyA()
1657{
1658  omCheckAddrSize(this,sizeof(sattr));
1659  return s_internalCopy(atyp,data);
1660}
1661
Note: See TracBrowser for help on using the repository browser.