source: git/Singular/feOpt.cc @ 8d1432e

spielwiese
Last change on this file since 8d1432e was 65041c, checked in by Hans Schoenemann <hannes@…>, 8 years ago
additional tests for unusual tty configurations, error msg for -b
  • Property mode set to 100644
File size: 9.2 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT: Implementation of option buisness
6*/
7
8
9
10
11#include <kernel/mod2.h>
12
13#include <string.h>
14#include <stdlib.h>
15
16#include <factory/factory.h>
17
18#define FE_OPT_STRUCTURE
19#include "feOpt.h"
20
21#if !defined(GENERATE_OPTION_INDEX) && !defined(ESINGULAR) && !defined(TSINGULAR)
22#include <misc/options.h>
23#include <misc/sirandom.h>
24#endif
25
26#include "fehelp.h"
27
28
29const char SHORT_OPTS_STRING[] = "bdhpqstvxec:r:u:";
30
31//////////////////////////////////////////////////////////////
32//
33// Generation of feOptIndex
34//
35#ifdef GENERATE_OPTION_INDEX
36
37#include <stdio.h>
38#include <unistd.h>
39#include <stdlib.h>
40int main()
41{
42  FILE* fd;
43#ifdef ESINGULAR
44  fd = fopen("feOptES.xx", "w");
45#elif defined(TSINGULAR)
46  fd = fopen("feOptTS.xx", "w");
47#else
48  fd = fopen("feOpt.xx", "w");
49#endif
50
51  if (fd == NULL) exit(1);
52
53  int i = 0;
54
55  fputs("typedef enum\n{\n", fd);
56
57  while (feOptSpec[i].name != NULL)
58  {
59    const char* name = feOptSpec[i].name;
60    fputs("FE_OPT_", fd);
61    while (*name != 0)
62    {
63      if (*name == '-')
64      {
65        putc('_', fd);
66      }
67      else if (*name >= 97 && *name <= 122)
68      {
69        putc(*name - 32, fd);
70      }
71      else
72      {
73        putc(*name, fd);
74      }
75      name++;
76    }
77    if (i == 0)
78    {
79      fputs("=0", fd);
80    }
81    i++;
82    fputs(",\n  ", fd);
83  }
84
85  fprintf(fd, "FE_OPT_UNDEF\n} feOptIndex;\n");
86  fclose(fd);
87#ifdef ESINGULAR
88  rename("feOptES.xx", "feOptES.inc");
89#elif defined(TSINGULAR)
90  rename("feOptTS.xx", "feOptTS.inc");
91#else
92  rename("feOpt.xx", "feOpt.inc");
93#endif
94  return(0);
95}
96
97#else // ! GENERATE_OPTION_INDEX
98
99///////////////////////////////////////////////////////////////
100//
101// Getting Values
102//
103
104feOptIndex feGetOptIndex(const char* name)
105{
106  int opt = 0;
107
108  while (opt != (int) FE_OPT_UNDEF)
109  {
110    if (strcmp(feOptSpec[opt].name, name) == 0)
111      return (feOptIndex) opt;
112    opt = opt + 1;
113  }
114  return FE_OPT_UNDEF;
115}
116
117feOptIndex feGetOptIndex(int optc)
118{
119  int opt = 0;
120
121  if (optc == LONG_OPTION_RETURN) return FE_OPT_UNDEF;
122
123  while (opt != (int) FE_OPT_UNDEF)
124  {
125    if (feOptSpec[opt].val == optc)
126      return (feOptIndex) opt;
127    opt = opt + 1;
128  }
129  return FE_OPT_UNDEF;
130}
131
132///////////////////////////////////////////////////////////////
133//
134// Setting Values
135//
136//
137// Return: NULL -- everything ok
138//         "error-string" on error
139#if !defined(ESINGULAR) && !defined(TSINGULAR)
140#include <omalloc/omalloc.h>
141#include <resources/feResource.h>
142#include <kernel/oswrapper/feread.h>
143#include <kernel/oswrapper/timer.h>
144
145#include "ipshell.h"
146#include "tok.h"
147#include "sdb.h"
148#include "cntrlc.h"
149
150#include <errno.h>
151
152static const char* feOptAction(feOptIndex opt);
153const char* feSetOptValue(feOptIndex opt, char* optarg)
154{
155  if (opt == FE_OPT_UNDEF) return "option undefined";
156
157  if (feOptSpec[opt].type != feOptUntyped)
158  {
159    if (feOptSpec[opt].type != feOptString)
160    {
161      if (optarg != NULL)
162      {
163        errno = 0;
164        feOptSpec[opt].value = (void*) strtol(optarg, NULL, 10);
165        if (errno) return "invalid integer argument";
166      }
167      else
168      {
169        feOptSpec[opt].value = (void*) 0;
170      }
171    }
172    else
173    {
174      assume(feOptSpec[opt].type == feOptString);
175      if (feOptSpec[opt].set && feOptSpec[opt].value != NULL)
176        omFree(feOptSpec[opt].value);
177      if (optarg != NULL)
178        feOptSpec[opt].value = omStrDup(optarg);
179      else
180        feOptSpec[opt].value = NULL;
181      feOptSpec[opt].set = 1;
182    }
183  }
184  return feOptAction(opt);
185}
186
187const char* feSetOptValue(feOptIndex opt, int optarg)
188{
189  if (opt == FE_OPT_UNDEF) return "option undefined";
190
191  if (feOptSpec[opt].type != feOptUntyped)
192  {
193    if (feOptSpec[opt].type == feOptString)
194      return "option value needs to be an integer";
195
196    feOptSpec[opt].value = (void*)(long) optarg;
197  }
198  return feOptAction(opt);
199}
200
201static const char* feOptAction(feOptIndex opt)
202{
203  // do some special actions
204  switch(opt)
205  {
206      case FE_OPT_BATCH:
207        if (feOptSpec[FE_OPT_BATCH].value)
208          fe_fgets_stdin=fe_fgets_dummy;
209        return NULL;
210
211      case FE_OPT_HELP:
212        feOptHelp(feArgv0);
213        return NULL;
214
215      case FE_OPT_PROFILE:
216         traceit=1024;
217         return NULL;
218
219      case FE_OPT_QUIET:
220        if (feOptSpec[FE_OPT_QUIET].value)
221          si_opt_2 &= ~(Sy_bit(0)|Sy_bit(V_LOAD_LIB));
222        else
223          si_opt_2 |= Sy_bit(V_LOAD_LIB)|Sy_bit(0);
224        return NULL;
225
226      case FE_OPT_NO_TTY:
227        if (feOptSpec[FE_OPT_NO_TTY].value)
228          fe_fgets_stdin=fe_fgets;
229        return NULL;
230
231      case FE_OPT_SDB:
232      #ifdef HAVE_SDB
233        if (feOptSpec[FE_OPT_SDB].value)
234          sdb_flags = 1;
235        else
236          sdb_flags = 0;
237      #endif
238        return NULL;
239
240      case FE_OPT_VERSION:
241        {
242        char *s=versionString();
243        printf("%s",s);
244        omFree(s);
245        return NULL;
246        }
247
248      case FE_OPT_ECHO:
249        si_echo = (int) ((long)(feOptSpec[FE_OPT_ECHO].value));
250        if (si_echo < 0 || si_echo > 9)
251          return "argument of option is not in valid range 0..9";
252        return NULL;
253
254      case FE_OPT_RANDOM:
255        siRandomStart = (unsigned int) ((unsigned long)
256                                          (feOptSpec[FE_OPT_RANDOM].value));
257        siSeed=siRandomStart;
258        factoryseed(siRandomStart);
259        return NULL;
260
261      case FE_OPT_EMACS:
262        if (feOptSpec[FE_OPT_EMACS].value)
263        {
264          // print EmacsDir and InfoFile so that Emacs
265          // mode can pcik it up
266          Warn("EmacsDir: %s", (feResource('e' /*"EmacsDir"*/) != NULL ?
267                                feResource('e' /*"EmacsDir"*/) : ""));
268          Warn("InfoFile: %s", (feResource('i' /*"InfoFile"*/) != NULL ?
269                                feResource('i' /*"InfoFile"*/) : ""));
270        }
271        return NULL;
272
273      case FE_OPT_NO_WARN:
274        if (feOptSpec[FE_OPT_NO_WARN].value)
275          feWarn = FALSE;
276        else
277          feWarn = TRUE;
278        return NULL;
279
280      case FE_OPT_NO_OUT:
281        if (feOptSpec[FE_OPT_NO_OUT].value)
282          feOut = FALSE;
283        else
284          feOut = TRUE;
285        return NULL;
286
287      case FE_OPT_MIN_TIME:
288      {
289        double mintime = atof((char*) feOptSpec[FE_OPT_MIN_TIME].value);
290        if (mintime <= 0) return "invalid float argument";
291        SetMinDisplayTime(mintime);
292        return NULL;
293      }
294
295      case FE_OPT_BROWSER:
296        feHelpBrowser((char*) feOptSpec[FE_OPT_BROWSER].value, 1);
297
298      case FE_OPT_TICKS_PER_SEC:
299      {
300        int ticks = (int) ((long)(feOptSpec[FE_OPT_TICKS_PER_SEC].value));
301        if (ticks <= 0)
302          return "integer argument must be larger than 0";
303        SetTimerResolution(ticks);
304        return NULL;
305      }
306
307      case FE_OPT_DUMP_VERSIONTUPLE:
308      {
309        feOptDumpVersionTuple();
310        return NULL;
311      }
312
313      default:
314        return NULL;
315  }
316}
317
318// Prints usage message
319void fePrintOptValues()
320{
321  int i = 0;
322
323  while (feOptSpec[i].name != 0)
324  {
325    if (feOptSpec[i].help != NULL && feOptSpec[i].type != feOptUntyped
326#ifndef SING_NDEBUG
327        && *(feOptSpec[i].help) != '/'
328#endif
329        )
330    {
331      if (feOptSpec[i].type == feOptString)
332      {
333        if (feOptSpec[i].value == NULL)
334        {
335          Print("// --%-15s\n", feOptSpec[i].name);
336        }
337        else
338        {
339          Print("// --%-15s \"%s\"\n", feOptSpec[i].name, (char*) feOptSpec[i].value);
340        }
341      }
342      else
343      {
344        Print("// --%-15s %d\n", feOptSpec[i].name, (int)(long)feOptSpec[i].value);
345      }
346    }
347    i++;
348  }
349}
350
351#endif // ! ESingular
352
353// Prints help message
354void feOptHelp(const char* name)
355{
356  int i = 0;
357  char tmp[20];
358#if defined(ESINGULAR)
359  printf("ESingular starts up Singular within emacs;\n");
360#elif defined(TSINGULAR)
361  printf("TSingular starts up Singular within a terminal window;\n");
362#endif
363  printf("Singular is a Computer Algebra System (CAS) for Polynomial Computations.\n");
364  printf("Usage: %s [options] [file1 [file2 ...]]\n", name);
365  printf("Options:\n");
366
367  while (feOptSpec[i].name != 0)
368  {
369    if (feOptSpec[i].help != NULL
370#ifdef SING_NDEBUG
371        && *(feOptSpec[i].help) != '/'
372#endif
373        )
374    {
375      if (feOptSpec[i].has_arg > 0)
376      {
377        if  (feOptSpec[i].has_arg > 1)
378          sprintf(tmp, "%s[=%s]", feOptSpec[i].name, feOptSpec[i].arg_name);
379        else
380          sprintf(tmp, "%s=%s", feOptSpec[i].name, feOptSpec[i].arg_name);
381
382        printf(" %c%c --%-20s %s\n",
383               (feOptSpec[i].val != LONG_OPTION_RETURN ? '-' : ' '),
384               (feOptSpec[i].val != LONG_OPTION_RETURN ? feOptSpec[i].val : ' '),
385               tmp,
386               feOptSpec[i].help);
387      }
388      else
389      {
390        printf(" %c%c --%-20s %s\n",
391               (feOptSpec[i].val != LONG_OPTION_RETURN ? '-' : ' '),
392               (feOptSpec[i].val != LONG_OPTION_RETURN ? feOptSpec[i].val : ' '),
393               feOptSpec[i].name,
394               feOptSpec[i].help);
395      }
396    }
397    i++;
398  }
399
400  printf("\nFor more information, type `help;' from within Singular or visit\n");
401  printf("http://www.singular.uni-kl.de or consult the\n");
402  printf("Singular manual (available as on-line info or html manual).\n");
403}
404
405void feOptDumpVersionTuple(void)
406{
407  printf("%s\n",VERSION);
408}
409
410#endif // GENERATE_OPTION_INDEX
Note: See TracBrowser for help on using the repository browser.