Merge alpha100 branch back to main trunk
diff --git a/Parser/Makefile.in b/Parser/Makefile.in
index b5649aa..4c1e1fa 100644
--- a/Parser/Makefile.in
+++ b/Parser/Makefile.in
@@ -9,17 +9,17 @@
 
 CC=		@CC@
 RANLIB=		@RANLIB@
+AR=		@AR@
+
 DEFS=		@DEFS@
 
 
 # === Other things that are customizable but not by configure ===
 
-TOP=		..
-INCLDIR=	$(TOP)/Py
-OPT=		-g
-CFLAGS=		$(OPT) -I$(INCLDIR) $(DEFS)
+INCLDIR=	$(srcdir)/../Include
+OPT=		-O
+CFLAGS=		$(OPT) -I$(INCLDIR) -I.. $(DEFS)
 
-AR=		ar
 MKDEP=		mkdep
 SHELL=		/bin/sh
 
@@ -34,13 +34,7 @@
 
 PGENOBJS=	pgenmain.o
 
-PARSERSRCS=	acceler.c fgetsintr.c grammar1.c \
-		intrcheck.c listnode.c myreadline.c node.c parser.c \
-		parsetok.c tokenizer.c bitset.c \
-		firstsets.c grammar.c metagrammar.c pgen.c \
-		printgrammar.c
-
-PGENSRCS=	pgenmain.c
+OBJS=		$(PGENOBJS) $(PARSEROBJS)
 
 PGEN=		pgen
 
@@ -64,11 +58,32 @@
 clobber:	clean
 		-rm -f $(PGEN) *.a tags TAGS
 
-Makefile:	Makefile.in $(TOP)/config.status
-		CONFIG_FILES=Makefile $(SHELL) $(TOP)/config.status
+Makefile:	$(srcdir)/Makefile.in ../config.status
+		(cd ..; CONFIG_FILES=Parser/Makefile CONFIG_HEADERS= \
+		$(SHELL) config.status)
 
-depend:		$(PARSERSRCS) $(PGENSRCS)
-		$(MKDEP) $(CFLAGS) $(PARSERSRCS) $(PGENSRCS)
+depend:
+		$(MKDEP) $(CFLAGS) `echo $(OBJS) | tr ' ' '\012' | \
+					sed 's|\(.*\)\.o|$(srcdir)/\1.c|'`
+
+.PRECIOUS:	Makefile
+
+acceler.o: acceler.c
+grammar1.o: grammar1.c
+intrcheck.o: intrcheck.c
+listnode.o: listnode.c
+myreadline.o: myreadline.c
+node.o: node.c
+parser.o: parser.c
+parsetok.o: parsetok.c
+tokenizer.o: tokenizer.c
+bitset.o: bitset.c
+firstsets.o: firstsets.c
+grammar.o: grammar.c
+metagrammar.o: metagrammar.c
+pgen.o: pgen.c
+printgrammar.o: printgrammar.c
+pgenmain.o: pgenmain.c
 
 # DO NOT DELETE THIS LINE -- mkdep uses it.
 # DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
diff --git a/Parser/assert.h b/Parser/assert.h
index dbce369..d007eca 100644
--- a/Parser/assert.h
+++ b/Parser/assert.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -28,7 +28,13 @@
 
 ******************************************************************/
 
+#ifdef MPW /* This is for MPW's File command */
+
+#define assert(e) { if (!(e)) { printf("### Python: Assertion failed:\n\
+    File %s; Line %d\n", __FILE__, __LINE__); abort(); } }
+#else
 #define assert(e) { if (!(e)) { printf("Assertion failed\n"); abort(); } }
+#endif
 
 #ifdef __cplusplus
 }
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 */
 }