From fbd64c8790e2cec2d6bc44d3d13f39b9a5940e12 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 18 Feb 1997 21:53:32 +0000 Subject: Restructured quite a bit, hopefully Lee Busby will find this useful. Also grandly renamed. Here's the new interface: When WITH_READLINE is defined, two functions are defined: - PyOS_GnuReadline (what used to be my_readline() with WITH_READLINE) - PyOS_ReadlineInit (for Dave Ascher) Always, these functions are defined: - PyOS_StdioReadline (what used to be my_readline() without WITH_READLINE) - PyOS_Readline (the interface used by tokenizer.c and [raw_]input(). There's a global function pointer PyOS_ReadlineFunctionPointer, initialized to NULL. When PyOS_Readline finds this to be NULL, it sets it to either PyOS_GnuReadline or PyOS_StdioReadline depending on which one makes more sense (i.e. it uses GNU only if it is defined *and* stdin is indeed a tty device). An embedding program that has its own wishes can set the function pointer to a function of its own design. It should take a char* prompt argument (which may be NULL) and return a string *ending in a \n character* -- or "" for EOF or NULL for a user interrupt. --Guido van Rossum (home page: http://www.python.org/~guido/) --- Parser/myreadline.c | 132 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 50 deletions(-) diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 5eff847..69788b5 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -29,16 +29,18 @@ PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ -/* Readline interface for tokenizer.c. - By default, we have a super simple my_readline function. - Optionally, we can use the GNU readline library (to be found in the - bash distribution). +/* Readline interface for tokenizer.c and [raw_]input() in bltinmodule.c. + By default, or when stdin is not a tty device, we have a super + simple my_readline function using fgets. + Optionally, we can use the GNU readline library. my_readline() has a different return value from GNU readline(): - NULL if an interrupt occurred or if an error occurred - a malloc'ed empty string if EOF was read - a malloc'ed string ending in \n normally */ +#define Py_USE_NEW_NAMES 1 + #include "config.h" #include @@ -49,6 +51,7 @@ PERFORMANCE OF THIS SOFTWARE. #include "mymalloc.h" #include "intrcheck.h" + #ifdef WITH_READLINE extern char *readline(); @@ -71,46 +74,6 @@ onintr(sig) longjmp(jbuf, 1); } -#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 */ - - -#ifdef WITH_READLINE void PyOS_ReadlineInit() { @@ -123,16 +86,13 @@ PyOS_ReadlineInit() been_here++; } } -#endif - char * -my_readline(prompt) +PyOS_GnuReadline(prompt) char *prompt; { int n; char *p; -#ifdef WITH_READLINE RETSIGTYPE (*old_inthandler)(); PyOS_ReadlineInit(); old_inthandler = signal(SIGINT, onintr); @@ -160,7 +120,54 @@ my_readline(prompt) p[n+1] = '\0'; } return p; -#else /* !WITH_READLINE */ +} + +#endif /* !WITH_READLINE */ + + +/* This function restarts a fgets() after an EINTR error occurred + except if PyOS_InterruptOccurred() 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 (PyOS_InterruptOccurred()) { + return 1; /* Interrupt */ + } + continue; + } +#endif + if (PyOS_InterruptOccurred()) { + return 1; /* Interrupt */ + } + return -2; /* Error */ + } + /* NOTREACHED */ +} + + +/* Readline implementation using fgets() */ + +char * +PyOS_StdioReadline(prompt) + char *prompt; +{ + int n; + char *p; n = 100; if ((p = malloc(n)) == NULL) return NULL; @@ -198,5 +205,30 @@ my_readline(prompt) n += strlen(p+n); } return realloc(p, n+1); -#endif /* !WITH_READLINE */ +} + + +/* By initializing this function pointer, systems embedding Python can + override the readline function. */ + +char *(*PyOS_ReadlineFunctionPointer) Py_PROTO((char *)); + + +/* Interface used by tokenizer.c and bltinmodule.c */ + +char * +PyOS_Readline(prompt) + char *prompt; +{ + int n; + char *p; + if (PyOS_ReadlineFunctionPointer == NULL) { +#ifdef WITH_READLINE + if (isatty(fileno(stdin))) + PyOS_ReadlineFunctionPointer = PyOS_GnuReadline; + else +#endif + PyOS_ReadlineFunctionPointer = PyOS_StdioReadline; + } + return (*PyOS_ReadlineFunctionPointer)(prompt); } -- cgit v0.12