source: git/Singular/ipshell.cc @ 48aa42

fieker-DuValspielwiese
Last change on this file since 48aa42 was cf42ab1, checked in by Hans Schönemann <hannes@…>, 23 years ago
*hannes: ring changes don't have complete any more git-svn-id: file:///usr/local/Singular/svn/trunk@4817 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 26.0 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: ipshell.cc,v 1.58 2000-12-06 11:03:18 Singular Exp $ */
5/*
6* ABSTRACT:
7*/
8
9//#include <stdlib.h>
10#include <stdio.h>
11#include <string.h>
12#include <ctype.h>
13
14#include "mod2.h"
15#include "tok.h"
16#include "ipid.h"
17#include "intvec.h"
18#include "omalloc.h"
19#include "febase.h"
20#include "polys.h"
21#include "ideals.h"
22#include "matpol.h"
23#include "kstd1.h"
24#include "ring.h"
25#include "subexpr.h"
26#include "maps.h"
27#include "syz.h"
28#include "numbers.h"
29#include "lists.h"
30#include "attrib.h"
31#include "ipconv.h"
32#include "silink.h"
33#include "stairc.h"
34#include "ipshell.h"
35#ifdef HAVE_FACTORY
36#define SI_DONT_HAVE_GLOBAL_VARS
37#include <factory.h>
38#endif
39
40leftv iiCurrArgs=NULL;
41int  traceit = 0;
42char *lastreserved=NULL;
43
44int  myynest = -1;
45
46static BOOLEAN iiNoKeepRing=TRUE;
47
48/*0 implementation*/
49
50char * Tok2Cmdname(int tok)
51{
52  int i = 0;
53  if (tok < 0)
54  {
55    return cmds[0].name;
56  }
57  if (tok==ANY_TYPE) return "any_type";
58  if (tok==NONE) return "nothing";
59  //if (tok==IFBREAK) return "if_break";
60  //if (tok==VECTOR_FROM_POLYS) return "vector_from_polys";
61  //if (tok==ORDER_VECTOR) return "ordering";
62  //if (tok==REF_VAR) return "ref";
63  //if (tok==OBJECT) return "object";
64  //if (tok==PRINT_EXPR) return "print_expr";
65  if (tok==IDHDL) return "identifier";
66  while (cmds[i].tokval!=0)
67  {
68    if ((cmds[i].tokval == tok)&&(cmds[i].alias==0))
69    {
70      return cmds[i].name;
71    }
72    i++;
73  }
74  return cmds[0].name;
75}
76
77char * iiTwoOps(int t)
78{
79  if (t<127)
80  {
81    static char ch[2];
82    switch (t)
83    {
84      case '&':
85        return "and";
86      case '|':
87        return "or";
88      default:
89        ch[0]=t;
90        ch[1]='\0';
91        return ch;
92    }
93  }
94  switch (t)
95  {
96    case COLONCOLON:  return "::";
97    case DOTDOT:      return "..";
98    //case PLUSEQUAL:   return "+=";
99    //case MINUSEQUAL:  return "-=";
100    case MINUSMINUS:  return "--";
101    case PLUSPLUS:    return "++";
102    case EQUAL_EQUAL: return "==";
103    case LE:          return "<=";
104    case GE:          return ">=";
105    case NOTEQUAL:    return "<>";
106    default:          return Tok2Cmdname(t);
107  }
108}
109
110static void list1(char* s, idhdl h,BOOLEAN c, BOOLEAN fullname)
111{
112  char buffer[22];
113  int l;
114  char buf2[128];
115
116  if(fullname) sprintf(buf2, "%s::%s", "", IDID(h));
117  else sprintf(buf2, "%s", IDID(h));
118
119  Print("%s%-20.20s [%d]  ",s,buf2,IDLEV(h));
120  if (h == currRingHdl) PrintS("*");
121  PrintS(Tok2Cmdname((int)IDTYP(h)));
122
123  ipListFlag(h);
124  switch(IDTYP(h))
125  {
126    case INT_CMD:   Print(" %d",IDINT(h)); break;
127    case INTVEC_CMD:Print(" (%d)",IDINTVEC(h)->length()); break;
128    case INTMAT_CMD:Print(" %d x %d",IDINTVEC(h)->rows(),IDINTVEC(h)->cols());
129                    break;
130    case POLY_CMD:
131    case VECTOR_CMD:if (c)
132                    {
133                      PrintS(" ");wrp(IDPOLY(h));
134                      if(IDPOLY(h) != NULL)
135                      {
136                        Print(", %d monomial(s)",pLength(IDPOLY(h)));
137                      }
138                    }
139                    break;
140    case MODUL_CMD: Print(", rk %d", IDIDEAL(h)->rank);
141    case IDEAL_CMD: Print(", %u generator(s)",
142                    IDELEMS(IDIDEAL(h)),IDIDEAL(h)->rank); break;
143    case MAP_CMD:
144                    Print(" from %s",IDMAP(h)->preimage); break;
145    case MATRIX_CMD:Print(" %u x %u"
146                      ,MATROWS(IDMATRIX(h))
147                      ,MATCOLS(IDMATRIX(h))
148                    );
149                    break;
150    case PACKAGE_CMD:
151                    PrintS(" (");
152                    switch (IDPACKAGE(h)->language)
153                    {
154                        case LANG_SINGULAR: PrintS("S"); break;
155                        case LANG_C:        PrintS("C"); break;
156                        case LANG_TOP:      PrintS("T"); break;
157                        case LANG_NONE:     PrintS("N"); break;
158                        default:            PrintS("U");
159                    }
160                    if(IDPACKAGE(h)->libname!=NULL)
161                      Print(",%s", IDPACKAGE(h)->libname);
162                    PrintS(")");
163                    break;
164    case PROC_CMD: if(strlen(IDPROC(h)->libname)>0)
165                     Print(" from %s",IDPROC(h)->libname);
166                   if(IDPROC(h)->is_static)
167                     PrintS(" (static)");
168                   break;
169    case STRING_CMD:
170                   {
171                     char *s;
172                     l=strlen(IDSTRING(h));
173                     memset(buffer,0,22);
174                     strncpy(buffer,IDSTRING(h),min(l,20));
175                     if ((s=strchr(buffer,'\n'))!=NULL)
176                     {
177                       *s='\0';
178                     }
179                     PrintS(" ");
180                     PrintS(buffer);
181                     if((s!=NULL) ||(l>20))
182                     {
183                       Print("..., %d char(s)",l);
184                     }
185                     break;
186                   }
187    case LIST_CMD: Print(", size: %d",IDLIST(h)->nr+1);
188                   break;
189    case QRING_CMD:
190    case RING_CMD:
191#ifdef RDEBUG
192                   if (traceit &TRACE_SHOW_RINGS)
193                     Print(" <%x>",IDRING(h));
194#endif
195                   break;
196    /*default:     break;*/
197  }
198  PrintLn();
199}
200
201void type_cmd(idhdl h)
202{
203  BOOLEAN oldShortOut = FALSE;
204 
205  if (currRing != NULL)
206  {
207    oldShortOut = currRing->ShortOut;
208    currRing->ShortOut = 1;
209  }
210  list1("// ",h,FALSE,FALSE);
211  if (IDTYP(h)!=INT_CMD)
212  {
213    sleftv expr;
214    memset(&expr,0,sizeof(expr));
215    expr.rtyp=IDHDL;
216    expr.name=IDID(h);
217    expr.data=(void *)h;
218    expr.Print();
219  }
220  if (currRing != NULL)
221    currRing->ShortOut = oldShortOut;
222}
223
224static void killlocals0(int v, idhdl * localhdl)
225{
226  idhdl h = *localhdl;
227  while (h!=NULL)
228  {
229    int vv;
230    //Print("consider %s, lev: %d:",IDID(h),IDLEV(h));
231    if ((vv=IDLEV(h))>0)
232    {
233      if (vv < v)
234      {
235        if (iiNoKeepRing)
236        {
237          //PrintS(" break\n");
238          return;
239        }
240        h = IDNEXT(h);
241        //PrintLn();
242      }
243      else if (vv >= v)
244      {
245        idhdl nexth = IDNEXT(h);
246        killhdl(h,localhdl);
247        h = nexth;
248        //PrintS("kill\n");
249      }
250    }
251    else
252    {
253      h = IDNEXT(h);
254      //PrintLn();
255    }
256  }
257}
258
259void killlocals(int v)
260{
261  killlocals0(v,&IDROOT);
262
263  if ((iiRETURNEXPR_len > myynest)
264  && ((iiRETURNEXPR[myynest].Typ()==RING_CMD)
265    || (iiRETURNEXPR[myynest].Typ()==QRING_CMD)))
266  {
267    leftv h=&iiRETURNEXPR[myynest];
268    killlocals0(v,&(((ring)h->data)->idroot));
269  }
270
271  idhdl sh=currRingHdl;
272  BOOLEAN changed=FALSE;
273#ifndef HAVE_NAMESPACES
274  idhdl h = IDROOT;
275
276  while (h!=NULL)
277  {
278    if (((IDTYP(h)==QRING_CMD) || (IDTYP(h) == RING_CMD))
279    && (IDRING(h)->idroot!=NULL))
280    {
281      if (h!=currRingHdl) {changed=TRUE;rSetHdl(h);}
282      killlocals0(v,&(IDRING(h)->idroot));
283    }
284    h = IDNEXT(h);
285  }
286#else
287  idhdl h = NSROOT(namespaceroot->root);
288
289  while (h!=NULL)
290  {
291    if (((IDTYP(h)==QRING_CMD) || (IDTYP(h) == RING_CMD))
292    && (IDRING(h)->idroot!=NULL))
293    {
294      //Print("=====> Toplevel: ring %s, lev: %d:\n",IDID(h),IDLEV(h));
295      if (h!=currRingHdl) {changed=TRUE;rSetHdl(h);}
296      killlocals0(v,&(IDRING(h)->idroot));
297    }
298    if (IDTYP(h)==PACKAGE_CMD && (IDPACKAGE(h)->idroot!=NULL))
299    {
300      idhdl h0 = (IDPACKAGE(h))->idroot;
301
302      //Print("=====> package: %s, lev: %d:\n",IDID(h),IDLEV(h));
303      while (h0!=NULL)
304      {
305        if (((IDTYP(h0)==QRING_CMD) || (IDTYP(h0) == RING_CMD))
306            && (IDRING(h0)->idroot!=NULL))
307        {
308          //Print("=====> '%s': ring %s, lev: %d:\n",IDID(h),IDID(h0),IDLEV(h0));
309          if (h0!=currRingHdl) {changed=TRUE;rSetHdl(h0);}
310          killlocals0(v,&(IDRING(h0)->idroot));
311        }
312        h0 = IDNEXT(h0);
313      }
314      killlocals0(v,&((IDPACKAGE(h))->idroot));
315    }
316    h = IDNEXT(h);
317  }
318#endif /* HAVE_NAMESPACES */
319  if (changed)
320  {
321    currRing=NULL;
322    currRingHdl=NULL;
323    if (sh!=NULL) rSetHdl(sh);
324  }
325
326  if (myynest<=1) iiNoKeepRing=TRUE;
327}
328
329void list_cmd(int typ, const char* what, char *prefix,BOOLEAN iterate, BOOLEAN fullname)
330{
331  idhdl h,start;
332  BOOLEAN all = typ<0;
333  BOOLEAN really_all=FALSE;
334  BOOLEAN do_packages=FALSE;
335
336  if ( typ == -1 ) do_packages=TRUE;
337  if ( typ==0 )
338  {
339    if (strcmp(what,"all")==0)
340    {
341      really_all=TRUE;
342      h=IDROOT;
343    }
344    else
345    {
346#ifdef HAVE_NAMESPACES
347      idhdl pack;
348      if(strchr(what, ':')!= NULL)
349        iiname2hdl(what, &pack, &h);
350      else h = ggetid(what);
351#else /* HAVE_NAMESPACES */
352      h = ggetid(what);
353#endif /* HAVE_NAMESPACES */
354      if (h!=NULL)
355      {
356        if (iterate) list1(prefix,h,TRUE,fullname);
357        if ((IDTYP(h)==RING_CMD)
358            || (IDTYP(h)==QRING_CMD))
359        {
360          h=IDRING(h)->idroot;
361        }
362        else if((IDTYP(h)==PACKAGE_CMD) || (IDTYP(h)==POINTER_CMD))
363        {
364          //Print("list_cmd:package or pointer\n");
365          if(strcmp(IDID(h), "Top")!=0) h=IDPACKAGE(h)->idroot;
366          else return;
367        }
368        else
369          return;
370      }
371      else
372      {
373        Werror("%s is undefined",what);
374        return;
375      }
376    }
377    all=TRUE;
378  }
379  else if ((typ>BEGIN_RING) && (typ<END_RING))
380  {
381    h = currRing->idroot;
382  }
383  else
384    h = IDROOT;
385  start=h;
386  while (h!=NULL)
387  {
388    if ((all && (IDTYP(h)!=PROC_CMD)) || (typ == IDTYP(h))
389    || ((IDTYP(h)==QRING_CMD) && (typ==RING_CMD)))
390    {
391      list1(prefix,h,start==currRingHdl, fullname);
392      if (((IDTYP(h)==RING_CMD)||(IDTYP(h)==QRING_CMD))
393        && (really_all || (all && (h==currRingHdl)))
394        && ((IDLEV(h)==0)||(IDLEV(h)==myynest)))
395      {
396        list_cmd(0,IDID(h),"//      ",FALSE);
397      }
398#ifdef HAVE_NAMESPACES
399      if (IDTYP(h)==PACKAGE_CMD && really_all && strcmp(IDID(h), "Top"))
400      {
401        namespaceroot->push(IDPACKAGE(h), IDID(h));
402        list_cmd(0,IDID(h),"//      ",FALSE);
403        namespaceroot->pop();
404      }
405#endif /* HAVE_NAMESPACES */
406    }
407    h = IDNEXT(h);
408  }
409#ifdef HAVE_NAMESPACES
410  if(!namespaceroot->isroot && do_packages) {
411    namespaceroot->push(namespaceroot->root->pack, "Top", myynest);
412    list_cmd(PACKAGE_CMD,"Top","// ",FALSE, TRUE);
413    namespaceroot->pop();
414  }
415#endif /* HAVE_NAMESPACES */
416}
417
418void test_cmd(int i)
419{
420  int ii=(char)i;
421
422  if (i == (-32))
423  {
424    test = 0;
425  }
426  else
427  {
428    if (i<0)
429    {
430      ii= -i;
431      if (Sy_bit(ii) & kOptions)
432      {
433        Warn("Gerhard, use the option command");
434        test &= ~Sy_bit(ii);
435      }
436      else if (Sy_bit(ii) & validOpts)
437        test &= ~Sy_bit(ii);
438    }
439    else if (i<32)
440    {
441      if (Sy_bit(ii) & kOptions)
442      {
443        Warn("Gerhard, use the option command");
444        test |= Sy_bit(ii);
445      }
446      else if (Sy_bit(ii) & validOpts)
447        test |= Sy_bit(ii);
448    }
449  }
450}
451
452int exprlist_length(leftv v)
453{
454  int rc = 0;
455  while (v!=NULL)
456  {
457    switch (v->Typ())
458    {
459      case INT_CMD:
460      case POLY_CMD:
461      case VECTOR_CMD:
462      case NUMBER_CMD:
463        rc++;
464        break;
465      case INTVEC_CMD:
466      case INTMAT_CMD:
467        rc += ((intvec *)(v->Data()))->length();
468        break;
469      case MATRIX_CMD:
470      case IDEAL_CMD:
471      case MODUL_CMD:
472        {
473          matrix mm = (matrix)(v->Data());
474          rc += mm->rows() * mm->cols();
475        }
476        break;
477      case LIST_CMD:
478        rc+=((lists)v->Data())->nr+1;
479        break;
480      default:
481        rc++;
482    }
483    v = v->next;
484  }
485  return rc;
486}
487
488void iiWriteMatrix(matrix im, const char *n, int dim,int spaces)
489{
490  int i,ii = MATROWS(im)-1;
491  int j,jj = MATCOLS(im)-1;
492  poly *pp = im->m;
493
494  for (i=0; i<=ii; i++)
495  {
496    for (j=0; j<=jj; j++)
497    {
498      if (spaces>0)
499        Print("%-*.*s",spaces,spaces," ");
500      if (dim == 2) Print("%s[%u,%u]=",n,i+1,j+1);
501      else if (dim == 1) Print("%s[%u]=",n,j+1);
502      else if (dim == 0) Print("%s=",n);
503      if ((i<ii)||(j<jj)) pWrite(*pp++);
504      else                pWrite0(*pp);
505    }
506  }
507}
508
509char * iiStringMatrix(matrix im, int dim,char ch)
510{
511  int i,ii = MATROWS(im);
512  int j,jj = MATCOLS(im);
513  poly *pp = im->m;
514  char *s=StringSetS("");
515
516  for (i=0; i<ii; i++)
517  {
518    for (j=0; j<jj; j++)
519    {
520      pString0(*pp++);
521      s=StringAppend("%c",ch);
522      if (dim > 1) s = StringAppendS("\n");
523    }
524  }
525  s[strlen(s)- (dim > 1 ? 2 : 1)]='\0';
526  return s;
527}
528
529int IsPrime(int p)  /* brute force !!!! */
530{
531  int i,j;
532  if      (p == 0)    return 0;
533  else if (p == 1)    return 1/*1*/;
534  else if (p == 2)    return p;
535  else if (p < 0)     return (-IsPrime(-p));
536  else if (p > 32002) return 32003; // without this line, max prime is 32749
537  else if (!(p & 1)) return IsPrime(p-1);
538#ifdef HAVE_FACTORY
539  int a=0;
540  int e=cf_getNumSmallPrimes()-1;
541  i=e/2;
542  do
543  {
544    if (p==(j=cf_getSmallPrime(i))) return p;
545    if (p<j) e=i-1;
546    else     a=i+1;
547    i=a+(e-a)/2;
548  } while ( a<= e);
549  if (p>j) return j;
550  else     return cf_getSmallPrime(i-1);
551#else
552  for (j=p/2+1,i=3; i<p; i+=2)
553  {
554    if ((p%i) == 0) return IsPrime(p-2);
555    if (j < i) return p;
556  }
557  return p;
558#endif
559}
560
561BOOLEAN iiWRITE(leftv res,leftv v)
562{
563  sleftv vf;
564  if (iiConvert(v->Typ(),LINK_CMD,iiTestConvert(v->Typ(),LINK_CMD),v,&vf))
565  {
566    WerrorS("link expected");
567    return TRUE;
568  }
569  si_link l=(si_link)vf.Data();
570  if (vf.next == NULL)
571  {
572    WerrorS("write: need at least two arguments");
573    return TRUE;
574  }
575
576  BOOLEAN b=slWrite(l,vf.next); /* iiConvert preserves next */
577  if (b)
578  {
579    const char *s;
580    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
581    else                            s=sNoName;
582    Werror("cannot write to %s",s);
583  }
584  vf.CleanUp();
585  return b;
586}
587
588leftv iiMap(map theMap, char * what)
589{
590  idhdl w,r;
591  leftv v;
592  int i;
593
594#ifdef HAVE_NAMESPACES
595  idhdl pack;
596  //r=namespaceroot->get(theMap->preimage,myynest);
597  iiname2hdl(theMap->preimage,&pack,&r);
598#else
599  r=idroot->get(theMap->preimage,myynest);
600#endif /* HAVE_NAMESPACES */
601  if ((r!=NULL) && ((r->typ == RING_CMD) || (r->typ== QRING_CMD)))
602  {
603    //if (!nSetMap(rInternalChar(IDRING(r)),
604    //             IDRING(r)->parameter,
605    //             rPar(IDRING(r)),
606    //             IDRING(r)->minpoly))
607    if (!nSetMap(IDRING(r)))
608    {
609      if (rEqual(IDRING(r),currRing))
610      {
611        nMap=nCopy;
612      }
613      else
614      {
615        Werror("can not map from ground field of %s to current ground field",
616          theMap->preimage);
617        return NULL;
618      }
619    }
620    if (IDELEMS(theMap)<IDRING(r)->N)
621    {
622      theMap->m=(polyset)omReallocSize((ADDRESS)theMap->m,
623                                 IDELEMS(theMap)*sizeof(poly),
624                                 (IDRING(r)->N)*sizeof(poly));
625      for(i=IDELEMS(theMap);i<IDRING(r)->N;i++)
626        theMap->m[i]=NULL;
627      IDELEMS(theMap)=IDRING(r)->N;
628    }
629    if (what==NULL)
630    {
631      WerrorS("argument of a map must have a name");
632    }
633    else if ((w=IDRING(r)->idroot->get(what,myynest))!=NULL)
634    {
635      v=(leftv)omAlloc0Bin(sleftv_bin);
636      sleftv tmpW;
637      memset(&tmpW,0,sizeof(sleftv));
638      tmpW.rtyp=IDTYP(w);
639      tmpW.data=IDDATA(w);
640      if (maApplyFetch(MAP_CMD,theMap,v,&tmpW,IDRING(r),NULL,NULL,0))
641      {
642        Werror("cannot map %s(%d)",Tok2Cmdname(w->typ),w->typ);
643        omFreeBin((ADDRESS)v, sleftv_bin);
644        return NULL;
645      }
646      return v;
647    }
648    else
649    {
650      Werror("%s undefined in %s",what,theMap->preimage);
651    }
652  }
653  else
654  {
655    Werror("cannot find preimage %s",theMap->preimage);
656  }
657  return NULL;
658}
659
660#ifdef OLD_RES
661void  iiMakeResolv(resolvente r, int length, int rlen, char * name, int typ0,
662                   intvec ** weights)
663{
664  lists L=liMakeResolv(r,length,rlen,typ0,weights);
665  int i=0;
666  idhdl h;
667  char * s=(char *)omAlloc(strlen(name)+5);
668
669  while (i<=L->nr)
670  {
671    sprintf(s,"%s(%d)",name,i+1);
672    if (i==0)
673      h=enterid(omStrDup(s),myynest,typ0,&(currRing->idroot), FALSE);
674    else
675      h=enterid(omStrDup(s),myynest,MODUL_CMD,&(currRing->idroot), FALSE);
676    if (h!=NULL)
677    {
678      h->data.uideal=(ideal)L->m[i].data;
679      h->attribute=L->m[i].attribute;
680      if (BVERBOSE(V_DEF_RES))
681        Print("//defining: %s as %d-th syzygy module\n",s,i+1);
682    }
683    else
684    {
685      idDelete((ideal *)&(L->m[i].data));
686      Warn("cannot define %s",s);
687    }
688    //L->m[i].data=NULL;
689    //L->m[i].rtyp=0;
690    //L->m[i].attribute=NULL;
691    i++;
692  }
693  omFreeSize((ADDRESS)L->m,(L->nr+1)*sizeof(sleftv));
694  omFreeBin((ADDRESS)L, slists_bin);
695  omFreeSize((ADDRESS)s,strlen(name)+5);
696}
697#endif
698
699//resolvente iiFindRes(char * name, int * len, int *typ0)
700//{
701//  char *s=(char *)omAlloc(strlen(name)+5);
702//  int i=-1;
703//  resolvente r;
704//  idhdl h;
705//
706//  do
707//  {
708//    i++;
709//    sprintf(s,"%s(%d)",name,i+1);
710//    h=currRing->idroot->get(s,myynest);
711//  } while (h!=NULL);
712//  *len=i-1;
713//  if (*len<=0)
714//  {
715//    Werror("no objects %s(1),.. found",name);
716//    omFreeSize((ADDRESS)s,strlen(name)+5);
717//    return NULL;
718//  }
719//  r=(ideal *)omAlloc(/*(len+1)*/ i*sizeof(ideal));
720//  memset(r,0,(*len)*sizeof(ideal));
721//  i=-1;
722//  *typ0=MODUL_CMD;
723//  while (i<(*len))
724//  {
725//    i++;
726//    sprintf(s,"%s(%d)",name,i+1);
727//    h=currRing->idroot->get(s,myynest);
728//    if (h->typ != MODUL_CMD)
729//    {
730//      if ((i!=0) || (h->typ!=IDEAL_CMD))
731//      {
732//        Werror("%s is not of type module",s);
733//        omFreeSize((ADDRESS)r,(*len)*sizeof(ideal));
734//        omFreeSize((ADDRESS)s,strlen(name)+5);
735//        return NULL;
736//      }
737//      *typ0=IDEAL_CMD;
738//    }
739//    if ((i>0) && (idIs0(r[i-1])))
740//    {
741//      *len=i-1;
742//      break;
743//    }
744//    r[i]=IDIDEAL(h);
745//  }
746//  omFreeSize((ADDRESS)s,strlen(name)+5);
747//  return r;
748//}
749
750static resolvente iiCopyRes(resolvente r, int l)
751{
752  int i;
753  resolvente res=(ideal *)omAlloc0((l+1)*sizeof(ideal));
754
755  for (i=0; i<l; i++)
756    res[i]=idCopy(r[i]);
757  return res;
758}
759
760BOOLEAN jjMINRES(leftv res, leftv v)
761{
762  int len=0;
763  int typ0;
764  resolvente rr=liFindRes((lists)v->Data(),&len,&typ0);
765  if (rr==NULL) return TRUE;
766  resolvente r=iiCopyRes(rr,len);
767
768  syMinimizeResolvente(r,len,0);
769  omFreeSize((ADDRESS)rr,len*sizeof(ideal));
770  len++;
771  res->data=(char *)liMakeResolv(r,len,-1,typ0,NULL);
772  return FALSE;
773}
774
775BOOLEAN jjBETTI(leftv res, leftv v)
776{
777  resolvente r;
778  int len;
779  int reg,typ0;
780
781  r=liFindRes((lists)v->Data(),&len,&typ0);
782  if (r==NULL) return TRUE;
783  res->data=(char *)syBetti(r,len,&reg);
784  omFreeSize((ADDRESS)r,(len)*sizeof(ideal));
785  return FALSE;
786}
787
788int iiRegularity(lists L)
789{
790  int len,reg,typ0;
791
792  resolvente r=liFindRes(L,&len,&typ0);
793
794  if (r==NULL)
795    return -2;
796  intvec * dummy=syBetti(r,len,&reg);
797  omFreeSize((ADDRESS)r,len*sizeof(ideal));
798  delete dummy;
799  return reg+1;
800}
801
802BOOLEAN iiDebugMarker=TRUE;
803#define BREAK_LINE_LENGTH 80
804void iiDebug()
805{
806  Print("\n-- break point in %s --\n",VoiceName());
807  if (iiDebugMarker) VoiceBackTrack();
808  char * s;
809  iiDebugMarker=FALSE;
810  s = (char *)omAlloc(BREAK_LINE_LENGTH+4);
811  loop
812  {
813    memset(s,0,80);
814    fe_fgets_stdin("",s,BREAK_LINE_LENGTH);
815    if (s[BREAK_LINE_LENGTH-1]!='\0')
816    {
817      Print("line too long, max is %d chars\n",BREAK_LINE_LENGTH);
818    }
819    else
820      break;
821  }
822  if (*s=='\n')
823  {
824    iiDebugMarker=TRUE;
825  }
826#if MDEBUG
827  else if(strncmp(s,"cont;",5)==0)
828  {
829    iiDebugMarker=TRUE;
830  }
831#endif /* MDEBUG */
832  else
833  {
834    strcat( s, "\n;~\n");
835    newBuffer(s,BT_execute);
836  }
837}
838
839int iiDeclCommand(leftv sy, leftv name, int lev,int t, idhdl* root,BOOLEAN isring, BOOLEAN init_b)
840{
841  BOOLEAN res=FALSE;
842  char *id = name->name;
843
844  memset(sy,0,sizeof(sleftv));
845  if ((name->name==NULL)||(isdigit(name->name[0])))
846  {
847    WerrorS("object to declare is not a name");
848    res=TRUE;
849  }
850  else
851  {
852    //if (name->rtyp!=0)
853    //{
854    //  Warn("`%s` is already in use",name->name);
855    //}
856#ifdef HAVE_NAMESPACES
857    if(name->req_packhdl != NULL && name->packhdl != NULL &&
858       name->req_packhdl != name->packhdl)
859      id = omStrDup(name->name);
860
861    //if(name->req_packhdl != NULL /*&& !isring*/) {
862    if(name->req_packhdl != NULL && !isring &&
863       IDPACKAGE(name->req_packhdl) != root) {
864      //Print("iiDeclCommand: PUSH(%s)\n",IDID(name->req_packhdl));
865      namespaceroot->push( IDPACKAGE(name->req_packhdl) ,
866                           IDID(name->req_packhdl));
867      sy->data = (char *)enterid(id,lev,t,
868                                 &IDPACKAGE(name->req_packhdl)->idroot,init_b);
869      namespaceroot->pop();
870    }
871    else
872#endif /* HAVE_NAMESPACES */
873    {
874      sy->data = (char *)enterid(id,lev,t,root,init_b);
875    }
876    if (sy->data!=NULL)
877    {
878      sy->rtyp=IDHDL;
879      currid=sy->name=IDID((idhdl)sy->data);
880      name->name=NULL; /* used in enterid */
881      //sy->e = NULL;
882      if (name->next!=NULL)
883      {
884        sy->next=(leftv)omAllocBin(sleftv_bin);
885        res=iiDeclCommand(sy->next,name->next,lev,t,root, isring);
886      }
887    }
888    else res=TRUE;
889  }
890  name->CleanUp();
891  return res;
892}
893
894BOOLEAN iiParameter(leftv p)
895{
896  if (iiCurrArgs==NULL)
897  {
898    if (strcmp(p->name,"#")==0) return FALSE;
899    Werror("not enough arguments for proc %s",VoiceName());
900    p->CleanUp();
901    return TRUE;
902  }
903  leftv h=iiCurrArgs;
904  if (strcmp(p->name,"#")==0)
905  {
906    iiCurrArgs=NULL;
907  }
908  else
909  {
910    iiCurrArgs=h->next;
911    h->next=NULL;
912  }
913  BOOLEAN res=iiAssign(p,h);
914  omFreeBin((ADDRESS)h, sleftv_bin);
915  return res;
916}
917
918static BOOLEAN iiInternalExport (leftv v, int toLev)
919{
920  idhdl h=(idhdl)v->data;
921  //Print("iiInternalExport('%s',%d)%s\n", v->name, toLev,"");
922  if (IDLEV(h)==0) Warn("`%s` is already global",IDID(h));
923  else
924  {
925    h=IDROOT->get(v->name,toLev);
926    idhdl *root=&IDROOT;
927    if ((h==NULL)&&(currRing!=NULL))
928    {
929      h=currRing->idroot->get(v->name,toLev);
930      root=&currRing->idroot;
931    }
932    if ((h!=NULL)&&(IDLEV(h)==toLev))
933    {
934      if (IDTYP(h)==v->Typ())
935      {
936        if (BVERBOSE(V_REDEFINE))
937        {
938#ifdef KAI
939          Warn("!!! redefining %s",IDID(h));
940#else
941          Warn("redefining %s",IDID(h));
942#endif
943        }
944#ifdef HAVE_NAMESPACES
945        //if (namespaceroot->currRing==IDRING(h)) namespaceroot->currRing=NULL;
946#endif /* HAVE_NAMESPACES */
947#ifdef USE_IILOCALRING
948            if (iiLocalRing[0]==IDRING(h)) iiLocalRing[0]=NULL;
949#else
950            if (namespaceroot->root->currRing==IDRING(h))
951              namespaceroot->root->currRing=NULL;
952#endif
953        killhdl(h,root);
954      }
955      else
956      {
957        return TRUE;
958      }
959    }
960    h=(idhdl)v->data;
961    IDLEV(h)=toLev;
962    iiNoKeepRing=FALSE;
963  }
964  return FALSE;
965}
966
967#ifdef HAVE_NAMESPACES
968BOOLEAN iiInternalExport (leftv v, int toLev, idhdl roothdl)
969{
970  idhdl h=(idhdl)v->data;
971  if(h==NULL) {
972    Warn("'%s': no such identifier\n", v->name);
973    return FALSE;
974  }
975  package rootpack = IDPACKAGE(roothdl);
976  //Print("iiInternalExport('%s',%d,%s) %s\n", v->name, toLev, IDID(roothdl),"");
977//  if (IDLEV(h)==0) Warn("`%s` is already global",IDID(h));
978//  else
979  {
980    /* is not ring or ring-element */
981    if( (IDTYP(h) == RING_CMD) || (IDTYP(h) == QRING_CMD)) {
982      sleftv tmp_expr;
983      //Print("// ==> Ring set nesting to 0\n");
984      //Print("// ++> make a copy of ring\n");
985      if(iiInternalExport(v, toLev)) return TRUE;
986      if(IDPACKAGE(roothdl) != NSPACK(namespaceroot)) {
987        namespaceroot->push(rootpack, IDID(roothdl));
988        //namespaceroot->push(NSPACK(namespaceroot->root), "Top");
989        idhdl rl=enterid(omStrDup(v->name), toLev, IDTYP(h),
990                         &(rootpack->idroot), FALSE);
991        namespaceroot->pop();
992
993        if( rl == NULL) return TRUE;
994        ring r=(ring)v->Data();
995        if(r != NULL) {
996          if (&IDRING(rl)!=NULL) rKill(rl);
997          r->ref++;
998          IDRING(rl)=r;
999        }
1000        else PrintS("! ! ! ! ! r is empty!!!!!!!!!!!!\n");
1001      }
1002    }
1003    else if ((BEGIN_RING<IDTYP(h)) && (IDTYP(h)<END_RING)
1004             || ((IDTYP(h)==LIST_CMD) && (lRingDependend(IDLIST(h))))) {
1005      //Print("// ==> Ringdependent set nesting to 0\n");
1006      if(iiInternalExport(v, toLev)) return TRUE;
1007    } else {
1008      if (h==IDROOT)
1009      {
1010        IDROOT=h->next;
1011      }
1012      else
1013      {
1014        idhdl hh=IDROOT;
1015        while ((hh->next!=h)&&(hh->next!=NULL))
1016          hh=hh->next;
1017        if (hh->next==h)
1018          hh->next=h->next;
1019        else
1020          return TRUE;
1021      }
1022      h->next=rootpack->idroot;
1023      rootpack->idroot=h;
1024    }
1025    IDLEV(h)=toLev;
1026  }
1027  return FALSE;
1028}
1029#endif /* HAVE_NAMESAPCES */
1030
1031BOOLEAN iiExport (leftv v, int toLev)
1032{
1033  BOOLEAN nok=FALSE;
1034  leftv r=v;
1035  while (v!=NULL)
1036  {
1037    if ((v->name==NULL)||(v->rtyp==0)||(v->e!=NULL))
1038    {
1039      WerrorS("cannot export");
1040      nok=TRUE;
1041    }
1042    else
1043    {
1044      if(iiInternalExport(v, toLev)) {
1045        r->CleanUp();
1046        return TRUE;
1047      }
1048    }
1049    v=v->next;
1050  }
1051  r->CleanUp();
1052  return nok;
1053}
1054
1055/*assume root!=idroot*/
1056#ifdef HAVE_NAMESPACES
1057BOOLEAN iiExport (leftv v, int toLev, idhdl root)
1058{
1059  BOOLEAN nok=FALSE;
1060  leftv rv=v;
1061  while (v!=NULL)
1062  {
1063    if ((v->name==NULL)||(v->rtyp==0)||(v->e!=NULL)
1064    )
1065    {
1066      WerrorS("cannot export");
1067      nok=TRUE;
1068    }
1069    else
1070    {
1071      idhdl old=root->get(v->name,toLev);
1072      if (old!=NULL)
1073      {
1074        if (IDTYP(old)==v->Typ())
1075        {
1076          if (BVERBOSE(V_REDEFINE))
1077          {
1078            Warn("redefining %s",IDID(old));
1079          }
1080          killhdl(old,&root);
1081        }
1082        else
1083        {
1084          rv->CleanUp();
1085          return TRUE;
1086        }
1087      }
1088      if(iiInternalExport(v, toLev, root)) {
1089        rv->CleanUp();
1090        return TRUE;
1091      }
1092    }
1093    v=v->next;
1094  }
1095  rv->CleanUp();
1096  return nok;
1097}
1098#endif /* HAVE_NAMESPACES */
1099
1100BOOLEAN iiCheckRing(int i)
1101{
1102  if (currRingHdl==NULL)
1103  {
1104    #ifdef SIQ
1105    if (siq<=0)
1106    {
1107    #endif
1108      if ((i>BEGIN_RING) && (i<END_RING))
1109      {
1110        WerrorS("no ring active");
1111        return TRUE;
1112      }
1113    #ifdef SIQ
1114    }
1115    #endif
1116  }
1117  return FALSE;
1118}
1119
1120poly    iiHighCorner(ideal I, int ak)
1121{
1122  BOOLEAN *UsedAxis=(BOOLEAN *)omAlloc0(pVariables*sizeof(BOOLEAN));
1123  int i,n;
1124  poly po;
1125  for(i=IDELEMS(I)-1;i>=0;i--)
1126  {
1127    po=I->m[i];
1128    if ((po!=NULL) &&((n=pIsPurePower(po))!=0)) UsedAxis[n-1]=TRUE;
1129  }
1130  for(i=pVariables-1;i>=0;i--)
1131  {
1132    if(UsedAxis[i]==FALSE) return NULL; // not zero-dim.
1133  }
1134  if (currRing->OrdSgn== -1)
1135  {
1136    po=NULL;
1137    scComputeHC(I,ak,po);
1138    if (po!=NULL)
1139    {
1140      pGetCoeff(po)=nInit(1);
1141      for (i=pVariables; i>0; i--)
1142      {
1143        if (pGetExp(po, i) > 0) pDecrExp(po,i);
1144      }
1145    }
1146  }
1147  if (po!=NULL)
1148  {
1149    pSetComp(po,ak);
1150    pSetm(po);
1151  }
1152  return po;
1153}
Note: See TracBrowser for help on using the repository browser.