source: git/Singular/tesths.cc

spielwiese
Last change on this file was 968c3d, checked in by Hans Schoenemann <hannes@…>, 5 months ago
remove some sprintf
  • Property mode set to 100644
File size: 6.3 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4
5/*
6* ABSTRACT - initialize SINGULARs components, run Script and start SHELL
7*/
8
9
10#include "kernel/mod2.h"
11#include "omalloc/omalloc.h"
12#include "misc/options.h"
13#include "factory/factory.h"
14#include "kernel/oswrapper/feread.h"
15#include "Singular/fevoices.h"
16#include "kernel/oswrapper/timer.h"
17
18#include "ipshell.h"
19#include "cntrlc.h"
20#include "links/silink.h"
21#include "ipid.h"
22#include "sdb.h"
23#include "feOpt.h"
24#include "misc/distrib.h"
25#include "mmalloc.h"
26#include "tok.h"
27#include "resources/fegetopt.h"
28
29#include "Singular/countedref.h"
30#include "Singular/pyobject_setup.h"
31
32#include <unistd.h>
33#ifdef HAVE_NTL
34#include <NTL/config.h>
35#endif
36
37
38extern void siInit(char *);
39#ifdef PSINGULAR
40GLOBAL_VAR char *global_argv0;
41#endif
42EXTERN_VAR FILE* File_Log;
43EXTERN_VAR BOOLEAN FE_OPT_NO_SHELL_FLAG;
44
45int mmInit( void )
46{
47#ifndef X_OMALLOC
48#if defined(OMALLOC_USES_MALLOC)
49    /* in mmstd.c, for some architectures freeSize() unconditionally uses the *system* free() */
50    /* sage ticket 5344: http://trac.sagemath.org/sage_trac/ticket/5344 */
51    /* do not rely on the default in Singular as libsingular may be different */
52    mp_set_memory_functions(omMallocFunc,omReallocSizeFunc,omFreeSizeFunc);
53#else
54    mp_set_memory_functions(malloc,reallocSize,freeSize);
55#endif
56#endif
57  return 1;
58}
59
60/*0 implementation*/
61int main(          /* main entry to Singular */
62    int argc,      /* number of parameter */
63    char** argv)   /* parameter array */
64{
65  mmInit();
66  // Don't worry: ifdef OM_NDEBUG, then all these calls are undef'ed
67  omInitRet_2_Info(argv[0]);
68  omInitGetBackTrace();
69
70#ifdef PSINGULAR
71  global_argv0 = argv[0];
72#endif
73  siInit(argv[0]);
74  init_signals();
75
76  // parse command line options
77  int optc, option_index;
78  const char* errormsg;
79  while((optc = fe_getopt_long(argc, argv,
80                               SHORT_OPTS_STRING, feOptSpec, &option_index))
81        != EOF)
82  {
83    if (optc == '?' || optc == 0)
84    {
85      fprintf(stderr, "Use '%s --help' for a complete list of options\n", feArgv0);
86      exit(1);
87    }
88
89    if (optc != LONG_OPTION_RETURN)
90      option_index = feGetOptIndex(optc);
91
92    assume(option_index >= 0 && option_index < (int) FE_OPT_UNDEF);
93
94    if (fe_optarg == NULL &&
95        (feOptSpec[option_index].type == feOptBool ||
96         feOptSpec[option_index].has_arg == optional_argument))
97      errormsg = feSetOptValue((feOptIndex) option_index, (int) 1);
98    else
99      errormsg = feSetOptValue((feOptIndex) option_index, fe_optarg);
100
101    if (errormsg)
102    {
103      if (fe_optarg == NULL)
104        fprintf(stderr, "Error: Option '--%s' %s\n",
105               feOptSpec[option_index].name, errormsg);
106      else
107        fprintf(stderr, "Error: Option '--%s=%s' %s\n",
108               feOptSpec[option_index].name, fe_optarg, errormsg);
109      fprintf(stderr, "Use '%s --help' for a complete list of options\n", feArgv0);
110      exit(1);
111    }
112    if (optc == 'h') exit(0);
113    switch(option_index)
114    {
115      case FE_OPT_DUMP_VERSIONTUPLE:
116        exit(0);
117        break;
118      default: ;
119    }
120  }
121
122  /* say hello */
123
124  if (TEST_V_QUIET)
125  {
126    (printf)(
127"                     SINGULAR                                 /"
128#ifndef MAKE_DISTRIBUTION
129"  Development"
130#endif
131"\n"
132" A Computer Algebra System for Polynomial Computations       /   version %s\n"
133"                                                           0<\n"
134" by: W. Decker, G.-M. Greuel, G. Pfister, H. Schoenemann     \\   %s\n"
135"FB Mathematik der Universitaet, D-67653 Kaiserslautern        \\\n"
136, VERSION, VERSION_DATE);
137    if (feOptValue(FE_OPT_NO_SHELL))
138    {
139      WarnS("running in restricted mode:"
140      " shell invocation and links are disallowed");
141      FE_OPT_NO_SHELL_FLAG=TRUE;
142    }
143  }
144  else
145  {
146    FE_OPT_NO_SHELL_FLAG=FALSE;
147    if (feOptValue(FE_OPT_SORT)) On(SW_USE_NTL_SORT);
148    dup2(1,2);
149    /* alternative:
150    *    memcpy(stderr,stdout,sizeof(FILE));
151    */
152  }
153  if (feOptValue(FE_OPT_LOG)!=NULL)
154  {
155    int pid=getpid();
156    char *buf=(char*)malloc(10+strlen((char*) feOptSpec[FE_OPT_LOG].value));
157    snprintf(buf,10+strlen((char*) feOptSpec[FE_OPT_LOG].value),
158      "%s.%d",(char*) feOptSpec[FE_OPT_LOG].value,pid);
159    File_Log=fopen(buf,"w");
160  }
161
162#ifdef SINGULAR_PYOBJECT_SETUP_H
163   pyobject_setup();
164#endif
165#ifdef SI_COUNTEDREF_AUTOLOAD
166  countedref_init();
167#endif
168  errorreported = 0;
169
170  // -- example for "static" modules ------
171  //load_builtin("huhu.so",FALSE,(SModulFunc_t)huhu_mod_init);
172  //module_help_main("huhu.so","Help for huhu\nhaha\n");
173  //module_help_proc("huhu.so","p","Help for huhu::p\nhaha\n");
174  setjmp(si_start_jmpbuf);
175
176  // Now, put things on the stack of stuff to do
177  // Last thing to do is to execute given scripts
178  if (fe_optind < argc)
179  {
180    int i = argc - 1;
181    FILE *fd;
182    while (i >= fe_optind)
183    {
184      if ((fd = feFopen(argv[i], "r")) == NULL)
185      {
186        Warn("Can not open %s", argv[i]);
187      }
188      else
189      {
190        fclose(fd);
191        newFile(argv[i]);
192      }
193      i--;
194    }
195  }
196  else
197  {
198    currentVoice=feInitStdin(NULL);
199  }
200
201  // before scripts, we execute -c, if it was given
202  if (feOptValue(FE_OPT_EXECUTE) != NULL)
203    newBuffer(omStrDup((char*) feOptValue(FE_OPT_EXECUTE)), BT_execute);
204
205  // first thing, however, is to load .singularrc from Singularpath
206  // and cwd/$HOME (in that order).
207  if (! feOptValue(FE_OPT_NO_RC))
208  {
209    char buf[MAXPATHLEN];
210    FILE * rc = feFopen("." DIR_SEPP ".singularrc", "r", buf);
211    if (rc == NULL) rc = feFopen("~" DIR_SEPP ".singularrc", "r", buf);
212    if (rc == NULL) rc = feFopen(".singularrc", "r", buf);
213
214    if (rc != NULL)
215    {
216      if (BVERBOSE(V_LOAD_LIB))
217        Print("// ** executing %s\n", buf);
218      fclose(rc);
219      newFile(buf);
220    }
221  }
222
223  /* start shell */
224  if (fe_fgets_stdin==fe_fgets_dummy)
225  {
226    singular_in_batchmode=TRUE;
227    char *linkname=(char*) feOptValue(FE_OPT_LINK);
228    if((linkname!=NULL)&&(strcmp(linkname,"ssi")==0))
229    {
230      return ssiBatch((char*) feOptValue(FE_OPT_MPHOST),(char*) feOptValue(FE_OPT_MPPORT));
231      //Print("batch: p:%s, h:%s\n",(char*) feOptValue(FE_OPT_MPPORT),(char*) feOptValue(FE_OPT_MPHOST));
232      //exit(0);
233    }
234    else
235    {
236      Print("** missing arguments: -b requires --link/--MPhost/--MPport\n");
237      return 1;
238    }
239  }
240  setjmp(si_start_jmpbuf);
241  yyparse();
242  m2_end(0);
243  return 0;
244}
245
Note: See TracBrowser for help on using the repository browser.