summaryrefslogtreecommitdiff
path: root/lib/line.c
diff options
context:
space:
mode:
authorkarl <karl>2004-04-19 22:56:26 +0000
committerkarl <karl>2004-04-19 22:56:26 +0000
commitd2ffca200655a89c5d140b66d69001e92173e3da (patch)
tree6fa1965e6e8362c5913e1554b12507a924dba7f1 /lib/line.c
parenteb33f9ace5a3ddfe8a983866468f3352abaa6391 (diff)
downloadfontutils-d2ffca200655a89c5d140b66d69001e92173e3da.tar.gz
init
Diffstat (limited to 'lib/line.c')
-rw-r--r--lib/line.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/line.c b/lib/line.c
new file mode 100644
index 0000000..6c2e16e
--- /dev/null
+++ b/lib/line.c
@@ -0,0 +1,63 @@
+/* line.c: return the next line from a file, or NULL.
+
+Copyright (C) 1992 Free Software Foundation, Inc.
+
+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
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+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., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include "config.h"
+
+
+#define BLOCK_SIZE 40
+
+char *
+read_line (f)
+ FILE *f;
+{
+ int c;
+ unsigned limit = BLOCK_SIZE;
+ unsigned loc = 0;
+ char *line = (char *) xmalloc (limit);
+
+ while ((c = getc (f)) != EOF && c != '\n')
+ {
+ line[loc] = c;
+ loc++;
+
+ /* By testing after the assignment, we guarantee that we'll always
+ have space for the null we append below. We know we always
+ have room for the first char, since we start with BLOCK_SIZE. */
+ if (loc == limit)
+ {
+ limit += BLOCK_SIZE;
+ line = (char *) xrealloc (line, limit);
+ }
+ }
+
+ /* If we read anything, return it. This can't represent a last
+ ``line'' which doesn't end in a newline, but so what. */
+ if (c != EOF)
+ {
+ /* Terminate the string. We can't represent nulls in the file,
+ either. Again, it doesn't matter. */
+ line[loc] = 0;
+ }
+ else /* At end of file. */
+ {
+ free (line);
+ line = NULL;
+ }
+
+ return line;
+}