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. */
27 /* Read up to (and including) a TERMINATOR from STREAM into *LINEPTR
28 (and null-terminate it). *LINEPTR is a pointer returned from malloc (or
29 NULL), pointing to *N characters of space. It is realloc'd as
30 necessary. Returns the number of characters read (not including the
31 null terminator), or -1 on error or EOF. */
34 DEFUN(__getdelim
, (lineptr
, n
, terminator
, stream
),
35 char **lineptr AND
size_t *n AND
int terminator AND
FILE *stream
)
40 if (!__validfp (stream
) || lineptr
== NULL
|| n
== NULL
)
49 /* Make sure we have a line buffer to start with. */
50 if (*lineptr
== NULL
|| *n
< 2) /* !seen and no buf yet need 2 chars. */
55 line
= realloc (*lineptr
, MAX_CANON
);
68 if (stream
->__buffer
== NULL
&& stream
->__userbuf
)
70 /* Unbuffered stream. Not much optimization to do. */
78 register int c
= getc (stream
);
81 else if ((*p
++ = c
) == terminator
)
85 /* Need to enlarge the line buffer. */
88 line
= realloc (line
, size
);
99 /* Leave space for the terminating null. */
102 if (!stream
->__seen
|| stream
->__buffer
== NULL
|| stream
->__pushed_back
)
104 /* Do one with getc to allocate a buffer. */
105 int c
= getc (stream
);
119 i
= stream
->__get_limit
- stream
->__bufp
;
122 /* Refill the buffer. */
123 int c
= __fillbf (stream
);
130 i
= stream
->__get_limit
- stream
->__bufp
;
136 found
= (char *) __memccpy ((PTR
) p
, stream
->__bufp
, terminator
, i
);
139 stream
->__bufp
+= found
- p
;
149 /* Need to enlarge the line buffer. */
150 size_t len
= p
- line
;
152 line
= realloc (line
, size
);
159 /* Leave space for the terminating null. */
168 /* Return a partial line since we got an error in the middle. */
174 weak_alias (__getdelim
, getdelim
)