|
|
1.1 root 1: /***
2: *streamb.h - definitions/declarations for the streambuf 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 streambuf class.
9: * [AT&T C++]
10: *
11: ****/
12:
13: #ifndef _INC_STREAMB
14: #define _INC_STREAMB
15:
16:
17: #include <ios.h> // need ios::seek_dir definition
18: #ifdef _MT
19: #include <oscalls.h> // required for Multi-thread declarations
20: void _mtlockinit(PRTL_CRITICAL_SECTION);
21: void _mtlock(PRTL_CRITICAL_SECTION);
22: void _mtunlock(PRTL_CRITICAL_SECTION);
23: #endif
24:
25: #ifndef NULL
26: #define NULL 0
27: #endif
28:
29: #ifndef EOF
30: #define EOF (-1)
31: #endif
32:
33: // Force word packing to avoid possible -Zp override
34: #pragma pack(4)
35:
36: #pragma warning(disable:4505) // disable unwanted /W4 warning
37: // #pragma warning(default:4505) // use this to reenable, if necessary
38:
39: typedef long streampos, streamoff;
40:
41: class ios;
42:
43: class streambuf {
44: public:
45:
46: virtual ~streambuf();
47:
48: inline int in_avail() const;
49: inline int out_waiting() const;
50: int sgetc();
51: int snextc();
52: int sbumpc();
53: void stossc();
54:
55: inline int sputbackc(char);
56:
57: inline int sputc(int);
58: inline int sputn(const char *,int);
59: inline int sgetn(char *,int);
60:
61: virtual int sync();
62:
63: // enum seek_dir { beg=0, cur=1, end=2 }; // CONSIDER: needed ???
64:
65: virtual streambuf* setbuf(char *, int);
66: virtual streampos seekoff(streamoff,ios::seek_dir,int =ios::in|ios::out);
67: virtual streampos seekpos(streampos,int =ios::in|ios::out);
68:
69: virtual int xsputn(const char *,int);
70: virtual int xsgetn(char *,int);
71:
72: virtual int overflow(int =EOF) = 0; // pure virtual function
73: virtual int underflow() = 0; // pure virtual function
74:
75: virtual int pbackfail(int);
76:
77: void dbp();
78:
79: #ifdef _MT
80: void setlock() { LockFlg--; } // <0 indicates lock required;
81: void clrlock() { if (LockFlg <= 0) LockFlg++; }
82: void lock() { if (LockFlg<0) _mtlock(lockptr()); };
83: void unlock() { if (LockFlg<0) _mtunlock(lockptr()); }
84: #else
85: void lock() { }
86: void unlock() { }
87: #endif
88:
89: protected:
90: streambuf();
91: streambuf(char *,int);
92:
93: inline char * base() const;
94: inline char * ebuf() const;
95: inline char * pbase() const;
96: inline char * pptr() const;
97: inline char * epptr() const;
98: inline char * eback() const;
99: inline char * gptr() const;
100: inline char * egptr() const;
101: inline int blen() const;
102: inline void setp(char *,char *);
103: inline void setg(char *,char *,char *);
104: inline void pbump(int);
105: inline void gbump(int);
106:
107: void setb(char *,char *,int =0);
108: inline int unbuffered() const;
109: inline void unbuffered(int);
110: int allocate();
111: virtual int doallocate();
112: #ifdef _MT
113: PRTL_CRITICAL_SECTION lockptr() { return & x_lock; }
114: #endif
115:
116: private:
117: int _fAlloc;
118: int _fUnbuf;
119: int x_lastc;
120: char * _base;
121: char * _ebuf;
122: char * _pbase;
123: char * _pptr;
124: char * _epptr;
125: char * _eback;
126: char * _gptr;
127: char * _egptr;
128: #ifdef _MT
129: int LockFlg; // <0 indicates locking required
130: RTL_CRITICAL_SECTION x_lock; // lock needed only for multi-thread operation
131: #endif
132: };
133:
134: inline int streambuf::in_avail() const { return (gptr()<_egptr) ? (_egptr-gptr()) : 0; }
135: inline int streambuf::out_waiting() const { return (_pptr>=_pbase) ? (_pptr-_pbase) : 0; }
136:
137: inline int streambuf::sputbackc(char _c){ return (_eback<gptr()) ? *(--_gptr)=_c : pbackfail(_c); }
138:
139: inline int streambuf::sputc(int _i){ return (_pptr<_epptr) ? (unsigned char)(*(_pptr++)=(char)_i) : overflow(_i); }
140:
141: inline int streambuf::sputn(const char * _str,int _n) { return xsputn(_str, _n); }
142: inline int streambuf::sgetn(char * _str,int _n) { return xsgetn(_str, _n); }
143:
144: inline char * streambuf::base() const { return _base; }
145: inline char * streambuf::ebuf() const { return _ebuf; }
146: inline int streambuf::blen() const {return ((_ebuf > _base) ? (_ebuf-_base) : 0); }
147: inline char * streambuf::pbase() const { return _pbase; }
148: inline char * streambuf::pptr() const { return _pptr; }
149: inline char * streambuf::epptr() const { return _epptr; }
150: inline char * streambuf::eback() const { return _eback; }
151: inline char * streambuf::gptr() const { return _gptr; }
152: inline char * streambuf::egptr() const { return _egptr; }
153: inline void streambuf::gbump(int n) { if (_egptr) _gptr += n; }
154: inline void streambuf::pbump(int n) { if (_epptr) _pptr += n; }
155: inline void streambuf::setg(char * eb, char * g, char * eg) {_eback=eb; _gptr=g; _egptr=eg; x_lastc=EOF; }
156: inline void streambuf::setp(char * p, char * ep) {_pptr=_pbase=p; _epptr=ep; }
157: inline int streambuf::unbuffered() const { return _fUnbuf; }
158: inline void streambuf::unbuffered(int fUnbuf) { _fUnbuf = fUnbuf; }
159:
160: // Restore default packing
161: #pragma pack()
162:
163: #endif /* !_INC_STREAMB */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.