source: git/Singular/subexpr.cc @ f69c6c

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