source: git/Singular/misc_ip.cc @ b7b65ee

spielwiese
Last change on this file since b7b65ee was b1dfaf, checked in by Frank Seelisch <seelisch@…>, 14 years ago
patch from Kai (checked for problems under Windows OS: no problems) git-svn-id: file:///usr/local/Singular/svn/trunk@13210 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 25.3 KB
Line 
1/*****************************************************************************\
2 * Computer Algebra System SINGULAR
3\*****************************************************************************/
4/** @file misc_ip.cc
5 *
6 * This file provides miscellaneous functionality.
7 *
8 * For more general information, see the documentation in
9 * misc_ip.h.
10 *
11 * @author Frank Seelisch
12 *
13 * @internal @version \$Id$
14 *
15 **/
16/*****************************************************************************/
17
18// include header files
19#include <kernel/mod2.h>
20#include <Singular/lists.h>
21#include <kernel/longrat.h>
22#include <Singular/misc_ip.h>
23
24void number2mpz(number n, mpz_t m)
25{
26  if (SR_HDL(n) & SR_INT) mpz_init_set_si(m, SR_TO_INT(n));     /* n fits in an int */
27  else             mpz_init_set(m, (mpz_ptr)n->z);
28}
29
30number mpz2number(mpz_t m)
31{
32  number z = (number)omAllocBin(rnumber_bin);
33  mpz_init_set(z->z, m);
34  mpz_init_set_ui(z->n, 1);
35  z->s = 3;
36  return z;
37}
38
39void divTimes(mpz_t n, mpz_t d, int* times)
40{
41  *times = 0;
42  mpz_t r; mpz_init(r);
43  mpz_t q; mpz_init(q);
44  mpz_fdiv_qr(q, r, n, d);
45  while (mpz_cmp_ui(r, 0) == 0)
46  {
47    (*times)++;
48    mpz_set(n, q);
49    mpz_fdiv_qr(q, r, n, d);
50  }
51  mpz_clear(r);
52  mpz_clear(q);
53}
54
55void divTimes_ui(mpz_t n, long d, int* times)
56{
57  *times = 0;
58  mpz_t r; mpz_init(r);
59  mpz_t q; mpz_init(q);
60  mpz_fdiv_qr_ui(q, r, n, d);
61  while (mpz_cmp_ui(r, 0) == 0)
62  {
63    (*times)++;
64    mpz_set(n, q);
65    mpz_fdiv_qr_ui(q, r, n, d);
66  }
67  mpz_clear(r);
68  mpz_clear(q);
69}
70
71/* returns an object of type lists which contains the entries
72   theInts[0..(length-1)] as INT_CMDs */
73lists makeListsObject(const int* theInts, int length)
74{
75  lists L=(lists)omAllocBin(slists_bin);
76  L->Init(length);
77  for (int i = 0; i < length; i++)
78    { L->m[i].rtyp = INT_CMD; L->m[i].data = (void*)theInts[i]; }
79  return L;
80}
81
82void setListEntry(lists L, int index, mpz_t n)
83{ /* assumes n > 0 */
84  /* try to fit nn into an int: */
85  if (mpz_size1(n)<=1)
86  {
87    int ui=(int)mpz_get_si(n);
88    if ((((ui<<3)>>3)==ui)
89    && (mpz_cmp_si(n,(long)ui)==0))
90    {
91      L->m[index].rtyp = INT_CMD; L->m[index].data = (void*)ui;
92      return;
93    }
94  }
95  number nn = mpz2number(n);
96  L->m[index].rtyp = BIGINT_CMD; L->m[index].data = (void*)nn;
97}
98
99void setListEntry_ui(lists L, int index, long ui)
100{ /* assumes n > 0 */
101  /* try to fit nn into an int: */
102  if (((ui<<3)>>3)==ui)
103  {
104    L->m[index].rtyp = INT_CMD; L->m[index].data = (void*)ui;
105  }
106  else
107  {
108    number nn = nlInit(ui,NULL);
109    L->m[index].rtyp = BIGINT_CMD; L->m[index].data = (void*)nn;
110  }
111}
112
113/* true iff p is prime */
114/*
115bool isPrime(mpz_t p)
116{
117  if (mpz_cmp_ui(p, 2) == 0) return true;
118  if (mpz_cmp_ui(p, 3) == 0) return true;
119  if (mpz_cmp_ui(p, 5) < 0)  return false;
120
121  mpz_t d; mpz_init_set_ui(d, 5); int add = 2;
122  mpz_t sr; mpz_init(sr); mpz_sqrt(sr, p);
123  mpz_t r; mpz_init(r);
124  while (mpz_cmp(d, sr) <= 0)
125  {
126    mpz_cdiv_r(r, p, d);
127    if (mpz_cmp_ui(r, 0) == 0)
128    {
129      mpz_clear(d); mpz_clear(sr); mpz_clear(r);
130      return false;
131    }
132    mpz_add_ui(d, d, add);
133    add += 2; if (add == 6) add = 2;
134  }
135  mpz_clear(d); mpz_clear(sr); mpz_clear(r);
136  return true;
137}
138*/
139
140/* finds the next prime q, bound >= q >= p;
141   in case of success, puts q into p;
142   otherwise sets q = bound + 1;
143   e.g. p = 24; nextPrime(p, 30) produces p = 29 (success),
144        p = 24; nextPrime(p, 29) produces p = 29 (success),
145        p = 24; nextPrime(p, 28) produces p = 29 (no success),
146        p = 24; nextPrime(p, 27) produces p = 28 (no success) */
147/*
148void nextPrime(mpz_t p, mpz_t bound)
149{
150  int add;
151  mpz_t r; mpz_init(r); mpz_cdiv_r_ui(r, p, 6); // r = p mod 6, 0 <= r <= 5
152  if (mpz_cmp_ui(r, 0) == 0) { mpz_add_ui(p, p, 1); add = 4; }
153  if (mpz_cmp_ui(r, 1) == 0) {                      add = 4; }
154  if (mpz_cmp_ui(r, 2) == 0) { mpz_add_ui(p, p, 3); add = 2; }
155  if (mpz_cmp_ui(r, 3) == 0) { mpz_add_ui(p, p, 2); add = 2; }
156  if (mpz_cmp_ui(r, 4) == 0) { mpz_add_ui(p, p, 1); add = 2; }
157  if (mpz_cmp_ui(r, 5) == 0) {                      add = 2; }
158
159  while (mpz_cmp(p, bound) <= 0)
160  {
161    if (isPrime(p)) { mpz_clear(r); return; }
162    mpz_add_ui(p, p, add);
163    add += 2; if (add == 6) add = 2;
164  }
165  mpz_set(p, bound);
166  mpz_add_ui(p, p, 1);
167  mpz_clear(r);
168  return;
169}
170*/
171
172/* n and pBound are assumed to be bigint numbers */
173lists primeFactorisation(const number n, const number pBound)
174{
175  mpz_t nn; number2mpz(n, nn);
176  mpz_t pb; number2mpz(pBound, pb);
177  mpz_t b; number2mpz(pBound, b);
178  mpz_t p; mpz_init(p); int tt;
179  mpz_t sr; mpz_init(sr); int index = 0; int add;
180  lists primes = (lists)omAllocBin(slists_bin); primes->Init(1000);
181  int* multiplicities = new int[1000];
182
183  divTimes_ui(nn, 2, &tt);
184  if (tt > 0)
185  {
186    setListEntry_ui(primes, index, 2);
187    multiplicities[index++] = tt;
188  }
189
190  divTimes_ui(nn, 3, &tt);
191  if (tt > 0)
192  {
193    setListEntry_ui(primes, index, 3);
194    multiplicities[index++] = tt;
195  }
196
197  unsigned long p_ui=5; add = 2;
198  mpz_sqrt(sr, nn);
199  if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
200  int limit=mpz_get_ui(pb);
201  if ((limit==0)||(mpz_cmp_ui(pb,limit)!=0)) limit=1<<31;
202  while (p_ui <=limit)
203  {
204    divTimes_ui(nn, p_ui, &tt);
205    if (tt > 0)
206    {
207      setListEntry_ui(primes, index, p_ui);
208      multiplicities[index++] = tt;
209      //mpz_sqrt(sr, nn);
210      //if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
211      if (mpz_size1(nn)<=2) 
212      {
213        mpz_sqrt(sr, nn);
214        if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
215        unsigned long l=mpz_get_ui(sr);
216        if (l<limit) limit=l;
217      }
218    }
219    p_ui +=add;
220    add += 2; if (add == 6) add = 2;
221  }
222  mpz_set_ui(p, p_ui);
223  mpz_sqrt(sr, nn);
224  if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
225  while (mpz_cmp(pb, p) >= 0)
226  {
227    divTimes(nn, p, &tt);
228    if (tt > 0)
229    {
230      setListEntry(primes, index, p);
231      multiplicities[index++] = tt;
232      mpz_sqrt(sr, nn);
233      if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
234    }
235    mpz_add_ui(p, p, add);
236    add += 2; if (add == 6) add = 2;
237  }
238  if ((mpz_cmp_ui(nn, 1) > 0) &&
239      ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(nn, b) <= 0)))
240  {
241    setListEntry(primes, index, nn);
242    multiplicities[index++] = 1;
243    mpz_set_ui(nn, 1);
244  }
245
246  lists primesL = (lists)omAllocBin(slists_bin);
247  primesL->Init(index);
248  for (int i = 0; i < index; i++)
249  {
250    primesL->m[i].rtyp = primes->m[i].rtyp;
251    primesL->m[i].data = primes->m[i].data;
252  }
253  omFreeSize((ADDRESS)primes->m, (primes->nr + 1) * sizeof(sleftv));
254  omFreeBin((ADDRESS)primes, slists_bin);
255
256  lists multiplicitiesL = (lists)omAllocBin(slists_bin);
257  multiplicitiesL->Init(index);
258  for (int i = 0; i < index; i++)
259  {
260    multiplicitiesL->m[i].rtyp = INT_CMD;
261    multiplicitiesL->m[i].data = (void*)multiplicities[i];
262  }
263  delete[] multiplicities;
264
265  lists L=(lists)omAllocBin(slists_bin);
266  L->Init(4);
267  setListEntry(L, 0, nn);
268  L->m[1].rtyp = LIST_CMD; L->m[1].data = (void*)primesL;
269  L->m[2].rtyp = LIST_CMD; L->m[2].data = (void*)multiplicitiesL;
270  int probTest = 0;
271  if (mpz_probab_prime_p(nn, 25) != 0) probTest = 1;
272  L->m[3].rtyp =  INT_CMD; L->m[3].data = (void*)probTest;
273  mpz_clear(nn); mpz_clear(pb); mpz_clear(b); mpz_clear(p); mpz_clear(sr);
274
275  return L;
276}
277
278#include <string.h>
279#include <unistd.h>
280#include <stdio.h>
281#include <stddef.h>
282#include <stdlib.h>
283#include <time.h>
284
285#include <omalloc/mylimits.h>
286#include <omalloc/omalloc.h>
287#include <kernel/options.h>
288#include <kernel/febase.h>
289#include <Singular/cntrlc.h>
290#include <kernel/page.h>
291#include <Singular/ipid.h>
292#include <Singular/ipshell.h>
293#include <kernel/kstd1.h>
294#include <Singular/subexpr.h>
295#include <kernel/timer.h>
296#include <kernel/intvec.h>
297#include <kernel/ring.h>
298#include <Singular/omSingularConfig.h>
299#include <kernel/p_Procs.h>
300/* Needed for debug Version of p_SetRingOfLeftv, Oliver */
301#ifdef PDEBUG
302#include <kernel/polys.h>
303#endif
304#include <Singular/version.h>
305
306#include <Singular/static.h>
307#ifdef HAVE_STATIC
308#undef HAVE_DYN_RL
309#endif
310
311#define SI_DONT_HAVE_GLOBAL_VARS
312
313//#ifdef HAVE_LIBPARSER
314//#  include "libparse.h"
315//#endif /* HAVE_LIBPARSER */
316
317#ifdef HAVE_FACTORY
318#include <factory/factory.h>
319// libfac:
320  extern const char * libfac_version;
321  extern const char * libfac_date;
322#endif
323
324/* version strings */
325#include <kernel/si_gmp.h>
326#ifdef HAVE_MPSR
327#include <MP_Config.h>
328#endif
329
330/*2
331* initialize components of Singular
332*/
333int inits(void)
334{
335  int t;
336/*4 signal handler:*/
337  init_signals();
338/*4 randomize: */
339  t=initTimer();
340  /*t=(int)time(NULL);*/
341  if (t==0) t=1;
342#ifdef HAVE_RTIMER
343  initRTimer();
344#endif
345#ifdef buildin_rand
346  siSeed=t;
347#else
348  srand((unsigned int)t);
349#endif
350#ifdef HAVE_FACTORY
351  factoryseed(t);
352#endif
353/*4 private data of other modules*/
354  memset(&sLastPrinted,0,sizeof(sleftv));
355  sLastPrinted.rtyp=NONE;
356  return t;
357}
358
359/*2
360* the renice routine for very large jobs
361* works only on unix machines,
362* testet on : linux, HP 9.0
363*
364*#include <sys/times.h>
365*#include <sys/resource.h>
366*extern "C" int setpriority(int,int,int);
367*void very_nice()
368*{
369*#ifndef NO_SETPRIORITY
370*  setpriority(PRIO_PROCESS,0,19);
371*#endif
372*  sleep(10);
373*}
374*/
375
376void singular_example(char *str)
377{
378  assume(str!=NULL);
379  char *s=str;
380  while (*s==' ') s++;
381  char *ss=s;
382  while (*ss!='\0') ss++;
383  while (*ss<=' ')
384  {
385    *ss='\0';
386    ss--;
387  }
388  idhdl h=IDROOT->get(s,myynest);
389  if ((h!=NULL) && (IDTYP(h)==PROC_CMD))
390  {
391    char *lib=iiGetLibName(IDPROC(h));
392    if((lib!=NULL)&&(*lib!='\0'))
393    {
394      Print("// proc %s from lib %s\n",s,lib);
395      s=iiGetLibProcBuffer(IDPROC(h), 2);
396      if (s!=NULL)
397      {
398        if (strlen(s)>5)
399        {
400          iiEStart(s,IDPROC(h));
401          return;
402        }
403        else omFree((ADDRESS)s);
404      }
405    }
406  }
407  else
408  {
409    char sing_file[MAXPATHLEN];
410    FILE *fd=NULL;
411    char *res_m=feResource('m', 0);
412    if (res_m!=NULL)
413    {
414      sprintf(sing_file, "%s/%s.sing", res_m, s);
415      fd = feFopen(sing_file, "r");
416    }
417    if (fd != NULL)
418    {
419
420      int old_echo = si_echo;
421      int length, got;
422      char* s;
423
424      fseek(fd, 0, SEEK_END);
425      length = ftell(fd);
426      fseek(fd, 0, SEEK_SET);
427      s = (char*) omAlloc((length+20)*sizeof(char));
428      got = fread(s, sizeof(char), length, fd);
429      fclose(fd);
430      if (got != length)
431      {
432        Werror("Error while reading file %s", sing_file);
433        omFree(s);
434      }
435      else
436      {
437        s[length] = '\0';
438        strcat(s, "\n;return();\n\n");
439        si_echo = 2;
440        iiEStart(s, NULL);
441        si_echo = old_echo;
442      }
443    }
444    else
445    {
446      Werror("no example for %s", str);
447    }
448  }
449}
450
451
452struct soptionStruct
453{
454  const char * name;
455  unsigned   setval;
456  unsigned   resetval;
457};
458
459struct soptionStruct optionStruct[]=
460{
461  {"prot",         Sy_bit(OPT_PROT),           ~Sy_bit(OPT_PROT)   },
462  {"redSB",        Sy_bit(OPT_REDSB),          ~Sy_bit(OPT_REDSB)   },
463  {"notBuckets",   Sy_bit(OPT_NOT_BUCKETS),    ~Sy_bit(OPT_NOT_BUCKETS)   },
464  {"notSugar",     Sy_bit(OPT_NOT_SUGAR),      ~Sy_bit(OPT_NOT_SUGAR)   },
465  {"interrupt",    Sy_bit(OPT_INTERRUPT),      ~Sy_bit(OPT_INTERRUPT)   },
466  {"sugarCrit",    Sy_bit(OPT_SUGARCRIT),      ~Sy_bit(OPT_SUGARCRIT)   },
467  {"teach",     Sy_bit(OPT_DEBUG),          ~Sy_bit(OPT_DEBUG)  },
468  /* 9 return SB in syz, quotient, intersect */
469  {"returnSB",     Sy_bit(OPT_RETURN_SB),      ~Sy_bit(OPT_RETURN_SB)  },
470  {"fastHC",       Sy_bit(OPT_FASTHC),         ~Sy_bit(OPT_FASTHC)  },
471  /* 11-19 sort in L/T */
472  {"staircaseBound",Sy_bit(OPT_STAIRCASEBOUND),~Sy_bit(OPT_STAIRCASEBOUND)  },
473  {"multBound",    Sy_bit(OPT_MULTBOUND),      ~Sy_bit(OPT_MULTBOUND)  },
474  {"degBound",     Sy_bit(OPT_DEGBOUND),       ~Sy_bit(OPT_DEGBOUND)  },
475  /* 25 no redTail(p)/redTail(s) */
476  {"redTail",      Sy_bit(OPT_REDTAIL),        ~Sy_bit(OPT_REDTAIL)  },
477  {"redThrough",   Sy_bit(OPT_REDTHROUGH),     ~Sy_bit(OPT_REDTHROUGH)  },
478  {"lazy",         Sy_bit(OPT_OLDSTD),         ~Sy_bit(OPT_OLDSTD)  },
479  {"intStrategy",  Sy_bit(OPT_INTSTRATEGY),    ~Sy_bit(OPT_INTSTRATEGY)  },
480  {"infRedTail",   Sy_bit(OPT_INFREDTAIL),     ~Sy_bit(OPT_INFREDTAIL)  },
481  /* 30: use not regularity for syz */
482  {"notRegularity",Sy_bit(OPT_NOTREGULARITY),  ~Sy_bit(OPT_NOTREGULARITY)  },
483  {"weightM",      Sy_bit(OPT_WEIGHTM),        ~Sy_bit(OPT_WEIGHTM)  },
484/*special for "none" and also end marker for showOption:*/
485  {"ne",           0,                          0 }
486};
487
488struct soptionStruct verboseStruct[]=
489{
490  {"mem",      Sy_bit(V_SHOW_MEM),  ~Sy_bit(V_SHOW_MEM)   },
491  {"yacc",     Sy_bit(V_YACC),      ~Sy_bit(V_YACC)       },
492  {"redefine", Sy_bit(V_REDEFINE),  ~Sy_bit(V_REDEFINE)   },
493  {"reading",  Sy_bit(V_READING),   ~Sy_bit(V_READING)    },
494  {"loadLib",  Sy_bit(V_LOAD_LIB),  ~Sy_bit(V_LOAD_LIB)   },
495  {"debugLib", Sy_bit(V_DEBUG_LIB), ~Sy_bit(V_DEBUG_LIB)  },
496  {"loadProc", Sy_bit(V_LOAD_PROC), ~Sy_bit(V_LOAD_PROC)  },
497  {"defRes",   Sy_bit(V_DEF_RES),   ~Sy_bit(V_DEF_RES)    },
498  {"usage",    Sy_bit(V_SHOW_USE),  ~Sy_bit(V_SHOW_USE)   },
499  {"Imap",     Sy_bit(V_IMAP),      ~Sy_bit(V_IMAP)       },
500  {"prompt",   Sy_bit(V_PROMPT),    ~Sy_bit(V_PROMPT)     },
501  {"length",   Sy_bit(V_LENGTH),    ~Sy_bit(V_LENGTH)     },
502  {"notWarnSB",Sy_bit(V_NSB),       ~Sy_bit(V_NSB)        },
503  {"contentSB",Sy_bit(V_CONTENTSB), ~Sy_bit(V_CONTENTSB)  },
504  {"cancelunit",Sy_bit(V_CANCELUNIT),~Sy_bit(V_CANCELUNIT)},
505  {"modpsolve",Sy_bit(V_MODPSOLVSB),~Sy_bit(V_MODPSOLVSB)},
506  {"geometricSB",Sy_bit(V_UPTORADICAL),~Sy_bit(V_UPTORADICAL)},
507  {"findMonomials",Sy_bit(V_FINDMONOM),~Sy_bit(V_FINDMONOM)},
508  {"coefStrat",Sy_bit(V_COEFSTRAT), ~Sy_bit(V_COEFSTRAT)},
509  {"qringNF",  Sy_bit(V_QRING),     ~Sy_bit(V_QRING)},
510  {"warn",     Sy_bit(V_ALLWARN),   ~Sy_bit(V_ALLWARN)},
511/*special for "none" and also end marker for showOption:*/
512  {"ne",         0,          0 }
513};
514
515BOOLEAN setOption(leftv res, leftv v)
516{
517  const char *n;
518  do
519  {
520    if (v->Typ()==STRING_CMD)
521    {
522      n=(const char *)v->CopyD(STRING_CMD);
523    }
524    else
525    {
526      if (v->name==NULL)
527        return TRUE;
528      if (v->rtyp==0)
529      {
530        n=v->name;
531        v->name=NULL;
532      }
533      else
534      {
535        n=omStrDup(v->name);
536      }
537    }
538
539    int i;
540
541    if(strcmp(n,"get")==0)
542    {
543      intvec *w=new intvec(2);
544      (*w)[0]=test;
545      (*w)[1]=verbose;
546      res->rtyp=INTVEC_CMD;
547      res->data=(void *)w;
548      goto okay;
549    }
550    if(strcmp(n,"set")==0)
551    {
552      if((v->next!=NULL)
553      &&(v->next->Typ()==INTVEC_CMD))
554      {
555        v=v->next;
556        intvec *w=(intvec*)v->Data();
557        test=(*w)[0];
558        verbose=(*w)[1];
559#if 0
560        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
561        && rField_has_simple_inverse()
562#ifdef HAVE_RINGS
563        && !rField_is_Ring(currRing)
564#endif
565        ) {
566          test &=~Sy_bit(OPT_INTSTRATEGY);
567        }
568#endif
569        goto okay;
570      }
571    }
572    if(strcmp(n,"none")==0)
573    {
574      test=0;
575      verbose=0;
576      goto okay;
577    }
578    for (i=0; (i==0) || (optionStruct[i-1].setval!=0); i++)
579    {
580      if (strcmp(n,optionStruct[i].name)==0)
581      {
582        if (optionStruct[i].setval & validOpts)
583        {
584          test |= optionStruct[i].setval;
585          // optOldStd disables redthrough
586          if (optionStruct[i].setval == Sy_bit(OPT_OLDSTD))
587            test &= ~Sy_bit(OPT_REDTHROUGH);
588        }
589        else
590          Warn("cannot set option");
591#if 0
592        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
593        && rField_has_simple_inverse()
594#ifdef HAVE_RINGS
595        && !rField_is_Ring(currRing)
596#endif
597        ) {
598          test &=~Sy_bit(OPT_INTSTRATEGY);
599        }
600#endif
601        goto okay;
602      }
603      else if ((strncmp(n,"no",2)==0)
604      && (strcmp(n+2,optionStruct[i].name)==0))
605      {
606        if (optionStruct[i].setval & validOpts)
607        {
608          test &= optionStruct[i].resetval;
609        }
610        else
611          Warn("cannot clear option");
612        goto okay;
613      }
614    }
615    for (i=0; (i==0) || (verboseStruct[i-1].setval!=0); i++)
616    {
617      if (strcmp(n,verboseStruct[i].name)==0)
618      {
619        verbose |= verboseStruct[i].setval;
620        #ifdef YYDEBUG
621        #if YYDEBUG
622        /*debugging the bison grammar --> grammar.cc*/
623        extern int    yydebug;
624        if (BVERBOSE(V_YACC)) yydebug=1;
625        else                  yydebug=0;
626        #endif
627        #endif
628        goto okay;
629      }
630      else if ((strncmp(n,"no",2)==0)
631      && (strcmp(n+2,verboseStruct[i].name)==0))
632      {
633        verbose &= verboseStruct[i].resetval;
634        #ifdef YYDEBUG
635        #if YYDEBUG
636        /*debugging the bison grammar --> grammar.cc*/
637        extern int    yydebug;
638        if (BVERBOSE(V_YACC)) yydebug=1;
639        else                  yydebug=0;
640        #endif
641        #endif
642        goto okay;
643      }
644    }
645    Werror("unknown option `%s`",n);
646  okay:
647    if (currRing != NULL)
648      currRing->options = test & TEST_RINGDEP_OPTS;
649    omFree((ADDRESS)n);
650    v=v->next;
651  } while (v!=NULL);
652  // set global variable to show memory usage
653  if (BVERBOSE(V_SHOW_MEM)) om_sing_opt_show_mem = 1;
654  else om_sing_opt_show_mem = 0;
655  return FALSE;
656}
657
658char * showOption()
659{
660  int i;
661  BITSET tmp;
662
663  StringSetS("//options:");
664  if ((test!=0)||(verbose!=0))
665  {
666    tmp=test;
667    if(tmp)
668    {
669      for (i=0; optionStruct[i].setval!=0; i++)
670      {
671        if (optionStruct[i].setval & test)
672        {
673          StringAppend(" %s",optionStruct[i].name);
674          tmp &=optionStruct[i].resetval;
675        }
676      }
677      for (i=0; i<32; i++)
678      {
679        if (tmp & Sy_bit(i)) StringAppend(" %d",i);
680      }
681    }
682    tmp=verbose;
683    if (tmp)
684    {
685      for (i=0; verboseStruct[i].setval!=0; i++)
686      {
687        if (verboseStruct[i].setval & tmp)
688        {
689          StringAppend(" %s",verboseStruct[i].name);
690          tmp &=verboseStruct[i].resetval;
691        }
692      }
693      for (i=1; i<32; i++)
694      {
695        if (tmp & Sy_bit(i)) StringAppend(" %d",i+32);
696      }
697    }
698    return omStrDup(StringAppendS(""));
699  }
700  else
701    return omStrDup(StringAppendS(" none"));
702}
703
704char * versionString()
705{
706  char* str = StringSetS("");
707  StringAppend("Singular for %s version %s (%d-%s)  %s\nwith\n",
708               S_UNAME, S_VERSION1, SINGULAR_VERSION,
709               feVersionId,singular_date);
710  StringAppendS("\t");
711#ifdef HAVE_FACTORY
712              StringAppend("factory(%s),", factoryVersion);
713              StringAppend("libfac(%s,%s),\n\t",libfac_version,libfac_date);
714#endif
715#if defined (__GNU_MP_VERSION) && defined (__GNU_MP_VERSION_MINOR)
716              StringAppend("GMP(%d.%d),",__GNU_MP_VERSION,__GNU_MP_VERSION_MINOR);
717#else
718              StringAppendS("GMP(1.3),");
719#endif
720#ifdef HAVE_NTL
721#include <NTL/version.h>
722              StringAppend("NTL(%s),",NTL_VERSION);
723#endif
724#ifdef HAVE_MPSR
725              StringAppend("MP(%s),",MP_VERSION);
726#endif
727#if SIZEOF_VOIDP == 8
728              StringAppendS("64bit,");
729#else
730              StringAppendS("32bit,");
731#endif
732#if defined(HAVE_DYN_RL)
733              if (fe_fgets_stdin==fe_fgets_dummy)
734                StringAppendS("no input,");
735              else if (fe_fgets_stdin==fe_fgets)
736                StringAppendS("fgets,");
737              if (fe_fgets_stdin==fe_fgets_stdin_drl)
738                StringAppendS("dynamic readline,");
739              #ifdef HAVE_FEREAD
740              else if (fe_fgets_stdin==fe_fgets_stdin_emu)
741                StringAppendS("emulated readline,");
742              #endif
743              else
744                StringAppendS("unknown fgets method,");
745#else
746  #if defined(HAVE_READLINE) && !defined(FEREAD)
747              StringAppendS("static readline,");
748  #else
749    #ifdef HAVE_FEREAD
750              StringAppendS("emulated readline,");
751    #else
752              StringAppendS("fgets,");
753    #endif
754  #endif
755#endif
756#ifdef HAVE_PLURAL
757              StringAppendS("Plural,");
758#endif
759#ifdef HAVE_DBM
760              StringAppendS("DBM,\n\t");
761#else
762              StringAppendS("\n\t");
763#endif
764#ifdef HAVE_DYNAMIC_LOADING
765              StringAppendS("dynamic modules,");
766#endif
767              if (p_procs_dynamic) StringAppendS("dynamic p_Procs,");
768#ifdef TEST
769              StringAppendS("TESTs,");
770#endif
771#if YYDEBUG
772              StringAppendS("YYDEBUG=1,");
773#endif
774#ifdef HAVE_ASSUME
775             StringAppendS("ASSUME,");
776#endif
777#ifdef MDEBUG
778              StringAppend("MDEBUG=%d,",MDEBUG);
779#endif
780#ifdef OM_CHECK
781              StringAppend("OM_CHECK=%d,",OM_CHECK);
782#endif
783#ifdef OM_TRACK
784              StringAppend("OM_TRACK=%d,",OM_TRACK);
785#endif
786#ifdef OM_NDEBUG
787              StringAppendS("OM_NDEBUG,");
788#endif
789#ifdef PDEBUG
790              StringAppendS("PDEBUG,");
791#endif
792#ifdef KDEBUG
793              StringAppendS("KDEBUG,");
794#endif
795#ifndef __OPTIMIZE__
796              StringAppendS("-g,");
797#endif
798#ifdef HAVE_EIGENVAL
799              StringAppendS("eigenvalues,");
800#endif
801#ifdef HAVE_GMS
802              StringAppendS("Gauss-Manin system,");
803#endif
804#ifdef HAVE_RATGRING
805              StringAppendS("ratGB,");
806#endif
807              StringAppend("random=%d\n",siRandomStart);
808              StringAppend("\tCC=%s,\n\tCXX=%s"
809#ifdef __GNUC__
810              "(" __VERSION__ ")"
811#endif
812              "\n",CC,CXX);
813              feStringAppendResources(0);
814              feStringAppendBrowsers(0);
815              StringAppendS("\n");
816              return str;
817}
818
819#ifdef PDEBUG
820#if (OM_TRACK > 2) && defined(OM_TRACK_CUSTOM)
821void p_SetRingOfLeftv(leftv l, ring r)
822{
823  switch(l->rtyp)
824  {
825    case INT_CMD:
826    case BIGINT_CMD:
827    case IDHDL:
828    case DEF_CMD:
829      break;
830    case POLY_CMD:
831    case VECTOR_CMD:
832    {
833      poly p=(poly)l->data;
834      while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
835      break;
836    }
837    case IDEAL_CMD:
838    case MODUL_CMD:
839    case MATRIX_CMD:
840    {
841      ideal I=(ideal)l->data;
842      int i;
843      for(i=IDELEMS(I)-1;i>=0;i--)
844      {
845        poly p=I->m[i];
846        while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
847      }
848      break;
849    }
850    case COMMAND:
851    {
852      command d=(command)l->data;
853      p_SetRingOfLeftv(&d->arg1, r);
854      if (d->argc>1) p_SetRingOfLeftv(&d->arg2, r);
855      if (d->argc>2) p_SetRingOfLeftv(&d->arg3, r);
856      break;
857    }
858    default:
859     printf("type %d not yet implementd in p_SetRingOfLeftv\n",l->rtyp);
860     break;
861  }
862}
863#endif
864#endif
865
866void listall(int showproc)
867{
868      idhdl hh=basePack->idroot;
869      PrintS("====== Top ==============\n");
870      while (hh!=NULL)
871      {
872        if (showproc || (IDTYP(hh)!=PROC_CMD))
873        {
874          if (IDDATA(hh)==(void *)currRing) PrintS("(R)");
875          else if (IDDATA(hh)==(void *)currPack) PrintS("(P)");
876          else PrintS("   ");
877          Print("::%s, typ %s level %d data %lx",
878                 IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
879          if ((IDTYP(hh)==RING_CMD)
880          || (IDTYP(hh)==QRING_CMD))
881            Print(" ref: %d\n",IDRING(hh)->ref);
882          else
883            PrintLn();
884        }
885        hh=IDNEXT(hh);
886      }
887      hh=basePack->idroot;
888      while (hh!=NULL)
889      {
890        if (IDDATA(hh)==(void *)basePack)
891          Print("(T)::%s, typ %s level %d data %lx\n",
892          IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
893        else
894        if ((IDTYP(hh)==RING_CMD)
895        || (IDTYP(hh)==QRING_CMD)
896        || (IDTYP(hh)==PACKAGE_CMD))
897        {
898          Print("====== %s ==============\n",IDID(hh));
899          idhdl h2=IDRING(hh)->idroot;
900          while (h2!=NULL)
901          {
902            if (showproc || (IDTYP(h2)!=PROC_CMD))
903            {
904              if ((IDDATA(h2)==(void *)currRing)
905              && ((IDTYP(h2)==RING_CMD)||(IDTYP(h2)==QRING_CMD)))
906                PrintS("(R)");
907              else if (IDDATA(h2)==(void *)currPack) PrintS("(P)");
908              else PrintS("   ");
909              Print("%s::%s, typ %s level %d data %lx\n",
910              IDID(hh),IDID(h2),Tok2Cmdname(IDTYP(h2)),IDLEV(h2),(long)IDDATA(h2));
911            }
912            h2=IDNEXT(h2);
913          }
914        }
915        hh=IDNEXT(hh);
916      }
917      Print("currRing:%lx, currPack:%lx,basePack:%lx\n",(long)currRing,(long)currPack,(long)basePack);
918      iiCheckPack(currPack);
919}
920#ifndef NDEBUG
921void checkall()
922{
923      idhdl hh=basePack->idroot;
924      while (hh!=NULL)
925      {
926        omCheckAddr(hh);
927        omCheckAddr((ADDRESS)IDID(hh));
928        if (RingDependend(IDTYP(hh))) Print("%s typ %d in Top\n",IDID(hh),IDTYP(hh));
929        hh=IDNEXT(hh);
930      }
931      hh=basePack->idroot;
932      while (hh!=NULL)
933      {
934        if (IDTYP(hh)==PACKAGE_CMD)
935        {
936          idhdl h2=IDPACKAGE(hh)->idroot;
937          while (h2!=NULL)
938          {
939            omCheckAddr(h2);
940            omCheckAddr((ADDRESS)IDID(h2));
941            if (RingDependend(IDTYP(h2))) Print("%s typ %d in %s\n",IDID(h2),IDTYP(h2),IDID(hh));
942            h2=IDNEXT(h2);
943          }
944        }
945        hh=IDNEXT(hh);
946      }
947}
948#endif
949
950#include <sys/types.h>
951#include <sys/stat.h>
952#include <unistd.h>
953
954extern "C"
955int singular_fstat(int fd, struct stat *buf)
956{
957  return fstat(fd,buf);
958}
959
960/*2
961* the global exit routine of Singular
962*/
963#ifdef HAVE_MPSR
964void (*MP_Exit_Env_Ptr)()=NULL;
965#endif
966
967extern "C" {
968
969void m2_end(int i)
970{
971  fe_reset_input_mode();
972  #ifdef PAGE_TEST
973  mmEndStat();
974  #endif
975  fe_reset_input_mode();
976  idhdl h = IDROOT;
977  while(h != NULL)
978  {
979    if(IDTYP(h) == LINK_CMD)
980    {
981      idhdl hh=h->next;
982      killhdl(h, currPack);
983      h = hh;
984    }
985    else
986    {
987      h = h->next;
988    }
989  }
990  if (i<=0)
991  {
992      if (TEST_V_QUIET)
993      {
994        if (i==0)
995          printf("Auf Wiedersehen.\n");
996        else
997          printf("\n$Bye.\n");
998      }
999    //#ifdef sun
1000    //  #ifndef __svr4__
1001    //    _cleanup();
1002    //    _exit(0);
1003    //  #endif
1004    //#endif
1005    exit(0);
1006  }
1007  else
1008  {
1009      printf("\nhalt %d\n",i);
1010  }
1011  #ifdef HAVE_MPSR
1012  if (MP_Exit_Env_Ptr!=NULL) (*MP_Exit_Env_Ptr)();
1013  #endif
1014  exit(i);
1015}
1016}
Note: See TracBrowser for help on using the repository browser.