1 /* vi: set sw=4 ts=4: */
4 * Copyright (C) 2000 by Lineo, inc. and Erik Andersen
5 * Copyright (C) 2000,2001 by Erik Andersen <andersen@uclibc.org>
6 * Written by Erik Andersen <andersen@uclibc.org>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Library General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
18 * You should have received a copy of the GNU Library General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 /* Read up to (and including) a TERMINATOR from STREAM into *LINEPTR
33 (and null-terminate it). *LINEPTR is a pointer returned from malloc (or
34 NULL), pointing to *N characters of space. It is realloc'd as
35 necessary. Returns the number of characters read (not including the
36 null delimiter), or -1 on error or EOF. */
37 ssize_t getdelim(char **linebuf, size_t *linebufsz, int delimiter, FILE *file)
39 static const int GROWBY = 80; /* how large we will grow strings by */
44 if (file == NULL || linebuf==NULL || linebufsz == NULL) {
49 if (*linebuf == NULL || *linebufsz < 2) {
50 *linebuf = malloc(GROWBY);
62 /* grow the line buffer as necessary */
63 while (idx > *linebufsz-2) {
64 *linebuf = realloc(*linebuf, *linebufsz += GROWBY);
70 (*linebuf)[idx++] = (char)ch;
71 if ((char)ch == delimiter)