diff options
author | karl <karl> | 2004-04-19 22:56:26 +0000 |
---|---|---|
committer | karl <karl> | 2004-04-19 22:56:26 +0000 |
commit | d2ffca200655a89c5d140b66d69001e92173e3da (patch) | |
tree | 6fa1965e6e8362c5913e1554b12507a924dba7f1 /lib/line.c | |
parent | eb33f9ace5a3ddfe8a983866468f3352abaa6391 (diff) | |
download | fontutils-d2ffca200655a89c5d140b66d69001e92173e3da.tar.gz |
init
Diffstat (limited to 'lib/line.c')
-rw-r--r-- | lib/line.c | 63 |
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; +} |