Merge alpha100 branch back to main trunk

This commit is contained in:
Guido van Rossum 1994-08-01 11:34:53 +00:00
parent 2979b01ff8
commit b6775db241
176 changed files with 5302 additions and 3668 deletions

View file

@ -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 */
}