|
|
1.1 root 1: /*ident "@(#)ctrans:lib/stream/stream.c 1.1.3.2" */
2: /**************************************************************************
3: Copyright (c) 1984 AT&T
4: All Rights Reserved
5:
6: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
7:
8: The copyright notice above does not evidence any
9: actual or intended publication of such source code.
10:
11: stream.c:
12:
13: *****************************************************************************/
14:
15: #include <iostream.h>
16:
17: long ios::nextbit = 1L<<16 ;
18: long ios::nextword = 0 ;
19:
20: const long ios::adjustfield = ios::left|ios::right|ios::internal ;
21: const long ios::floatfield = ios::fixed|ios::scientific ;
22: const long ios::basefield = ios::dec|ios::hex|ios::oct ;
23:
24: #define ISTREAM istream
25: #define OSTREAM ostream
26: #define IOSTREAM iostream
27:
28: union ios_user_union { long i ; void* p ; } ;
29:
30: void ios::init(streambuf* b)
31: {
32: // Must be called by other constructors. */
33: bp=b ;
34: state = 0 ;
35: ispecial = 0 ;
36: ospecial = 0 ;
37: delbuf = 0 ;
38: if (!bp ) setstate(hardfail|failbit) ;
39: flags(skipws|dec) ;
40: width(0);
41: precision(6);
42: fill(' ');
43: tie(0);
44:
45: x_user = 0 ;
46: nuser = 0 ;
47: }
48:
49: ios::ios(streambuf* b) { init(b) ; }
50:
51: ios::~ios()
52: {
53: if (bp) bp->sync() ;
54: if (delbuf) {
55: delete bp ;
56: bp = 0 ;
57: }
58: if (x_user) {
59: delete x_user ;
60: x_user = 0 ;
61: }
62: }
63:
64: iostream::iostream(streambuf* b) { init(b) ; }
65: iostream::~iostream() { }
66: istream::istream(streambuf* b) { init(b) ; }
67: istream::~istream() { }
68: ostream::ostream(streambuf* b) { init(b) ; }
69: ostream::~ostream() { }
70:
71: IOSTREAM::IOSTREAM() { }
72: ISTREAM::ISTREAM() { }
73: OSTREAM::OSTREAM() { }
74:
75: ostream& OSTREAM::flush()
76: {
77: if ( bp->out_waiting() ) bp->overflow() ;
78: else if ( bp->in_avail() ) bp->sync() ;
79:
80: return *this ;
81: }
82:
83: streampos OSTREAM::tellp()
84: {
85: return bp->seekoff(0,cur,out) ;
86: }
87:
88: streampos ISTREAM::tellg()
89: {
90: return bp->seekoff(0,cur,in) ;
91: }
92:
93: ostream& OSTREAM::seekp(streampos p)
94: {
95: if ( bp->seekpos(p,out) == EOF ) setstate(badbit) ;
96: return *this ;
97: }
98:
99: typedef seek_dir Sdir ; /** Gets around a bug in release 2.0 beta 5 **/
100:
101: ostream& OSTREAM::seekp(streamoff o, Sdir d)
102: {
103: if ( bp->seekoff(o,d,out) == EOF ) setstate(badbit) ;
104: return *this ;
105: }
106:
107: istream& ISTREAM::seekg(streampos p)
108: {
109: if ( bp->seekpos(p,in) == EOF ) setstate(badbit) ;
110: return *this ;
111: }
112:
113: istream& ISTREAM::seekg(streamoff o, Sdir d)
114: {
115: if ( bp->seekoff(o,d,in) == EOF ) setstate(badbit) ;
116: return *this ;
117: }
118:
119: ostream* ios::tie(ostream* s)
120: {
121: ostream* t = x_tie ;
122: x_tie = s ;
123:
124: if ( s ) {
125: ispecial |= tied ;
126: ospecial |= tied ;
127: }
128: else {
129: ispecial &= ~tied ;
130: ospecial &= ~tied ;
131: }
132: return t ;
133: }
134:
135: char ios::fill(char c)
136: {
137: char oldf = x_fill ;
138: x_fill = c ;
139: return oldf ;
140: }
141:
142: int ios::precision(int p)
143: {
144: register int oldp = x_precision ;
145: x_precision = p;
146: return oldp ;
147: }
148:
149: long ios::setf(long b, long f)
150: {
151: long oldf = x_flags ;
152: x_flags = (b&f) | (x_flags&~f) ;
153:
154: if (x_flags&skipws ) ispecial |= skipping ;
155: else ispecial &= ~skipping ;
156:
157: return oldf ;
158: }
159:
160: long ios::setf(long b)
161: {
162: long oldf = x_flags ;
163: x_flags |= b ;
164: if ( b & skipws ) ispecial |= skipping ;
165: return oldf ;
166: }
167:
168: long ios::unsetf(long b)
169: {
170: long oldf = x_flags ;
171: x_flags &= ~b ;
172: if ( b & skipws ) ispecial &= ~skipping ;
173: return oldf ;
174: }
175:
176: long ios::flags(long f)
177: {
178: long oldf = x_flags ;
179: x_flags = f ;
180:
181: if (x_flags&skipws ) ispecial |= skipping ;
182: else ispecial &= ~skipping ;
183:
184: return oldf ;
185: }
186:
187: int ISTREAM::do_ipfx(int noskipws)
188: {
189: if ( state&hardfail) return 0 ;
190: // note that we flush tied stream even when !this->good().
191: if ( x_tie && x_tie->rdbuf()->out_waiting()
192: && (noskipws==0 || rdbuf()->in_avail()<noskipws) ){
193: x_tie->flush() ;
194: }
195: if ( good() && !noskipws && (ispecial&skipping) ) eatwhite() ;
196: if ( eof() ) {
197: // if we were only skipping this wouldn't be a failure.
198: // but the presumption is that this is a prefix operation
199: // prior to inputting something else.
200: setstate(ios::failbit) ;
201: return 0 ;
202: }
203: return good() ;
204: }
205:
206: int OSTREAM::do_opfx()
207: {
208: if ( state&hardfail) return 0 ;
209: if ( x_tie && x_tie->rdbuf()->out_waiting()) {
210: x_tie->flush() ;
211: }
212: return good() ;
213: }
214:
215: void ios::operator=(ios& rhs) { bp = rhs.bp ; }
216:
217: ios::ios() { assign_private = state ; state = hardfail ; }
218:
219: istream_withassign::istream_withassign()
220: {
221: // In order for the standard streams to be properly initialized
222: // it is essential that nothing is done by the combination
223: // of this constructor and ios::ios(). So we undo the effect of
224: // ios::ios()
225: state = assign_private ;
226: }
227:
228: istream_withassign::~istream_withassign() { }
229:
230: istream_withassign& istream_withassign::operator=(istream& s)
231: {
232: init(s.rdbuf()) ;
233: return *this ;
234: }
235:
236: ostream_withassign::~ostream_withassign() { }
237:
238: istream_withassign& istream_withassign::operator=(streambuf* sb)
239: {
240: init(sb) ;
241: return *this ;
242: }
243:
244: ostream_withassign::ostream_withassign()
245: {
246: // In order for the standard streams to be properly initialized
247: // it is essential that nothing is done by the combination
248: // of this constructor and ios::ios(). So we undo the effect of
249: // ios::ios()
250: state = assign_private ;
251: }
252:
253: ostream_withassign& ostream_withassign::operator=(ostream& s)
254: {
255: init(s.rdbuf()) ;
256: return *this ;
257: }
258:
259: ostream_withassign& ostream_withassign::operator=(streambuf* sb)
260: {
261: init(sb) ;
262: return *this ;
263: }
264:
265: iostream_withassign::iostream_withassign()
266: {
267: // In order for the standard streams to be properly initialized
268: // it is essential that nothing is done by the combination
269: // of this constructor and ios::ios(). So we undo the effect of
270: // ios::ios()
271: state = assign_private ;
272: }
273:
274: iostream_withassign::~iostream_withassign() { }
275:
276:
277: iostream_withassign& iostream_withassign::operator=(ios& s)
278: {
279: init(s.rdbuf()) ;
280: return *this ;
281: }
282:
283: iostream_withassign& iostream_withassign::operator=(streambuf* sb)
284: {
285: init(sb) ;
286: return *this ;
287: }
288:
289: void ios::uresize(int n)
290: {
291: if ( n < nuser ) return ;
292: ios_user_union* newu = new ios_user_union[n+1] ;
293: for ( int x = 0 ; x < nuser ; ++x ) {
294: newu[x] = x_user[x] ;
295: } ;
296: delete [nuser] x_user ;
297: nuser = n+1 ;
298: x_user = newu ;
299: }
300:
301: long & ios::iword(int x)
302: {
303: if ( x < 0 ) x = 0 ;
304: if ( x >= nuser ) uresize(x) ;
305: return x_user[x].i ;
306: }
307:
308: void* & ios::pword(int x)
309: {
310: if ( x < 0 ) x = 0 ;
311: if ( x >= nuser ) uresize(x) ;
312: return x_user[x].p ;
313: }
314:
315:
316: long ios::bitalloc()
317: {
318: long w = nextbit ;
319: nextbit = nextbit << 1 ;
320: return w ;
321: }
322:
323: long ios::xalloc()
324: {
325: return nextword++ ;
326: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.