source: git/Singular/subexpr.cc @ df4422

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