Added external interface to readline, for raw_input().
This commit is contained in:
parent
26203aa422
commit
0bd2441e00
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue