|
|
1.1 root 1: /* This is part of libio/iostream, providing -*- C++ -*- input/output.
2: Copyright (C) 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: #ifdef __GNUG__
28: #pragma implementation
29: #endif
30:
31: #include <stdiostream.h>
32:
33: // A stdiobuf is "tied" to a FILE object (as used by the stdio package).
34: // Thus a stdiobuf is always synchronized with the corresponding FILE,
35: // though at the cost of some overhead. (If you use the implementation
36: // of stdio supplied with this library, you don't need stdiobufs.)
37: // This implementation inherits from filebuf, but implement the virtual
38: // functions sys_read/..., using the stdio functions fread/... instead
39: // of the low-level read/... system calls. This has the advantage that
40: // we get all of the nice filebuf semantics automatically, though
41: // with some overhead.
42:
43:
44: #ifndef SEEK_SET
45: #define SEEK_SET 0
46: #endif
47: #ifndef SEEK_CUR
48: #define SEEK_CUR 1
49: #endif
50: #ifndef SEEK_END
51: #define SEEK_END 2
52: #endif
53:
54: stdiobuf::stdiobuf(FILE *f) : filebuf(fileno(f))
55: {
56: _file = f;
57: // Turn off buffer in stdiobuf. Instead, rely on buffering in (FILE).
58: // Thus the stdiobuf will be synchronized with the FILE.
59: setbuf(NULL, 0);
60: }
61:
62: _IO_ssize_t stdiobuf::sys_read(char* buf, _IO_size_t size)
63: {
64: return fread(buf, 1, size, _file);
65: }
66:
67: _IO_ssize_t stdiobuf::sys_write(const void *buf, _IO_size_t n)
68: {
69: _IO_ssize_t count = fwrite(buf, 1, n, _file);
70: if (_offset >= 0)
71: _offset += n;
72: return count;
73: }
74:
75: _IO_pos_t stdiobuf::sys_seek(_IO_pos_t offset, _seek_dir dir)
76: {
77: // Normally, equivalent to: fdir=dir
78: int fdir =
79: (dir == ios::beg) ? SEEK_SET :
80: (dir == ios::cur) ? SEEK_CUR :
81: (dir == ios::end) ? SEEK_END :
82: dir;
83: return fseek(_file, offset, fdir);
84: }
85:
86: int stdiobuf::sys_close()
87: {
88: int status = fclose(_file);
89: _file = NULL;
90: return status;
91: }
92:
93: int stdiobuf::sync()
94: {
95: if (filebuf::sync() == EOF)
96: return EOF;
97: if (!(xflags() & _IO_NO_WRITES))
98: if (fflush(_file))
99: return EOF;
100: #if 0
101: // This loses when writing to a pipe.
102: if (fseek(_file, 0, SEEK_CUR) == EOF)
103: return EOF;
104: #endif
105: return 0;
106: }
107:
108: int stdiobuf::overflow(int c /* = EOF*/)
109: {
110: if (filebuf::overflow(c) == EOF)
111: return EOF;
112: if (c != EOF)
113: return c;
114: return fflush(_file);
115: }
116:
117: int stdiobuf::xsputn(const char* s, int n)
118: {
119: // The filebuf implementation of sputn loses.
120: return streambuf::xsputn(s, n);
121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.