Annotation of researchv10dc/man/mana/sbuf.prot.3, revision 1.1.1.1

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.PROT 3I+ "C++ Stream Library" " "
                      8: .SH NAME
                      9: streambuf \- interface for derived classes
                     10: .SH SYNOPSIS
                     11: .nf
                     12: .ta1i 2i
                     13: .ft B
                     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:                streambuf() ;
                     27:                streambuf(char* p, int len, int i=0);
                     28: 
                     29:        void    dbp() ;
                     30: protected:
                     31:        int     allocate();
                     32:        char*   base();
                     33:        int     blen();
                     34:        char*   eback();
                     35:        char*   ebuf();
                     36:        char*   egptr();
                     37:        char*   epptr();
                     38:        void    gbump(int n);
                     39:        char*   gptr();
                     40:        char*   pbase();
                     41:        void    pbump(int n); 
                     42:        char*   pptr();
                     43:        void    setg(char* eb,char* g, char* eg);
                     44:        void    setp(char* p, char* ep);
                     45:        void    setb(char* b, char* eb, int a = 0 );
                     46:        int     unbuffered();
                     47:        void    unbuffered(int);
                     48: 
                     49:        virtual int     doallocate();
                     50:        virtual int     pbackfail(int c);
                     51:        virtual ~streambuf() ;
                     52: public:
                     53:        virtual int     overflow(int c=EOF);
                     54:        virtual int     underflow();
                     55:        virtual streambuf*
                     56:                setbuf(char* p, int len);
                     57:        virtual streampos
                     58:                seekpos(streampos,open_mode=input|output);
                     59:        virtual streampos
                     60:                seekoff(streamoff,seek_dir,open_mode=input|output);
                     61:        virtual int     sync();
                     62: };
                     63: .fi
                     64: .ft R
                     65: .SH DESCRIPTION
                     66: \f(CWstreambuf\fRs implement the buffer abstraction described in
                     67: \fIsbuf.pub\fR(3C++).  But the \f(CWstreambuf\fR class itself contains
                     68: only basic members for manipulating the characters and normally
                     69: a class derived from \f(CWstreambuf\fR will be used.  This man page
                     70: describes the interface needed by programmers who are
                     71: coding a derived class.
                     72: Broadly speaking there are two kinds of members described here.
                     73: The non-virtual functions are provided for manipulating a \fBstreambuf\fR
                     74: in ways that are appropriate in a derived class.
                     75: Their descriptions reveal details of the implementation that would
                     76: be inappropriate in the public interface.
                     77: The virtual functions permit the derived class to specialize the
                     78: \fBstreambuf\fR class in ways appropriate to the specific sources
                     79: and sinks that it is implementing.
                     80: The descriptions of virtuals explain the obligations of the
                     81: virtuals of the derived class.  If the virtuals behave as specified,
                     82: the \fBstreambuf\fR will behave as specified in the
                     83: public interface.  However, if the virtuals do not behave as
                     84: specified, then the \f(CWstreambuf\fR may not behave properly,
                     85: and an \f(CWiostream\fR (or any other code) that relies on proper
                     86: behavior of the \f(CWstreambuf\fR may not behave properly either.
                     87: .PP
                     88: Assume
                     89: .br
                     90: \(em \fBsb\fR is a \f(CWstreambuf*\fR.
                     91: .br
                     92: \(em \fBi\fR and \fBn\fR are \f(CWint\fR.
                     93: .br
                     94: \(em \fBptr\fR, \fBb\fR, \fBeb\fR, \fBp\fR, \fBep\fR, \fBeb\fR, \fBg\fR,
                     95: and \fBeg\fR are \f(CWchar*\fR.
                     96: .br
                     97: \(em \fBc\fR is an \f(CWint\fR character (positive or \f(CWEOF\fR)).
                     98: .br
                     99: \(em \fBpos\fR is a \f(CWstreampos\fR. (See \fIiostream\fR(3C++).)
                    100: .br
                    101: \(em \fBoff\fR is a \f(CWstreamoff\fR.
                    102: .br
                    103: \(em \fBdir\fR is a \f(CWseekdir\fR.
                    104: .br
                    105: \(em \fBmode\fR is a \f(CWopen_mode\fR.
                    106: .PP
                    107: Constructors:
                    108: .TP
                    109: \fBstreambuf()\fR
                    110: Constructs
                    111: an empty buffer corresponding to an empty sequence.
                    112: .TP
                    113: \fBstreambuf(b,len,i)\fR
                    114: Constructs an empty buffer and then sets up the reserve area
                    115: to be the \fBlen\fR bytes starting at \fBb\fR. (\fBi\fR is present
                    116: for backward compatibility with the stream package\fR.  The effect
                    117: if it is not 0 is undefined.) 
                    118: .PP
                    119: The protected members of 
                    120: \f(CWstreambuf\fR
                    121: present an interface to derived classes organized around
                    122: three areas (arrays of bytes) managed cooperatively by
                    123: the base and derived classes.
                    124: They are the get area, the put area, and the reserve area.
                    125: The get and the put area are normally disjoint, but they
                    126: may both overlap the reserve area, whose primary purpose is
                    127: to be a a resource in which
                    128: space for the put and get areas can be allocated.  The get and
                    129: the put areas are changed as characters are put into and
                    130: gotten from the buffer, but the reserve area normally remains
                    131: fixed.
                    132: The areas are defined by a collection of \f(CWchar*\fR values.
                    133: The buffer abstraction is described in terms of pointers that point
                    134: between characters, but the \f(CWchar*\fR values must point at
                    135: \f(CWchar\fRs.
                    136: To establish a correspondence the \f(CWchar*\fR values should be thought
                    137: of as pointing just before the byte they really point at.
                    138: .PP
                    139: Functions to examine the pointers are:
                    140: .TP
                    141: \fBptr=sb->base()\fR
                    142: Returns a pointer to the first byte of the reserve area.
                    143:  Space between \fBsb->base()\fR
                    144: and \fBsb->ebase()\fR is the reserve area.
                    145: .TP
                    146: \fBptr=sb->eback()\fR
                    147: Returns a pointer to a lower bound on
                    148: \fBsb->gptr()\fR.
                    149: Space between \fBsb->eback()\fR and \fBsb->gptr()\fR is available
                    150: for putback.
                    151: .TP
                    152: \fBptr=sb->ebuf()\fR
                    153: Returns a pointer to the byte after the last byte of the reserve area.
                    154: .TP
                    155: \fBptr=sb->egptr()\fR
                    156: Returns a pointer to the byte after the last byte of the get area.
                    157: .TP
                    158: \fBptr=sb->epptr()\fR
                    159: Returns a pointer to the byte after the last byte of the put area.
                    160: .TP
                    161: \fBptr=sb->gptr()\fR
                    162: Returns a pointer to the first byte of the get area.
                    163: The available characters are those between \fBsb->gptr()\fR
                    164: and \fBsb->egptr()\fR. The next character fetched will
                    165: be \fB*sb->gptr()\fR unless \fBsb->egptr()\fR is less than
                    166: or equal to \fBsb->gptr()\fR.
                    167: .TP
                    168: \fBptr=sb->pbase()\fR
                    169: Returns a pointer to the put area base.
                    170: Characters between \fBsb->pbase()\fR and \fBsb->pptr()\fR
                    171: have been storeded into the buffer and not yet consumed.
                    172: .TP
                    173: \fBptr=sb->pptr()\fR
                    174: Returns a pointer to the first byte of the put area.
                    175: The space between \fBsb->pptr()\fR
                    176: and \fBsb->epptr()\fR is the put area and characters will be storeed
                    177: here.
                    178: .PP
                    179: The member functions for setting the pointers:
                    180: .TP
                    181: \fBsb->setb(b,eb,i)\fR
                    182: Sets \fBbase\fR and \fBebase\fR to \fBb\fR and \fBeb\fR respectively.
                    183: \fBi\fR controls whether the area will be subject to
                    184: automatic deletion.
                    185: If \fBi\fR is non zero, then
                    186: \f(CWdelete\fB b\fR will be done when \fBbase\fR is changed by
                    187: another call of \fBsetb\fR, or when the destructor is called for
                    188: \fB*sb\fR.
                    189: If \fBb\fR and \fBeb\fR
                    190: are both null then we say that there is no reserve area.
                    191: If \fBb\fR is non-null, there is a reserve area even if
                    192: \fBeb\fR is less than \fBb\fR and so the reserve area
                    193: has zero length.
                    194: .TP
                    195: \fBsb->setp(p,ep)\fR
                    196: Sets \fBpptr\fR to \fBp\fR, \fBpbase\fR to \fBp\fR, and \fBepptr\R
                    197: to \fBep\fR.
                    198: .TP
                    199: \fBsb->setg(eb,g,eg)\fR
                    200: Sets \fBeback\fR to \fBeb\fR, \fBgptr\fR to \fBg\fR, and \fBegptr\fR
                    201: to \fBeg\fR.
                    202: .PP
                    203: Other non-virtual members:
                    204: .TP
                    205: \fBi=sb->allocate()\fR
                    206: Tries to set up a reserve area.
                    207: If a reserve area already exists or if \fBsb->unbuffered()\fR
                    208: is nonzero returns 0 without doing anything.
                    209: If the attempt to allocate space fails \fBallocate\fR
                    210: returns \f(CWEOF\fR.  Otherwise (allocation succeeds)
                    211: \fBallocate\fR returns 1.  \fBallocate\fR is not called by
                    212: any member of \f(CWstreambuf\fR except virtuals.
                    213: .TP
                    214: \fBi=sb->blen()\fR
                    215: Returns the current size (in chars) of the current reserve area.
                    216: .TP
                    217: \fBdbp()\fR
                    218: Writes directly on file descriptor 1 
                    219: information in ASCII about the state of the
                    220: buffer.  It is intended for debugging and nothing
                    221: is specified about the form of the output.  It is considered part
                    222: of the protected interface because the information it prints can
                    223: only be understood in relation to that interface, but it is a public
                    224: function so that it can be called anywhere during debugging.  
                    225: .TP
                    226: \fBsb->gbump(n)\fR
                    227: Increments \fBgptr\fR by \fBn\fR
                    228: which may be positive or negative.
                    229: No checks are made on whether the new
                    230: value of \fBgptr\fR is in bounds.
                    231: .TP
                    232: \fBsb->pbump(n)\fR
                    233: Increments \fBpptr\fR by \fBn\fR
                    234: which may be positive or negative.
                    235: No checks are made on whether the new
                    236: value of \fBpptr\fR is in bounds.
                    237: .sp
                    238: .nf
                    239: .in -.5i
                    240: \fBsb->unbuffered(i)\fR
                    241: \fBi=sb->unbuffered()\fR
                    242: .in
                    243: .fi
                    244: There is a private variable known as \fBsb\fR's buffering state.
                    245: \fBsb->unbuffered(i)\fR sets the value of this variable
                    246: to \fBi\fR and \fBsb->unbuffered()\fR returns the current value.
                    247: This state is independent of the actual
                    248: allocation of a reserve area.  Its primary purpose is to
                    249: control whether a reserve area is allocated automatically
                    250: by \fBallocate\fR.
                    251: .PP
                    252: Virtual functions must be redefined in
                    253: derived classes to specialize the behavior of \fBstreambuf\fRs:
                    254: .TP
                    255: \fBi=sb->doallocate()\fR
                    256: Is called when \fBallocate\fR determines
                    257: that space is needed.
                    258: \fBdoallocate\fR is required to call \fBsetb\fR to provide a reserve
                    259: area or to return \f(CWEOF\fR if it cannot.  It is only called
                    260: if \fBsb->unbuffered()\fR is non-zero and \fBsb->base()\fR is non-zero.
                    261: .TP
                    262: \fBi=overflow(c)\fR
                    263: Is called to consume characters.  If \fBc\fR is not \f(CWEOF\fR
                    264: it also must either save \fBc\fR or consume it.  
                    265: Usually it is called when the put area is full and
                    266: an attempt is being made to store a new character, but
                    267: it can be called at other times.
                    268: The normal action is to consume the characters between \fBpbase\fR
                    269: and \fBpptr\fR, call \fBsetp\fR to establish a new put area, and
                    270: if \fBc\f(CW!=EOF\fR store it (using \fBsputc\fR).
                    271: If \fBsb->unbuffered()\fR is non-zero,
                    272: \fBoverflow\fR is not allowed to call \fBsetp\fR and 
                    273: so must consume \fBn\fR
                    274: \fBsb->overflow\fR
                    275: should return \fBEOF\fR to indicate an error; otherwise it should
                    276: return something else.
                    277: .TP
                    278: \fBi=sb->pbackfail(c)
                    279: Is called when \fBeback\fR equals \fBgptr\fR and an attempt 
                    280: has been made to putback \fBc\fR.
                    281: If this situation can be dealt with (e.g., by repositioning
                    282: an external file), \fBpbackfail\fR should return \fBc\fR;
                    283: otherwise it should return \f(CWEOF\fR.
                    284: .TP
                    285: \fBpos=sb->seekoff(off,dir,mode)\fR
                    286: Repositions the get and/or put pointers  (i.e., the abstract
                    287: get and put pointers, not \fBpptr\fR and \fBgptr\fR).  The
                    288: meanings of \fBoff\fR and \fBdir\fR
                    289: are discussed in 
                    290: \fIsbuf.pub\fR(3C++).
                    291: \fBmode\fR specifies whether the put pointer (\fBoutput\fR bit set) or
                    292: the get pointer (\fBinput\fR bit set) is to be modified.  Both bits
                    293: may be set in which case both pointers should be affected.
                    294: A class derived from \fBstreambuf\fR is not required to
                    295: support repositioning.  \fBseekoff\fR should return \f(CWEOF\fR if 
                    296: the class does not support repositioning.  If the class does
                    297: support repositioning, \fBseekoff\fR should return the new
                    298: position or \f(CWEOF\fR on error.
                    299: .TP
                    300: \fBpos=sb->seekpos(pos,mode)\fR
                    301: Repositions the streambuf get and/or put pointer to \fBpos\fR.
                    302: \fBmode\fR specifies which pointers are affected as for \fBseekoff\fR.
                    303: Returns \fBpos\fR (the argument) or \f(CWEOF\fR if the class does
                    304: not support repositioning or an error occurs.
                    305: .TP
                    306: \fBsb=sb->setbuf(ptr,len)\fR
                    307: Offers the array at \fBptr\fR with \fBlen\fR bytes should
                    308: be used as a reserve
                    309: area.   The normal interpretation is that
                    310: if \fBptr\fR or \fBlen\fR are zero then this is a request
                    311: to make the \fBsb\fR unbuffered.
                    312: The derived class may use this area or not as it chooses.
                    313: If may accept or ignore the request for unbuffered state as it
                    314: chooses.
                    315: \fBsetbuf\fR should return \fBsb\fR if it honors the request.
                    316: Otherwise it should return 0.
                    317: .TP
                    318: \fBi=sb->sync()\fR
                    319: Is called to give the derived class
                    320: a chance to
                    321: look at the state of the areas, and synchronize
                    322: them with any external representation.
                    323: Normally \fBsync\fR should
                    324: consume any characters that have been storeed into the put area,
                    325: and if possible give back to the source any characters in the get area
                    326: that have not been fetched.  When \fBsync\fR returns there should not
                    327: be any unconsumed characters, and the get area should be empty.
                    328: \fBsync\fR should return \fBEOF\fR if some kind of failure occurs.
                    329: .TP
                    330: \fBi=sb->underflow()\fR
                    331: Is called to supply characters for fetching, i.e.,
                    332: to create a condition in which the get area is not empty.
                    333: If it is called when there are characters in the get area
                    334: it should return the first character.  If the get area is empty
                    335: it should create a nonempty get area 
                    336: and return the next character (which it should also
                    337: leave in the get area).
                    338: If there are no more characters available
                    339: \fBunderflow\fR
                    340: should return \f(CWEOF\fR and leave an empty put area.
                    341: .PP
                    342: The default definitions of the virtual functions:
                    343: .TP
                    344: \fBi=sb->streambuf::doallocate()\fR
                    345: Attempts to allocate a reserve area using \f(CWoperator new\fR.
                    346: .TP
                    347: \fBi=sb->streambuf::overflow(n)\fR
                    348: Is compatible
                    349: with the old stream package, but that behavior is not
                    350: considered part of the specification of the iostream package.
                    351: So \fBstreambuf::overflow\fR should be treated as if 
                    352: it had undefined behavior.  That is, derived classes should
                    353: always define it.
                    354: .TP
                    355: \fBi=sb->streambuf::pbackfail(n)
                    356: Returns \f(CWEOF\fR.
                    357: .TP
                    358: \fBpos=sb->streambuf::seekpos(pos,mode)\fR
                    359: Returns \fBsb->seekoff(streamoff(pos),seek_beg,mode)\fR.
                    360: Thus to define seeking in a derived class, it is frequently
                    361: only necessary to define 
                    362: \fBseekoff\fR and use the inherited \fBstreambuf::seekpos\fR.
                    363: .TP
                    364: \fBpos=sb->streambuf::seekoff(off,dir,mode)\fR
                    365: Returns \f(CWEOF\fR.
                    366: .TP
                    367: \fBsb=sb->streambuf::setbuf(ptr,len)\fR
                    368: Will honor the request when ever there is no reserve area.
                    369: .TP
                    370: \fBi=sb->streambuf::sync()\fR
                    371: Returns 0 if the get area is empty and there are no unconsumed
                    372: characters.  Otherwise it returns \f(CWEOF\fR.
                    373: .TP
                    374: \fBi=sb->streambuf::underflow()\fR
                    375: Is compatible
                    376: with the old stream package, but that behavior is not
                    377: considered part of the specification of the iostream package.
                    378: So \fBstreambuf::underflow\fR should be treated as if 
                    379: it had undefined behavior.  That is, it should always be defined
                    380: in derived classes.
                    381: .SH CAVEATS
                    382: The constructors are public for compatibility with the
                    383: old stream package.
                    384: They ought to be protected.
                    385: .PP
                    386: The interface for unbuffered actions is awkward.
                    387: It's hard to write \fBunderflow\fR and \fBoverflow\fR
                    388: virtuals that behave properly
                    389: for unbuffered \f(CWstreambuf\fRs without special casing.
                    390: Also there is no way for the virtuals to react sensibly to
                    391: multi character gets or puts.
                    392: .PP
                    393: Although the public interface to \f(CWstreambuf\fRs
                    394: deals in characters and bytes,
                    395: the interface to derived classes deals in \f(CWchar\fRs.
                    396: Since a decision had to be made on the types of the real data
                    397: pointers, it seemed easier to reflect that choice in the
                    398: types of the protected members than to duplicate all
                    399: the members with both plain and unsigned char versions.
                    400: But perhaps all these uses of \f(CWchar*\fR ought to have been
                    401: with a typedef.
                    402: .PP 
                    403: The implementation contains a variant
                    404: of  \fBsetbuf\fR that accepts a third argument.
                    405: It is present only for compatibility
                    406: with the old stream package.
                    407: .SH SEE ALSO
                    408: sbuf.pub(3C++)
                    409: streambuf(3C++)
                    410: iostream(3C++)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.