Merge alpha100 branch back to main trunk
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 @@
    - 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 @@
 	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 @@
 {
 	int n;
 	char *p;
-#ifdef HAVE_READLINE
+#ifdef WITH_READLINE
 	RETSIGTYPE (*old_inthandler)();
 	static int been_here;
 	if (!been_here) {
@@ -92,28 +136,41 @@
 		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 */
 }