|
|
1.1 ! root 1: /*ident "@(#)ctrans:lib/stream/oldformat.c 1.1.4.1" */ ! 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: oldformat.c: ! 12: file for obsolete stream stuff that isn't part of the ! 13: official iostream package. ! 14: *****************************************************************************/ ! 15: ! 16: #include <stream.h> ! 17: #include "streamdefs.h" ! 18: #include <string.h> ! 19: #include <strstream.h> ! 20: #include <fstream.h> ! 21: #include <libc.h> ! 22: ! 23: #ifdef VSPRINTF ! 24: # include <stdarg.h> ! 25: #endif ! 26: ! 27: static const int cb_size = 1024 ; ! 28: static const int fld_size = 256 ; ! 29: ! 30: /* a circular formating buffer */ ! 31: static char formbuf[cb_size]; // some slob for form overflow ! 32: static char* bfree=formbuf; ! 33: static char* max = &formbuf[cb_size-1]; ! 34: ! 35: char* chr(register i, register int w) /* note: chr(0) is "" */ ! 36: { ! 37: register char* buf = bfree; ! 38: ! 39: if (w<=0 || fld_size<w) w = 1; ! 40: w++; /* space for trailing 0 */ ! 41: if (max < buf+w) buf = formbuf; ! 42: bfree = buf+w; ! 43: char * res = buf; ! 44: ! 45: w -= 2; /* pad */ ! 46: while (w--) *buf++ = ' '; ! 47: if (i<0 || 127<i) i = ' '; ! 48: *buf++ = i; ! 49: *buf = 0; ! 50: return res; ! 51: } ! 52: ! 53: char* str(const char* s, register int w) ! 54: { ! 55: register char* buf = bfree; ! 56: int ll = strlen(s); ! 57: if (w<=0 || fld_size<w) w = ll; ! 58: if (w < ll) ll = w; ! 59: w++; /* space for traling 0 */ ! 60: if (max < buf+w) buf = formbuf; ! 61: bfree = buf+w; ! 62: char* res = buf; ! 63: ! 64: w -= (ll+1); /* pad */ ! 65: while (w--) *buf++ = ' '; ! 66: while (*s) *buf++ = *s++; ! 67: *buf = 0; ! 68: return res; ! 69: } ! 70: ! 71: char* form(const char* format ...) ! 72: { ! 73: register char* buf = bfree; ! 74: if (max < buf+fld_size) buf = formbuf; ! 75: ! 76: # ifdef VSPRINTF ! 77: va_list args ; ! 78: va_start(args,format) ; ! 79: VSPRINTF(buf,format,args) ; ! 80: va_end(args) ; ! 81: # else ! 82: // not very portable ! 83: register* ap = (int*)((char*)&format+sizeof(char*)); ! 84: sprintf(buf,format,ap[0],ap[1],ap[2],ap[3],ap[4],ap[5],ap[6],ap[7],ap[8],ap[9]); ! 85: # endif ! 86: ! 87: register ll = strlen(buf); // not all sprintf's return length ! 88: if (0<ll && ll<cb_size) // length ! 89: ; ! 90: else if (buf<(char*)ll && (char*)ll<buf+cb_size)// pointer to trailing 0 ! 91: ll = (char*)ll - buf; ! 92: else ! 93: ll = strlen(buf); ! 94: ! 95: // If we have scribbled beyond the end of the buffer then ! 96: // who knows what data we've destroyed. Better to abort here ! 97: // here there is some chance that somebody can associate ! 98: // the location with the error than to continue and die ! 99: // a mysterious death later. ! 100: if (fld_size < ll) abort(); ! 101: ! 102: bfree = buf+ll+1; ! 103: return buf; ! 104: } ! 105: ! 106: const char a10 = 'a'-10; ! 107: ! 108: char* hex(long ii, register w) ! 109: { ! 110: int m = sizeof(long)*2; // maximum hex digits for a long ! 111: if (w<0 || fld_size<w) w = 0; ! 112: int sz = (w?w:m)+1; ! 113: register char* buf = bfree; ! 114: if (max < buf+sz) buf = formbuf; ! 115: register char* p = buf+sz; ! 116: bfree = p+1; ! 117: *p-- = 0; // trailing 0 ! 118: register unsigned long i = ii; ! 119: ! 120: if (w) { ! 121: do { ! 122: register h = (int)(i&0xf); ! 123: *p-- = (h < 10) ? h+'0' : h+a10; ! 124: } while (--w && (i>>=4)); ! 125: while (0<w--) *p-- = ' '; ! 126: } ! 127: else { ! 128: do { ! 129: register h = (int)(i&0xf); ! 130: *p-- = (h < 10) ? h+'0' : h+a10; ! 131: } while (i>>=4); ! 132: } ! 133: return p+1; ! 134: } ! 135: ! 136: char* oct(long ii, int w) ! 137: { ! 138: int m = sizeof(long)*3; // maximum oct digits for a long ! 139: if (w<0 || fld_size<w) w = 0; ! 140: int sz = (w?w:m)+1; ! 141: register char* buf = bfree; ! 142: if (max < buf+sz) buf = formbuf; ! 143: register char* p = buf+sz; ! 144: bfree = p+1; ! 145: *p-- = 0; // trailing 0 ! 146: register unsigned long i = ii; ! 147: ! 148: if (w) { ! 149: do { ! 150: register h = (int)(i&07); ! 151: *p-- = h + '0'; ! 152: } while (--w && (i>>=3)); ! 153: while (0<w--) *p-- = ' '; ! 154: } ! 155: else { ! 156: do { ! 157: register h = (int)(i&07); ! 158: *p-- = h+'0'; ! 159: } while (i>>=3); ! 160: } ! 161: ! 162: return p+1; ! 163: } ! 164: ! 165: char* dec(long i, int w) ! 166: { ! 167: int sign = 0; ! 168: if (i < 0) { ! 169: sign = 1; ! 170: i = -i; ! 171: } ! 172: int m = sizeof(long)*3; /* maximum dec digits for a long */ ! 173: if (w<0 || fld_size<w) w = 0; ! 174: int sz = (w?w:m)+1; ! 175: register char* buf = bfree; ! 176: if (max < buf+sz) buf = formbuf; ! 177: register char* p = buf+sz; ! 178: bfree = p+1; ! 179: *p-- = 0; /* trailing 0 */ ! 180: ! 181: if (w) { ! 182: do { ! 183: register h = (int)(i%10); ! 184: *p-- = h + '0'; ! 185: } while (--w && (i/=10)); ! 186: if (sign && 0<w) { ! 187: w--; ! 188: *p-- = '-'; ! 189: } ! 190: while (0<w--) *p-- = ' '; ! 191: } ! 192: else { ! 193: do { ! 194: register h = (int)(i%10); ! 195: *p-- = h + '0'; ! 196: } while (i/=10); ! 197: if (sign) *p-- = '-'; ! 198: } ! 199: ! 200: return p+1; ! 201: } ! 202: ! 203: istream& WS(istream& i) { return i >> ws ; } ! 204: ! 205: void eatwhite(istream& i) { i >> ws ; } ! 206: ! 207: istream::istream(streambuf* b, int sk, ostream* t) ! 208: { ! 209: init(b) ; ! 210: skip(sk) ; ! 211: tie(t) ; ! 212: } ! 213: ! 214: istream::istream(int len, char* b, int sk) ! 215: { ! 216: init( new streambuf(b,len,-len) ) ; ! 217: delbuf = 1 ; ! 218: skip(sk) ; ! 219: } ! 220: ! 221: istream::istream(int fd, int sk, ostream* t) ! 222: { ! 223: init( new filebuf(fd) ) ; ! 224: delbuf = 1 ; ! 225: skip(sk) ; ! 226: tie(t) ; ! 227: } ! 228: ! 229: ostream::ostream(int fd) ! 230: { ! 231: init( new filebuf(fd) ) ; ! 232: delbuf = 1 ; ! 233: } ! 234: ! 235: ostream::ostream(int len, char* b) ! 236: { ! 237: init( new streambuf(b,len,0) ) ; ! 238: delbuf = 1 ; ! 239: } ! 240: ! 241: streambuf::streambuf(char* p, int l, int c ) : ! 242: x_unbuf(0), alloc(0) ! 243: { ! 244: setb(0,0,0); ! 245: setbuf(p,l,c) ; ! 246: } ! 247: ! 248: streambuf* streambuf::setbuf(char* p, int len, int count) ! 249: { ! 250: // Three argument setbuf for compatibility with old ! 251: // stream package. ! 252: if ( x_base ) return 0 ; ! 253: if ( len <= 0 || p == 0 ) { ! 254: // make it unbuffered ! 255: setb(0,0,0) ; ! 256: setg(0,0,0) ; ! 257: setp(0,0); ! 258: unbuffered(1) ; ! 259: } else if ( count >= 0 ) { ! 260: setb(p,p+len,0) ; ! 261: setg(p,p,p+count) ; ! 262: setp(p+count,p+len) ; ! 263: unbuffered(0) ; ! 264: } else { // count < 0 ! 265: // Special case, ! 266: // Used by iostream::iostream(char*,int) ! 267: // For backwards compatibility with old streams ! 268: setb(p,p+len,0) ; ! 269: setg(p,p,p-count) ; ! 270: setp(p,p+len) ; ! 271: unbuffered(0) ; ! 272: } ! 273: return this; ! 274: } ! 275: ! 276: int ios::skip(int sk) ! 277: { ! 278: long f ; ! 279: if ( sk ) f = setf(skipws,skipws) ; ! 280: else f = setf(0,skipws) ; ! 281: ! 282: return (f&skipws) != 0 ; ! 283: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.