source: git/Singular/misc.cc @ aade4b

fieker-DuValspielwiese
Last change on this file since aade4b was aade4b, checked in by Olaf Bachmann <obachman@…>, 26 years ago
* cosmetic changes git-svn-id: file:///usr/local/Singular/svn/trunk@2165 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 17.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT:
6*/
7
8#include <string.h>
9#include "mod2.h"
10#ifndef macintosh
11#include <unistd.h>
12#endif
13#include <stdio.h>
14#include <stddef.h>
15#include <stdlib.h>
16#include <time.h>
17#include <limits.h>
18
19#include "tok.h"
20#include "febase.h"
21#include "cntrlc.h"
22#include "mmemory.h"
23#include "ipid.h"
24#include "ipshell.h"
25#include "kstd1.h"
26#include "subexpr.h"
27#include "timer.h"
28#include "intvec.h"
29#define SI_DONT_HAVE_GLOBAL_VARS
30
31#ifdef HAVE_LIBPARSER
32#  include "libparse.h"
33#endif /* HAVE_LIBPARSER */
34
35#ifdef HAVE_FACTORY
36#include <factory.h>
37#endif
38
39/* version strings */
40#ifdef HAVE_LIBFAC_P
41  extern const char * libfac_version;
42  extern const char * libfac_date;
43#endif
44extern "C" {
45#include <gmp.h>
46}
47#ifdef HAVE_MPSR
48#include <MP_Config.h>
49#endif
50
51/*0 implementation*/
52
53/*2
54* initialize components of Singular
55*/
56int inits(void)
57{
58  int t;
59/*4 signal handler:*/
60  init_signals();
61/*4 randomize: */
62  t=initTimer();
63  /*t=(int)time(NULL);*/
64  if (t==0) t=1;
65#ifdef HAVE_RTIMER
66  initRTimer();
67#endif
68#ifdef buildin_rand
69  siSeed=t;
70#else
71  srand((unsigned int)t);
72#endif
73#ifdef HAVE_FACTORY
74  factoryseed(t);
75#endif
76/*4 private data of other modules*/
77  memset(&sLastPrinted,0,sizeof(sleftv));
78  sLastPrinted.rtyp=NONE;
79#ifdef HAVE_MPSR
80  extern void mpsr_Init();
81  mpsr_Init();
82#endif
83  return t;
84}
85
86/*2
87* the global exit routine of Singular
88*/
89extern "C" {
90void m2_end(short i)
91{
92  #ifdef HAVE_TCL
93  if (tclmode)
94    PrintTCL('Q',0,NULL);
95  #endif
96  if (i<=0)
97  {
98    #ifdef HAVE_TCL
99    if (!tclmode)
100    #endif
101      if (BVERBOSE(0))
102      {
103        if (i==0)
104          printf("Auf Wiedersehen.\n");
105        else
106          printf("\n$Bye.\n");
107      }
108    #ifndef macintosh
109      #ifdef HAVE_FEREAD
110        #ifdef HAVE_ATEXIT
111          fe_reset_input_mode();
112        #else
113          fe_reset_input_mode(0,NULL);
114        #endif
115      #else
116        #ifdef HAVE_READLINE
117          fe_reset_input_mode();
118        #endif
119      #endif
120    #endif
121    #ifdef sun
122      #ifndef __svr4__
123        _cleanup();
124        _exit(0);
125      #endif
126    #endif
127    exit(0);
128  }
129  else
130  {
131    #ifdef HAVE_TCL
132    if (!tclmode)
133    #endif
134      printf("\nhalt %d\n",i);
135  }
136  exit(i);
137}
138}
139
140/*2
141* the renice routine for very large jobs
142* works only on unix machines,
143* testet on : linux, HP 9.0
144*
145*#ifndef MSDOS
146*#ifndef macintosh
147*#include <sys/times.h>
148*#include <sys/resource.h>
149*extern "C" int setpriority(int,int,int);
150*void very_nice()
151*{
152*#ifndef NO_SETPRIORITY
153*  setpriority(PRIO_PROCESS,0,19);
154*#endif
155*  sleep(10);
156*}
157*#else
158*void very_nice(){}
159*#endif
160*#else
161*void very_nice(){}
162*#endif
163*/
164
165/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
166#ifdef buildin_rand
167/*
168 *
169 *  A prime modulus multiplicative linear congruential
170 *  generator (PMMLCG), or "Lehmer generator".
171 *  Implementation directly derived from the article:
172 *
173 *        S. K. Park and K. W. Miller
174 *        Random Number Generators: Good Ones are Hard to Find
175 *        CACM vol 31, #10. Oct. 1988. pp 1192-1201.
176 *
177 *  Using the following multiplier and modulus, we obtain a
178 *  generator which:
179 *
180 *        1)  Has a full period: 1 to 2^31 - 2.
181 *        2)  Is testably "random" (see the article).
182 *        3)  Has a known implementation by E. L. Schrage.
183 */
184
185
186#define  A        16807L        /*  A "good" multiplier          */
187#define  M   2147483647L        /*  Modulus: 2^31 - 1          */
188#define  Q       127773L        /*  M / A                  */
189#define  R         2836L        /*  M % A                  */
190
191
192int siSeed = 1L;
193
194
195int siRand()
196{
197  siSeed = A * (siSeed % Q) - R * (siSeed / Q);
198
199  if ( siSeed < 0 )
200    siSeed += M;
201
202  return( siSeed );
203}
204#endif
205
206/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
207#define HELP_OK        0
208
209#ifdef buildin_help
210
211#define FIN_INDEX    '\037'
212#define not  !
213#define HELP_NOT_OPEN  1
214#define HELP_NOT_FOUND 2
215#ifndef macintosh
216#define Index_File     SINGULAR_INFODIR "/singular.hlp"
217#define Help_File      SINGULAR_INFODIR "/singular.hlp"
218#else
219#define Index_File     SINGULAR_INFODIR "singular.hlp"
220#define Help_File      SINGULAR_INFODIR "singular.hlp"
221#endif
222#define BUF_LEN        128
223#define IDX_LEN        64
224#define MAX_LINES      21
225
226static int compare(char *s1,char *s2)
227{
228  for(;*s1==*s2;s1++,s2++)
229     if(*s2=='\0') return(0);
230  return(*s2);
231}
232
233#ifdef macintosh
234static char tolow(char p)
235#else
236static inline char tolow(char p)
237#endif
238{
239  if (('A'<=p)&&(p<='Z')) return p | 040;
240  return p;
241}
242
243/*************************************************/
244static int show(unsigned long offset,FILE *help, char *close)
245{ char buffer[BUF_LEN+1];
246  int  lines = 0;
247
248  if( help== NULL)
249    if( (help = feFopen(Help_File, "r")) == NULL)
250      return HELP_NOT_OPEN;
251
252  fseek(help,  (long)(offset+1), (int)0);
253  while( !feof(help)
254        && *fgets(buffer, BUF_LEN, help) != EOF
255        && buffer[0] != FIN_INDEX)
256  {
257    printf("%s", buffer);
258    if(lines++> MAX_LINES)
259    {
260#ifdef macintosh
261      printf("\n Press <RETURN> to continue or x and <RETURN> to exit help.\n");
262#else
263      printf("\n Press <RETURN> to continue or x to exit help.\n");
264#endif
265      fflush(stdout);
266      *close = (char)getchar();
267      if(*close=='x')
268      {
269        getchar();
270        break;
271      }
272      lines=0;
273    }
274  }
275  if(*close!='x')
276  {
277#ifdef macintosh
278    printf("\nEnd of part. Press <RETURN> to continue or x and <RETURN> to exit help.\n");
279#else
280    printf("\nEnd of part. Press <RETURN> to continue or x to exit help.\n");
281#endif
282    fflush(stdout);
283    *close = (char)getchar();
284    if(*close=='x')
285      getchar();
286  }
287  return HELP_OK;
288}
289
290/*************************************************/
291int singular_manual(char *str)
292{ FILE *index=NULL,*help=NULL;
293  unsigned long offset;
294  char *p,close;
295  int done = 0;
296  char buffer[BUF_LEN+1],
297       Index[IDX_LEN+1],
298       String[IDX_LEN+1];
299
300  if( (index = feFopen(Index_File, "r",NULL,TRUE)) == NULL)
301  {
302    return HELP_NOT_OPEN;
303  }
304
305  for(p=str; *p; p++) *p = tolow(*p);/* */
306  do
307  {
308    p--;
309  }
310  while ((p != str) && (*p<=' '));
311  p++;
312  *p='\0';
313  (void)sprintf(String, " %s ", str);
314
315  while(!feof(index)
316        && *fgets(buffer, BUF_LEN, index) != EOF
317        && buffer[0] != FIN_INDEX);
318
319  while(!feof(index))
320  {
321    (void)fgets(buffer, BUF_LEN, index); /* */
322    (void)sscanf(buffer, "Node:%[^\177]\177%ld\n", Index, &offset);
323    for(p=Index; *p; p++) *p = tolow(*p);/* */
324    (void)strcat(Index, " ");
325    if( strstr(Index, String)!=NULL)
326    {
327      done++; (void)show(offset, help, &close);
328    }
329    Index[0]='\0';
330    if(close=='x')
331    break;
332  }
333  (void)fclose(index);
334  (void)fclose(help);
335  if(not done)
336  {
337    Warn("`%s` not found",String);
338    return HELP_NOT_FOUND;
339  }
340  return HELP_OK;
341}
342#endif // buildin_help
343/*************************************************/
344
345void singular_help(char *str,BOOLEAN example)
346{
347  char *s=str;
348  while (*s==' ') s++;
349  char *ss=s;
350  while (*ss!='\0') ss++;
351  while (*ss<=' ')
352  {
353    *ss='\0';
354    ss--;
355  }
356#ifdef HAVE_NAMESPACES
357  char *p1 = AllocL(strlen(s)), *p2 = AllocL(strlen(s));
358  *p1='\0';
359  *p2='\0';
360  sscanf(s, "%[^:]::%s", p1, p2);
361  idhdl h, ns;
362  if(*p2) {
363    printf("singular_help:(%s, %s)\n", p1, p2);
364    ns = namespaceroot->get(p1,0);
365    namespaceroot->push(IDPACKAGE(ns), IDID(ns));
366    h=namespaceroot->get(p2,myynest);
367    namespaceroot->pop();
368  } else {
369    h=namespaceroot->get(p1,myynest);
370  }
371  FreeL(p1);
372  FreeL(p2);
373#else /* HAVE_NAMESPACES */
374  /* --------- is it a proc ? --------------------------------*/
375  idhdl h=idroot->get(s,myynest);
376#endif /* HAVE_NAMESPACES */
377  if ((h!=NULL) && (IDTYP(h)==PROC_CMD) &&
378      (strcmp(IDPROC(h)->libname, "standard.lib")!=0))
379  {
380    char *lib=iiGetLibName(IDPROC(h));
381    Print("// proc %s ",s);
382    if((lib==NULL)||(*lib=='\0'))
383    {
384      PrintLn();
385    }
386    else
387    {
388      Print("from lib %s\n",lib);
389      s=iiGetLibProcBuffer(IDPROC(h), example ? 2 : 0);
390      if (!example)
391      {
392        PrintS(s);
393        FreeL((ADDRESS)s);
394      }
395      else
396      {
397        if (s!=NULL)
398        {
399          if (strlen(s)>5) iiEStart(s,IDPROC(h));
400          else FreeL((ADDRESS)s);
401        }
402      }
403    }
404  }
405  else if (example)
406  {
407    Werror("%s not found",s);
408  }
409  else
410  {
411  /* --------- is it a library ? --------------------------------*/
412    char libnamebuf[128];
413    FILE *fp=feFopen(str,"rb", libnamebuf);
414    if (fp!=NULL)
415    {
416#ifdef HAVE_LIBPARSER
417      extern FILE *yylpin;
418      lib_style_types lib_style; // = OLD_LIBSTYLE;
419
420      yylpin = fp;
421#  ifdef HAVE_NAMESPACES
422      yylplex(str, libnamebuf, &lib_style, IDROOT, GET_INFO);
423#  else /* HAVE_NAMESPACES */
424      yylplex(str, libnamebuf, &lib_style, GET_INFO);
425#  endif /* HAVE_NAMESPACES */
426      reinit_yylp();
427      if(lib_style == OLD_LIBSTYLE)
428      {
429        char buf[256];
430        fseek(fp, 0, SEEK_SET);
431#else /* HAVE_LIBPARSER */
432        { char buf[256];
433#endif /* HAVE_LIBPARSER */
434        Warn( "library %s has an old format. Please fix it for the next time",
435              str);
436        BOOLEAN found=FALSE;
437        while (fgets( buf, sizeof(buf), fp))
438        {
439          if (strncmp(buf,"//",2)==0)
440          {
441            if (found) return;
442          }
443          else if ((strncmp(buf,"proc ",5)==0)||(strncmp(buf,"LIB ",4)==0))
444          {
445            if (!found) Warn("no help part in library found");
446            return;
447          }
448          else
449          {
450            found=TRUE;
451            PrintS(buf);
452          }
453        }
454      }
455#ifdef HAVE_LIBPARSER
456      else
457      {
458        fclose( yylpin );
459        PrintS(text_buffer);
460        FreeL(text_buffer);
461      }
462#endif /* HAVE_LIBPARSER */
463    }
464  /* --------- everything else is for the manual ----------------*/
465    else
466    {
467#ifdef buildin_help
468      singular_manual(str);
469#else
470      system(feGetInfoCall(str));
471#ifndef MSDOS
472      //sprintf(tmp,"clear");
473      //system(tmp);
474#endif
475#endif
476    }
477  }
478}
479
480
481struct soptionStruct
482{
483  char * name;
484  int   setval;
485  int   resetval;
486};
487
488struct soptionStruct optionStruct[]=
489{
490  {"prot",         Sy_bit(OPT_PROT),           ~Sy_bit(OPT_PROT)   },
491  {"redSB",        Sy_bit(OPT_REDSB),          ~Sy_bit(OPT_REDSB)   },
492  /* 2 Gebauer/Moeller */
493  {"notSugar",     Sy_bit(OPT_NOT_SUGAR),      ~Sy_bit(OPT_NOT_SUGAR)   },
494  {"interrupt",    Sy_bit(OPT_INTERRUPT),      ~Sy_bit(OPT_INTERRUPT)   },
495  {"sugarCrit",    Sy_bit(OPT_SUGARCRIT),      ~Sy_bit(OPT_SUGARCRIT)   },
496  {"teach",     Sy_bit(OPT_DEBUG),          ~Sy_bit(OPT_DEBUG)  },
497  /* 7 cancel unit */
498  {"morePairs",    Sy_bit(OPT_MOREPAIRS),      ~Sy_bit(OPT_MOREPAIRS)   },
499  /* 9 return SB in syz, quotient, intersect */
500  {"returnSB",     Sy_bit(OPT_RETURN_SB),      ~Sy_bit(OPT_RETURN_SB)  },
501  {"fastHC",       Sy_bit(OPT_FASTHC),         ~Sy_bit(OPT_FASTHC)  },
502  /* 11-19 sort in L/T */
503  /* 20 redBest */
504  {"keepvars",     Sy_bit(OPT_KEEPVARS),       ~Sy_bit(OPT_KEEPVARS) },
505  {"staircaseBound",Sy_bit(OPT_STAIRCASEBOUND),~Sy_bit(OPT_STAIRCASEBOUND)  },
506  {"multBound",    Sy_bit(OPT_MULTBOUND),      ~Sy_bit(OPT_MULTBOUND)  },
507  {"degBound",     Sy_bit(OPT_DEGBOUND),       ~Sy_bit(OPT_DEGBOUND)  },
508  /* 25 no redTail(p)/redTail(s) */
509  {"redTail",      Sy_bit(OPT_REDTAIL),        ~Sy_bit(OPT_REDTAIL)  },
510  {"intStrategy",  Sy_bit(OPT_INTSTRATEGY),    ~Sy_bit(OPT_INTSTRATEGY)  },
511  /* 27 stop at HC (finiteDeterminacyTest) */
512  {"minRes",       Sy_bit(OPT_MINRES),         ~Sy_bit(OPT_MINRES)  },
513  /* 30: use not regularity for syz */
514  {"notRegularity",Sy_bit(OPT_NOTREGULARITY),  ~Sy_bit(OPT_NOTREGULARITY)  },
515  {"weightM",      Sy_bit(OPT_WEIGHTM),        ~Sy_bit(OPT_WEIGHTM)  },
516/*special for "none" and also end marker for showOption:*/
517  {"ne",           0,                          0 }
518};
519
520struct soptionStruct verboseStruct[]=
521{
522  {"mem",      Sy_bit(V_SHOW_MEM),  ~Sy_bit(V_SHOW_MEM)   },
523  {"yacc",     Sy_bit(V_YACC),      ~Sy_bit(V_YACC)       },
524  {"redefine", Sy_bit(V_REDEFINE),  ~Sy_bit(V_REDEFINE)   },
525  {"reading",  Sy_bit(V_READING),   ~Sy_bit(V_READING)    },
526  {"loadLib",  Sy_bit(V_LOAD_LIB),  ~Sy_bit(V_LOAD_LIB)   },
527  {"debugLib", Sy_bit(V_DEBUG_LIB), ~Sy_bit(V_DEBUG_LIB)  },
528  {"loadProc", Sy_bit(V_LOAD_PROC), ~Sy_bit(V_LOAD_PROC)  },
529  {"defRes",   Sy_bit(V_DEF_RES),   ~Sy_bit(V_DEF_RES)    },
530  {"debugMem", Sy_bit(V_DEBUG_MEM), ~Sy_bit(V_DEBUG_MEM)  },
531  {"usage",    Sy_bit(V_SHOW_USE),  ~Sy_bit(V_SHOW_USE)   },
532  {"Imap",     Sy_bit(V_IMAP),      ~Sy_bit(V_IMAP)       },
533  {"prompt",   Sy_bit(V_PROMPT),    ~Sy_bit(V_PROMPT)     },
534  {"notWarnSB",Sy_bit(V_NSB),       ~Sy_bit(V_NSB)        },
535/*special for "none" and also end marker for showOption:*/
536  {"ne",         0,          0 }
537};
538
539BOOLEAN setOption(leftv res, leftv v)
540{
541  char *n;
542  do
543  {
544    n=v->name;
545    if (n==NULL) return TRUE;
546    v->name=NULL;
547
548    int i;
549
550    if(strcmp(n,"get")==0)
551    {
552      intvec *w=new intvec(2);
553      (*w)[0]=test;
554      (*w)[1]=verbose;
555      res->rtyp=INTVEC_CMD;
556      res->data=(void *)w;
557      goto okay;
558    }
559    if(strcmp(n,"set")==0)
560    {
561      if((v->next!=NULL)
562      &&(v->next->Typ()==INTVEC_CMD))
563      {
564        v=v->next;
565        intvec *w=(intvec*)v->Data();
566        test=(*w)[0];
567        verbose=(*w)[1];
568
569        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL) && (currRing->ch>=2))
570        {
571          test &=~Sy_bit(OPT_INTSTRATEGY);
572        }
573        goto okay;
574      }
575    }
576    if(strcmp(n,"none")==0)
577    {
578      test=0;
579      verbose=0;
580      goto okay;
581    }
582    for (i=0; (i==0) || (optionStruct[i-1].setval!=0); i++)
583    {
584      if (strcmp(n,optionStruct[i].name)==0)
585      {
586        if (optionStruct[i].setval & validOpts)
587          test |= optionStruct[i].setval;
588        else
589          Warn("cannot set option");
590        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL) && (currRing->ch>=2))
591        {
592          test &=~Sy_bit(OPT_INTSTRATEGY);
593        }
594        goto okay;
595      }
596      else if ((strncmp(n,"no",2)==0)
597      && (strcmp(n+2,optionStruct[i].name)==0))
598      {
599        if (optionStruct[i].setval & validOpts)
600        {
601          test &= optionStruct[i].resetval;
602        }
603        else
604          Warn("cannot clear option");
605        goto okay;
606      }
607    }
608    for (i=0; (i==0) || (verboseStruct[i-1].setval!=0); i++)
609    {
610      if (strcmp(n,verboseStruct[i].name)==0)
611      {
612        verbose |= verboseStruct[i].setval;
613        #ifdef YYDEBUG
614        #if YYDEBUG
615        if (BVERBOSE(V_YACC)) yydebug=1;
616        else                  yydebug=0;
617        #endif
618        #endif
619        goto okay;
620      }
621      else if ((strncmp(n,"no",2)==0)
622      && (strcmp(n+2,verboseStruct[i].name)==0))
623      {
624        verbose &= verboseStruct[i].resetval;
625        #ifdef YYDEBUG
626        #if YYDEBUG
627        if (BVERBOSE(V_YACC)) yydebug=1;
628        else                  yydebug=0;
629        #endif
630        #endif
631        goto okay;
632      }
633    }
634    Werror("unknown option `%s`",n);
635  okay:
636    FreeL((ADDRESS)n);
637    v=v->next;
638  } while (v!=NULL);
639  return FALSE;
640}
641
642char * showOption()
643{
644  int i;
645  BITSET tmp;
646
647  StringSet("//options:");
648  if ((test!=0)||(verbose!=0))
649  {
650    tmp=test;
651    if(tmp)
652    {
653      for (i=0; optionStruct[i].setval!=0; i++)
654      {
655        if (optionStruct[i].setval & test)
656        {
657          StringAppend(" %s",optionStruct[i].name);
658          tmp &=optionStruct[i].resetval;
659        }
660      }
661      for (i=0; i<32; i++)
662      {
663        if (tmp & Sy_bit(i)) StringAppend(" %d",i);
664      }
665    }
666    tmp=verbose;
667    if (tmp)
668    {
669      for (i=0; verboseStruct[i].setval!=0; i++)
670      {
671        if (verboseStruct[i].setval & tmp)
672        {
673          StringAppend(" %s",verboseStruct[i].name);
674          tmp &=verboseStruct[i].resetval;
675        }
676      }
677      for (i=1; i<32; i++)
678      {
679        if (tmp & Sy_bit(i)) StringAppend(" %d",i+32);
680      }
681    }
682    return mstrdup(StringAppend(""));
683  }
684  else
685    return mstrdup(StringAppend(" none"));
686}
687
688char * versionString()
689{
690  StringSet("\t");
691#ifdef HAVE_FACTORY
692              StringAppend("factory(%s),", factoryVersion);
693#endif
694#ifdef HAVE_LIBFAC_P
695              StringAppend("libfac(%s,%s),\n\t",libfac_version,libfac_date);
696#endif
697#if defined (__GNU_MP_VERSION) && defined (__GNU_MP_VERSION_MINOR)
698              StringAppend("GMP(%d.%d),",__GNU_MP_VERSION,__GNU_MP_VERSION_MINOR);
699#elif defined (HAVE_SMALLGMP)
700              StringAppendS("SmallGMP(2.0.2.0),");
701#else
702              StringAppendS("GMP(1.3),");
703#endif
704#ifdef HAVE_MPSR
705              StringAppend("MP(%s),",MP_VERSION);
706#endif
707#if defined(HAVE_READLINE) && !defined(FEREAD)
708              StringAppendS("libreadline,\n\t");
709#else
710#ifdef HAVE_FEREAD
711              StringAppendS("emulated libreadline,\n\t");
712#else
713              StringAppendS("\n\t");
714#endif
715#endif
716#ifdef SRING
717              StringAppendS("super algebra,");
718#endif
719#ifdef DRING
720              StringAppendS("Weyl algebra,");
721#endif
722#ifdef HAVE_DBM
723              StringAppendS("DBM,");
724#endif
725#ifdef HAVE_INFO
726              StringAppendS("info,");
727#endif
728#ifdef TEST
729              StringAppendS("TESTs,");
730#endif
731#if YYDEBUG
732              StringAppendS("YYDEBUG=1,");
733#endif
734#ifdef MDEBUG
735              StringAppend("MDEBUG=%d,",MDEBUG);
736#endif
737#ifdef PDEBUG
738              StringAppend("PDEBUG,");
739#endif
740#ifdef KDEBUG
741              StringAppend("KDEBUG,");
742#endif
743#ifdef TEST_MAC_ORDER
744              StringAppendS("mac_order,");
745#endif
746#ifndef __OPTIMIZE__
747              StringAppend("-g,");
748#endif
749              StringAppend("random=%d\n",siRandomStart);
750#ifdef HAVE_INFO
751              StringAppend("InfoFile   : %s\n", feGetInfoFile());
752              StringAppend("InfoProgram: %s\n", feGetInfoProgram());
753#endif
754              StringAppend("Singular   : %s\n",feGetExpandedExecutable());
755              return StringAppend("SearchPath : %s", feGetSearchPath());
756}
Note: See TracBrowser for help on using the repository browser.