1 /* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA. */
26 /* Read up to (and including) a TERMINATOR from STREAM into *LINEPTR
27 (and null-terminate it). *LINEPTR is a pointer returned from malloc (or
28 NULL), pointing to *N characters of space. It is realloc'd as
29 necessary. Returns the number of characters read (not including the
30 null terminator), or -1 on error or EOF. */
33 DEFUN(__getdelim
, (lineptr
, n
, terminator
, stream
),
34 char **lineptr AND
size_t *n AND
int terminator AND
FILE *stream
)
39 if (!__validfp (stream
) || lineptr
== NULL
|| n
== NULL
)
48 /* Make sure we have a line buffer to start with. */
49 if (*lineptr
== NULL
|| *n
< 2) /* !seen and no buf yet need 2 chars. */
54 line
= realloc (*lineptr
, MAX_CANON
);
67 if (stream
->__buffer
== NULL
&& stream
->__userbuf
)
69 /* Unbuffered stream. Not much optimization to do. */
77 register int c
= getc (stream
);
80 else if ((*p
++ = c
) == terminator
)
84 /* Need to enlarge the line buffer. */
87 line
= realloc (line
, size
);
98 /* Leave space for the terminating null. */
101 if (!stream
->__seen
|| stream
->__buffer
== NULL
|| stream
->__pushed_back
)
103 /* Do one with getc to allocate a buffer. */
104 int c
= getc (stream
);
118 i
= stream
->__get_limit
- stream
->__bufp
;
121 /* Refill the buffer. */
122 int c
= __fillbf (stream
);
129 i
= stream
->__get_limit
- stream
->__bufp
;
135 found
= (char *) __memccpy ((PTR
) p
, stream
->__bufp
, terminator
, i
);
138 stream
->__bufp
+= found
- p
;
148 /* Need to enlarge the line buffer. */
149 size_t len
= p
- line
;
151 line
= realloc (line
, size
);
158 /* Leave space for the terminating null. */
167 /* Return a partial line since we got an error in the middle. */
173 weak_alias (__getdelim
, getdelim
)