source: git/Singular/subexpr.cc @ c5f4b9

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