|
|
1.1 root 1: /*
2: C++ stream i/o source
3:
4: out.c
5: */
6: sprintf(char*,char* ...);
7: strlen(char*);
8: #include "stream.h"
9: #include <common.h>
10:
11:
12: #define MAXOSTREAMS 20
13:
14: char cout_buf[BUFSIZE];
15: filebuf cout_file(1,cout_buf,BUFSIZE); // UNIX output stream 1
16: ostream cout(&cout_file);
17:
18: char cerr_buf[1];
19: filebuf cerr_file(2,cerr_buf,0); // UNIX output stream 2
20: // 0-length to ensure unbuffered output
21: ostream cerr(&cerr_file);
22:
23: const cb_size = 512;
24: const fld_size = 128;
25:
26: /* a circular formating buffer */
27: static char formbuf[cb_size];
28: static char* bfree=formbuf;
29: static char* max = &formbuf[cb_size-1];
30:
31: char* chr(register i, register int w) /* note: chr(0) is "" */
32: {
33: register char* buf = bfree;
34:
35: if (w<=0 || fld_size<w) w = 1;
36: w++; /* space for trailing 0 */
37: if (max < buf+w) buf = formbuf;
38: bfree = buf+w;
39: char * res = buf;
40:
41: w -= 2; /* pad */
42: while (w--) *buf++ = ' ';
43: if (i<0 || 127<i) i = ' ';
44: *buf++ = i;
45: *buf = 0;
46: return res;
47: }
48:
49: char* str(char* s, register int w)
50: {
51: register char* buf = bfree;
52: int ll = strlen(s);
53: if (w<=0 || fld_size<w) w = ll;
54: if (w < ll) ll = w;
55: w++; /* space for traling 0 */
56: if (max < buf+w) buf = formbuf;
57: bfree = buf+w;
58: char* res = buf;
59:
60: w -= (ll+1); /* pad */
61: while (w--) *buf++ = ' ';
62: while (*s) *buf++ = *s++;
63: *buf = 0;
64: return res;
65: }
66:
67: char* form(char* format ...)
68: {
69: register* ap = (int*)&format;
70: register char* buf = bfree;
71: if (max < buf+fld_size) buf = formbuf;
72:
73: register ll = sprintf(buf,format,ap[1],ap[2],ap[3],ap[4],ap[5],ap[6],ap[7],ap[8]);
74: if (0<ll && ll<1024) /* length */
75: ;
76: else if (buf<(char*)ll && (char*)ll<buf+1024) /* pointer to trailing 0 */
77: ll = (char*)ll - buf;
78: else
79: ll = strlen(buf);
80: if (fld_size < ll) exit(10);
81: bfree += (ll+1);
82: return buf;
83: }
84:
85: const char a10 = 'a'-10;
86:
87: char* hex(long i, register w)
88: {
89: int m = sizeof(long)*2; /* maximum hex digits for a long */
90: if (w<0 || fld_size<w) w = 0;
91: int sz = (w?w:m)+1;
92: register char* buf = bfree;
93: if (max < buf+sz) buf = formbuf;
94: register char* p = buf+sz;
95: bfree = p+1;
96: *p-- = 0; /* trailing 0 */
97:
98: if (w) {
99: do {
100: register h = i&0xf;
101: *p-- = (h < 10) ? h+'0' : h+a10;
102: } while (w-- && (i>>=4));
103: while (w--) *p-- = ' ';
104: }
105: else {
106: do {
107: register h = i&0xf;
108: *p-- = (h < 10) ? h+'0' : h+a10;
109: } while (i>>=4);
110: }
111: return p+1;
112: }
113:
114: char* oct(long i, int w)
115: {
116: int m = sizeof(long)*3; /* maximum oct digits for a long */
117: if (w<0 || fld_size<w) w = 0;
118: int sz = (w?w:m)+1;
119: register char* buf = bfree;
120: if (max < buf+sz) buf = formbuf;
121: register char* p = buf+sz;
122: bfree = p+1;
123: *p-- = 0; /* trailing 0 */
124:
125: if (w) {
126: do {
127: register h = i&07;
128: *p-- = h+'0';
129: } while (w-- && (i>>=3));
130: while (w--) *p-- = ' ';
131: }
132: else {
133: do {
134: register h = i&07;
135: *p-- = h+'0';
136: } while (i>>=3);
137: }
138:
139: return p+1;
140: }
141:
142: char* dec(long i, int w)
143: {
144: int m = sizeof(long)*3; /* maximum dec digits for a long */
145: if (w<0 || fld_size<w) w = 0;
146: int sz = (w?w:m)+1;
147: register char* buf = bfree;
148: if (max < buf+sz) buf = formbuf;
149: register char* p = buf+sz;
150: bfree = p+1;
151: *p-- = 0; /* trailing 0 */
152:
153: if (w) {
154: do {
155: register h = i%10;
156: *p-- = h + '0';
157: } while (w-- && (i/=10));
158: while (w--) *p-- = ' ';
159: }
160: else {
161: do {
162: register h = i%10;
163: *p-- = h + '0';
164: } while (i/=10);
165: }
166:
167: return p+1;
168: }
169:
170:
171: ostream& ostream.operator<<(char* s)
172: {
173: register streambuf* nbp = bp;
174: if (state) return *this;
175: if (*s == 0) return *this;
176: do
177: if (nbp->sputc(*s++) == EOF) {
178: state |= _eof|_fail;
179: break;
180: }
181: while (*s);
182: // if (*(s-1)=='\n') flush(); /* fudge due to lack of destructors for static*/
183: return *this;
184: }
185:
186: ostream& ostream.operator<<(long i)
187: {
188: register streambuf* nbp = bp;
189: register long j;
190: char buf[32];
191: register char *p = buf;
192:
193: if (state) return *this;
194:
195: if (i < 0) {
196: nbp->sputc('-');
197: j = -i;
198: } else
199: j = i;
200: do {
201: *p++ = '0' + j%10;
202: j = j/10;
203: } while (j > 0);
204: do {
205: if (nbp->sputc(*--p) == EOF) {
206: state |= _fail | _eof;
207: break;
208: }
209: } while (p != buf);
210: return *this;
211: }
212:
213: ostream& ostream.put(char c)
214: {
215: if (state) return *this;
216:
217: if (bp->sputc(c) == EOF) state |= _eof|_fail;
218:
219: return *this;
220: }
221:
222: ostream& ostream.operator<<(double d)
223: {
224: register streambuf* nbp = bp;
225: char buf[32];
226: register char *p = buf;
227:
228: if (state) return *this;
229:
230: sprintf(buf,"%g",d);
231: while (*p != '\0')
232: if (nbp->sputc(*p++) == EOF) {
233: state |= _eof|_fail;
234: break;
235: }
236: return *this;
237: }
238:
239: ostream& ostream.operator<<(streambuf& b)
240: {
241: register streambuf* nbp = bp;
242: register int c;
243:
244: if (state) return *this;
245:
246: c = b.sgetc();
247: while (c != EOF) {
248: if (nbp->sputc(c) == EOF) {
249: state |= _eof|_fail;
250: break;
251: }
252: c = b.snextc();
253: }
254:
255: return *this;
256: }
257:
258:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.