|
|
1.1 ! root 1: /*** ! 2: *ios.h - definitions/declarations for the ios class. ! 3: * ! 4: * Copyright (c) 1990-1992, Microsoft Corporation. All rights reserved. ! 5: * ! 6: *Purpose: ! 7: * This file defines the classes, values, macros, and functions ! 8: * used by the ios class. ! 9: * [AT&T C++] ! 10: * ! 11: ****/ ! 12: ! 13: #ifndef _INC_IOS ! 14: #define _INC_IOS ! 15: ! 16: ! 17: #ifdef _MT ! 18: #include <oscalls.h> // critical section declarations ! 19: void _mtlockinit(PRTL_CRITICAL_SECTION); ! 20: void _mtlock(PRTL_CRITICAL_SECTION); ! 21: void _mtunlock(PRTL_CRITICAL_SECTION); ! 22: #endif ! 23: ! 24: #ifndef NULL ! 25: #define NULL 0 ! 26: #endif ! 27: ! 28: #ifndef EOF ! 29: #define EOF (-1) ! 30: #endif ! 31: ! 32: // Force word packing to avoid possible -Zp override ! 33: #pragma pack(4) ! 34: ! 35: #pragma warning(disable:4505) // disable unwanted /W4 warning ! 36: // #pragma warning(default:4505) // use this to reenable, if necessary ! 37: ! 38: class streambuf; ! 39: class ostream; ! 40: ! 41: class ios { ! 42: ! 43: public: ! 44: enum io_state { goodbit = 0x00, ! 45: eofbit = 0x01, ! 46: failbit = 0x02, ! 47: badbit = 0x04 }; ! 48: ! 49: enum open_mode { in = 0x01, ! 50: out = 0x02, ! 51: ate = 0x04, ! 52: app = 0x08, ! 53: trunc = 0x10, ! 54: nocreate = 0x20, ! 55: noreplace = 0x40, ! 56: binary = 0x80 }; // CONSIDER: not in latest spec. ! 57: ! 58: enum seek_dir { beg=0, cur=1, end=2 }; ! 59: ! 60: enum { skipws = 0x0001, ! 61: left = 0x0002, ! 62: right = 0x0004, ! 63: internal = 0x0008, ! 64: dec = 0x0010, ! 65: oct = 0x0020, ! 66: hex = 0x0040, ! 67: showbase = 0x0080, ! 68: showpoint = 0x0100, ! 69: uppercase = 0x0200, ! 70: showpos = 0x0400, ! 71: scientific = 0x0800, ! 72: fixed = 0x1000, ! 73: unitbuf = 0x2000, ! 74: stdio = 0x4000 ! 75: }; ! 76: ! 77: static const long basefield; // dec | oct | hex ! 78: static const long adjustfield; // left | right | internal ! 79: static const long floatfield; // scientific | fixed ! 80: ! 81: ios(streambuf*); // differs from ANSI ! 82: virtual ~ios(); ! 83: ! 84: inline long flags() const; ! 85: inline long flags(long _l); ! 86: ! 87: inline long setf(long _f,long _m); ! 88: inline long setf(long _l); ! 89: inline long unsetf(long _l); ! 90: ! 91: inline int width() const; ! 92: inline int width(int _i); ! 93: ! 94: inline ostream* tie(ostream* _os); ! 95: inline ostream* tie() const; ! 96: ! 97: inline char fill() const; ! 98: inline char fill(char _c); ! 99: ! 100: inline int precision(int _i); ! 101: inline int precision() const; ! 102: ! 103: inline int rdstate() const; ! 104: inline void clear(int _i = 0); ! 105: ! 106: // inline operator void*() const; ! 107: operator void *() const { if(state&(badbit|failbit) ) return 0; return (void *)this; } ! 108: inline int operator!() const; ! 109: ! 110: inline int good() const; ! 111: inline int eof() const; ! 112: inline int fail() const; ! 113: inline int bad() const; ! 114: ! 115: inline streambuf* rdbuf() const; ! 116: ! 117: inline long & iword(int) const; ! 118: inline void * & pword(int) const; ! 119: ! 120: static long bitalloc(); ! 121: static int xalloc(); ! 122: static void sync_with_stdio(); ! 123: ! 124: #ifdef _MT ! 125: inline void setlock(); ! 126: inline void clrlock(); ! 127: void lock() { if (LockFlg<0) _mtlock(lockptr()); }; ! 128: void unlock() { if (LockFlg<0) _mtunlock(lockptr()); } ! 129: inline void lockbuf(); ! 130: inline void unlockbuf(); ! 131: #else ! 132: void lock() { } ! 133: void unlock() { } ! 134: void lockbuf() { } ! 135: void unlockbuf() { } ! 136: #endif ! 137: ! 138: protected: ! 139: ios(); ! 140: ios(const ios&); // treat as private ! 141: ios& operator=(const ios&); ! 142: void init(streambuf*); ! 143: ! 144: enum { skipping, tied }; ! 145: streambuf* bp; ! 146: ! 147: int state; ! 148: int ispecial; // not used ! 149: int ospecial; // not used ! 150: int isfx_special; // not used ! 151: int osfx_special; // not used ! 152: int x_delbuf; // if set, rdbuf() deleted by ~ios ! 153: ! 154: ostream* x_tie; ! 155: long x_flags; ! 156: int x_precision; ! 157: char x_fill; ! 158: int x_width; ! 159: ! 160: static void (*stdioflush)(); // not used ! 161: ! 162: #ifdef _MT ! 163: static void lockc() { _mtlock(& x_lockc); } ! 164: static void unlockc() { _mtunlock( & x_lockc); } ! 165: PRTL_CRITICAL_SECTION lockptr() { return & x_lock; } ! 166: #else ! 167: static void lockc() { } ! 168: static void unlockc() { } ! 169: #endif ! 170: ! 171: public: ! 172: int delbuf() const { return x_delbuf; } ! 173: void delbuf(int _i) { x_delbuf = _i; } ! 174: ! 175: private: ! 176: static long x_maxbit; ! 177: static int x_curindex; ! 178: // consider: make interal static to ios::sync_with_stdio() ! 179: static int sunk_with_stdio; // make sure sync_with done only once ! 180: #ifdef _MT ! 181: #define MAXINDEX 7 ! 182: static long x_statebuf[MAXINDEX+1]; // used by xalloc() ! 183: static int fLockcInit; // used to see if x_lockc initialized ! 184: static RTL_CRITICAL_SECTION x_lockc; // used to lock static (class) data members ! 185: // consider: make pointer and allocate elsewhere ! 186: int LockFlg; // enable locking flag ! 187: RTL_CRITICAL_SECTION x_lock; // used for multi-thread lock on object ! 188: #else ! 189: static long * x_statebuf; // used by xalloc() ! 190: #endif ! 191: }; ! 192: ! 193: #include <streamb.h> ! 194: ! 195: inline ios& dec(ios& _strm) { _strm.setf(ios::dec,ios::basefield); return _strm; } ! 196: inline ios& hex(ios& _strm) { _strm.setf(ios::hex,ios::basefield); return _strm; } ! 197: inline ios& oct(ios& _strm) { _strm.setf(ios::oct,ios::basefield); return _strm; } ! 198: ! 199: inline long ios::flags() const { return x_flags; } ! 200: inline long ios::flags(long _l){ long _lO; _lO = x_flags; x_flags = _l; return _lO; } ! 201: ! 202: inline long ios::setf(long _l,long _m){ long _lO; lock(); _lO = x_flags; x_flags = (_l&_m) | (x_flags&(~_m)); unlock(); return _lO; } ! 203: inline long ios::setf(long _l){ long _lO; lock(); _lO = x_flags; x_flags |= _l; unlock(); return _lO; } ! 204: inline long ios::unsetf(long _l){ long _lO; lock(); _lO = x_flags; x_flags &= (~_l); unlock(); return _lO; } ! 205: ! 206: inline int ios::width() const { return x_width; } ! 207: inline int ios::width(int _i){ int _iO; _iO = (int)x_width; x_width = _i; return _iO; } ! 208: ! 209: inline ostream* ios::tie(ostream* _os){ ostream* _osO; _osO = x_tie; x_tie = _os; return _osO; } ! 210: inline ostream* ios::tie() const { return x_tie; } ! 211: inline char ios::fill() const { return x_fill; } ! 212: inline char ios::fill(char _c){ char _cO; _cO = x_fill; x_fill = _c; return _cO; } ! 213: inline int ios::precision(int _i){ int _iO; _iO = (int)x_precision; x_precision = _i; return _iO; } ! 214: inline int ios::precision() const { return x_precision; } ! 215: ! 216: inline int ios::rdstate() const { return state; } ! 217: ! 218: // inline ios::operator void *() const { if(state&(badbit|failbit) ) return 0; return (void *)this; } ! 219: inline int ios::operator!() const { return state&(badbit|failbit); } ! 220: ! 221: inline int ios::bad() const { return state & badbit; } ! 222: // consider: are locks needed on clear() ? ! 223: inline void ios::clear(int _i){ lock(); state = _i; unlock(); } ! 224: inline int ios::eof() const { return state & eofbit; } ! 225: inline int ios::fail() const { return state & (badbit | failbit); } ! 226: inline int ios::good() const { return state == 0; } ! 227: ! 228: inline streambuf* ios::rdbuf() const { return bp; } ! 229: ! 230: inline long & ios::iword(int _i) const { return x_statebuf[_i] ; } ! 231: inline void * & ios::pword(int _i) const { return (void * &)x_statebuf[_i]; } ! 232: ! 233: #ifdef _MT ! 234: inline void ios::setlock() { LockFlg--; if (bp) bp->setlock(); } ! 235: inline void ios::clrlock() { if (LockFlg <= 0) LockFlg++; if (bp) bp->clrlock(); } ! 236: inline void ios::lockbuf() { bp->lock(); } ! 237: inline void ios::unlockbuf() { bp->unlock(); } ! 238: #endif ! 239: ! 240: // Restore default packing ! 241: #pragma pack() ! 242: ! 243: #endif // !_INC_IOS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.