|
|
1.1 root 1: /*
2: C++ stream i/o source
3:
4: in.c
5: */
6: #include <ctype.h>
7: #include "stream.h"
8: #include <common.h>
9:
10: filebuf cin_file(stdin); // UNIX input stream 0
11: istream cin(&cin_file,1,&cout); // cin tied to cout
12:
13: /* predefined whitespace */
14: whitespace WS;
15:
16: /*inline */void eatwhite (istream& is)
17: {
18: if (is.tied_to) is.tied_to->flush();
19: register streambuf *nbp = is.bp;
20: register char c = nbp->sgetc();
21: while (isspace(c)) c = nbp->snextc();
22: if (c == EOF) is.state |= _eof;
23: }
24:
25: istream& istream::operator>>(whitespace&)
26: {
27: register streambuf *nbp = bp;
28:
29: if (state) return *this;
30: if (tied_to) tied_to->flush();
31: register c = nbp->sgetc();
32: while (isspace(c)) c = nbp->snextc();
33: if (c == EOF) state |= _eof;
34: return *this;
35: }
36:
37: istream& istream::operator>>(register char& s)
38: /*
39: reads characters NOT very small integers
40: */
41: {
42: if (skipws)
43: eatwhite(*this);
44: else if (tied_to)
45: tied_to->flush();
46:
47: if (state) {
48: state |= _fail;
49: return *this;
50: }
51:
52: register c = bp->sgetc();
53: if (c == EOF) {
54: state |= _fail|_eof;
55: } else {
56: s = c;
57: bp->stossc();
58: }
59:
60: return *this;
61: }
62:
63: istream& istream::operator>>(register char* s)
64: {
65: register streambuf *nbp = bp;
66:
67:
68: if (skipws)
69: eatwhite(*this);
70: else if (tied_to)
71: tied_to->flush();
72:
73:
74: if (state) {
75: state |= _fail;
76: return *this;
77: }
78:
79: /* get string */
80: register c = nbp->sgetc();
81: if (c == EOF) state |= _fail;
82: while (!isspace(c) && c != EOF) {
83: *s++ = c;
84: c = nbp->snextc();
85: }
86: *s = '\0';
87:
88: if (c == EOF) state |= _eof;
89:
90: return *this;
91: }
92:
93: istream& istream::operator>>(long& i)
94: {
95: register c;
96: register ii = 0;
97: register streambuf *nbp = bp;
98: int neg = 0;
99:
100: if (skipws)
101: eatwhite(*this);
102: else if (tied_to)
103: tied_to->flush();
104:
105:
106: if (state) {
107: state |= _fail;
108: return *this;
109: }
110:
111: switch (c = nbp->sgetc()) {
112: case '-':
113: case '+':
114: neg = c;
115: c = nbp->snextc();
116: break;
117: case EOF:
118: state |= _fail;
119: }
120:
121: if (isdigit(c)) {
122: do {
123: ii = ii*10+c-'0';
124: } while (isdigit(c=nbp->snextc()));
125: i = (neg=='-') ? -ii : ii;
126: } else
127: state |= _fail;
128:
129: if (c == EOF) state |= _eof;
130: return *this;
131: }
132:
133: istream& istream::operator>>(int& i)
134: {
135: long l;
136:
137:
138: if (skipws)
139: eatwhite(*this);
140: else if (tied_to)
141: tied_to->flush();
142:
143: if (state) {
144: state |= _fail;
145: return *this;
146: }
147:
148: if ( *this>>l ) {
149: i = l;
150: }
151: return *this;
152: }
153:
154: istream& istream::operator>>(short& i)
155: {
156: long l;
157:
158: if (skipws)
159: eatwhite(*this);
160: else if (tied_to)
161: tied_to->flush();
162:
163:
164: if (state) {
165: state |= _fail;
166: return *this;
167: }
168:
169: if ( *this>>l ) {
170: i = l;
171: }
172: return *this;
173: }
174:
175: istream& istream::operator>>(double& d)
176: /*
177: {+|-} d* {.} d* { e|E {+|-} d+ }
178: except that
179: - a dot must be pre- or succeded by at least one digit
180: - an exponent must be preseded by at least one digit
181: */
182: {
183: register c = 0;
184: char buf[256];
185: register char* p = buf;
186: register streambuf* nbp = bp;
187:
188: if (skipws)
189: eatwhite(*this);
190: else if (tied_to)
191: tied_to->flush();
192:
193: if (state) {
194: state |= _fail;
195: return *this;
196: }
197:
198: /* get the sign */
199: switch (c = nbp->sgetc()) {
200: case EOF:
201: state = _eof|_fail;
202: return *this;
203: case '-':
204: case '+':
205: *p++ = c;
206: c = bp->snextc();
207: }
208:
209: /* get integral part */
210: while (isdigit(c)) {
211: *p++ = c;
212: c = bp->snextc();
213: }
214:
215: /* get fraction */
216: if (c == '.') {
217: do {
218: *p++ = c;
219: c = bp->snextc();
220: } while (isdigit(c));
221: }
222:
223: /* get exponent */
224: if (c == 'e' || c == 'E') {
225: *p++ = c;
226: switch (c = nbp->snextc()) {
227: case EOF:
228: state = _eof|_fail;
229: return *this;
230: case '-':
231: case '+':
232: *p++ = c;
233: c = bp->snextc();
234: }
235: while (isdigit(c)) {
236: *p++ = c;
237: c = bp->snextc();
238: }
239: }
240:
241: *p = 0;
242: d = atof(buf);
243:
244: if (c == EOF) state |= _eof;
245: return *this;
246: }
247:
248: istream& istream::operator>>(float& f)
249: {
250: double d;
251:
252:
253: if (skipws)
254: eatwhite(*this);
255: else if (tied_to)
256: tied_to->flush();
257:
258: if (state) {
259: state |= _fail;
260: return *this;
261: }
262:
263: if ( *this>>d ) {
264: f = d;
265: }
266: return *this;
267: }
268:
269: istream& istream::get(
270: register char* s, /* character array to read into */
271: register int len, /* size of character array */
272: register char term /* character that terminates input */
273: ) {
274: register c;
275: register streambuf *nbp = bp;
276:
277: if (tied_to) tied_to->flush();
278:
279: if (state) {
280: state |= _fail;
281: return *this;
282: }
283:
284: if ((c = bp->sgetc()) == EOF) {
285: state |= _fail | _eof;
286: return *this;
287: }
288:
289: while (c != term && c != EOF && len > 1) {
290: *s++ = c;
291: c = nbp->snextc();
292: len--;
293: }
294: *s = '\0';
295: if (c == EOF) state |= _eof;
296: return *this;
297: }
298:
299: istream& istream::putback(register char c)
300: {
301: bp->sputbackc(c);
302: return *this;
303: }
304:
305:
306: istream& istream::get(
307: register streambuf &s, /* streambuf to input to */
308: register char term /* termination character */
309: ){
310: register c;
311: register streambuf *nbp = bp;
312:
313: if (tied_to) tied_to->flush();
314:
315: if (state) {
316: state |= _fail;
317: return *this;
318: }
319:
320: if ((c = bp->sgetc()) == EOF) {
321: state |= _fail | _eof;
322: return *this;
323: }
324:
325: while (c != term && c != EOF) {
326: if (s.sputc(c) == EOF) break;
327: c = nbp->snextc();
328: }
329: if (c == EOF) state |= _eof;
330: return *this;
331: }
332:
333: istream& istream::operator>>(register streambuf &s) {
334: register c;
335: register streambuf *nbp = bp;
336:
337: if (tied_to) tied_to->flush();
338:
339: if (state) {
340: state |= _fail;
341: return *this;
342: }
343:
344: if ((c = bp->sgetc()) == EOF) {
345: state |= _fail | _eof;
346: return *this;
347: }
348:
349: while (c != EOF) {
350: if (s.sputc(c) == EOF) break;
351: c = nbp->snextc();
352: }
353: if (c == EOF) state |= _eof;
354: return *this;
355: }
356:
357: istream& istream::operator>>(common& p)
358: {
359: if (skipws)
360: eatwhite(*this);
361: else if (tied_to)
362: tied_to->flush();
363:
364: return p.read(*this);
365: }
366:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.