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