diff options
author | Manuel Novoa III | 2003-03-19 09:13:01 +0000 |
---|---|---|
committer | Manuel Novoa III | 2003-03-19 09:13:01 +0000 |
commit | cad5364599eb5062d59e0c397ed638ddd61a8d5d (patch) | |
tree | a318d0f03aa076c74b576ea45dc543a5669e8e91 /libbb/get_line_from_file.c | |
parent | e01f9662a5bd5d91be4f6b3941b57fff73cd5af1 (diff) | |
download | busybox-cad5364599eb5062d59e0c397ed638ddd61a8d5d.zip busybox-cad5364599eb5062d59e0c397ed638ddd61a8d5d.tar.gz |
Major coreutils update.
Diffstat (limited to 'libbb/get_line_from_file.c')
-rw-r--r-- | libbb/get_line_from_file.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/libbb/get_line_from_file.c b/libbb/get_line_from_file.c index 5e70621..5af8989 100644 --- a/libbb/get_line_from_file.c +++ b/libbb/get_line_from_file.c @@ -21,41 +21,57 @@ */ #include <stdio.h> +#include <stdlib.h> #include "libbb.h" - - -/* get_line_from_file() - This function reads an entire line from a text file +/* get_line_from_file() - This function reads an entire line from a text file, * up to a newline. It returns a malloc'ed char * which must be stored and - * free'ed by the caller. */ -extern char *get_line_from_file(FILE *file) + * free'ed by the caller. If 'c' is nonzero, the trailing '\n' (if any) + * is removed. In event of a read error or EOF, NULL is returned. */ + +static char *private_get_line_from_file(FILE *file, int c) { - static const int GROWBY = 80; /* how large we will grow strings by */ +#define GROWBY (80) /* how large we will grow strings by */ int ch; int idx = 0; char *linebuf = NULL; int linebufsz = 0; - while (1) { - ch = fgetc(file); - if (ch == EOF) - break; + while ((ch = getc(file)) != EOF) { /* grow the line buffer as necessary */ - while (idx > linebufsz-2) + if (idx > linebufsz-2) { linebuf = xrealloc(linebuf, linebufsz += GROWBY); + } linebuf[idx++] = (char)ch; - if (ch == '\n' || ch == '\0') + if (ch == '\n' || ch == '\0') { + if (c) { + --idx; + } break; + } } - if (idx == 0) - return NULL; - - linebuf[idx] = 0; + if (linebuf) { + if (ferror(file)) { + free(linebuf); + return NULL; + } + linebuf[idx] = 0; + } return linebuf; } +extern char *bb_get_line_from_file(FILE *file) +{ + return private_get_line_from_file(file, 0); +} + +extern char *bb_get_chomped_line_from_file(FILE *file) +{ + return private_get_line_from_file(file, 1); +} + /* END CODE */ /* |