1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29: #include "libioP.h"
30: #include <string.h>
31:
32: #if defined _LIBC || !_G_HAVE_IO_GETLINE_INFO
33:
34: _IO_size_t
35: _IO_getline (fp, buf, n, delim, extract_delim)
36: _IO_FILE *fp;
37: char *buf;
38: _IO_size_t n;
39: int delim;
40: int extract_delim;
41: {
42: return INTUSE(_IO_getline_info) (fp, buf, n, delim, extract_delim,
43: (int *) 0);
44: }
45: INTDEF(_IO_getline)
46:
47:
48:
49:
50:
51:
52:
53:
54:
55: _IO_size_t
56: _IO_getline_info (fp, buf, n, delim, extract_delim, eof)
57: _IO_FILE *fp;
58: char *buf;
59: _IO_size_t n;
60: int delim;
61: int extract_delim;
62: int *eof;
63: {
64: char *ptr = buf;
65: if (eof != NULL)
66: *eof = 0;
67: if (__builtin_expect (fp->_mode, -1) == 0)
68: _IO_fwide (fp, -1);
69: while (n != 0)
70: {
71: _IO_ssize_t len = fp->_IO_read_end - fp->_IO_read_ptr;
72: if (len <= 0)
73: {
74: int c = __uflow (fp);
75: if (c == EOF)
76: {
77: if (eof)
78: *eof = c;
79: break;
80: }
81: if (c == delim)
82: {
83: if (extract_delim > 0)
84: *ptr++ = c;
85: else if (extract_delim < 0)
86: INTUSE(_IO_sputbackc) (fp, c);
87: if (extract_delim > 0)
88: ++len;
89: return ptr - buf;
90: }
91: *ptr++ = c;
92: n--;
93: }
94: else
95: {
96: char *t;
97: if ((_IO_size_t) len >= n)
98: len = n;
99: t = (char *) memchr ((void *) fp->_IO_read_ptr, delim, len);
100: if (t != NULL)
101: {
102: _IO_size_t old_len = ptr-buf;
103: len = t - fp->_IO_read_ptr;
104: if (extract_delim >= 0)
105: {
106: ++t;
107: if (extract_delim > 0)
108: ++len;
109: }
110: memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
111: fp->_IO_read_ptr = t;
112: return old_len + len;
113: }
114: memcpy ((void *) ptr, (void *) fp->_IO_read_ptr, len);
115: fp->_IO_read_ptr += len;
116: ptr += len;
117: n -= len;
118: }
119: }
120: return ptr - buf;
121: }
122: INTDEF(_IO_getline_info)
123:
124: #endif