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