]> git.ipfire.org Git - thirdparty/glibc.git/blame - libio/iogetline.c
Remove use of INTDEF/INTUSE in libio
[thirdparty/glibc.git] / libio / iogetline.c
CommitLineData
d18ea0c5 1/* Copyright (C) 1993-2012 Free Software Foundation, Inc.
41bdb6e2 2 This file is part of the GNU C Library.
96aa2d94 3
41bdb6e2
AJ
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
96aa2d94 8
41bdb6e2
AJ
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
40a55d20 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
96aa2d94 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>.
96aa2d94 17
41bdb6e2
AJ
18 As a special exception, if you link the code in this file with
19 files compiled with a GNU compiler to produce an executable,
20 that does not cause the resulting executable to be covered by
21 the GNU Lesser General Public License. This exception does not
22 however invalidate any other reasons why the executable file
23 might be covered by the GNU Lesser General Public License.
24 This exception applies to code released by its copyright holders
25 in files containing the exception. */
96aa2d94
RM
26
27#include "libioP.h"
28#include <string.h>
29
0a614877
UD
30#if defined _LIBC || !_G_HAVE_IO_GETLINE_INFO
31
32_IO_size_t
33_IO_getline (fp, buf, n, delim, extract_delim)
34 _IO_FILE *fp;
35 char *buf;
36 _IO_size_t n;
37 int delim;
38 int extract_delim;
39{
d18ea0c5 40 return _IO_getline_info (fp, buf, n, delim, extract_delim, (int *) 0);
0a614877 41}
d18ea0c5 42libc_hidden_def (_IO_getline)
0a614877 43
96aa2d94
RM
44/* Algorithm based on that used by Berkeley pre-4.4 fgets implementation.
45
46 Read chars into buf (of size n), until delim is seen.
47 Return number of chars read (at most n).
48 Does not put a terminating '\0' in buf.
49 If extract_delim < 0, leave delimiter unread.
50 If extract_delim > 0, insert delim in output. */
51
52_IO_size_t
0a614877 53_IO_getline_info (fp, buf, n, delim, extract_delim, eof)
40a55d20
UD
54 _IO_FILE *fp;
55 char *buf;
56 _IO_size_t n;
57 int delim;
58 int extract_delim;
0a614877 59 int *eof;
96aa2d94 60{
40a55d20 61 char *ptr = buf;
0a614877
UD
62 if (eof != NULL)
63 *eof = 0;
076bfcf6
UD
64 if (__builtin_expect (fp->_mode, -1) == 0)
65 _IO_fwide (fp, -1);
00a2f9aa 66 while (n != 0)
96aa2d94
RM
67 {
68 _IO_ssize_t len = fp->_IO_read_end - fp->_IO_read_ptr;
96aa2d94 69 if (len <= 0)
96aa2d94 70 {
0a614877
UD
71 int c = __uflow (fp);
72 if (c == EOF)
96aa2d94 73 {
b5d839c9
UD
74 if (eof)
75 *eof = c;
0a614877
UD
76 break;
77 }
78 if (c == delim)
79 {
80 if (extract_delim > 0)
81 *ptr++ = c;
82 else if (extract_delim < 0)
d18ea0c5 83 _IO_sputbackc (fp, c);
96aa2d94 84 if (extract_delim > 0)
40a55d20 85 ++len;
8da2915d 86 return ptr - buf;
96aa2d94 87 }
0a614877
UD
88 *ptr++ = c;
89 n--;
96aa2d94 90 }
b5d839c9
UD
91 else
92 {
93 char *t;
94 if ((_IO_size_t) len >= n)
95 len = n;
96 t = (char *) memchr ((void *) fp->_IO_read_ptr, delim, len);
97 if (t != NULL)
98 {
99 _IO_size_t old_len = ptr-buf;
100 len = t - fp->_IO_read_ptr;
101 if (extract_delim >= 0)
102 {
103 ++t;
104 if (extract_delim > 0)
105 ++len;
106 }
107 memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
108 fp->_IO_read_ptr = t;
109 return old_len + len;
110 }
111 memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
112 fp->_IO_read_ptr += len;
113 ptr += len;
114 n -= len;
115 }
08cac4ac 116 }
96aa2d94
RM
117 return ptr - buf;
118}
d18ea0c5 119libc_hidden_def (_IO_getline_info)
0a614877
UD
120
121#endif /* Defined _LIBC || !_G_HAVE_IO_GETLINE_INFO */