|
|
1.1 ! root 1: . \"ident "%W%" ! 2: . \"Copyright (c) 1984 AT&T ! 3: . \"All Rights Reserved ! 4: . \"THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T ! 5: . \"The copyright notice above does not evidence any ! 6: . \"actual or intended publication of such source code. ! 7: .TH SBUF.PUB 3I+ "C++ Stream Library" " " ! 8: .SH NAME ! 9: streambuf \- public interface of character buffering class ! 10: .SH SYNOPSIS ! 11: .ft B ! 12: .ta1i 2i ! 13: .nf ! 14: #include <iostream.h> ! 15: ! 16: typedef long streamoff, streampos; ! 17: class ios { ! 18: public: ! 19: enum seek_dir { beg, cur, end }; ! 20: enum open_mode { in, out, ate, app } ; ! 21: // \fIand lots of other stuff ... \fP ! 22: } ; ! 23: ! 24: class streambuf { ! 25: public : ! 26: ! 27: int in_avail(); ! 28: int out_waiting(); ! 29: int sbumpc(); ! 30: streambuf* setbuf(char* ptr, int len, int count=0); ! 31: streampos seekpos(streampos,open_mode); ! 32: streampos seekoff(streamoff,seek_dir,open_mode); ! 33: int sgetc(); ! 34: int sgetn(char* ptr,int n); ! 35: int snextc(); ! 36: int sputbackc(char c); ! 37: int sputc(int c); ! 38: int sputn(const char* s,int n); ! 39: void stossc(); ! 40: int sync(); ! 41: } ! 42: .fi ! 43: .SH DESCRIPTION ! 44: The \f(CWstreambuf\fR ! 45: class supports buffers into which ! 46: characters can be inserted (put) or from which characters can be ! 47: fetched (gotten). Abstractly such a buffer is a sequence of ! 48: characters together with one or ! 49: two pointers (a get and/or a put pointer) ! 50: that define ! 51: the location at which characters are to be inserted or fetched. ! 52: The pointers should be thought of as pointing between characters ! 53: rather than at them. This makes it easier to understand the ! 54: boundary conditions (a pointer before the first character or after ! 55: the last). ! 56: Some of the effects of getting and putting are defined ! 57: by this class but most of the details are left to specialized ! 58: classes derived from \f(CWstreambuf\fR. ! 59: .PP ! 60: Classes derived from \f(CWstreambuf\fR vary in their ! 61: treatments of the get and put pointers. ! 62: The simplest are unidirectional buffers which permit only gets or ! 63: only puts. Such classes serve as pure sources (producers) ! 64: or sinks (consumers) of characters. ! 65: Queuelike buffers have a put and a get pointer which ! 66: move independently ! 67: of each other. In such buffers characters that are stored are held ! 68: (i.e., queued) ! 69: until they are later fetched. ! 70: Filelike buffers permit both gets and puts but ! 71: have only a single pointer. ! 72: (An alternative description is that the get ! 73: and put pointers are tied together ! 74: so that when one moves so does the other.) ! 75: .PP ! 76: Most \f(CWstreambuf\fR member functions are ! 77: organized into two phases. ! 78: As far as possible, operations are performed inline by storing into ! 79: or fetching ! 80: from arrays (the get area and the put area). ! 81: From time to time, virtual functions are called to ! 82: deal with collections of characters. ! 83: Generally the user of a \f(CWstreambuf\fR does not have to know ! 84: anything about these ! 85: details, but some the public members pass back information ! 86: about the ! 87: state of the areas. ! 88: .PP ! 89: Assume: ! 90: .br ! 91: \(em \fBi\fR, \fBn\fR, and \fBlen\fR are \f(CWint\fR. ! 92: .br ! 93: \(em \fBc\fR is an \f(CWint\fR. It always holds a "character" ! 94: value or \f(CWEOF\fR. A "character" value is always positive ! 95: even when \f(CWchar\fR is normally sign extended. ! 96: .br ! 97: \(em \fBsb\fR and \fBsb1\fR are \f(CWstreambuf*\fR. ! 98: .br ! 99: \(em \fBptr\fR is a \f(CWchar*\fR. ! 100: .br ! 101: \(em \fBoff\fR is a \f(CWstreamoff\fR. ! 102: .br ! 103: \(em \fBpos\fR is a \f(CWstreampos\fR. ! 104: .br ! 105: \(em \fBdir\fR is a \f(CWseekdir\fR. ! 106: .br ! 107: \(em \fBmode\fR is a \f(CWopen_mode\fR. ! 108: .PP ! 109: Public member functions: ! 110: .TP ! 111: \fBi=sb->in_avail()\fR ! 112: Returns the number of characters ! 113: that are immediately available in the get area for ! 114: fetching. That many characters may be fetched with ! 115: a guarantee that no errors will be reported. ! 116: .TP ! 117: \fBi=sb->out_waiting()\fR ! 118: Returns the number of characters in the put area that have not ! 119: been consumed by virtuals. ! 120: .TP ! 121: \fBc=sb->sbumpc()\fR ! 122: Moves the get pointer forward one character and returns the ! 123: character moved over. ! 124: Returns \f(CWEOF\fR if the get pointer is ! 125: currently at the end of the sequence. ! 126: .TP ! 127: \fBpos=sb->seekoff(off,dir,mode)\fR ! 128: Repositions the get and/or put pointers. ! 129: \fBmode\fR specifies whether the put pointer (\fBoutput\fR bit set) or ! 130: the get pointer (\fBinput\fR bit set) is to be modified. Both bits ! 131: may be set in which case both pointers should be affected. ! 132: \fBoff\fR is interpreted as a byte offset. (Notice that it is a ! 133: signed quantity.) ! 134: The meaning of possible values of \fBdir\fR are ! 135: .RS ! 136: .TP ! 137: \f(CWbeg\fR ! 138: The beginning of the stream. ! 139: .TP ! 140: \f(CWcur\fR ! 141: The current position. ! 142: .TP ! 143: \f(CWend\fR ! 144: The end of the stream. (End of file.) ! 145: .RE ! 146: Not all classes derived from \fBstreambuf\fR ! 147: support repositioning. \fBseek\fR will return \f(CWEOF\fR if ! 148: the class does not support repositioning. If the class does ! 149: support repositioning, \fBseek\fR will return the new ! 150: position or \f(CWEOF\fR on error. ! 151: .TP ! 152: \fBpos=sb->seekpos(pos,mode)\fR ! 153: Repositions the streambuf get and/or put pointer to \fBpos\fR. ! 154: \fBmode\fR specifies which pointers are affected as for \fBseekoff\fR. ! 155: Returns \fBpos\fR (the argument) or \f(CWEOF\fR if the class does ! 156: not support repositioning or an error occurs. ! 157: In general a \f(CWstreampos\fR should be treated as a "magic cookie" ! 158: and no arithmetic should be performed on it. ! 159: But two particular values have special meaning: ! 160: .RS ! 161: .TP ! 162: \fBstreampos(0)\fR ! 163: The beginning of the file. ! 164: .TP ! 165: \fBstreampos(EOF)\fR ! 166: Used as an error indication. ! 167: .RE ! 168: .TP ! 169: \fBc=sb->sgetc()\fR ! 170: Returns the character after the get pointer. Contrary to what most ! 171: people expect from the name ! 172: \fIIT DOES NOT MOVE THE GET POINTER\fR. Returns \f(CWEOF\fR if there is ! 173: no character available. ! 174: .TP ! 175: \fBsb1=sb->setbuf(ptr,len,i) ! 176: Offers the \fBlen\fR ! 177: bytes starting at \fBptr\fR. ! 178: as the reserve area. ! 179: If \fBptr\fR is null or \fBlen\fR is zero or less, then an unbuffered ! 180: state is requested. ! 181: Whether the offered area is used, or a request for unbuffered ! 182: state is honored depends on details of the derived class. ! 183: \fBsetbuf\fR normally returns \fBsb\fR, but if it does not ! 184: accept the offer or honor the request, it returns 0. ! 185: .TP ! 186: \fBi=sb->sgetn(ptr,n)\fR ! 187: Fetches the \fBn\fR ! 188: characters following the get pointer and copies them to the area ! 189: starting at \fBptr\fR. ! 190: When there are less than \fBn\fR characters left before the ! 191: end of the sequence \fBsgetn\fR fetches whatever characters ! 192: remain. ! 193: \fBsgetn\fR repositions the get pointer following ! 194: the fetched characters and ! 195: returns the number of characters fetched. ! 196: .TP ! 197: \fBc=sb->snextc()\fR ! 198: Moves the get pointer forward one character ! 199: and returns the character following the new position. ! 200: It returns \f(CWEOF\fR if the pointer ! 201: is currently at the end of the sequence or is at the end of ! 202: the sequence after moving forward. ! 203: .TP ! 204: \fBi=sb->sputbackc(c) ! 205: Moves the get pointer back one character. ! 206: \fBc\fR must be ! 207: the current content of the sequence just before the get pointer. ! 208: The underlying mechanism may ! 209: simply back up the get pointer or may rearrange its internal ! 210: data structures so the \fBc\fR is saved. Thus the effect ! 211: of \fBsputbackc\fR is undefined if \fBc\fR is not the character ! 212: before the get pointer. ! 213: \fBputbackc\fR returns \f(CWEOF\fR when it fails. ! 214: The conditions under which it can fail depend on the details of ! 215: the derived ! 216: class. ! 217: .TP ! 218: \fBi=sb->sputc(c) ! 219: Stores \fBc\fR after the put pointer, and moves the ! 220: put pointer over the stored character. Usually this extends ! 221: the sequence. ! 222: It returns \fBEOF\fR when an error occurs. The conditions ! 223: that can cause errors depend on the derived class. ! 224: .TP ! 225: \fBi=sb->sputn(ptr,n)\fR ! 226: Stores the \fBn\fR ! 227: characters starting at \fBptr\fR ! 228: after the put pointer. Moves the put ! 229: pointer over them. ! 230: Returns the number of characters stored successfully. ! 231: Normally this is \fBn\fR, but it may be less when errors occur. ! 232: .TP ! 233: \fBsb->stossc()\fR ! 234: Moves the get pointer forward one character. If the pointer started at the ! 235: end of the sequence this function has no effect. ! 236: .TP ! 237: \fBi=sb->sync()\fR ! 238: Establishes consistency between the internal data structures and the ! 239: external source or sink. ! 240: The details of this function depend on the derived class. ! 241: Usually this "flushes" any characters that have been stored ! 242: but not yet consumed, and "gives back" any characters that ! 243: may have been produced but not yet fetched. ! 244: .SH CAVEATS ! 245: \fBsetbuf\fR ! 246: does not really belong in the public interface. ! 247: It is there for compatibility with the stream package. ! 248: .PP ! 249: Requiring the program to provide ! 250: the previously fetched character to ! 251: \f(CWsputback\fR is probably a botch. ! 252: .SH SEE ALSO ! 253: iostream(3C++), ! 254: sbuf.prot(3C++)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.