jason@ucbopal.BERKELEY.EDU (Jason Venner) (12/24/85)
This routine takes a FILE* as it's sole argument, and returns a pointer
to a null terminated string in malloced memory.
The string will be terminated be a '\n''\0' if there is a terminating
'\n' in the input, or just by a '\0' if an 'EOF' was hit.
There should be no problem using this on other UNIX version, but I don't know.
---Cut Here Checksum via sum.1 is '22377 2'----
#include <stdio.h>
/* This routine reads a line (of arbitrary length), up to a '\n' or 'EOF'
* and returns a pointer to the resulting null terminated string.
* The '\n' if found, is included in the returned string.
*/
#define STRGROW 256
char *
readline( fd )
FILE *fd;
{
int c;
unsigned StrLen;
unsigned MemLen;
char *StrPtr;
char* realloc();
StrPtr = (char*) 0;
StrLen = 0;
MemLen = STRGROW;
if( !(StrPtr = realloc( StrPtr, MemLen )) ) {
return (char*) 0;
}
MemLen -= 1; /* Save constant -1's in while loop */
while( (c = getc( fd )) != EOF ) {
StrPtr[StrLen] = c;
StrLen++;
if( StrLen >= MemLen ) {
MemLen += STRGROW;
if( !(StrPtr = realloc( StrPtr, MemLen + 1)) ) {
return (char*) 0;
}
}
if( c == '\n' ) {
break;
}
}
if( StrLen == 0 ) {
(void) free( StrPtr );
return (char*) 0;
}
StrPtr[StrLen] = '\0';
/* Trim the string */
if( !(StrPtr = realloc( StrPtr, StrLen + 1 )) ) {
return (char*) 0;
}
return StrPtr;
}
#ifdef TEST_READLINE
main( argc, argv )
int argc;
char **argv;
{
char *string;
while( (string = readline( stdin )) ) {
puts( string );
(void) free( string );
}
exit( 0 );
}
#endif
---Cut here also----
jason@jade.berkeley.edu
{ihnp4,sun,dual,tektronix}!ucbvax!ucbjade!jasondavidson@sdcsvax.UUCP (J. Greg Davidson) (12/27/85)
#include <stdio.h>
char *
readline( fd )
FILE *fd;
/* Reads the next line ending in '\n' or EOF from fd. Stores
it, NUL terminated, into a malloc'ed string array. Returns
the address of the string. - greg@vis.UUCP
( J. Greg Davidson Virtual Infinity Systems, San Diego )
*/
{
char *rdln();
return rdln( fd, (unsigned) 1);
}
static char *
rdln( fd, l )
FILE *fd;
unsigned l;
/* See readline. Call with l == 1. */
{
int c;
char *p;
char *malloc();
c = getc( fd );
if (c == '\n' || c == EOF)
{
p = malloc( l ) + l;
*--p = '\0';
}
else
{
p = rdln( fd, l + 1 );
*--p = c;
}
return p;
}
/*
J. Greg Davidson Virtual Infinity Systems
(619) 452-8059 6231 Branting St; San Diego, CA 92122
greg@vis.uucp ucbvax--| telesoft--|
davidson@sdcsvax.uucp decvax--+--sdcsvax--+--vis
davidson@ucsd.arpa ihnp4--| noscvax--|
*/