1 /* Copyright (C) 1991, 1992, 1995, 1996 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 __getdelim (lineptr
, n
, terminator
, stream
)
42 if (!__validfp (stream
) || lineptr
== NULL
|| n
== NULL
)
51 /* Make sure we have a line buffer to start with. */
52 if (*lineptr
== NULL
|| *n
< 2) /* !seen and no buf yet need 2 chars. */
57 line
= realloc (*lineptr
, MAX_CANON
);
70 if (stream
->__buffer
== NULL
&& stream
->__userbuf
)
72 /* Unbuffered stream. Not much optimization to do. */
80 register int c
= getc (stream
);
83 else if ((*p
++ = c
) == terminator
)
87 /* Need to enlarge the line buffer. */
90 line
= realloc (line
, size
);
101 /* Leave space for the terminating null. */
104 if (!stream
->__seen
|| stream
->__buffer
== NULL
|| stream
->__pushed_back
)
106 /* Do one with getc to allocate a buffer. */
107 int c
= getc (stream
);
121 i
= stream
->__get_limit
- stream
->__bufp
;
124 /* Refill the buffer. */
125 int c
= __fillbf (stream
);
132 i
= stream
->__get_limit
- stream
->__bufp
;
138 found
= (char *) __memccpy ((void *) p
, stream
->__bufp
,
142 stream
->__bufp
+= found
- p
;
152 /* Need to enlarge the line buffer. */
153 size_t len
= p
- line
;
155 line
= realloc (line
, size
);
162 /* Leave space for the terminating null. */
171 /* Return a partial line since we got an error in the middle. */
177 weak_alias (__getdelim
, getdelim
)