source: git/Singular/subexpr.cc @ 5c5638

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