/*
* Utility routines.
*
- * Copyright (C) tons of folks. Tracking down who wrote what
- * isn't something I'm going to worry about... If you wrote something
- * here, please feel free to acknowledge your work.
+ * Copyright (C) many different people.
+ * If you wrote this, please acknowledge your work.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Based in part on code from sash, Copyright (c) 1999 by David I. Bell
- * Permission has been granted to redistribute this code under the GPL.
- *
*/
#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 ((char)ch == '\n')
+ if (!ch) return linebuf;
+ if (c<2 && ch == '\n') {
+ if (c) {
+ --idx;
+ }
break;
+ }
}
+ if (linebuf) {
+ if (ferror(file)) {
+ free(linebuf);
+ return NULL;
+ }
+ linebuf[idx] = 0;
+ }
+ return linebuf;
+}
- if (idx == 0)
- return NULL;
+extern char *bb_get_line_from_file(FILE *file)
+{
+ return private_get_line_from_file(file, 0);
+}
- linebuf[idx] = 0;
- return linebuf;
+extern char *bb_get_chomped_line_from_file(FILE *file)
+{
+ return private_get_line_from_file(file, 1);
+}
+
+extern char *bb_get_chunk_from_file(FILE *file)
+{
+ return private_get_line_from_file(file, 2);
}