mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
Merge alpha100 branch back to main trunk
This commit is contained in:
parent
2979b01ff8
commit
b6775db241
176 changed files with 5302 additions and 3668 deletions
|
@ -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 */
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue