source: git/Singular/subexpr.cc @ 72404e

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