summaryrefslogtreecommitdiffstats
path: root/Parser/myreadline.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-08-01 11:34:53 (GMT)
committerGuido van Rossum <guido@python.org>1994-08-01 11:34:53 (GMT)
commitb6775db241f5fe5e3dc2ca09fc6c9e6164d4b2af (patch)
tree9362939305b2d088b8f19a530c9015d886bc2801 /Parser/myreadline.c
parent2979b01ff88ac4c5b316d9bf98edbaaaffac8e24 (diff)
downloadcpython-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.c77
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 */
}