Bill Allombert on Wed, 10 Mar 2004 12:59:51 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: a couple of gp issues |
On Sat, Mar 06, 2004 at 03:21:14PM -0500, Igor Schein wrote: > Hi, > > 1) I would like to be able to concatenate command line gp options, > e.g. "gp -qf" instead of "gp -q -f". And while we're at it, why not > have each option have both short and long variant, like every GNU > package out there. Right now, for instance, -q doesn't have > --quiet (or --silent) counterpart, and --test doesn't have -t > counterpart. The problem is that PARI 2.3 need to support options understood by PARI 2.1 so backward incompatible changes will wait for 2.5. gp 2.1 support: [-b buffersize] Deprecated [-emacs] Run as if in Emacs shell [-f] Faststart: do not read .gprc [--help] Print this message [-q] Quiet mode: do not print banner and history numbers [-p primelimit] Precalculate primes up to the limit [-s stacksize] Start with the PARI stack of given size (in bytes) [-test] Test mode. As -q, plus wrap long lines [--version] Output version info and exit and options clustering does not fit well with X11-style long options like -test. Now, we can add --fast, --quiet, --primelimit and --stacksize. already. The attached patch implement that, supporting both --primelimit x and --primelimit=x syntax. > 2) Let's say I am piping a bunch of commands to gp, and I wanna skip > the one that takes too long and continue with the rest of the input. > I press ^C, and it does just that. However, if I need to ^C some time > later, it gets trapped somehow. Here's a simple example: > > % cat << EOD | gp -q -f > > \e > > while(1,) > > while(1,) > > EOD > echo = 1 (on) > ? while(1,) > *** user interrupt after 2,250 ms. > ? while(1,) > > at this point ^C is a noop. I have mentionned this problem on this list recently. I am not sure what cause it. Cheers, Bill.
Index: src/gp/gp.c =================================================================== RCS file: /home/cvs/pari/src/gp/gp.c,v retrieving revision 1.218 diff -u -r1.218 gp.c --- src/gp/gp.c 20 Jan 2004 19:20:32 -0000 1.218 +++ src/gp/gp.c 10 Mar 2004 11:56:07 -0000 @@ -86,13 +86,13 @@ { printf("### Usage: %s [options] [GP files]\n", s); printf("Options are:\n"); - printf("\t[-f]\t\tFaststart: do not read .gprc\n"); - printf("\t[-q]\t\tQuiet mode: do not print banner and history numbers\n"); - printf("\t[-p primelimit]\tPrecalculate primes up to the limit\n"); - printf("\t[-s stacksize]\tStart with the PARI stack of given size (in bytes)\n"); + printf("\t[-f,--fast]\tFaststart: do not read .gprc\n"); + printf("\t[-q,--quiet]\tQuiet mode: do not print banner and history numbers\n"); + printf("\t[-p,--primelimit primelimit]\tPrecalculate primes up to the limit\n"); + printf("\t[-s,--stacksize stacksize]\tStart with the PARI stack of given size (in bytes)\n"); printf("\t[--emacs]\tRun as if in Emacs shell\n"); printf("\t[--help]\tPrint this message\n"); - printf("\t[--test]\t\tTest mode. No history, wrap long lines (bench only)\n"); + printf("\t[--test]\tTest mode. No history, wrap long lines (bench only)\n"); printf("\t[--texmacs]\tRun as if using TeXmacs frontend\n"); printf("\t[--version]\tOutput version info and exit\n"); printf("\t[--version-short]\tOutput version number and exit\n\n"); @@ -2485,13 +2485,6 @@ char **v; /* args */ } tm_cmd; -static char * -pari_strndup(char *s, long n) -{ - char *t = gpmalloc(n+1); - memcpy(t,s,n); t[n] = 0; return t; -} - static void parse_texmacs_command(tm_cmd *c, char *ch) { @@ -2918,6 +2911,16 @@ *nread = i+1; return argv[i]; } +static char * +read_arg_equal(int *nread, char *t, long argc, char **argv) +{ + int i = *nread; + if (*t=='=' && isdigit((int)t[1])) return t+1; + if (*t || i==argc) usage(argv[0]); + *nread = i+1; return argv[i]; +} + + static void init_trivial_stack() { @@ -2964,6 +2967,10 @@ if (strcmp(t, "texmacs") == 0) { GP_DATA->flags |= TEXMACS; break; } if (strcmp(t, "emacs") == 0) { GP_DATA->flags |= EMACS; break; } if (strcmp(t, "test") == 0) { GP_DATA->flags |= TEST; initrc = 0; break; } + if (strcmp(t, "quiet") == 0) { GP_DATA->flags |= QUIET; break; } + if (strcmp(t, "fast") == 0) { initrc = 0; break; } + if (strncmp(t, "primelimit",10) == 0) {p = read_arg_equal(&i,t+10,argc,argv); break; } + if (strncmp(t, "stacksize",9) == 0) {s = read_arg_equal(&i,t+9,argc,argv); break; } /* fall through */ default: usage(argv[0]);