]> gcc.gnu.org Git - gcc.git/blame - libio/iogetdelim.c
iostream.cc (istream::operator>>(long double&)): Scan value into separate variable...
[gcc.git] / libio / iogetdelim.c
CommitLineData
dbfcb4be
BK
1/* Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
2 This file is part of the GNU IO Library.
6599da04 3
dbfcb4be
BK
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License as
6 published by the Free Software Foundation; either version 2, or (at
7 your option) any later version.
6599da04 8
dbfcb4be
BK
9 This library is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
6599da04 13
dbfcb4be
BK
14 You should have received a copy of the GNU General Public License
15 along with this library; see the file COPYING. If not, write to
16 the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
17 MA 02111-1307, USA.
6599da04 18
dbfcb4be
BK
19 As a special exception, if you link this library with files
20 compiled with a GNU compiler to produce an executable, this does
21 not cause the resulting executable to be covered by the GNU General
22 Public License. This exception does not however invalidate any
23 other reasons why the executable file might be covered by the GNU
24 General Public License. */
6599da04
JM
25
26#ifdef __STDC__
27#include <stdlib.h>
28#endif
29#include "libioP.h"
30#include <string.h>
31#include <errno.h>
32
33/* Read up to (and including) a TERMINATOR from FP into *LINEPTR
34 (and null-terminate it). *LINEPTR is a pointer returned from malloc (or
35 NULL), pointing to *N characters of space. It is realloc'ed as
36 necessary. Returns the number of characters read (not including the
37 null terminator), or -1 on error or EOF. */
38
39_IO_ssize_t
dbfcb4be
BK
40_IO_getdelim (lineptr, n, delimiter, fp)
41 char **lineptr;
42 _IO_size_t *n;
43 int delimiter;
44 _IO_FILE *fp;
6599da04 45{
dbfcb4be
BK
46 int result;
47 _IO_ssize_t cur_len = 0;
6599da04
JM
48 _IO_ssize_t len;
49
50 if (lineptr == NULL || n == NULL)
51 {
dbfcb4be 52 MAYBE_SET_EINVAL;
6599da04
JM
53 return -1;
54 }
55 CHECK_FILE (fp, -1);
dbfcb4be
BK
56 _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
57 _IO_flockfile (fp);
58 if (_IO_ferror_unlocked (fp))
59 {
60 result = -1;
61 goto unlock_return;
62 }
6599da04
JM
63
64 if (*lineptr == NULL || *n == 0)
65 {
66 *n = 120;
67 *lineptr = (char *) malloc (*n);
68 if (*lineptr == NULL)
dbfcb4be
BK
69 {
70 result = -1;
71 goto unlock_return;
72 }
6599da04
JM
73 }
74
75 len = fp->_IO_read_end - fp->_IO_read_ptr;
76 if (len <= 0)
77 {
78 if (__underflow (fp) == EOF)
dbfcb4be
BK
79 {
80 result = -1;
81 goto unlock_return;
82 }
6599da04
JM
83 len = fp->_IO_read_end - fp->_IO_read_ptr;
84 }
85
86 for (;;)
87 {
88 _IO_size_t needed;
89 char *t;
90 t = (char *) memchr ((void *) fp->_IO_read_ptr, delimiter, len);
91 if (t != NULL)
92 len = (t - fp->_IO_read_ptr) + 1;
dbfcb4be 93 /* Make enough space for len+1 (for final NUL) bytes. */
6599da04
JM
94 needed = cur_len + len + 1;
95 if (needed > *n)
96 {
dbfcb4be 97 if (needed < 2 * *n)
6599da04
JM
98 needed = 2 * *n; /* Be generous. */
99 *n = needed;
100 *lineptr = (char *) realloc (*lineptr, needed);
101 if (*lineptr == NULL)
dbfcb4be
BK
102 {
103 result = -1;
104 goto unlock_return;
105 }
6599da04
JM
106 }
107 memcpy (*lineptr + cur_len, (void *) fp->_IO_read_ptr, len);
108 fp->_IO_read_ptr += len;
109 cur_len += len;
110 if (t != NULL || __underflow (fp) == EOF)
111 break;
112 len = fp->_IO_read_end - fp->_IO_read_ptr;
113 }
114 (*lineptr)[cur_len] = '\0';
dbfcb4be
BK
115 result = cur_len;
116
117unlock_return:
118 _IO_cleanup_region_end (1);
119 return result;
6599da04 120}
dbfcb4be
BK
121
122#ifdef weak_alias
123weak_alias (_IO_getdelim, __getdelim)
124weak_alias (_IO_getdelim, getdelim)
125#endif
This page took 0.48844 seconds and 5 git commands to generate.