diff options
author | Guido van Rossum <guido@python.org> | 1994-08-01 11:34:53 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1994-08-01 11:34:53 (GMT) |
commit | b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2af (patch) | |
tree | 9362939305b2d088b8f19a530c9015d886bc2801 /Parser/myreadline.c | |
parent | 2979b01ff88ac4c5b316d9bf98edbaaaffac8e24 (diff) | |
download | cpython-b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2af.zip cpython-b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2af.tar.gz cpython-b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2af.tar.bz2 |
Merge alpha100 branch back to main trunk
Diffstat (limited to 'Parser/myreadline.c')
-rw-r--r-- | Parser/myreadline.c | 77 |
1 files changed, 67 insertions, 10 deletions
diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 870333c..18f8b1d 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -1,5 +1,5 @@ /*********************************************************** -Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum, +Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, Amsterdam, The Netherlands. All Rights Reserved @@ -32,12 +32,19 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - a malloc'ed string ending in \n normally */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include <stdio.h> #include <string.h> +#include <errno.h> +#include "myproto.h" #include "mymalloc.h" +#include "intrcheck.h" -#ifdef HAVE_READLINE +#ifdef WITH_READLINE extern char *readline(); @@ -54,7 +61,44 @@ onintr(sig) longjmp(jbuf, 1); } -#endif /* HAVE_READLINE */ +#else /* !WITH_READLINE */ + +/* This function restarts a fgets() after an EINTR error occurred + except if intrcheck() returns true. */ + +static int +my_fgets(buf, len, fp) + char *buf; + int len; + FILE *fp; +{ + char *p; + for (;;) { + errno = 0; + p = fgets(buf, len, fp); + if (p != NULL) + return 0; /* No error */ + if (feof(fp)) { + return -1; /* EOF */ + } +#ifdef EINTR + if (errno == EINTR) { + if (intrcheck()) { + return 1; /* Interrupt */ + } + continue; + } +#endif + if (intrcheck()) { + return 1; /* Interrupt */ + } + return -2; /* Error */ + } + /* NOTREACHED */ +} + +#endif /* WITH_READLINE */ + char * my_readline(prompt) @@ -62,7 +106,7 @@ my_readline(prompt) { int n; char *p; -#ifdef HAVE_READLINE +#ifdef WITH_READLINE RETSIGTYPE (*old_inthandler)(); static int been_here; if (!been_here) { @@ -92,28 +136,41 @@ my_readline(prompt) p[n+1] = '\0'; } return p; -#else /* !HAVE_READLINE */ +#else /* !WITH_READLINE */ n = 100; if ((p = malloc(n)) == NULL) return NULL; if (prompt) fprintf(stderr, "%s", prompt); - if (fgets(p, n, stdin) == NULL) - *p = '\0'; - if (intrcheck()) { + switch (my_fgets(p, n, stdin)) { + case 0: /* Normal case */ + break; + case 1: /* Interrupt */ free(p); return NULL; + case -1: /* EOF */ + case -2: /* Error */ + default: /* Shouldn't happen */ + *p = '\0'; + break; } +#ifdef MPW + /* Hack for MPW C where the prompt comes right back in the input */ + /* XXX (Actually this would be rather nice on most systems...) */ + n = strlen(prompt); + if (strncmp(p, prompt, n) == 0) + memmove(p, p + n, strlen(p) - n + 1); +#endif n = strlen(p); while (n > 0 && p[n-1] != '\n') { int incr = n+2; p = realloc(p, n + incr); if (p == NULL) return NULL; - if (fgets(p+n, incr, stdin) == NULL) + if (my_fgets(p+n, incr, stdin) != 0) break; n += strlen(p+n); } return realloc(p, n+1); -#endif /* !HAVE_READLINE */ +#endif /* !WITH_READLINE */ } |