source: git/Singular/subexpr.cc @ 3907ab

fieker-DuValspielwiese
Last change on this file since 3907ab was 3907ab, checked in by Hans Schoenemann <hannes@…>, 10 years ago
simplifyed rindep. tests
  • Property mode set to 100644
File size: 42.7 KB
RevLine 
[0e1846]1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
[6ae4f5]5* ABSTRACT: handling of leftv
[0e1846]6*/
7
8#include <stdlib.h>
9#include <stdio.h>
10#include <string.h>
11#include <ctype.h>
12#include <unistd.h>
13
[16f511]14#ifdef HAVE_CONFIG_H
[ba5e9e]15#include "singularconfig.h"
[16f511]16#endif /* HAVE_CONFIG_H */
[b1dfaf]17#include <kernel/mod2.h>
[5ff1d3]18
19#include <omalloc/omalloc.h>
20
[0fb34ba]21#include <misc/intvec.h>
22#include <misc/options.h>
[5ff1d3]23
24
25#include <coeffs/ffields.h>
26#include <coeffs/numbers.h>
[75f10d]27#include <coeffs/bigintmat.h>
[5ff1d3]28
[0fb34ba]29#include <polys/monomials/maps.h>
30#include <polys/matpol.h>
[5ff1d3]31#include <polys/monomials/ring.h>
[737a68]32#include <kernel/polys.h>
[5ff1d3]33
[a44806]34#include <libpolys/coeffs/longrat.h>
[5ff1d3]35// #include <coeffs/longrat.h>
36
37#include <kernel/febase.h>
38#include <kernel/ideals.h>
[599326]39#include <kernel/kstd1.h>
40#include <kernel/timer.h>
[5ff1d3]41#include <kernel/syz.h>
42
43#include <Singular/tok.h>
44#include <Singular/ipid.h>
[599326]45#include <Singular/ipshell.h>
46#include <Singular/lists.h>
47#include <Singular/attrib.h>
[44ca2f]48#include <Singular/links/silink.h>
[599326]49#include <Singular/attrib.h>
50#include <Singular/subexpr.h>
[b117e8]51#include <Singular/blackbox.h>
[855a8f]52
[5ff1d3]53
54
[0e051f]55omBin sSubexpr_bin = omGetSpecBin(sizeof(_ssubexpr));
[c232af]56omBin sleftv_bin = omGetSpecBin(sizeof(sleftv));
57omBin procinfo_bin = omGetSpecBin(sizeof(procinfo));
58omBin libstack_bin = omGetSpecBin(sizeof(libstack));
[ec7aac]59static omBin size_two_bin = omGetSpecBin(2);
[c232af]60
[0e1846]61sleftv     sLastPrinted;
62const char sNoName[]="_";
63#ifdef SIQ
64BOOLEAN siq=FALSE;
65#endif
66
67int sleftv::listLength()
68{
69  int n = 1;
70  leftv sl = next;
71  while (sl!=NULL)
72  {
73    n++;
74    sl=sl->next;
75  }
76  return n;
77}
78
79void sleftv::Print(leftv store, int spaces)
80{
81  int  t=Typ();
82  if (errorreported) return;
83#ifdef SIQ
84  if (rtyp==COMMAND)
85  {
86    command c=(command)data;
87    char ch[2];
88    ch[0]=c->op;ch[1]='\0';
[85e68dd]89    const char *s=ch;
[2c89d2]90    if (c->op>127) s=iiTwoOps(c->op);
[0e1846]91    ::Print("##command %d(%s), %d args\n",
92      c->op, s, c->argc);
93    if (c->argc>0)
94      c->arg1.Print(NULL,spaces+2);
95    if(c->argc<4)
96    {
97      if (c->argc>1)
98        c->arg2.Print(NULL,spaces+2);
99      if (c->argc>2)
100        c->arg3.Print(NULL,spaces+2);
101    }
102    PrintS("##end");
103  }
104  else
105#endif
106  {
[2ba9a6]107    const char *n=Name();
108    char *s;
109    void *d=Data();
[49fbc3f]110    if (errorreported) return;
[2ba9a6]111    if ((store!=NULL)&&(store!=this))
112      store->CleanUp();
[a3432c]113
[2ba9a6]114    switch (t /*=Typ()*/)
[0e1846]115      {
116        case UNKNOWN:
117        case DEF_CMD:
[490a23b]118          PrintNSpaces(spaces);
119          PrintS("`");PrintS(n);PrintS("`");
[0e1846]120          break;
[95197e]121        case PACKAGE_CMD:
[4c9cf1]122          PrintNSpaces(spaces);
123          paPrint(n,(package)d);
124          break;
[0e1846]125        case NONE:
126          return;
127        case INTVEC_CMD:
128        case INTMAT_CMD:
[6d3ffec]129          ((intvec *)d)->show(t,spaces);
[0e1846]130          break;
[75f10d]131        case BIGINTMAT_CMD:
132          ((bigintmat *)d)->pprint(80);
133          break;
[0e1846]134        case RING_CMD:
135        case QRING_CMD:
[db34980]136        {
[490a23b]137          PrintNSpaces(spaces);
[db34980]138          const ring r = (const ring)d;
[fb85f97]139          rWrite(r, currRing == r);
[0e1846]140          break;
[db34980]141        }
[0e1846]142        case MATRIX_CMD:
[8fa9ea]143          iiWriteMatrix((matrix)d,n,2, currRing, spaces);
[0e1846]144          break;
145        case MODUL_CMD:
146        case IDEAL_CMD:
[3e7095]147          if ((TEST_V_QRING)  &&(currQuotient!=NULL)
148          &&(!hasFlag(this,FLAG_QRING)))
[6c4db17]149          {
150            jjNormalizeQRingId(this);
151            d=Data();
152          }
153          // no break:
154        case MAP_CMD:
[8fa9ea]155          iiWriteMatrix((matrix)d,n,1, currRing, spaces);
[0e1846]156          break;
157        case POLY_CMD:
158        case VECTOR_CMD:
[3e7095]159          if ((TEST_V_QRING)  &&(currQuotient!=NULL)
160          &&(!hasFlag(this,FLAG_QRING)))
[6c4db17]161          {
162            jjNormalizeQRingP(this);
163            d=Data();
164          }
[490a23b]165          PrintNSpaces(spaces);
[0e1846]166          pWrite0((poly)d);
167          break;
[dfc6b54]168        case RESOLUTION_CMD:
[22579cf]169        {
[e7463f]170          syStrategy tmp=(syStrategy)d;
[9b01b1]171          syPrint(tmp,IDID(currRingHdl));
[a3432c]172          break;
[22579cf]173        }
[0e1846]174        case STRING_CMD:
[490a23b]175          PrintNSpaces(spaces);
176          PrintS((char *)d);
[0e1846]177          break;
178       case INT_CMD:
[490a23b]179          PrintNSpaces(spaces);
180          ::Print("%d",(int)(long)d);
[0e1846]181          break;
[2ba9a6]182       case PROC_CMD:
183         {
184           procinfov pi=(procinfov)d;
[490a23b]185
186           PrintNSpaces(spaces);
187           PrintS("// libname  : ");
188           PrintS(piProcinfo(pi, "libname"));
[17681b]189           PrintLn();
[490a23b]190
191           PrintNSpaces(spaces);
192           PrintS("// procname : ");
193           PrintS(piProcinfo(pi, "procname"));
[17681b]194           PrintLn();
[490a23b]195
196           PrintNSpaces(spaces);
197           PrintS("// type     : ");
198           PrintS(piProcinfo(pi, "type"));
[a3432c]199           //           ::Print("%-*.*s// ref      : %s",spaces,spaces," ",
200           //   piProcinfo(pi, "ref"));
201           break;
[2ba9a6]202         }
[46d09b]203       case POINTER_CMD:
204         { package pack = (package)d;
[17681b]205         PrintNSpaces(spaces);
[490a23b]206         PrintS("// PointerTest\n");
[17681b]207         PrintNSpaces(spaces);
[490a23b]208         ::Print("// %s\n",IDID(pack->idroot));
[46d09b]209         //::Print(((char *)(pack->idroot)->data), spaces);
210         break;
211         }
[0e1846]212       case LINK_CMD:
213          {
214            si_link l=(si_link)d;
[17681b]215            PrintNSpaces(spaces);
[490a23b]216            ::Print("// type : %s\n", slStatus(l, "type"));
[17681b]217            PrintNSpaces(spaces);
[490a23b]218            ::Print("// mode : %s\n", slStatus(l, "mode"));
[17681b]219            PrintNSpaces(spaces);
[490a23b]220            ::Print("// name : %s\n", slStatus(l, "name"));
[17681b]221            PrintNSpaces(spaces);
[490a23b]222            ::Print("// open : %s\n", slStatus(l, "open"));
[17681b]223            PrintNSpaces(spaces);
[490a23b]224            ::Print("// read : %s\n", slStatus(l, "read"));
[17681b]225            PrintNSpaces(spaces);
[490a23b]226            ::Print("// write: %s", slStatus(l, "write"));
[d754b7]227          break;
[0e1846]228          }
229        case NUMBER_CMD:
[84a6a7]230        case BIGINT_CMD:
[0e1846]231          s=String(d);
232          if (s==NULL) return;
[17681b]233          PrintNSpaces(spaces);
[0e1846]234          PrintS(s);
[c232af]235          omFree((ADDRESS)s);
[0e1846]236          break;
237        case LIST_CMD:
238        {
239          lists l=(lists)d;
[ecf019]240          if (lSize(l)<0)
[17681b]241          {
242             PrintNSpaces(spaces);
[490a23b]243             PrintS("empty list\n");
[17681b]244          }
[0e1846]245          else
246          {
247            int i=0;
248            for (;i<=l->nr;i++)
249            {
250              if (l->m[i].rtyp!=DEF_CMD)
251              {
[17681b]252                PrintNSpaces(spaces);
[490a23b]253                ::Print("[%d]:\n",i+1);
[0e1846]254                l->m[i].Print(NULL,spaces+3);
255              }
256            }
257          }
258          break;
259        }
[b117e8]260
[0e1846]261        default:
[c4dab4]262          if (t>MAX_TOK)
263          {
264            blackbox * bb=getBlackboxStuff(t);
[b117e8]265            PrintNSpaces(spaces);
[c4dab4]266            if (bb!=NULL) { bb->blackbox_Print(bb,d); }
267            else          { ::Print("Print: blackbox %d(bb=NULL)",t); }
268          }
269          else
[0e1846]270          ::Print("Print:unknown type %s(%d)", Tok2Cmdname(t),t);
271      } /* end switch: (Typ()) */
272  }
273  if (next!=NULL)
274  {
275    if (t==COMMAND) PrintLn();
276    else if (t!=LIST_CMD) PrintS(" ");
277    next->Print(NULL,spaces);
278  }
279  else if (t!=LIST_CMD)
280  {
281    PrintLn();
[a3432c]282  }
[0e1846]283#ifdef SIQ
284  if (rtyp!=COMMAND)
285#endif
286  {
287    if ((store!=NULL)
[e7463f]288    && (store!=this))
[0e1846]289    {
[e7463f]290      if((t/*Typ()*/!=LINK_CMD)
291      && (t/*Typ()*/!=POINTER_CMD)
292      && (t/*Typ()*/!=PACKAGE_CMD)
293      && (t/*Typ()*/!=DEF_CMD)
294      )
[3074334]295      {
[e7463f]296        store->rtyp=t/*Typ()*/;
297        store->data=CopyD();
298        if(attribute!=NULL)
299        {
300          store->attribute=CopyA();
301        }
302        store->flag=flag;
[3074334]303      }
[0e1846]304    }
305  }
306}
307
[16acb0]308void sleftv::CleanUp(ring r)
[0e1846]309{
[ea947e]310  if ((name!=NULL) && (name!=sNoName) && (rtyp!=IDHDL) && (rtyp!=ALIAS_CMD))
[0e1846]311  {
312    //::Print("free %x (%s)\n",name,name);
[c232af]313    omFree((ADDRESS)name);
[0e1846]314  }
[f2dff02]315  //name=NULL;
316  //flag=0;
[0e1846]317  if (data!=NULL)
318  {
[c4dab4]319     if (rtyp==IDHDL) attribute=NULL; // is only a pointer to attribute of id
320     else s_internalDelete(rtyp,data,r);
[ff7e529]321    //data=NULL; // will be done by Init() at the end
[0e1846]322  }
323  if (attribute!=NULL)
324  {
325    switch (rtyp)
326    {
[46d09b]327      case POINTER_CMD:
[0e1846]328      case PACKAGE_CMD:
329      case IDHDL:
330      case ANY_TYPE:
331      case VECHO:
332      case VPRINTLEVEL:
333      case VCOLMAX:
334      case VTIMER:
[7a7652]335      case VRTIMER:
[0e1846]336      case VOICE:
337      case VMAXDEG:
338      case VMAXMULT:
339      case TRACE:
340      case VSHORTOUT:
341      case VNOETHER:
342      case VMINPOLY:
[7a7652]343      case LIB_CMD:
[0e1846]344      case 0:
[ff7e529]345        //attribute=NULL; // will be done by Init() at the end
[0e1846]346        break;
347      default:
348      {
[c227a2f]349        attribute->killAll(r);
[0e1846]350      }
351    }
352  }
353  Subexpr h;
354  while (e!=NULL)
355  {
356    h=e->next;
[c232af]357    omFreeBin((ADDRESS)e, sSubexpr_bin);
[0e1846]358    e=h;
359  }
[ff7e529]360  //rtyp=NONE; // will be done by Init() at the end
[0e1846]361  if (next!=NULL)
362  {
[df4422]363    leftv tmp_n;
364    do
365    {
366      tmp_n=next->next;
367      //next->name=NULL;
368      next->next=NULL;
[16acb0]369      next->CleanUp(r);
[c232af]370      omFreeBin((ADDRESS)next, sleftv_bin);
[df4422]371      next=tmp_n;
372    } while (next!=NULL);
[0e1846]373  }
[f2dff02]374  Init();
[0e1846]375}
376
[4cbe5d]377BOOLEAN sleftv::RingDependend()
378{
379  int rt=Typ();
[df5fc1]380  if(::RingDependend(rt) && (rt!=QRING_CMD))
[4cbe5d]381    return TRUE;
382  if (rt==LIST_CMD)
383    return lRingDependend((lists)Data());
[3907ab]384  if (this->next!=NULL)
385    return this->next->RingDependend();
[a3bc95e]386  return FALSE;
[4cbe5d]387}
388
[a1a595]389static inline void * s_internalCopy(const int t,  void *d)
[0e1846]390{
[dfc6b54]391  switch (t)
[0e1846]392  {
393    case INTVEC_CMD:
394    case INTMAT_CMD:
395      return (void *)ivCopy((intvec *)d);
[75f10d]396    case BIGINTMAT_CMD:
397      return (void*)bimCopy((bigintmat *)d);
[0e1846]398    case MATRIX_CMD:
[8fa9ea]399      return (void *)mp_Copy((matrix)d, currRing);
[0e1846]400    case IDEAL_CMD:
401    case MODUL_CMD:
402      return  (void *)idCopy((ideal)d);
403    case STRING_CMD:
[c232af]404        return (void *)omStrDup((char *)d);
[46d09b]405    case POINTER_CMD:
406      return d;
[daeb6d]407    case PACKAGE_CMD:
408      return  (void *)paCopy((package) d);
[0e1846]409    case PROC_CMD:
[2ba9a6]410      return  (void *)piCopy((procinfov) d);
[0e1846]411    case POLY_CMD:
412    case VECTOR_CMD:
413      return  (void *)pCopy((poly)d);
414    case INT_CMD:
415      return  d;
416    case NUMBER_CMD:
417      return  (void *)nCopy((number)d);
[84a6a7]418    case BIGINT_CMD:
[4ff07f]419      return  (void *)n_Copy((number)d, coeffs_BIGINT);
[0e1846]420    case MAP_CMD:
[8fa9ea]421      return  (void *)maCopy((map)d, currRing);
[0e1846]422    case LIST_CMD:
423      return  (void *)lCopy((lists)d);
[e6969d]424    case LINK_CMD:
425      return (void *)slCopy((si_link) d);
[2f12a6f]426    case RING_CMD:
427    case QRING_CMD:
428      {
429        ring r=(ring)d;
[56aaae]430        if (r!=NULL) r->ref++;
[e7463f]431        //Print("+  ring %d, ref %d\n",r,r->ref);
[2f12a6f]432        return d;
433      }
[dfc6b54]434    case RESOLUTION_CMD:
435      return (void*)syCopy((syStrategy)d);
[0e1846]436    case DEF_CMD:
437    case NONE:
[8739c9]438    case 0: /* type in error case */
[0e1846]439      break; /* error recovery: do nothing */
440    //case COMMAND:
441    default:
[b117e8]442    {
443      if (t>MAX_TOK)
444      {
445        blackbox *b=getBlackboxStuff(t);
[c4dab4]446        if (b!=NULL) return b->blackbox_Copy(b,d);
[b117e8]447        return NULL;
448      }
449      else
[b70e54]450      Warn("s_internalCopy: cannot copy type %s(%d)",
[a1a595]451            Tok2Cmdname(t),t);
[b117e8]452    }
[0e1846]453  }
454  return NULL;
455}
456
[c4dab4]457void s_internalDelete(const int t,  void *d, const ring r)
458{
[6559a1]459  assume(d!=NULL);
[c4dab4]460  switch (t)
461  {
462    case INTVEC_CMD:
463    case INTMAT_CMD:
464    {
465      intvec *v=(intvec*)d;
466      delete v;
467      break;
468    }
[75f10d]469    case BIGINTMAT_CMD:
470    {
471      bigintmat *v=(bigintmat*)d;
472      delete v;
473      break;
474    }
[c4dab4]475    case MAP_CMD:
476    {
477      map m=(map)d;
[95197e]478      omFreeBinAddr((ADDRESS)m->preimage);
[c4dab4]479      m->preimage=NULL;
480      /* no break: continue as IDEAL*/
481    }
482    case MATRIX_CMD:
483    case IDEAL_CMD:
484    case MODUL_CMD:
485    {
486      ideal i=(ideal)d;
487      id_Delete(&i,r);
488      break;
489    }
490    case STRING_CMD:
491      omFree(d);
492      break;
493    //case POINTER_CMD:
494    //  return d;
495    //case PACKAGE_CMD:
496    //  return  (void *)paCopy((package) d);
497    case PROC_CMD:
498      piKill((procinfo*)d);
499      break;
500    case POLY_CMD:
501    case VECTOR_CMD:
502    {
503      poly p=(poly)d;
504      p_Delete(&p,r);
505      break;
506    }
507    case NUMBER_CMD:
508    {
509      number n=(number)d;
510      n_Delete(&n,r);
511      break;
512    }
513    case BIGINT_CMD:
514    {
515      number n=(number)d;
[4ff07f]516      n_Delete(&n,coeffs_BIGINT);
[c4dab4]517      break;
518    }
519    case LIST_CMD:
520    {
521      lists l=(lists)d;
522      l->Clean(r);
523      break;
524    }
525    case LINK_CMD:
526    {
527      si_link l=(si_link)d;
528      slKill(l);
529      break;
530    }
531    case RING_CMD:
532    case QRING_CMD:
533    {
534      ring R=(ring)d;
[7ddcb2]535      if ((R!=currRing)||(R->ref>=0))
536        rKill(R);
[c4dab4]537      #ifdef TEST
[7ddcb2]538      else     
[e7463f]539        Print("currRing? ref=%d\n",R->ref);
[c4dab4]540      #endif
541      break;
542    }
543    case RESOLUTION_CMD:
544    {
545      syStrategy s=(syStrategy)d;
546      if (s!=NULL) syKillComputation(s,r);
547      break;
548    }
549    case COMMAND:
550    {
551     command cmd=(command)d;
552     if (cmd->arg1.rtyp!=0) cmd->arg1.CleanUp(r);
553     if (cmd->arg2.rtyp!=0) cmd->arg2.CleanUp(r);
554     if (cmd->arg3.rtyp!=0) cmd->arg3.CleanUp(r);
555     omFreeBin((ADDRESS)d, sip_command_bin);
556     break;
557    }
558    case INT_CMD:
559    case DEF_CMD:
560    case ALIAS_CMD:
561    case POINTER_CMD:
562    case PACKAGE_CMD:
563    case IDHDL:
564    case NONE:
565    case ANY_TYPE:
566    case VECHO:
567    case VPRINTLEVEL:
568    case VCOLMAX:
569    case VTIMER:
570    case VRTIMER:
571    case VOICE:
572    case VMAXDEG:
573    case VMAXMULT:
574    case TRACE:
575    case VSHORTOUT:
576    case VNOETHER:
577    case VMINPOLY:
578    case LIB_CMD:
579    case 0: /* type in error case */
580      break; /* error recovery: do nothing */
581    //case COMMAND:
582    //case COMMAND:
583    default:
584    {
585      if (t>MAX_TOK)
586      {
587        blackbox *b=getBlackboxStuff(t);
588        if (b!=NULL) b->blackbox_destroy(b,d);
589        break;
590      }
591      else
592      Warn("s_internalDelete: cannot delete type %s(%d)",
593            Tok2Cmdname(t),t);
594    }
595  }
596}
[f71681]597
[a1a595]598void * slInternalCopy(leftv source, const int t, void *d, Subexpr e)
599{
600  if (t==STRING_CMD)
601  {
602      if ((e==NULL)
603      || (source->rtyp==LIST_CMD)
604      || ((source->rtyp==IDHDL)&&(IDTYP((idhdl)source->data)==LIST_CMD)))
605        return (void *)omStrDup((char *)d);
606      else if (e->next==NULL)
607      {
608        char *s=(char*)omAllocBin(size_two_bin);
609        s[0]=*(char *)d;
610        s[1]='\0';
611        return s;
612      }
613      #ifdef TEST
614      else
615      {
616        Werror("not impl. string-op in `%s`",my_yylinebuf);
617        return NULL;
618      }
619      #endif
620  }
621  return s_internalCopy(t,d);
622}
623
[0e1846]624void sleftv::Copy(leftv source)
625{
[f2dff02]626  Init();
[0e1846]627  rtyp=source->Typ();
628  void *d=source->Data();
629  if(!errorreported)
630  {
[a1a595]631    data=s_internalCopy(rtyp,d);
[8c94ba]632    if ((source->attribute!=NULL)||(source->e!=NULL))
633      attribute=source->CopyA();
634    flag=source->flag;
[24c186a]635    if (source->next!=NULL)
636    {
[c232af]637      next=(leftv)omAllocBin(sleftv_bin);
[24c186a]638      next->Copy(source->next);
639    }
[0e1846]640  }
641}
642
643void * sleftv::CopyD(int t)
644{
[98adcd]645  if ((rtyp!=IDHDL)&&(rtyp!=ALIAS_CMD)&&(e==NULL))
[0e1846]646  {
[a3432c]647    if (iiCheckRing(t)) return NULL;
[8b87135]648    void *x = data;
649    if (rtyp==VNOETHER) x = (void *)pCopy((currRing->ppNoether));
650    else if ((rtyp==VMINPOLY) && nCoeff_is_algExt(currRing->cf) && (!nCoeff_is_GF(currRing->cf)))
651    {
652      const ring A = currRing->cf->extRing;
[db34980]653
[8b87135]654      assume( A != NULL );
[dd668f]655      assume( A->qideal != NULL );
[db34980]656
[dd668f]657      x=(void *)p_Copy(A->qideal->m[0], A);
[8b87135]658    }
[0e1846]659    data=NULL;
660    return x;
661  }
[a3432c]662  void *d=Data(); // will also do a iiCheckRing
663  if ((!errorreported) && (d!=NULL)) return slInternalCopy(this,t,d,e);
[0e1846]664  return NULL;
665}
666
[2166ad3]667//void * sleftv::CopyD()
668//{
[24c186a]669  //if ((rtyp!=IDHDL)&&(e==NULL)
670  //&&(rtyp!=VNOETHER)&&(rtyp!=LIB_CMD)&&(rtyp!=VMINPOLY))
671  //{
672  //  void *x=data;
673  //  data=NULL;
674  //  return x;
675  //}
[2166ad3]676//  return CopyD(Typ());
677//}
[0e1846]678
[8c94ba]679attr sleftv::CopyA()
680{
681  attr *a=Attribute();
682  if ((a!=NULL) && (*a!=NULL))
683    return (*a)->Copy();
684  return NULL;
685}
[0e1846]686
[a79a128]687char *  sleftv::String(void *d, BOOLEAN typed, int dim)
[0e1846]688{
689#ifdef SIQ
690  if (rtyp==COMMAND)
691  {
692    ::Print("##command %d\n",((command)data)->op);
693    if (((command)data)->arg1.rtyp!=0)
694      ((command)data)->arg1.Print(NULL,2);
695    if (((command)data)->arg2.rtyp!=0)
696      ((command)data)->arg2.Print(NULL,2);
697    if (((command)data)->arg3.rtyp==0)
698      ((command)data)->arg3.Print(NULL,2);
699    PrintS("##end\n");
[c232af]700    return omStrDup("");
[0e1846]701  }
702#endif
703  if (d==NULL) d=Data();
704  if (!errorreported)
705  {
706    char *s;
[84a6a7]707    int t=Typ();
708    switch (t /*Typ()*/)
[0e1846]709    {
[4b2155]710        case INT_CMD:
[7604db]711          if (typed)
712          {
[c232af]713            s=(char *)omAlloc(MAX_INT_LEN+7);
[7447d8]714            sprintf(s,"int(%d)",(int)(long)d);
[7604db]715          }
716          else
717          {
[c232af]718            s=(char *)omAlloc(MAX_INT_LEN+2);
[7447d8]719            sprintf(s,"%d",(int)(long)d);
[7604db]720          }
721          return s;
722
[4b2155]723        case STRING_CMD:
[7604db]724          if (d == NULL)
725          {
[c232af]726            if (typed) return omStrDup("\"\"");
727            return omStrDup("");
[7604db]728          }
729          if (typed)
730          {
[c232af]731            s = (char*) omAlloc(strlen((char*) d) + 3);
[7604db]732            sprintf(s,"\"%s\"", (char*) d);
733            return s;
734          }
735          else
736          {
[c232af]737            return omStrDup((char*)d);
[7604db]738          }
[c931a2]739
[4b2155]740        case POLY_CMD:
741        case VECTOR_CMD:
[7604db]742          if (typed)
743          {
744            char* ps = pString((poly) d);
[c232af]745            s = (char*) omAlloc(strlen(ps) + 10);
[84a6a7]746            sprintf(s,"%s(%s)", (t /*Typ()*/ == POLY_CMD ? "poly" : "vector"), ps);
[4c9cf1]747            omFree(ps);
[7604db]748            return s;
749          }
750          else
[ea9fd60]751            return pString((poly)d);
[7604db]752
[4b2155]753        case NUMBER_CMD:
[a70441f]754          StringSetS((char*) (typed ? "number(" : ""));
[4b2155]755          if ((rtyp==IDHDL)&&(IDTYP((idhdl)data)==NUMBER_CMD))
756          {
757            nWrite(IDNUMBER((idhdl)data));
758          }
759          else if (rtyp==NUMBER_CMD)
760          {
761            number n=(number)data;
762            nWrite(n);
763            data=(char *)n;
764          }
[8fa9ea]765          else if((rtyp==VMINPOLY)&&(rField_is_GF(currRing)))
[4b2155]766          {
[8fa9ea]767            nfShowMipo(currRing->cf);
[4b2155]768          }
769          else
770          {
771            number n=nCopy((number)d);
772            nWrite(n);
773            nDelete(&n);
774          }
[538512]775          StringAppendS((char*) (typed ? ")" : ""));
776          return StringEndS();
[c931a2]777
[84a6a7]778        case BIGINT_CMD:
779          {
780          StringSetS((char*) (typed ? "bigint(" : ""));
781          number nl=(number)d;
[4ff07f]782          n_Write(nl,coeffs_BIGINT);
[538512]783          StringAppendS((char*) (typed ? ")" : ""));
784          return StringEndS();
[84a6a7]785          }
786
[4b2155]787        case MATRIX_CMD:
[8fa9ea]788          s= iiStringMatrix((matrix)d,dim, currRing);
[7604db]789          if (typed)
790          {
[c232af]791            char* ns = (char*) omAlloc(strlen(s) + 40);
[c931a2]792            sprintf(ns, "matrix(ideal(%s),%d,%d)", s,
[7604db]793                    ((ideal) d)->nrows, ((ideal) d)->ncols);
[c232af]794            omCheckAddr(ns);
[7604db]795            return ns;
796          }
797          else
798          {
[c232af]799            return omStrDup(s);
[7604db]800          }
801
[4b2155]802        case MODUL_CMD:
803        case IDEAL_CMD:
804        case MAP_CMD:
[8fa9ea]805          s= iiStringMatrix((matrix)d,dim, currRing);
[7604db]806          if (typed)
807          {
[c232af]808            char* ns = (char*) omAlloc(strlen(s) + 10);
[84a6a7]809            sprintf(ns, "%s(%s)", (t/*Typ()*/==MODUL_CMD ? "module" : "ideal"), s);
[c232af]810            omCheckAddr(ns);
[7604db]811            return ns;
812          }
[c232af]813          return omStrDup(s);
[7604db]814
[4b2155]815        case INTVEC_CMD:
816        case INTMAT_CMD:
817        {
818          intvec *v=(intvec *)d;
[a79a128]819          s = v->String(dim);
[7604db]820          if (typed)
821          {
822            char* ns;
[84a6a7]823            if (t/*Typ()*/ == INTMAT_CMD)
[7604db]824            {
[c232af]825              ns = (char*) omAlloc(strlen(s) + 40);
[7604db]826              sprintf(ns, "intmat(intvec(%s),%d,%d)", s, v->rows(), v->cols());
827            }
828            else
829            {
[c232af]830              ns = (char*) omAlloc(strlen(s) + 10);
[7604db]831              sprintf(ns, "intvec(%s)", s);
832            }
[c232af]833            omCheckAddr(ns);
834            omFree(s);
[7604db]835            return ns;
836          }
837          else
838            return s;
[4b2155]839        }
[75f10d]840        case BIGINTMAT_CMD:
841        {
842          bigintmat *bim=(bigintmat*)d;
843          s = bim->String();
844          if (typed)
845          {
846            char* ns = (char*) omAlloc0(strlen(s) + 40);
847            sprintf(ns, "bigintmat(bigintvec(%s),%d,%d)", s, bim->rows(), bim->cols());
848            omCheckAddr(ns);
849            return ns;
850          }
851          else
852            return omStrDup(s);
[4c9cf1]853        }
[7604db]854
[4b2155]855        case RING_CMD:
856        case QRING_CMD:
[7604db]857          s  = rString((ring)d);
[c931a2]858
[7604db]859          if (typed)
860          {
861            char* ns;
[84a6a7]862            if (t/*Typ()*/ == QRING_CMD)
[7604db]863            {
[8fa9ea]864              char* id = iiStringMatrix((matrix) ((ring) d)->qideal, dim,
[db34980]865                              currRing);
[c232af]866              ns = (char*) omAlloc(strlen(s) + strlen(id) + 20);
[7604db]867              sprintf(ns, "\"%s\";%sideal(%s)", s,(dim == 2 ? "\n" : " "), id);
868            }
869            else
870            {
[c232af]871              ns = (char*) omAlloc(strlen(s) + 4);
[7604db]872              sprintf(ns, "\"%s\"", s);
873            }
[c232af]874            omFree(s);
875            omCheckAddr(ns);
[7604db]876            return ns;
877          }
878          return s;
[4b2155]879        case RESOLUTION_CMD:
[077e9c]880        {
[4b2155]881          lists l = syConvRes((syStrategy)d);
[a79a128]882          s = lString(l, typed, dim);
[4b2155]883          l->Clean();
[7604db]884          return s;
[077e9c]885        }
[7604db]886
[4b2155]887        case PROC_CMD:
[0e1846]888        {
[4b2155]889          procinfo* pi = (procinfo*) d;
890          if((pi->language == LANG_SINGULAR) && (pi->data.s.body!=NULL))
[7604db]891            s = (pi->data.s.body);
[4b2155]892          else
[85e68dd]893            s = (char *)"";
[7604db]894          if (typed)
895          {
[c232af]896            char* ns = (char*) omAlloc(strlen(s) + 4);
[7604db]897            sprintf(ns, "\"%s\"", s);
[c232af]898            omCheckAddr(ns);
[7604db]899            return ns;
900          }
[c232af]901          return omStrDup(s);
[0e1846]902        }
[c931a2]903
[f82470]904        case LINK_CMD:
[a79a128]905          s = slString((si_link) d);
[7604db]906          if (typed)
907          {
[c232af]908            char* ns = (char*) omAlloc(strlen(s) + 10);
[7604db]909            sprintf(ns, "link(\"%s\")", s);
[95197e]910            omFreeBinAddr(s);
[c232af]911            omCheckAddr(ns);
[7604db]912            return ns;
913          }
914          return s;
[c931a2]915
[4b2155]916        case LIST_CMD:
[7604db]917          return lString((lists) d, typed, dim);
[b117e8]918
919        default:
[c4dab4]920          if(t> MAX_TOK)
921          {
922            blackbox *bb=getBlackboxStuff(t);
923            if (bb!=NULL) return bb->blackbox_String(bb,d);
924          }
[0e1846]925    } /* end switch: (Typ()) */
926  }
[c232af]927  return omStrDup("");
[0e1846]928}
929
[c931a2]930
[0e1846]931int  sleftv::Typ()
932{
933  if (e==NULL)
934  {
[38cfbb]935    switch (rtyp)
[0e1846]936    {
[11ca48]937      case IDHDL:
938        return IDTYP((idhdl)data);
[ea947e]939      case ALIAS_CMD:
940         {
941           idhdl h=(idhdl)data;
942           return  ((idhdl)h->data.ustring)->typ;
943         }
[0e1846]944      case VECHO:
945      case VPRINTLEVEL:
946      case VCOLMAX:
947      case VTIMER:
[7a7652]948      case VRTIMER:
[0e1846]949      case VOICE:
950      case VMAXDEG:
951      case VMAXMULT:
952      case TRACE:
953      case VSHORTOUT:
954        return INT_CMD;
955      case VMINPOLY:
956        return NUMBER_CMD;
957      case VNOETHER:
958        return POLY_CMD;
959      //case COMMAND:
960      //  return COMMAND;
961      default:
962        return rtyp;
963    }
964  }
965  int r=0;
966  int t=rtyp;
[11ca48]967  if (t==IDHDL) t=IDTYP((idhdl)data);
968  else if (t==ALIAS_CMD) { idhdl h=(idhdl)IDDATA((idhdl)data); t=IDTYP(h); }
[0e1846]969  switch (t)
970  {
971    case INTVEC_CMD:
972    case INTMAT_CMD:
973      r=INT_CMD;
974      break;
[75f10d]975    case BIGINTMAT_CMD:
976      r=BIGINT_CMD;
977      break;
[0e1846]978    case IDEAL_CMD:
979    case MATRIX_CMD:
980    case MAP_CMD:
981      r=POLY_CMD;
982      break;
983    case MODUL_CMD:
984      r=VECTOR_CMD;
985      break;
986    case STRING_CMD:
987      r=STRING_CMD;
988      break;
[8db6c3]989    default:
[0e1846]990    {
[8db6c3]991      blackbox *b=NULL;
992      if (t>MAX_TOK)
[0e1846]993      {
[8db6c3]994        b=getBlackboxStuff(t);
[0e1846]995      }
[8db6c3]996      if ((t==LIST_CMD)||((b!=NULL)&&BB_LIKE_LIST(b)))
[0e1846]997      {
[8db6c3]998        lists l;
999        if (rtyp==IDHDL) l=IDLIST((idhdl)data);
[db34980]1000        else if (rtyp==ALIAS_CMD)
1001        {
1002          idhdl h=(idhdl)data;
1003          l=(lists)(((idhdl)h->data.ustring)->data.ustring);
1004        }
[8db6c3]1005        else             l=(lists)data;
1006        if ((0<e->start)&&(e->start<=l->nr+1))
1007        {
1008          Subexpr tmp=l->m[e->start-1].e;
1009          l->m[e->start-1].e=e->next;
1010          r=l->m[e->start-1].Typ();
1011          e->next=l->m[e->start-1].e;
1012          l->m[e->start-1].e=tmp;
1013        }
1014        else
1015        {
1016          //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
1017          r=NONE;
1018        }
[0e1846]1019      }
[8db6c3]1020      else
1021        Werror("cannot index type %s(%d)",Tok2Cmdname(t),t);
[0e1846]1022      break;
1023    }
1024  }
1025  return r;
1026}
1027
1028int  sleftv::LTyp()
1029{
1030  lists l=NULL;
1031  int r;
1032  if (rtyp==LIST_CMD)
1033    l=(lists)data;
1034  else if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1035    l=IDLIST((idhdl)data);
1036  else
1037    return Typ();
1038  //if (l!=NULL)
1039  {
1040    if ((e!=NULL) && (e->next!=NULL))
1041    {
1042      if ((0<e->start)&&(e->start<=l->nr+1))
1043      {
1044        l->m[e->start-1].e=e->next;
1045        r=l->m[e->start-1].LTyp();
1046        l->m[e->start-1].e=NULL;
1047      }
1048      else
1049      {
1050        //Warn("out of range: %d not in 1..%d",e->start,l->nr+1);
1051        r=NONE;
1052      }
1053      return r;
1054    }
1055    return LIST_CMD;
1056  }
1057  return Typ();
1058}
1059
1060void * sleftv::Data()
1061{
[17681b]1062  if ((rtyp!=IDHDL) && iiCheckRing(rtyp))
[0e1846]1063     return NULL;
1064  if (e==NULL)
1065  {
1066    switch (rtyp)
1067    {
[11ca48]1068      case ALIAS_CMD:
1069      {
1070        idhdl h=(idhdl)data;
1071        return  ((idhdl)h->data.ustring)->data.ustring;
1072      }
[979b4e6]1073      case VECHO:      return (void *)(long)si_echo;
1074      case VPRINTLEVEL:return (void *)(long)printlevel;
1075      case VCOLMAX:    return (void *)(long)colmax;
1076      case VTIMER:     return (void *)(long)getTimer();
1077      case VRTIMER:    return (void *)(long)getRTimer();
1078      case VOICE:      return (void *)(long)(myynest+1);
1079      case VMAXDEG:    return (void *)(long)Kstd1_deg;
1080      case VMAXMULT:   return (void *)(long)Kstd1_mu;
1081      case TRACE:      return (void *)(long)traceit;
1082      case VSHORTOUT:  return (void *)(long)(currRing != NULL ? currRing->ShortOut : 0);
[8b87135]1083      case VMINPOLY:
1084        if ( (currRing != NULL)  && nCoeff_is_algExt(currRing->cf) && !nCoeff_is_GF(currRing->cf))
1085        {
1086          /* Q(a), Fp(a), but not GF(q) */
1087          const ring A = currRing->cf->extRing;
[db34980]1088
[8b87135]1089          assume( A != NULL );
[dd668f]1090          assume( A->qideal != NULL );
[db34980]1091
[dd668f]1092          return (void *)A->qideal->m[0];
[8b87135]1093        }
1094        else
1095          return (void *)currRing->cf->nNULL;
[db34980]1096
[993ae2]1097      case VNOETHER:   return (void *) (currRing->ppNoether);
[0e1846]1098      case IDHDL:
1099        return IDDATA((idhdl)data);
[46d09b]1100      case POINTER_CMD:
1101        return IDDATA((idhdl)data);
[0e1846]1102      case COMMAND:
1103        //return NULL;
1104      default:
1105        return data;
1106    }
1107  }
1108  /* e != NULL : */
1109  int t=rtyp;
1110  void *d=data;
1111  if (t==IDHDL)
1112  {
1113    t=((idhdl)data)->typ;
1114    d=IDDATA((idhdl)data);
1115  }
[11ca48]1116  else if (t==ALIAS_CMD)
1117  {
1118    idhdl h=(idhdl)IDDATA((idhdl)data);
1119    t=IDTYP(h);
1120    d=IDDATA(h);
1121  }
[0e1846]1122  if (iiCheckRing(t))
1123    return NULL;
1124  char *r=NULL;
[c931a2]1125  int index=e->start;
[0e1846]1126  switch (t)
1127  {
1128    case INTVEC_CMD:
1129    {
1130      intvec *iv=(intvec *)d;
[c931a2]1131      if ((index<1)||(index>iv->length()))
[0e1846]1132      {
1133        if (!errorreported)
[c931a2]1134          Werror("wrong range[%d] in intvec(%d)",index,iv->length());
[0e1846]1135      }
1136      else
[a867b2]1137        r=(char *)(long)((*iv)[index-1]);
[0e1846]1138      break;
1139    }
1140    case INTMAT_CMD:
1141    {
1142      intvec *iv=(intvec *)d;
[c931a2]1143      if ((index<1)
1144         ||(index>iv->rows())
[0e1846]1145         ||(e->next->start<1)
1146         ||(e->next->start>iv->cols()))
1147      {
1148        if (!errorreported)
[c931a2]1149        Werror("wrong range[%d,%d] in intmat(%dx%d)",index,e->next->start,
[0e1846]1150                                                     iv->rows(),iv->cols());
1151      }
1152      else
[a867b2]1153        r=(char *)(long)(IMATELEM((*iv),index,e->next->start));
[0e1846]1154      break;
1155    }
[75f10d]1156    case BIGINTMAT_CMD:
1157    {
1158      bigintmat *m=(bigintmat *)d;
1159      if ((index<1)
1160         ||(index>m->rows())
1161         ||(e->next->start<1)
1162         ||(e->next->start>m->cols()))
1163      {
1164        if (!errorreported)
1165        Werror("wrong range[%d,%d] in bigintmat(%dx%d)",index,e->next->start,
1166                                                     m->rows(),m->cols());
1167      }
1168      else
1169        r=(char *)(BIMATELEM((*m),index,e->next->start));
1170      break;
1171    }
[0e1846]1172    case IDEAL_CMD:
1173    case MODUL_CMD:
1174    case MAP_CMD:
1175    {
1176      ideal I=(ideal)d;
[c931a2]1177      if ((index<1)||(index>IDELEMS(I)))
[0e1846]1178      {
1179        if (!errorreported)
[c931a2]1180          Werror("wrong range[%d] in ideal/module(%d)",index,IDELEMS(I));
[0e1846]1181      }
1182      else
[c931a2]1183        r=(char *)I->m[index-1];
[0e1846]1184      break;
1185    }
1186    case STRING_CMD:
1187    {
[c931a2]1188      // this was a memory leak
1189      // we evalute it, cleanup and replace this leftv by it's evalutated form
1190      // the evalutated form will be build in tmp
1191      sleftv tmp;
[f2dff02]1192      tmp.Init();
[c931a2]1193      tmp.rtyp=STRING_CMD;
[ec7aac]1194      r=(char *)omAllocBin(size_two_bin);
[c931a2]1195      if ((index>0)&& (index<=(int)strlen((char *)d)))
[0e1846]1196      {
[c931a2]1197        r[0]=*(((char *)d)+index-1);
[0e1846]1198        r[1]='\0';
1199      }
1200      else
1201      {
1202        r[0]='\0';
1203      }
[c931a2]1204      tmp.data=r;
[0bf7dff]1205      if ((rtyp==IDHDL)||(rtyp==STRING_CMD))
[c931a2]1206      {
1207        tmp.next=next; next=NULL;
[17681b]1208        //if (rtyp==STRING_CMD) { omFree((ADDRESS)data); }
1209        //data=NULL;
1210        d=NULL;
[c931a2]1211        CleanUp();
1212        memcpy(this,&tmp,sizeof(tmp));
1213      }
1214      // and, remember, r is also the result...
1215      else
1216      {
1217        // ???
1218        // here we still have a memory leak...
[82063a]1219        // example: list L="123","456";
1220        // L[1][2];
1221        // therefore, it should never happen:
1222        assume(0);
1223        // but if it happens: here is the temporary fix:
1224        // omMarkAsStaticAddr(r);
[c931a2]1225      }
[0e1846]1226      break;
1227    }
1228    case MATRIX_CMD:
1229    {
[c931a2]1230      if ((index<1)
1231         ||(index>MATROWS((matrix)d))
[0e1846]1232         ||(e->next->start<1)
1233         ||(e->next->start>MATCOLS((matrix)d)))
1234      {
1235        if (!errorreported)
[c931a2]1236          Werror("wrong range[%d,%d] in intmat(%dx%d)",
1237                  index,e->next->start,
1238                  MATROWS((matrix)d),MATCOLS((matrix)d));
[0e1846]1239      }
1240      else
[c931a2]1241        r=(char *)MATELEM((matrix)d,index,e->next->start);
[0e1846]1242      break;
1243    }
[8db6c3]1244    default:
[0e1846]1245    {
[8db6c3]1246      blackbox *b=NULL;
1247      if (t>MAX_TOK)
1248      {
1249        b=getBlackboxStuff(t);
1250      }
1251      if ((t==LIST_CMD)||((b!=NULL)&&(BB_LIKE_LIST(b))))
[0e1846]1252      {
[8db6c3]1253        lists l=(lists)d;
1254        if ((0<index)&&(index<=l->nr+1))
[82063a]1255        {
[8db6c3]1256          if ((e->next!=NULL)
1257          && (l->m[index-1].rtyp==STRING_CMD))
1258          // string[..].Data() modifies sleftv, so let's do it ourself
[82063a]1259          {
[8db6c3]1260            char *dd=(char *)l->m[index-1].data;
1261            int j=e->next->start-1;
1262            r=(char *)omAllocBin(size_two_bin);
1263            if ((j>=0) && (j<(int)strlen(dd)))
1264            {
1265              r[0]=*(dd+j);
1266              r[1]='\0';
1267            }
1268            else
1269            {
1270              r[0]='\0';
1271            }
[82063a]1272          }
1273          else
1274          {
[8db6c3]1275            Subexpr tmp=l->m[index-1].e;
1276            l->m[index-1].e=e->next;
1277            r=(char *)l->m[index-1].Data();
1278            e->next=l->m[index-1].e;
1279            l->m[index-1].e=tmp;
[82063a]1280          }
1281        }
[8db6c3]1282        else //if (!errorreported)
1283          Werror("wrong range[%d] in list(%d)",index,l->nr+1);
[0e1846]1284      }
[8db6c3]1285      else
1286        Werror("cannot index type %s(%d)",Tok2Cmdname(t),t);
[0e1846]1287      break;
1288    }
1289  }
1290  return r;
1291}
1292
1293attr * sleftv::Attribute()
1294{
[8c94ba]1295  if (e==NULL) return &attribute;
[13e2da]1296  if ((rtyp==LIST_CMD)
1297  ||((rtyp==IDHDL)&&(IDTYP((idhdl)data)==LIST_CMD)))
[0e1846]1298  {
1299    leftv v=LData();
1300    return &(v->attribute);
1301  }
1302  return NULL;
1303}
1304
1305leftv sleftv::LData()
1306{
1307  if (e!=NULL)
1308  {
1309    lists l=NULL;
1310
1311    if (rtyp==LIST_CMD)
1312      l=(lists)data;
[db34980]1313    else if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
[0e1846]1314      l=IDLIST((idhdl)data);
[db34980]1315    else if (rtyp==ALIAS_CMD)
1316    {
1317      idhdl h=(idhdl)data;
1318      l= (lists)(((idhdl)h->data.ustring)->data.ustring);
1319    }
[0e1846]1320    if (l!=NULL)
1321    {
1322      if ((0>=e->start)||(e->start>l->nr+1))
1323        return NULL;
1324      if (e->next!=NULL)
1325      {
1326        l->m[e->start-1].e=e->next;
1327        leftv r=l->m[e->start-1].LData();
1328        l->m[e->start-1].e=NULL;
1329        return r;
1330      }
1331      return &(l->m[e->start-1]);
1332    }
1333  }
1334  return this;
1335}
1336
[7ddcb2]1337#if 0
[0e1846]1338leftv sleftv::LHdl()
1339{
1340  if (e!=NULL)
1341  {
[577d19f]1342    lists l=NULL;
1343
1344    if (rtyp==LIST_CMD)
1345      l=(lists)data;
1346    if ((rtyp==IDHDL)&& (IDTYP((idhdl)data)==LIST_CMD))
1347      l=IDLIST((idhdl)data);
1348    if (l!=NULL)
1349    {
1350      if ((0>=e->start)||(e->start>l->nr+1))
1351        return NULL;
1352      if (e->next!=NULL)
1353      {
1354        l->m[e->start-1].e=e->next;
1355        leftv r=l->m[e->start-1].LHdl();
1356        l->m[e->start-1].e=NULL;
1357        return r;
1358      }
1359      return &(l->m[e->start-1]);
1360    }
[0e1846]1361  }
1362  return this;
1363}
[7ddcb2]1364#endif
[0e1846]1365
1366BOOLEAN assumeStdFlag(leftv h)
1367{
1368  if ((h->e!=NULL)&&(h->LTyp()==LIST_CMD))
1369  {
1370    return assumeStdFlag(h->LData());
1371  }
1372  if (!hasFlag(h,FLAG_STD))
1373  {
1374    if (!TEST_VERB_NSB)
[95197e]1375    {
1376      if (TEST_V_ALLWARN)
1377        Warn("%s is no standard basis in >>%s<<",h->Name(),my_yylinebuf);
1378      else
1379        Warn("%s is no standard basis",h->Name());
1380    }
[0e1846]1381    return FALSE;
1382  }
1383  return TRUE;
1384}
1385
1386/*2
[c232af]1387* transforms a name (as an string created by omAlloc or omStrDup)
[0e1846]1388* into an expression (sleftv), deletes the string
1389* utility for grammar and iparith
1390*/
[85e68dd]1391void syMake(leftv v,const char * id, idhdl packhdl)
[0e1846]1392{
1393  /* resolv an identifier: (to DEF_CMD, if siq>0)
1394  * 1) reserved id: done by scanner
[8f1a54]1395  * 2) `basering` / 'Current`
[0e1846]1396  * 3) existing identifier, local
[4c9cf1]1397  * 4) ringvar, ringpar, local ring
[0e1846]1398  * 5) existing identifier, global
1399  * 6) monom (resp. number), local ring: consisting of:
[4c9cf1]1400  * 6') ringvar,  ringpar,global ring
[0e1846]1401  * 6'') monom (resp. number), local ring
1402  * 7) monom (resp. number), non-local ring
1403  * 8) basering
1404  * 9) `_`
1405  * 10) everything else is of type 0
1406  */
1407#ifdef TEST
1408  if ((*id<' ')||(*id>(char)126))
1409  {
1410    Print("wrong id :%s:\n",id);
1411  }
1412#endif
[0e051f]1413  idhdl save_ring=currRingHdl;
[f2dff02]1414  v->Init();
[bd4cb92]1415  if(packhdl != NULL)
[17ccde]1416  {
1417  //  Print("setting req_packhdl to %s\n",IDID(packhdl));
[bd4cb92]1418    v->req_packhdl = IDPACKAGE(packhdl);
[ff7e529]1419  }
[a3bc95e]1420  else v->req_packhdl = currPack;
1421//  if (v->req_packhdl!=basePack)
1422//    Print("search %s in %s\n",id,v->req_packhdl->libname);
[610881]1423  idhdl h=NULL;
[0e1846]1424#ifdef SIQ
1425  if (siq<=0)
1426#endif
1427  {
1428    if (!isdigit(id[0]))
1429    {
1430      if (strcmp(id,"basering")==0)
1431      {
1432        if (currRingHdl!=NULL)
1433        {
[95197e]1434          if (id!=IDID(currRingHdl)) omFreeBinAddr((ADDRESS)id);
[610881]1435          h=currRingHdl;
1436          goto id_found;
[0e1846]1437        }
1438        else
1439        {
1440          v->name = id;
1441          return; /* undefined */
1442        }
1443      }
[610881]1444      else if (strcmp(id,"Current")==0)
[8f1a54]1445      {
1446        if (currPackHdl!=NULL)
1447        {
[95197e]1448          omFreeBinAddr((ADDRESS)id);
[610881]1449          h=currPackHdl;
1450          goto id_found;
[8f1a54]1451        }
1452        else
1453        {
1454          v->name = id;
1455          return; /* undefined */
1456        }
1457      }
[bd4cb92]1458      if(v->req_packhdl!=currPack)
1459      {
1460        h=v->req_packhdl->idroot->get(id,myynest);
1461      }
1462      else
[9c9fb9]1463      h=ggetid(id);
[0e1846]1464      /* 3) existing identifier, local */
1465      if ((h!=NULL) && (IDLEV(h)==myynest))
1466      {
[95197e]1467        if (id!=IDID(h)) omFreeBinAddr((ADDRESS)id); /*assume strlen(id) <1000 */
[610881]1468        goto id_found;
[0e1846]1469      }
1470    }
[0e051f]1471    if (yyInRingConstruction)
1472    {
1473      currRingHdl=NULL;
1474    }
[0e1846]1475    /* 4. local ring: ringvar */
[b9e18a3]1476    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest)
[0e051f]1477    /*&& (!yyInRingConstruction)*/)
[0e1846]1478    {
1479      int vnr;
[7bb7da5]1480      if ((vnr=r_IsRingVar(id, currRing->names,currRing->N))>=0)
[0e1846]1481      {
1482        poly p=pOne();
1483        pSetExp(p,vnr+1,1);
1484        pSetm(p);
1485        v->data = (void *)p;
1486        v->name = id;
1487        v->rtyp = POLY_CMD;
1488        return;
1489      }
[7bb7da5]1490      if((n_NumberOfParameters(currRing->cf)>0)
1491      &&((vnr=r_IsRingVar(id, (char**)n_ParameterNames(currRing->cf),
1492                              n_NumberOfParameters(currRing->cf))>=0)))
[4c9cf1]1493      {
1494        BOOLEAN ok=FALSE;
1495        poly p = pmInit(id,ok);
[4740e8]1496        if (ok && (p!=NULL))
[4c9cf1]1497        {
1498          v->data = pGetCoeff(p);
1499          pGetCoeff(p)=NULL;
1500          pLmFree(p);
1501          v->rtyp = NUMBER_CMD;
1502          v->name = id;
1503          return;
1504        }
1505      }
[0e1846]1506    }
1507    /* 5. existing identifier, global */
1508    if (h!=NULL)
1509    {
[95197e]1510      if (id!=IDID(h)) omFreeBinAddr((ADDRESS)id);  /*assume strlen(id) <1000 */
[610881]1511      goto id_found;
[0e1846]1512    }
1513    /* 6. local ring: number/poly */
1514    if ((currRingHdl!=NULL) && (IDLEV(currRingHdl)==myynest))
1515    {
1516      BOOLEAN ok=FALSE;
[0e051f]1517      /*poly p = (!yyInRingConstruction) ? pmInit(id,ok) : (poly)NULL;*/
1518      poly p = pmInit(id,ok);
[0e1846]1519      if (ok)
1520      {
1521        if (p==NULL)
1522        {
1523          v->data = (void *)nInit(0);
1524          v->rtyp = NUMBER_CMD;
[875ec3]1525          #ifdef HAVE_PLURAL
1526          // in this case we may have monomials equal to 0 in p_Read
1527          v->name = id;
1528          #else
[95197e]1529          omFreeBinAddr((ADDRESS)id);
[875ec3]1530          #endif
[0e1846]1531        }
[0e051f]1532        else if (pIsConstant(p))
[0e1846]1533        {
1534          v->data = pGetCoeff(p);
1535          pGetCoeff(p)=NULL;
[512a2b]1536          pLmFree(p);
[0e1846]1537          v->rtyp = NUMBER_CMD;
1538          v->name = id;
1539        }
1540        else
1541        {
1542          v->data = p;
1543          v->rtyp = POLY_CMD;
1544          v->name = id;
1545        }
1546        return;
1547      }
1548    }
1549    /* 7. non-local ring: number/poly */
1550    {
1551      BOOLEAN ok=FALSE;
[1aa559b]1552      poly p = ((currRing!=NULL)     /* ring required */
1553               && (currRingHdl!=NULL)
[0e051f]1554               /*&& (!yyInRingConstruction) - not in decl */
[1aa559b]1555               && (IDLEV(currRingHdl)!=myynest)) /* already in case 4/6 */
[0e1846]1556                     ? pmInit(id,ok) : (poly)NULL;
1557      if (ok)
1558      {
1559        if (p==NULL)
1560        {
1561          v->data = (void *)nInit(0);
1562          v->rtyp = NUMBER_CMD;
[875ec3]1563          #ifdef HAVE_PLURAL
1564          // in this case we may have monomials equal to 0 in p_Read
1565          v->name = id;
1566          #else
[95197e]1567          omFreeBinAddr((ADDRESS)id);
[875ec3]1568          #endif
[0e1846]1569        }
1570        else
1571        if (pIsConstant(p))
1572        {
1573          v->data = pGetCoeff(p);
1574          pGetCoeff(p)=NULL;
[512a2b]1575          pLmFree(p);
[0e1846]1576          v->rtyp = NUMBER_CMD;
1577          v->name = id;
1578        }
1579        else
1580        {
1581          v->data = p;
1582          v->rtyp = POLY_CMD;
1583          v->name = id;
1584        }
[f3578ca]1585        if (TEST_V_ALLWARN /*&& (myynest>0)*/
[7bb7da5]1586        && ((r_IsRingVar(id, currRing->names,currRing->N)>=0)
1587          || ((n_NumberOfParameters(currRing->cf)>0)
1588             &&(r_IsRingVar(id, (char**)n_ParameterNames(currRing->cf),
1589                                n_NumberOfParameters(currRing->cf))>=0))))
[f3578ca]1590        {
1591        // WARNING: do not use ring variable names in procedures
[bdda288]1592          Warn("use of variable >>%s<< in a procedure in line %s",id,my_yylinebuf);
[f3578ca]1593        }
[0e1846]1594        return;
1595      }
1596    }
1597    /* 8. basering ? */
1598    if ((myynest>1)&&(currRingHdl!=NULL))
1599    {
1600      if (strcmp(id,IDID(currRingHdl))==0)
1601      {
[95197e]1602        if (IDID(currRingHdl)!=id) omFreeBinAddr((ADDRESS)id); /*assume strlen
1603(id) <1000 */
[610881]1604        h=currRingHdl;
1605        goto id_found;
[0e1846]1606      }
1607    }
[8f1a54]1608    if((v->req_packhdl!=basePack) && (v->req_packhdl==currPack))
[a3bc95e]1609    {
[5bce7c]1610      h=basePack->idroot->get(id,myynest);
1611      if (h!=NULL)
[ff7e529]1612      {
[95197e]1613        if (id!=IDID(h)) omFreeBinAddr((ADDRESS)id); /*assume strlen(id) <1000 */
[5bce7c]1614        v->req_packhdl=basePack;
[610881]1615        goto id_found;
[5bce7c]1616      }
[a3bc95e]1617    }
[0e1846]1618  }
1619#ifdef SIQ
1620  else
1621    v->rtyp=DEF_CMD;
1622#endif
1623  /* 9: _ */
1624  if (strcmp(id,"_")==0)
1625  {
[95197e]1626    omFreeBinAddr((ADDRESS)id);
[0e1846]1627    v->Copy(&sLastPrinted);
1628  }
1629  else
1630  {
1631    /* 10: everything else */
1632    /* v->rtyp = UNKNOWN;*/
1633    v->name = id;
1634  }
[0e051f]1635  currRingHdl=save_ring;
[610881]1636  return;
1637id_found: // we have an id (in h) found, to set the data in from h
[ea947e]1638  if (IDTYP(h)!=ALIAS_CMD)
1639  {
1640    v->rtyp = IDHDL;
1641    v->flag = IDFLAG(h);
1642    v->attribute=IDATTR(h);
1643  }
1644  else
1645  {
1646    v->rtyp = ALIAS_CMD;
1647  }
[610881]1648  v->name = IDID(h);
[ea947e]1649  v->data = (char *)h;
[0e051f]1650  currRingHdl=save_ring;
[0e1846]1651}
1652
1653int sleftv::Eval()
1654{
1655  BOOLEAN nok=FALSE;
1656  leftv nn=next;
1657  next=NULL;
1658  if(rtyp==IDHDL)
1659  {
1660    int t=Typ();
[2a2c07]1661    if (t!=PROC_CMD)
1662    {
1663      void *d=CopyD(t);
1664      data=d;
1665      rtyp=t;
1666      name=NULL;
1667      e=NULL;
1668    }
[0e1846]1669  }
1670  else if (rtyp==COMMAND)
1671  {
1672    command d=(command)data;
1673    if(d->op==PROC_CMD) //assume d->argc==2
1674    {
1675      char *what=(char *)(d->arg1.Data());
1676      idhdl h=ggetid(what);
1677      if((h!=NULL)&&(IDTYP(h)==PROC_CMD))
1678      {
1679        nok=d->arg2.Eval();
1680        if(!nok)
1681        {
[5edb77]1682          nok=iiMake_proc(h,req_packhdl,&d->arg2);
1683          if (!nok)
1684            memcpy(this,&iiRETURNEXPR,sizeof(sleftv));
[0e1846]1685        }
1686      }
1687      else nok=TRUE;
1688    }
1689    else if (d->op=='=') //assume d->argc==2
1690    {
[faeb82]1691      if ((d->arg1.rtyp!=IDHDL)&&(d->arg1.rtyp!=DEF_CMD))
[0e1846]1692      {
[faeb82]1693        nok=d->arg1.Eval();
1694      }
1695      if (!nok)
1696      {
[85e68dd]1697        const char *n=d->arg1.name;
[fff984]1698        nok=(n == NULL) || d->arg2.Eval();
[0e1846]1699        if (!nok)
1700        {
[d754b7]1701          int save_typ=d->arg1.rtyp;
[85e68dd]1702          omCheckAddr((ADDRESS)n);
[faeb82]1703          if (d->arg1.rtyp!=IDHDL)
[fff984]1704          syMake(&d->arg1,n);
[85e68dd]1705          omCheckAddr((ADDRESS)d->arg1.name);
[0e1846]1706          if (d->arg1.rtyp==IDHDL)
1707          {
[c232af]1708            n=omStrDup(IDID((idhdl)d->arg1.data));
[0e1846]1709            killhdl((idhdl)d->arg1.data);
[a3bc95e]1710            d->arg1.Init();
[f077d2]1711            //d->arg1.data=NULL;
[0e1846]1712            d->arg1.name=n;
1713          }
[f077d2]1714          d->arg1.rtyp=DEF_CMD;
[0e1846]1715          sleftv t;
[d754b7]1716          if(save_typ!=PROC_CMD) save_typ=d->arg2.rtyp;
[df5fc1]1717          if (::RingDependend(d->arg2.rtyp))
[d754b7]1718            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&currRing->idroot);
[0e1846]1719          else
[46d09b]1720            nok=iiDeclCommand(&t,&d->arg1,0,save_typ,&IDROOT);
[0e1846]1721          memcpy(&d->arg1,&t,sizeof(sleftv));
[85e68dd]1722          omCheckAddr((ADDRESS)d->arg1.name);
[0e1846]1723          nok=nok||iiAssign(&d->arg1,&d->arg2);
[9d72fe]1724          omCheckIf(d->arg1.name != NULL,  // OB: ????
[85e68dd]1725                    omCheckAddr((ADDRESS)d->arg1.name));
[0e1846]1726          if (!nok)
1727          {
1728            memset(&d->arg1,0,sizeof(sleftv));
[4f568c]1729            this->CleanUp();
1730            rtyp=NONE;
[0e1846]1731          }
1732        }
1733      }
1734      else nok=TRUE;
1735    }
[91ef34]1736    else
[0e1846]1737    {
[91ef34]1738      int toktype=iiTokType(d->op);
1739      if ((toktype==CMD_M)
1740      ||( toktype==ROOT_DECL_LIST)
[1f03aba]1741      ||( toktype==RING_DECL_LIST))
[91ef34]1742      {
1743        if (d->argc <=3)
1744        {
1745          if (d->argc>=1) nok=d->arg1.Eval();
1746          if ((!nok) && (d->argc>=2))
1747          { nok=d->arg2.Eval(); d->arg1.next=&d->arg2; }
1748          if ((!nok) && (d->argc==3))
1749          { nok=d->arg3.Eval(); d->arg2.next=&d->arg3; }
1750          if (d->argc==0)
1751            nok=nok||iiExprArithM(this,NULL,d->op);
1752          else
1753            nok=nok||iiExprArithM(this,&d->arg1,d->op);
1754          d->arg1.next=NULL;
1755          d->arg2.next=NULL;
1756          d->arg3.next=NULL;
1757        }
1758        else
1759        {
1760          nok=d->arg1.Eval();
1761          nok=nok||iiExprArithM(this,&d->arg1,d->op);
1762        }
1763      }
1764      else if (d->argc==1)
1765      {
1766        nok=d->arg1.Eval();
1767        nok=nok||iiExprArith1(this,&d->arg1,d->op);
1768      }
1769      else if(d->argc==2)
1770      {
1771        nok=d->arg1.Eval();
1772        nok=nok||d->arg2.Eval();
1773        nok=nok||iiExprArith2(this,&d->arg1,d->op,&d->arg2);
1774      }
1775      else if(d->argc==3)
1776      {
1777        nok=d->arg1.Eval();
1778        nok=nok||d->arg2.Eval();
1779        nok=nok||d->arg3.Eval();
1780        nok=nok||iiExprArith3(this,d->op,&d->arg1,&d->arg2,&d->arg3);
1781      }
1782      else if(d->argc!=0)
1783      {
1784        nok=d->arg1.Eval();
1785        nok=nok||iiExprArithM(this,&d->arg1,d->op);
1786      }
1787      else // d->argc == 0
1788      {
1789        nok = iiExprArithM(this, NULL, d->op);
1790      }
[0e1846]1791    }
1792  }
1793  else if (((rtyp==0)||(rtyp==DEF_CMD))
1794    &&(name!=NULL))
1795  {
1796     syMake(this,name);
1797  }
1798#ifdef MDEBUG
1799  switch(Typ())
1800  {
1801    case NUMBER_CMD:
1802#ifdef LDEBUG
1803      nTest((number)Data());
[84a6a7]1804#endif
1805      break;
1806    case BIGINT_CMD:
1807#ifdef LDEBUG
[4ff07f]1808      n_Test((number)Data(),coeffs_BIGINT);
[0e1846]1809#endif
1810      break;
1811    case POLY_CMD:
1812      pTest((poly)Data());
1813      break;
1814    case IDEAL_CMD:
1815    case MODUL_CMD:
1816    case MATRIX_CMD:
1817      {
1818        ideal id=(ideal)Data();
[c232af]1819        omCheckAddrSize(id,sizeof(*id));
[0e1846]1820        int i=id->ncols*id->nrows-1;
1821        for(;i>=0;i--) pTest(id->m[i]);
1822      }
1823      break;
1824  }
1825#endif
1826  if (nn!=NULL) nok=nok||nn->Eval();
1827  next=nn;
1828  return nok;
1829}
1830
[85e68dd]1831const char *iiSleftv2name(leftv v)
[c12cf96]1832{
1833  return(v->name);
1834}
[f71681]1835
1836void * sattr::CopyA()
1837{
1838  omCheckAddrSize(this,sizeof(sattr));
1839  return s_internalCopy(atyp,data);
1840}
1841
Note: See TracBrowser for help on using the repository browser.