source: git/Singular/subexpr.cc @ 7604db

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