ericco@stew.ssl.berkeley.edu (03/02/90)
OK, here's a tidbit of C code to get the ball rolling. I've
never found a safe line general line reader. This one mallocs
some space, which must later be free'd.
Eric
#define READSIZE 256 /* any number you like */
char *readline (in)
FILE *in; /* stream to read from */
{
static unsigned long length = 0; /* total length */
char buffer[READSIZE]; /* temp stack space */
int count; /* current segment len */
char *malloc();
char *ret; /* what to return */
/* should be a better way*/
if (fgets (buffer, READSIZE, in)) /* safe but finite read */
count = strlen(buffer);
else if (length == 0) /* out of data */
return NULL;
length += count;
/*
** length != 0 count == 0 ==> out of data, but some read in.
** count != 0 buffer[count-1] == \n ==> end of line
** so I pick off the silly \n character.
*/
if (count == 0 || (buffer[count-1] == '\n' && (count--, length--, 1)))
{
ret = malloc (length+1); /* one malloc per read */
ret[length]='\0'; /* start at the end */
}
else /* more to come */
ret = readline(in); /* recurse */
if (ret && count) /* got bytes to move */
{
length -= count; /* move pointer back */
bcopy (buffer, ret + length, count);/* move bytes */
}
return ret; /* unwind stack */
}
Eric
ericco@ssl.berkeley.edu