|
|
1.1 root 1: /* This is part of libio/iostream, providing -*- C++ -*- input/output.
2: Copyright (C) 1991, 1992, 1993 Free Software Foundation
3:
4: This file is part of the GNU IO Library. This library is free
5: software; you can redistribute it and/or modify it under the
6: terms of the GNU General Public License as published by the
7: Free Software Foundation; either version 2, or (at your option)
8: any later version.
9:
10: This library is distributed in the hope that it will be useful,
11: but WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with GNU CC; see the file COPYING. If not, write to
17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18:
19: As a special exception, if you link this library with files
20: compiled with a GNU compiler to produce an executable, this does not cause
21: the resulting executable to be covered by the GNU General Public License.
22: This exception does not however invalidate any other reasons why
23: the executable file might be covered by the GNU General Public License. */
24:
25: /* Written by Per Bothner ([email protected]). */
26:
27: #define _STREAM_COMPAT
28: #ifdef __GNUG__
29: #pragma implementation
30: #endif
31: #include "iostreamP.h"
32: #include <string.h>
33: #include <stdarg.h>
34: #include <errno.h>
35: #ifndef errno
36: extern int errno;
37: #endif
38:
39: void streambuf::_un_link() { _IO_un_link(this); }
40:
41: void streambuf::_link_in() { _IO_link_in(this); }
42:
43: int streambuf::switch_to_get_mode()
44: { return _IO_switch_to_get_mode(this); }
45:
46: void streambuf::free_backup_area()
47: { _IO_free_backup_area(this); }
48:
49: #if 0
50: int streambuf::switch_to_put_mode()
51: { return _IO_:switch_to_put_mode(this); }
52: #endif
53:
54: int __overflow(streambuf* sb, int c)
55: {
56: return sb->overflow(c);
57: }
58:
59: int streambuf::underflow()
60: { return EOF; }
61:
62: int streambuf::overflow(int c /* = EOF */)
63: { return EOF; }
64:
65: streamsize streambuf::xsputn(register const char* s, streamsize n)
66: { return _IO_default_xsputn(this, s, n); }
67:
68: streamsize streambuf::xsgetn(char* s, streamsize n)
69: { return _IO_default_xsgetn(this, s, n); }
70:
71: int streambuf::ignore(int n)
72: {
73: register int more = n;
74: for (;;) {
75: int count = _IO_read_end - _IO_read_ptr; // Data available.
76: if (count > 0) {
77: if (count > more)
78: count = more;
79: _IO_read_ptr += count;
80: more -= count;
81: }
82: if (more == 0 || __underflow(this) == EOF)
83: break;
84: }
85: return n - more;
86: }
87:
88: int streambuf::sync()
89: {
90: if (pptr() == pbase())
91: return 0;
92: return EOF;
93: }
94:
95: int streambuf::pbackfail(int c)
96: {
97: return _IO_default_pbackfail(this, c);
98: }
99:
100: streambuf* streambuf::setbuf(char* p, int len)
101: {
102: if (sync() == EOF)
103: return NULL;
104: if (p == NULL || len == 0) {
105: unbuffered(1);
106: setb(_shortbuf, _shortbuf+1, 0);
107: }
108: else {
109: unbuffered(0);
110: setb(p, p+len, 0);
111: }
112: setp(0, 0);
113: setg(0, 0, 0);
114: return this;
115: }
116:
117: streampos streambuf::seekpos(streampos pos, int mode)
118: {
119: return seekoff(pos, ios::beg, mode);
120: }
121:
122: streampos streambuf::sseekpos(streampos pos, int mode)
123: {
124: return _IO_seekpos (this, pos, convert_to_seekflags (0, mode));
125: }
126:
127: void streambuf::setb(char* b, char* eb, int a)
128: { _IO_setb(this, b, eb, a); }
129:
130: int streambuf::doallocate() { return _IO_default_doallocate(this); }
131:
132: void streambuf::doallocbuf() { _IO_doallocbuf(this); }
133:
134: /* The following are jump table entries that just call the virtual method */
135:
136: static int _IO_sb_overflow(_IO_FILE *fp, int c)
137: { return ((streambuf*)fp)->overflow(c); }
138: static int _IO_sb_underflow(_IO_FILE *fp)
139: { return ((streambuf*)fp)->underflow(); }
140: static _IO_size_t _IO_sb_xsputn(_IO_FILE *fp, const void *s, _IO_size_t n)
141: { return ((streambuf*)fp)->xsputn((const char*)s, n); }
142: static _IO_size_t _IO_sb_xsgetn(_IO_FILE *fp, void *s, _IO_size_t n)
143: { return ((streambuf*)fp)->xsgetn((char*)s, n); }
144: static int _IO_sb_close(_IO_FILE *fp)
145: { return ((streambuf*)fp)->sys_close(); }
146: static int _IO_sb_stat(_IO_FILE *fp, void *b)
147: { return ((streambuf*)fp)->sys_stat(b); }
148: static int _IO_sb_doallocate(_IO_FILE *fp)
149: { return ((streambuf*)fp)->doallocate(); }
150:
151: static _IO_pos_t _IO_sb_seekoff(_IO_FILE *fp, _IO_off_t pos, _IO_seekflags m)
152: {
153: int mode = ((m & _IO_seek_not_in) ? 0 : ios::in)
154: + ((m & _IO_seek_not_out) ? 0 : ios::out);
155: return ((streambuf*)fp)->seekoff(pos, (_seek_dir)((int)m & 3), mode);
156: }
157:
158: static _IO_pos_t _IO_sb_seekpos(_IO_FILE *fp, _IO_pos_t pos, _IO_seekflags m)
159: {
160: int mode = ((m & _IO_seek_not_in) ? 0 : ios::in)
161: + ((m & _IO_seek_not_out) ? 0 : ios::out);
162: return ((streambuf*)fp)->seekpos(pos, mode);
163: }
164:
165: static int _IO_sb_pbackfail(_IO_FILE *fp, int ch)
166: { return ((streambuf*)fp)->pbackfail(ch); }
167: static void _IO_sb_finish(_IO_FILE *fp)
168: { ((streambuf*)fp)->~streambuf(); }
169: static _IO_ssize_t _IO_sb_read(_IO_FILE *fp, void *buf, _IO_ssize_t n)
170: { return ((streambuf*)fp)->sys_read((char*)buf, n); }
171: static _IO_ssize_t _IO_sb_write(_IO_FILE *fp, const void *buf, _IO_ssize_t n)
172: { return ((streambuf*)fp)->sys_write((const char*)buf, n); }
173: static int _IO_sb_sync(_IO_FILE *fp)
174: { return ((streambuf*)fp)->sync(); }
175: static _IO_pos_t _IO_sb_seek(_IO_FILE *fp, _IO_off_t off, int dir)
176: { return ((streambuf*)fp)->sys_seek(off, (_seek_dir)dir); }
177: static int _IO_sb_setbuf(_IO_FILE *fp, char *buf, _IO_ssize_t n)
178: { return ((streambuf*)fp)->setbuf(buf, n) == NULL ? EOF : 0; }
179:
180: /* This callbacks in this jumptable just call the corresponding
181: virtual function, so that C functions can access (potentially user-defined)
182: streambuf-derived objects.
183: Contrast the builtinbuf class, which does the converse: Allow
184: C++ virtual calls to to be used on _IO_FILE objects that are builtin
185: (or defined by C code). */
186:
187:
188: struct _IO_jump_t _IO_streambuf_jumps = {
189: _IO_sb_overflow,
190: _IO_sb_underflow,
191: _IO_sb_xsputn,
192: _IO_sb_xsgetn,
193: _IO_sb_read,
194: _IO_sb_write,
195: _IO_sb_doallocate,
196: _IO_sb_pbackfail,
197: _IO_sb_setbuf,
198: _IO_sb_sync,
199: _IO_sb_finish,
200: _IO_sb_close,
201: _IO_sb_stat,
202: _IO_sb_seek,
203: _IO_sb_seekoff,
204: _IO_sb_seekpos,
205: };
206:
207: streambuf::streambuf(int flags)
208: {
209: _IO_init(this, flags);
210: _jumps = &_IO_streambuf_jumps;
211: }
212:
213: streambuf::~streambuf() { _IO_default_finish(this); }
214:
215: streampos
216: streambuf::seekoff(streamoff, _seek_dir, int mode /*=ios::in|ios::out*/)
217: {
218: return EOF;
219: }
220:
221: streampos
222: streambuf::sseekoff(streamoff o , _seek_dir d, int m /*=ios::in|ios::out*/)
223: {
224: return _IO_seekoff (this, o, convert_to_seekflags (d, m));
225: }
226:
227: int streambuf::sputbackc(char c)
228: {
229: return _IO_sputbackc(this, c);
230: }
231:
232: int streambuf::sungetc()
233: {
234: return _IO_sungetc(this);
235: }
236:
237: #if 0 /* Work in progress */
238: void streambuf::collumn(int c)
239: {
240: if (c == -1)
241: _collumn = -1;
242: else
243: _collumn = c - (_IO_write_ptr - _IO_write_base);
244: }
245: #endif
246:
247:
248: int streambuf::get_column()
249: {
250: if (_cur_column)
251: return _IO_adjust_column(_cur_column - 1, pbase(), pptr() - pbase());
252: return -1;
253: }
254:
255: int streambuf::set_column(int i)
256: {
257: _cur_column = i+1;
258: return 0;
259: }
260:
261: int streambuf::flush_all() { return _IO_flush_all (); }
262:
263: void streambuf::flush_all_linebuffered()
264: { _IO_flush_all_linebuffered(); }
265:
266: int streambuf::sys_stat(void *)
267: {
268: #ifdef EIO
269: errno = EIO;
270: #endif
271: return -1;
272: }
273:
274: streamsize streambuf::sys_read(char* buf, streamsize size)
275: {
276: return 0;
277: }
278:
279: streamsize streambuf::sys_write(const char* buf, streamsize size)
280: {
281: return 0;
282: }
283:
284: streampos streambuf::sys_seek(streamoff, _seek_dir)
285: {
286: return EOF;
287: }
288:
289: int streambuf::sys_close() { return 0; /* Suceess; do nothing */ }
290:
291: streammarker::streammarker(streambuf *sb)
292: {
293: _IO_init_marker(this, sb);
294: }
295:
296: streammarker::~streammarker()
297: {
298: _IO_remove_marker(this);
299: }
300:
301: #define BAD_DELTA EOF
302:
303: int streammarker::delta(streammarker& other_mark)
304: {
305: return _IO_marker_difference(this, &other_mark);
306: }
307:
308: int streammarker::delta()
309: {
310: return _IO_marker_delta(this);
311: }
312:
313: int streambuf::seekmark(streammarker& mark, int delta /* = 0 */)
314: {
315: return _IO_seekmark(this, &mark, delta);
316: }
317:
318: void streambuf::unsave_markers()
319: {
320: _IO_unsave_markers(this);
321: }
322:
323: int ios::readable() { return !(rdbuf()->_flags & _IO_NO_READS); }
324: int ios::writable() { return !(rdbuf()->_flags & _IO_NO_WRITES); }
325: int ios::is_open() { return rdbuf()
326: && (rdbuf()->_flags & _IO_NO_READS+_IO_NO_WRITES)
327: != _IO_NO_READS+_IO_NO_WRITES; }
328:
329: #if defined(linux)
330: #define IO_CLEANUP
331: #endif
332:
333: #ifdef IO_CLEANUP
334: IO_CLEANUP
335: #else
336: struct __io_defs {
337: __io_defs() { }
338: ~__io_defs() { _IO_flush_all (); }
339: };
340: __io_defs io_defs__;
341: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.