source: git/Singular/subexpr.cc @ 228c7e

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