source: git/Singular/subexpr.cc @ 4cbe5d

spielwiese
Last change on this file since 4cbe5d was 4cbe5d, checked in by Hans Schönemann <hannes@…>, 23 years ago
*hannes: bug 23 git-svn-id: file:///usr/local/Singular/svn/trunk@5208 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 38.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT: handling of leftv
6*/
7/* $Id: subexpr.cc,v 1.71 2001-02-08 12:55:51 Singular 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
447BOOLEAN sleftv::RingDependend()
448{
449  int rt=Typ();
450  if((BEGIN_RING<rt) && (rt<END_RING) && (rt!=QRING_CMD))
451    return TRUE;
452  if (rt==LIST_CMD)
453    return lRingDependend((lists)Data());
454  return FALSE; 
455}
456
457void * slInternalCopy(leftv source, int t, void *d, Subexpr e)
458{
459  switch (t)
460  {
461    case INTVEC_CMD:
462    case INTMAT_CMD:
463      return (void *)ivCopy((intvec *)d);
464    case MATRIX_CMD:
465      return (void *)mpCopy((matrix)d);
466    case IDEAL_CMD:
467    case MODUL_CMD:
468      return  (void *)idCopy((ideal)d);
469    case STRING_CMD:
470      if ((e==NULL)
471      || (source->rtyp==LIST_CMD)
472      || ((source->rtyp==IDHDL)&&(IDTYP((idhdl)source->data)==LIST_CMD)))
473        return (void *)omStrDup((char *)d);
474      else if (e->next==NULL)
475      {
476        char *s=(char*)omAllocBin(size_two_bin);
477        s[0]=*(char *)d;
478        s[1]='\0';
479        return s;
480      }
481      #ifdef TEST
482      else
483      {
484        Werror("not impl. string-op in `%s`",my_yylinebuf);
485        return NULL;
486      }
487      #endif
488    case POINTER_CMD:
489      return d;
490    case PACKAGE_CMD:
491      return  (void *)paCopy((package) d);
492    case PROC_CMD:
493      return  (void *)piCopy((procinfov) d);
494    case POLY_CMD:
495    case VECTOR_CMD:
496      return  (void *)pCopy((poly)d);
497    case INT_CMD:
498      return  d;
499    case NUMBER_CMD:
500      return  (void *)nCopy((number)d);
501    case MAP_CMD:
502      return  (void *)maCopy((map)d);
503    case LIST_CMD:
504      return  (void *)lCopy((lists)d);
505    case LINK_CMD:
506      return (void *)slCopy((si_link) d);
507    case RING_CMD:
508    case QRING_CMD:
509      {
510        ring r=(ring)d;
511        r->ref++;
512        return d;
513      }
514    case RESOLUTION_CMD:
515      return (void*)syCopy((syStrategy)d);
516#ifdef TEST
517    case DEF_CMD:
518    case NONE:
519      break; /* error recovery: do nothing */
520    //case COMMAND:
521    default:
522      Warn("InternalCopy: cannot copy type %s(%d)",
523            Tok2Cmdname(source->rtyp),source->rtyp);
524#endif
525  }
526  return NULL;
527}
528
529void sleftv::Copy(leftv source)
530{
531  memset(this,0,sizeof(*this));
532  rtyp=source->Typ();
533  void *d=source->Data();
534  if(!errorreported)
535  {
536    switch (rtyp)
537    {
538      case INTVEC_CMD:
539      case INTMAT_CMD:
540        data=(void *)ivCopy((intvec *)d);
541        break;
542      case MATRIX_CMD:
543        data=(void *)mpCopy((matrix)d);
544        break;
545      case IDEAL_CMD:
546      case MODUL_CMD:
547        data= (void *)idCopy((ideal)d);
548        break;
549      case STRING_CMD:
550        data= (void *)omStrDup((char *)d);
551        break;
552      case POINTER_CMD:
553        data=d;
554        break;
555      case PROC_CMD:
556        data= (void *)piCopy((procinfov) d);
557        break;
558      case POLY_CMD:
559      case VECTOR_CMD:
560        data= (void *)pCopy((poly)d);
561        break;
562      case INT_CMD:
563        data= d;
564        break;
565      case NUMBER_CMD:
566        data= (void *)nCopy((number)d);
567        break;
568      case MAP_CMD:
569        data= (void *)maCopy((map)d);
570        break;
571      case LIST_CMD:
572        data= (void *)lCopy((lists)d);
573        break;
574      case LINK_CMD:
575        data = (void *)slCopy((si_link)d);
576        break;
577      case RING_CMD:
578      case QRING_CMD:
579        {
580          if (d!=NULL)
581          {
582            ring r=(ring)d;
583            r->ref++;
584            data=d;
585          }
586          else
587          {
588            WerrorS("invalid ring description");
589          }
590          break;
591        }
592      case RESOLUTION_CMD:
593        data=(void*)syCopy((syStrategy)d);
594        break;
595      #ifdef TEST
596      case DEF_CMD:
597      case NONE:
598        break; /* error recovery: do nothing */
599      //case COMMAND:
600      default:
601        Warn("Copy: cannot copy type %s(%d)",Tok2Cmdname(rtyp),rtyp);
602      #endif
603    }
604#ifdef HAVE_NAMESPACES
605    packhdl = source->packhdl;
606    req_packhdl = source->req_packhdl;
607#endif /* HAVE_NAMESPACES */
608    if ((source->attribute!=NULL)||(source->e!=NULL))
609      attribute=source->CopyA();
610    if(source->e==NULL)
611    {
612      flag=source->flag;
613    }
614    //else
615    //{
616    //}
617    if (source->next!=NULL)
618    {
619      next=(leftv)omAllocBin(sleftv_bin);
620      next->Copy(source->next);
621    }
622  }
623}
624
625void * sleftv::CopyD(int t)
626{
627  if ((rtyp!=IDHDL)&&(e==NULL))
628  {
629    if (iiCheckRing(t)) return NULL;
630    void *x=data;
631    if (rtyp==VNOETHER) x=(void *)pCopy(ppNoether);
632    else if (rtyp==LIB_CMD)
633      x=(void *)omStrDup((char *)Data());
634    else if ((rtyp==VMINPOLY)&& (currRing->minpoly!=NULL)&&(!rField_is_GF()))
635      x=(void *)nCopy(currRing->minpoly);
636    data=NULL;
637    return x;
638  }
639  void *d=Data(); // will also do a iiCheckRing
640  if ((!errorreported) && (d!=NULL)) return slInternalCopy(this,t,d,e);
641  return NULL;
642}
643
644//void * sleftv::CopyD()
645//{
646  //if ((rtyp!=IDHDL)&&(e==NULL)
647  //&&(rtyp!=VNOETHER)&&(rtyp!=LIB_CMD)&&(rtyp!=VMINPOLY))
648  //{
649  //  void *x=data;
650  //  data=NULL;
651  //  return x;
652  //}
653//  return CopyD(Typ());
654//}
655
656attr sleftv::CopyA()
657{
658  attr *a=Attribute();
659  if ((a!=NULL) && (*a!=NULL))
660    return (*a)->Copy();
661  return NULL;
662}
663
664char *  sleftv::String(void *d, BOOLEAN typed, int dim)
665{
666#ifdef SIQ
667  if (rtyp==COMMAND)
668  {
669    ::Print("##command %d\n",((command)data)->op);
670    if (((command)data)->arg1.rtyp!=0)
671      ((command)data)->arg1.Print(NULL,2);
672    if (((command)data)->arg2.rtyp!=0)
673      ((command)data)->arg2.Print(NULL,2);
674    if (((command)data)->arg3.rtyp==0)
675      ((command)data)->arg3.Print(NULL,2);
676    PrintS("##end\n");
677    return omStrDup("");
678  }
679#endif
680  if (d==NULL) d=Data();
681  if (!errorreported)
682  {
683    char *s;
684    const char *n;
685    if (name!=NULL) n=name;
686    else n=sNoName;
687    switch (Typ())
688    {
689        case INT_CMD:
690          if (typed)
691          {
692            s=(char *)omAlloc(MAX_INT_LEN+7);
693            sprintf(s,"int(%d)",(int)d);
694          }
695          else
696          {
697            s=(char *)omAlloc(MAX_INT_LEN+2);
698            sprintf(s,"%d",(int)d);
699          }
700          return s;
701
702        case STRING_CMD:
703          if (d == NULL)
704          {
705            if (typed) return omStrDup("\"\"");
706            return omStrDup("");
707          }
708          if (typed)
709          {
710            s = (char*) omAlloc(strlen((char*) d) + 3);
711            sprintf(s,"\"%s\"", (char*) d);
712            return s;
713          }
714          else
715          {
716            return omStrDup((char*)d);
717          }
718
719        case POLY_CMD:
720        case VECTOR_CMD:
721          if (typed)
722          {
723            char* ps = pString((poly) d);
724            s = (char*) omAlloc(strlen(ps) + 10);
725            sprintf(s,"%s(%s)", (Typ() == POLY_CMD ? "poly" : "vector"), ps);
726            return s;
727          }
728          else
729            return omStrDup(pString((poly)d));
730
731        case NUMBER_CMD:
732          StringSetS((char*) (typed ? "number(" : ""));
733          if ((rtyp==IDHDL)&&(IDTYP((idhdl)data)==NUMBER_CMD))
734          {
735            nWrite(IDNUMBER((idhdl)data));
736          }
737          else if (rtyp==NUMBER_CMD)
738          {
739            number n=(number)data;
740            nWrite(n);
741            data=(char *)n;
742          }
743          else if((rtyp==VMINPOLY)&&(rField_is_GF()))
744          {
745            nfShowMipo();
746          }
747          else
748          {
749            number n=nCopy((number)d);
750            nWrite(n);
751            nDelete(&n);
752          }
753          s = StringAppendS((char*) (typed ? ")" : ""));
754          return omStrDup(s);
755
756        case MATRIX_CMD:
757          s= iiStringMatrix((matrix)d,dim);
758          if (typed)
759          {
760            char* ns = (char*) omAlloc(strlen(s) + 40);
761            sprintf(ns, "matrix(ideal(%s),%d,%d)", s,
762                    ((ideal) d)->nrows, ((ideal) d)->ncols);
763            omCheckAddr(ns);
764            return ns;
765          }
766          else
767          {
768            return omStrDup(s);
769          }
770
771        case MODUL_CMD:
772        case IDEAL_CMD:
773        case MAP_CMD:
774          s= iiStringMatrix((matrix)d,dim);
775          if (typed)
776          {
777            char* ns = (char*) omAlloc(strlen(s) + 10);
778            sprintf(ns, "%s(%s)", (Typ()==MODUL_CMD ? "module" : "ideal"), s);
779            omCheckAddr(ns);
780            return ns;
781          }
782          return omStrDup(s);
783
784        case INTVEC_CMD:
785        case INTMAT_CMD:
786        {
787          intvec *v=(intvec *)d;
788          s = v->String(dim);
789          if (typed)
790          {
791            char* ns;
792            if (Typ() == INTMAT_CMD)
793            {
794              ns = (char*) omAlloc(strlen(s) + 40);
795              sprintf(ns, "intmat(intvec(%s),%d,%d)", s, v->rows(), v->cols());
796            }
797            else
798            {
799              ns = (char*) omAlloc(strlen(s) + 10);
800              sprintf(ns, "intvec(%s)", s);
801            }
802            omCheckAddr(ns);
803            omFree(s);
804            return ns;
805          }
806          else
807            return s;
808        }
809
810        case RING_CMD:
811        case QRING_CMD:
812          s  = rString((ring)d);
813
814          if (typed)
815          {
816            char* ns;
817            if (Typ() == QRING_CMD)
818            {
819              char* id = iiStringMatrix((matrix) ((ring) d)->qideal, dim);
820              ns = (char*) omAlloc(strlen(s) + strlen(id) + 20);
821              sprintf(ns, "\"%s\";%sideal(%s)", s,(dim == 2 ? "\n" : " "), id);
822            }
823            else
824            {
825              ns = (char*) omAlloc(strlen(s) + 4);
826              sprintf(ns, "\"%s\"", s);
827            }
828            omFree(s);
829            omCheckAddr(ns);
830            return ns;
831          }
832          return s;
833
834        case RESOLUTION_CMD:
835        {
836          lists l = syConvRes((syStrategy)d);
837          s = lString(l, typed, dim);
838          l->Clean();
839          return s;
840        }
841
842        case PROC_CMD:
843        {
844          procinfo* pi = (procinfo*) d;
845          if((pi->language == LANG_SINGULAR) && (pi->data.s.body!=NULL))
846            s = (pi->data.s.body);
847          else
848            s = "";
849          if (typed)
850          {
851            char* ns = (char*) omAlloc(strlen(s) + 4);
852            sprintf(ns, "\"%s\"", s);
853            omCheckAddr(ns);
854            return ns;
855          }
856          return omStrDup(s);
857        }
858
859        case LINK_CMD:
860          s = slString((si_link) d);
861          if (typed)
862          {
863            char* ns = (char*) omAlloc(strlen(s) + 10);
864            sprintf(ns, "link(\"%s\")", s);
865            omFree(s);
866            omCheckAddr(ns);
867            return ns;
868          }
869          return s;
870
871        case LIST_CMD:
872          return lString((lists) d, typed, dim);
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#ifdef SRING
888      case VALTVARS:
889#endif
890      case VECHO:
891      case VPAGELENGTH:
892      case VPRINTLEVEL:
893      case VCOLMAX:
894      case VTIMER:
895#ifdef HAVE_RTIMER
896      case VRTIMER:
897#endif
898      case VOICE:
899      case VMAXDEG:
900      case VMAXMULT:
901      case TRACE:
902      case VSHORTOUT:
903        return INT_CMD;
904      case LIB_CMD:
905        return STRING_CMD;
906      case VMINPOLY:
907        return NUMBER_CMD;
908      case VNOETHER:
909        return POLY_CMD;
910      //case COMMAND:
911      //  return COMMAND;
912      default:
913        return rtyp;
914    }
915  }
916  int r=0;
917  int t=rtyp;
918  if (t==IDHDL) t=IDTYP((idhdl)data);
919  switch (t)
920  {
921    case INTVEC_CMD:
922    case INTMAT_CMD:
923      r=INT_CMD;
924      break;
925    case IDEAL_CMD:
926    case MATRIX_CMD:
927    case MAP_CMD:
928      r=POLY_CMD;
929      break;
930    case MODUL_CMD:
931      r=VECTOR_CMD;
932      break;
933    case STRING_CMD:
934      r=STRING_CMD;
935      break;
936    case LIST_CMD:
937    {
938      lists l;
939      if (rtyp==IDHDL) l=IDLIST((idhdl)data);
940      else             l=(lists)data;
941      if ((0<e->start)&&(e->start<=l->nr+1))
942      {
943        l->m[e->start-1].e=e->next;
944        r=l->m[e->start-1].Typ();
945        l->m[e->start-1].e=NULL;
946      }
947      else
948      {
949        //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
950        r=NONE;
951      }
952      break;
953    }
954    default:
955      Werror("cannot index type %d",t);
956  }
957  return r;
958}
959
960int  sleftv::LTyp()
961{
962  lists l=NULL;
963  int r;
964  if (rtyp==LIST_CMD)
965    l=(lists)data;
966  else if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
967    l=IDLIST((idhdl)data);
968  else
969    return Typ();
970  //if (l!=NULL)
971  {
972    if ((e!=NULL) && (e->next!=NULL))
973    {
974      if ((0<e->start)&&(e->start<=l->nr+1))
975      {
976        l->m[e->start-1].e=e->next;
977        r=l->m[e->start-1].LTyp();
978        l->m[e->start-1].e=NULL;
979      }
980      else
981      {
982        //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
983        r=NONE;
984      }
985      return r;
986    }
987    return LIST_CMD;
988  }
989  return Typ();
990}
991
992void sleftv::SetData(void* what)
993{
994  if (rtyp == IDHDL)
995  {
996    IDDATA((idhdl)data) = (char *)what;
997  }
998  else
999  {
1000    data = what;
1001  }
1002}
1003
1004void * sleftv::Data()
1005{
1006  if (rtyp!=IDHDL && iiCheckRing(rtyp))
1007     return NULL;
1008  if (e==NULL)
1009  {
1010    switch (rtyp)
1011    {
1012      case VECHO:      return (void *)si_echo;
1013      case VPAGELENGTH:return (void *)pagelength;
1014      case VPRINTLEVEL:return (void *)printlevel;
1015      case VCOLMAX:    return (void *)colmax;
1016      case VTIMER:     return (void *)getTimer();
1017#ifdef HAVE_RTIMER
1018      case VRTIMER:    return (void *)getRTimer();
1019#endif
1020      case VOICE:      return (void *)(myynest+1);
1021      case VMAXDEG:    return (void *)Kstd1_deg;
1022      case VMAXMULT:   return (void *)Kstd1_mu;
1023      case TRACE:      return (void *)traceit;
1024      case VSHORTOUT:  return (void *)(currRing != NULL ? currRing->ShortOut : 0);
1025      case VMINPOLY:   if (currRing != NULL && 
1026                           (currRing->minpoly!=NULL)&&(!rField_is_GF()))
1027                       /* Q(a), Fp(a), but not GF(q) */
1028                         return (void *)currRing->minpoly;
1029                       else
1030                         return (void *)nNULL;
1031      case VNOETHER:   return (void *) ppNoether;
1032      case LIB_CMD:    {
1033                         idhdl h = ggetid( "LIB" );
1034                         if(h==NULL) return (void *)sNoName;
1035                         return IDSTRING(h);
1036                       }
1037      case IDHDL:
1038        return IDDATA((idhdl)data);
1039      case POINTER_CMD:
1040        return IDDATA((idhdl)data);
1041      case COMMAND:
1042        //return NULL;
1043      default:
1044        return data;
1045    }
1046  }
1047  /* e != NULL : */
1048  int t=rtyp;
1049  void *d=data;
1050  if (t==IDHDL)
1051  {
1052    t=((idhdl)data)->typ;
1053    d=IDDATA((idhdl)data);
1054  }
1055  if (iiCheckRing(t))
1056    return NULL;
1057  char *r=NULL;
1058  int index=e->start;
1059  switch (t)
1060  {
1061    case INTVEC_CMD:
1062    {
1063      intvec *iv=(intvec *)d;
1064      if ((index<1)||(index>iv->length()))
1065      {
1066        if (!errorreported)
1067          Werror("wrong range[%d] in intvec(%d)",index,iv->length());
1068      }
1069      else
1070        r=(char *)((*iv)[index-1]);
1071      break;
1072    }
1073    case INTMAT_CMD:
1074    {
1075      intvec *iv=(intvec *)d;
1076      if ((index<1)
1077         ||(index>iv->rows())
1078         ||(e->next->start<1)
1079         ||(e->next->start>iv->cols()))
1080      {
1081        if (!errorreported)
1082        Werror("wrong range[%d,%d] in intmat(%dx%d)",index,e->next->start,
1083                                                     iv->rows(),iv->cols());
1084      }
1085      else
1086        r=(char *)(IMATELEM((*iv),index,e->next->start));
1087      break;
1088    }
1089    case IDEAL_CMD:
1090    case MODUL_CMD:
1091    case MAP_CMD:
1092    {
1093      ideal I=(ideal)d;
1094      if ((index<1)||(index>IDELEMS(I)))
1095      {
1096        if (!errorreported)
1097          Werror("wrong range[%d] in ideal/module(%d)",index,IDELEMS(I));
1098      }
1099      else
1100        r=(char *)I->m[index-1];
1101      break;
1102    }
1103    case STRING_CMD:
1104    {
1105      // this was a memory leak
1106      // we evalute it, cleanup and replace this leftv by it's evalutated form
1107      // the evalutated form will be build in tmp
1108      sleftv tmp;
1109      memset(&tmp,0,sizeof(tmp));
1110      tmp.rtyp=STRING_CMD;
1111      r=(char *)omAllocBin(size_two_bin);
1112      if ((index>0)&& (index<=(int)strlen((char *)d)))
1113      {
1114        r[0]=*(((char *)d)+index-1);
1115        r[1]='\0';
1116      }
1117      else
1118      {
1119        r[0]='\0';
1120      }
1121      tmp.data=r;
1122      if ((rtyp==IDHDL)||(rtyp==STRING_CMD))
1123      {
1124        tmp.next=next; next=NULL;
1125        data=NULL; d=NULL;
1126        CleanUp();
1127        memcpy(this,&tmp,sizeof(tmp));
1128      }
1129      // and, remember, r is also the result...
1130      else
1131      {
1132        // ???
1133        // here we still have a memory leak...
1134        // example: list L="123","456";
1135        // L[1][2];
1136        // therefore, it should never happen:
1137        assume(0);
1138        // but if it happens: here is the temporary fix:
1139        // omMarkAsStaticAddr(r);
1140      }
1141      break;
1142    }
1143    case MATRIX_CMD:
1144    {
1145      if ((index<1)
1146         ||(index>MATROWS((matrix)d))
1147         ||(e->next->start<1)
1148         ||(e->next->start>MATCOLS((matrix)d)))
1149      {
1150        if (!errorreported)
1151          Werror("wrong range[%d,%d] in intmat(%dx%d)",
1152                  index,e->next->start,
1153                  MATROWS((matrix)d),MATCOLS((matrix)d));
1154      }
1155      else
1156        r=(char *)MATELEM((matrix)d,index,e->next->start);
1157      break;
1158    }
1159    case LIST_CMD:
1160    {
1161      lists l=(lists)d;
1162      if ((0<index)&&(index<=l->nr+1))
1163      {
1164        if ((e->next!=NULL)
1165        && (l->m[index-1].rtyp==STRING_CMD))
1166        // string[..].Data() modifies sleftv, so let's do it ourself
1167        {
1168          char *dd=(char *)l->m[index-1].data;
1169          int j=e->next->start-1;
1170          r=(char *)omAllocBin(size_two_bin);
1171          if ((j>=0) && (j<(int)strlen(dd)))
1172          {
1173            r[0]=*(dd+j);
1174            r[1]='\0';
1175          }
1176          else
1177          {
1178            r[0]='\0';
1179          }
1180        }
1181        else
1182        {
1183          l->m[index-1].e=e->next;
1184          r=(char *)l->m[index-1].Data();
1185          l->m[index-1].e=NULL;
1186        }
1187      }
1188      else //if (!errorreported)
1189        Werror("wrong range[%d] in list(%d)",index,l->nr+1);
1190      break;
1191    }
1192#ifdef TEST
1193    default:
1194      Werror("cannot index type %s(%d)",Tok2Cmdname(t),t);
1195#endif
1196  }
1197  return r;
1198}
1199
1200attr * sleftv::Attribute()
1201{
1202  if (e==NULL) return &attribute;
1203  if ((rtyp==LIST_CMD)
1204  ||((rtyp==IDHDL)&&(IDTYP((idhdl)data)==LIST_CMD)))
1205  {
1206    leftv v=LData();
1207    return &(v->attribute);
1208  }
1209  return NULL;
1210}
1211
1212leftv sleftv::LData()
1213{
1214  if (e!=NULL)
1215  {
1216    lists l=NULL;
1217
1218    if (rtyp==LIST_CMD)
1219      l=(lists)data;
1220    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1221      l=IDLIST((idhdl)data);
1222    if (l!=NULL)
1223    {
1224      if ((0>=e->start)||(e->start>l->nr+1))
1225        return NULL;
1226      if (e->next!=NULL)
1227      {
1228        l->m[e->start-1].e=e->next;
1229        leftv r=l->m[e->start-1].LData();
1230        l->m[e->start-1].e=NULL;
1231        return r;
1232      }
1233      return &(l->m[e->start-1]);
1234    }
1235  }
1236  return this;
1237}
1238
1239leftv sleftv::LHdl()
1240{
1241  if (e!=NULL)
1242  {
1243    lists l=NULL;
1244
1245    if (rtyp==LIST_CMD)
1246      l=(lists)data;
1247    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1248      l=IDLIST((idhdl)data);
1249    if (l!=NULL)
1250    {
1251      if ((0>=e->start)||(e->start>l->nr+1))
1252        return NULL;
1253      if (e->next!=NULL)
1254      {
1255        l->m[e->start-1].e=e->next;
1256        leftv r=l->m[e->start-1].LHdl();
1257        l->m[e->start-1].e=NULL;
1258        return r;
1259      }
1260      return &(l->m[e->start-1]);
1261    }
1262  }
1263  return this;
1264}
1265
1266BOOLEAN assumeStdFlag(leftv h)
1267{
1268  if ((h->e!=NULL)&&(h->LTyp()==LIST_CMD))
1269  {
1270    return assumeStdFlag(h->LData());
1271  }
1272  if (!hasFlag(h,FLAG_STD))
1273  {
1274    if (!TEST_VERB_NSB)
1275      Warn("%s is no standardbasis",h->Name());
1276    return FALSE;
1277  }
1278  return TRUE;
1279}
1280
1281/*2
1282* transforms a name (as an string created by omAlloc or omStrDup)
1283* into an expression (sleftv), deletes the string
1284* utility for grammar and iparith
1285*/
1286void syMake(leftv v,char * id, idhdl packhdl)
1287{
1288  /* resolv an identifier: (to DEF_CMD, if siq>0)
1289  * 1) reserved id: done by scanner
1290  * 2) `basering`
1291  * 3) existing identifier, local
1292  * 4) ringvar, local ring
1293  * 5) existing identifier, global
1294  * 6) monom (resp. number), local ring: consisting of:
1295  * 6') ringvar, global ring
1296  * 6'') monom (resp. number), local ring
1297  * 7) monom (resp. number), non-local ring
1298  * 8) basering
1299  * 9) `_`
1300  * 10) everything else is of type 0
1301  */
1302#ifdef TEST
1303  if ((*id<' ')||(*id>(char)126))
1304  {
1305    Print("wrong id :%s:\n",id);
1306  }
1307#endif
1308  memset(v,0,sizeof(sleftv));
1309#ifdef HAVE_NAMESPACES
1310  v->packhdl = NULL;
1311  if(packhdl != NULL)
1312    v->req_packhdl = packhdl;
1313  else v->req_packhdl = namespaceroot->get(namespaceroot->name, 0, TRUE);
1314#endif /* HAVE_NAMESPACES */
1315#ifdef SIQ
1316  if (siq<=0)
1317#endif
1318  {
1319    idhdl h=NULL;
1320    if (!isdigit(id[0]))
1321    {
1322      if (strcmp(id,"basering")==0)
1323      {
1324        if (currRingHdl!=NULL)
1325        {
1326          if (id!=IDID(currRingHdl)) omFree((ADDRESS)id);
1327          v->rtyp = IDHDL;
1328          v->data = (char *)currRingHdl;
1329          v->name = IDID(currRingHdl);
1330          v->flag = IDFLAG(currRingHdl);
1331          return;
1332        }
1333        else
1334        {
1335          v->name = id;
1336          return; /* undefined */
1337        }
1338      }
1339#ifdef HAVE_NAMESPACES
1340      if (strcmp(id,"Current")==0)
1341      {
1342        h = namespaceroot->get(namespaceroot->name,0, TRUE);
1343        if (id!=IDID(h)) omFree((ADDRESS)id);
1344        v->rtyp = IDHDL;
1345        v->data = (char *)h;
1346        v->flag = IDFLAG(h);
1347        v->name = IDID(h);
1348        v->attribute=IDATTR(h);
1349        return;
1350      }
1351      if (strcmp(id,"Up")==0)
1352      { namehdl ns=namespaceroot;
1353        if (!ns->isroot) ns=ns->next;
1354        if (id!=ns->name) omFree((ADDRESS)id);
1355        v->rtyp = NSHDL;
1356        v->data = (char *)ns;
1357        v->name = omStrDup(ns->name);
1358        return;
1359      }
1360      h=ggetid(id, packhdl==NULL ? FALSE : TRUE, &(v->packhdl));
1361      //if(h==NULL) Print("syMake: h is null\n");
1362#else /* HAVE_NAMESPACES */
1363      h=ggetid(id);
1364#endif /* HAVE_NAMESPACES */
1365      /* 3) existing identifier, local */
1366      if ((h!=NULL) && (IDLEV(h)==myynest))
1367      {
1368        if (id!=IDID(h)) omFree((ADDRESS)id);
1369        v->rtyp = IDHDL;
1370        v->data = (char *)h;
1371        v->flag = IDFLAG(h);
1372        v->name = IDID(h);
1373        v->attribute=IDATTR(h);
1374        return;
1375      }
1376    }
1377    /* 4. local ring: ringvar */
1378    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest))
1379    {
1380      int vnr;
1381      if ((vnr=rIsRingVar(id))>=0)
1382      {
1383        poly p=pOne();
1384        pSetExp(p,vnr+1,1);
1385        pSetm(p);
1386        v->data = (void *)p;
1387        v->name = id;
1388        v->rtyp = POLY_CMD;
1389        return;
1390      }
1391    }
1392    /* 5. existing identifier, global */
1393    if (h!=NULL)
1394    {
1395      if (id!=IDID(h)) omFree((ADDRESS)id);
1396      v->rtyp = IDHDL;
1397      v->data = (char *)h;
1398      v->flag = IDFLAG(h);
1399      v->name = IDID(h);
1400      v->attribute=IDATTR(h);
1401      return;
1402    }
1403    /* 6. local ring: number/poly */
1404    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest))
1405    {
1406      BOOLEAN ok=FALSE;
1407      poly p = (!yyInRingConstruction) ? pmInit(id,ok) : (poly)NULL;
1408      if (ok)
1409      {
1410        if (p==NULL)
1411        {
1412          v->data = (void *)nInit(0);
1413          v->rtyp = NUMBER_CMD;
1414          omFree((ADDRESS)id);
1415        }
1416        else
1417        if (pIsConstant(p))
1418        {
1419          v->data = pGetCoeff(p);
1420          pGetCoeff(p)=NULL;
1421          pLmFree(p);
1422          v->rtyp = NUMBER_CMD;
1423          v->name = id;
1424        }
1425        else
1426        {
1427          v->data = p;
1428          v->rtyp = POLY_CMD;
1429          v->name = id;
1430        }
1431        return;
1432      }
1433    }
1434    /* 7. non-local ring: number/poly */
1435    {
1436      BOOLEAN ok=FALSE;
1437      poly p = ((currRingHdl!=NULL)     /* ring required */
1438               &&(!yyInRingConstruction) /* not in decl */
1439               &&(IDLEV(currRingHdl)!=myynest)) /* already in case 4/6 */
1440                     ? pmInit(id,ok) : (poly)NULL;
1441      if (ok)
1442      {
1443        if (p==NULL)
1444        {
1445          v->data = (void *)nInit(0);
1446          v->rtyp = NUMBER_CMD;
1447          omFree((ADDRESS)id);
1448        }
1449        else
1450        if (pIsConstant(p))
1451        {
1452          v->data = pGetCoeff(p);
1453          pGetCoeff(p)=NULL;
1454          pLmFree(p);
1455          v->rtyp = NUMBER_CMD;
1456          v->name = id;
1457        }
1458        else
1459        {
1460          v->data = p;
1461          v->rtyp = POLY_CMD;
1462          v->name = id;
1463        }
1464        return;
1465      }
1466    }
1467    /* 8. basering ? */
1468    if ((myynest>1)&&(currRingHdl!=NULL))
1469    {
1470      if (strcmp(id,IDID(currRingHdl))==0)
1471      {
1472        if (IDID(currRingHdl)!=id) omFree((ADDRESS)id);
1473        v->rtyp=IDHDL;
1474        v->data=currRingHdl;
1475        v->name=IDID(currRingHdl);
1476        v->attribute=IDATTR(currRingHdl);
1477        return;
1478      }
1479    }
1480  }
1481#ifdef SIQ
1482  else
1483    v->rtyp=DEF_CMD;
1484#endif
1485  /* 9: _ */
1486  if (strcmp(id,"_")==0)
1487  {
1488    omFree((ADDRESS)id);
1489    v->Copy(&sLastPrinted);
1490  }
1491  else
1492  {
1493    /* 10: everything else */
1494    /* v->rtyp = UNKNOWN;*/
1495    v->name = id;
1496  }
1497}
1498
1499int sleftv::Eval()
1500{
1501  BOOLEAN nok=FALSE;
1502  leftv nn=next;
1503  next=NULL;
1504  if(rtyp==IDHDL)
1505  {
1506    int t=Typ();
1507    if (t!=PROC_CMD)
1508    {
1509      void *d=CopyD(t);
1510      data=d;
1511      rtyp=t;
1512      name=NULL;
1513      e=NULL;
1514    }
1515  }
1516  else if (rtyp==COMMAND)
1517  {
1518    command d=(command)data;
1519    if(d->op==PROC_CMD) //assume d->argc==2
1520    {
1521      char *what=(char *)(d->arg1.Data());
1522      idhdl h=ggetid(what);
1523      if((h!=NULL)&&(IDTYP(h)==PROC_CMD))
1524      {
1525        nok=d->arg2.Eval();
1526        if(!nok)
1527        {
1528#ifdef HAVE_NAMESPACES
1529          leftv r=iiMake_proc(h,(sleftv*)NULL,&d->arg2);
1530#else /* HAVE_NAMESPACES */
1531          leftv r=iiMake_proc(h,&d->arg2);
1532#endif /* HAVE_NAMESPACES */
1533          if (r!=NULL)
1534            memcpy(this,r,sizeof(sleftv));
1535          else
1536            nok=TRUE;
1537        }
1538      }
1539      else nok=TRUE;
1540    }
1541    else if (d->op=='=') //assume d->argc==2
1542    {
1543      if ((d->arg1.rtyp!=IDHDL)&&(d->arg1.rtyp!=DEF_CMD))
1544      {
1545        nok=d->arg1.Eval();
1546      }
1547      if (!nok)
1548      {
1549        char *n=d->arg1.name;
1550        nok=(n == NULL) || d->arg2.Eval();
1551        if (!nok)
1552        {
1553          int save_typ=d->arg1.rtyp;
1554          omCheckAddr(n);
1555          if (d->arg1.rtyp!=IDHDL)
1556#ifdef HAVE_NAMESPACES
1557            syMake(&d->arg1,n, d->arg1.req_packhdl); //assume  type of arg1==DEF_CMD
1558#else
1559          syMake(&d->arg1,n);
1560#endif
1561          omCheckAddr(d->arg1.name);
1562          if (d->arg1.rtyp==IDHDL)
1563          {
1564            n=omStrDup(IDID((idhdl)d->arg1.data));
1565            killhdl((idhdl)d->arg1.data);
1566            d->arg1.data=NULL;
1567            d->arg1.name=n;
1568          }
1569          //d->arg1.rtyp=DEF_CMD;
1570          sleftv t;
1571          if(save_typ!=PROC_CMD) save_typ=d->arg2.rtyp;
1572          if ((BEGIN_RING<d->arg2.rtyp)&&(d->arg2.rtyp<END_RING)
1573          /*&&(QRING_CMD!=d->arg2.rtyp)*/)
1574            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&currRing->idroot);
1575          else
1576            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&IDROOT);
1577          memcpy(&d->arg1,&t,sizeof(sleftv));
1578          omCheckAddr(d->arg1.name);
1579          nok=nok||iiAssign(&d->arg1,&d->arg2);
1580          omCheckIf(d->arg1.name != NULL,  // OB: ????
1581                    omCheckAddr(d->arg1.name));
1582          if (!nok)
1583          {
1584            memset(&d->arg1,0,sizeof(sleftv));
1585            this->CleanUp();
1586            memset(this,0,sizeof(sleftv));
1587            rtyp=NONE;
1588          }
1589        }
1590      }
1591      else nok=TRUE;
1592    }
1593    else if (d->argc==1)
1594    {
1595      nok=d->arg1.Eval();
1596      nok=nok||iiExprArith1(this,&d->arg1,d->op);
1597    }
1598    else if(d->argc==2)
1599    {
1600      nok=d->arg1.Eval();
1601      nok=nok||d->arg2.Eval();
1602      nok=nok||iiExprArith2(this,&d->arg1,d->op,&d->arg2);
1603    }
1604    else if(d->argc==3)
1605    {
1606      nok=d->arg1.Eval();
1607      nok=nok||d->arg2.Eval();
1608      nok=nok||d->arg3.Eval();
1609      nok=nok||iiExprArith3(this,d->op,&d->arg1,&d->arg2,&d->arg3);
1610    }
1611    else if(d->argc!=0)
1612    {
1613      nok=d->arg1.Eval();
1614      nok=nok||iiExprArithM(this,&d->arg1,d->op);
1615    }
1616    else // d->argc == 0
1617    {
1618      nok = iiExprArithM(this, NULL, d->op);
1619    }
1620  }
1621  else if (((rtyp==0)||(rtyp==DEF_CMD))
1622    &&(name!=NULL))
1623  {
1624     syMake(this,name);
1625  }
1626#ifdef MDEBUG
1627  switch(Typ())
1628  {
1629    case NUMBER_CMD:
1630#ifdef LDEBUG
1631      nTest((number)Data());
1632#endif
1633      break;
1634    case POLY_CMD:
1635      pTest((poly)Data());
1636      break;
1637    case IDEAL_CMD:
1638    case MODUL_CMD:
1639    case MATRIX_CMD:
1640      {
1641        ideal id=(ideal)Data();
1642        omCheckAddrSize(id,sizeof(*id));
1643        int i=id->ncols*id->nrows-1;
1644        for(;i>=0;i--) pTest(id->m[i]);
1645      }
1646      break;
1647  }
1648#endif
1649  if (nn!=NULL) nok=nok||nn->Eval();
1650  next=nn;
1651  return nok;
1652}
1653
1654char *iiSleftv2name(leftv v)
1655{
1656#ifdef HAVE_NAMESPACES
1657  char *name;
1658  if(v->packhdl != NULL) {
1659    name = (char *)omAlloc(strlen(v->name) + strlen(IDID(v->packhdl)) + 3);
1660    sprintf(name, "%s::%s", IDID(v->packhdl), v->name);
1661    return(name);
1662  }
1663  else
1664  {
1665    return(v->name);
1666  }
1667#else /* HAVE_NAMESPACES */
1668  return(v->name);
1669#endif /* HAVE_NAMESPACES */
1670}
Note: See TracBrowser for help on using the repository browser.