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: #include "libioP.h"
29: #include <string.h>
30: #include <wchar.h>
31:
32: #ifdef _LIBC
33: # define wmemcpy __wmemcpy
34: #endif
35:
36: #if defined _LIBC || !_G_HAVE_IO_GETLINE_INFO
37:
38: _IO_size_t
39: _IO_getwline (fp, buf, n, delim, extract_delim)
40: _IO_FILE *fp;
41: wchar_t *buf;
42: _IO_size_t n;
43: wint_t delim;
44: int extract_delim;
45: {
46: return _IO_getwline_info (fp, buf, n, delim, extract_delim, (wint_t *) 0);
47: }
48:
49:
50:
51:
52:
53:
54:
55:
56:
57: _IO_size_t
58: _IO_getwline_info (fp, buf, n, delim, extract_delim, eof)
59: _IO_FILE *fp;
60: wchar_t *buf;
61: _IO_size_t n;
62: wint_t delim;
63: int extract_delim;
64: wint_t *eof;
65: {
66: wchar_t *ptr = buf;
67: if (eof != NULL)
68: *eof = 0;
69: if (__builtin_expect (fp->_mode, 1) == 0)
70: _IO_fwide (fp, 1);
71: while (n != 0)
72: {
73: _IO_ssize_t len = (fp->_wide_data->_IO_read_end
74: - fp->_wide_data->_IO_read_ptr);
75: if (len <= 0)
76: {
77: wint_t wc = __wuflow (fp);
78: if (wc == WEOF)
79: {
80: if (eof)
81: *eof = wc;
82: break;
83: }
84: if (wc == delim)
85: {
86: if (extract_delim > 0)
87: *ptr++ = wc;
88: else if (extract_delim < 0)
89: INTUSE(_IO_sputbackc) (fp, wc);
90: if (extract_delim > 0)
91: ++len;
92: return ptr - buf;
93: }
94: *ptr++ = wc;
95: n--;
96: }
97: else
98: {
99: wchar_t *t;
100: if ((_IO_size_t) len >= n)
101: len = n;
102: t = wmemchr ((void *) fp->_wide_data->_IO_read_ptr, delim, len);
103: if (t != NULL)
104: {
105: _IO_size_t old_len = ptr - buf;
106: len = t - fp->_wide_data->_IO_read_ptr;
107: if (extract_delim >= 0)
108: {
109: ++t;
110: if (extract_delim > 0)
111: ++len;
112: }
113: wmemcpy ((void *) ptr, (void *) fp->_wide_data->_IO_read_ptr,
114: len);
115: fp->_wide_data->_IO_read_ptr = t;
116: return old_len + len;
117: }
118: wmemcpy ((void *) ptr, (void *) fp->_wide_data->_IO_read_ptr, len);
119: fp->_wide_data->_IO_read_ptr += len;
120: ptr += len;
121: n -= len;
122: }
123: }
124: return ptr - buf;
125: }
126:
127: #endif