source: git/Singular/subexpr.cc @ 146b47

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