source: git/Singular/misc_ip.cc @ 72292f

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