Added external interface to readline, for raw_input().

This commit is contained in:
Guido van Rossum 1991-04-04 15:21:57 +00:00
parent 26203aa422
commit 0bd2441e00
2 changed files with 72 additions and 34 deletions

View File

@ -31,3 +31,4 @@ extern typeobject Filetype;
extern object *newfileobject PROTO((char *, char *)); extern object *newfileobject PROTO((char *, char *));
extern object *newopenfileobject PROTO((FILE *, char *, char *)); extern object *newopenfileobject PROTO((FILE *, char *, char *));
extern FILE *getfilefile PROTO((object *)); extern FILE *getfilefile PROTO((object *));
extern object *filegetline PROTO((object *, int));

View File

@ -279,28 +279,22 @@ file_read(f, args)
return v; return v;
} }
/* Read a line. /* Internal routine to get a line.
Without argument, or with a zero argument, read until end of line Size argument interpretation:
or EOF, whichever comes first. > 0: max length;
With a positive argument n, read at most n bytes until end of line = 0: read arbitrary line;
or EOF, whichever comes first. < 0: strip trailing '\n', raise EOFError if EOF reached immediately
Negative and non-integer arguments are illegal.
When EOF is hit immediately, return an empty string.
A newline character is returned as the last character of the buffer
if it is read.
*/ */
/* XXX Should this be unified with raw_input()? */ object *
getline(f, n)
static object *
file_readline(f, args)
fileobject *f; fileobject *f;
object *args; int n;
{ {
register FILE *fp; register FILE *fp;
register int c; register int c;
register char *buf, *end; register char *buf, *end;
int n, n1, n2; int n1, n2;
object *v; object *v;
if ((fp = f->f_fp) == NULL) { if ((fp = f->f_fp) == NULL) {
@ -308,18 +302,7 @@ file_readline(f, args)
return NULL; return NULL;
} }
if (args == NULL) n2 = n > 0 ? n : 100;
n = 0; /* Unlimited */
else {
if (!getintarg(args, &n))
return NULL;
if (n < 0) {
err_badarg();
return NULL;
}
}
n2 = n != 0 ? n : 100;
v = newsizedstringobject((char *)NULL, n2); v = newsizedstringobject((char *)NULL, n2);
if (v == NULL) if (v == NULL)
return NULL; return NULL;
@ -327,11 +310,26 @@ file_readline(f, args)
end = buf + n2; end = buf + n2;
for (;;) { for (;;) {
if ((c = getc(fp)) == EOF || (*buf++ = c) == '\n') if ((c = getc(fp)) == EOF) {
if (intrcheck()) {
DECREF(v);
err_set(KeyboardInterrupt);
return NULL;
}
if (n < 0 && buf == BUF(v)) {
DECREF(v);
err_set(EOFError);
return NULL;
}
break; break;
/* XXX Error check? */ }
if ((*buf++ = c) == '\n') {
if (n < 0)
buf--;
break;
}
if (buf == end) { if (buf == end) {
if (n != 0) if (n > 0)
break; break;
n1 = n2; n1 = n2;
n2 += 1000; n2 += 1000;
@ -348,6 +346,43 @@ file_readline(f, args)
return v; return v;
} }
/* External C interface */
object *
filegetline(f, n)
object *f;
int n;
{
if (f == NULL || !is_fileobject(f)) {
err_badcall();
return NULL;
}
return getline((fileobject *)f, n);
}
/* Python method */
static object *
file_readline(f, args)
fileobject *f;
object *args;
{
int n;
if (args == NULL)
n = 0; /* Unlimited */
else {
if (!getintarg(args, &n))
return NULL;
if (n < 0) {
err_badarg();
return NULL;
}
}
return getline((object *)f, n);
}
static object * static object *
file_readlines(f, args) file_readlines(f, args)
fileobject *f; fileobject *f;
@ -356,10 +391,12 @@ file_readlines(f, args)
object *list; object *list;
object *line; object *line;
if (!getnoarg(args))
return NULL;
if ((list = newlistobject(0)) == NULL) if ((list = newlistobject(0)) == NULL)
return NULL; return NULL;
for (;;) { for (;;) {
line = file_readline(f, args); line = getline(f, 0);
if (line != NULL && getstringsize(line) == 0) { if (line != NULL && getstringsize(line) == 0) {
DECREF(line); DECREF(line);
break; break;