Annotation of embedaddon/readline/examples/readlinebuf.h, revision 1.1

1.1     ! misho       1: /*******************************************************************************
        !             2:  * $Revision: 1.2 $
        !             3:  * $Date: 2001/09/11 06:19:36 $
        !             4:  * $Author: vyzo $
        !             5:  *
        !             6:  * Contents: A streambuf which uses the GNU readline library for line I/O
        !             7:  * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu]
        !             8:  *
        !             9:  * This program is free software; you can redistribute it and/or modify
        !            10:  * it under the terms of the GNU General Public License as published by
        !            11:  * the Free Software Foundation; either version 2  of the License, or
        !            12:  * (at your option) any later version.
        !            13:  *
        !            14:  * This program is distributed in the hope that it will be useful,
        !            15:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            16:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            17:  * General Public License for more details.
        !            18:  *
        !            19:  * You should have received a copy of the GNU General Public
        !            20:  * License along with this program; if not, write to the Free
        !            21:  * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
        !            22:  * MA 02111-1307 USA
        !            23:  *
        !            24:  ******************************************************************************/
        !            25: 
        !            26: #ifndef _READLINEBUF_H_
        !            27: #define _READLINEBUF_H_
        !            28: 
        !            29: #include <iostream>
        !            30: #include <cstring>
        !            31: #include <cassert>
        !            32: #include <cstdlib>
        !            33: #include <cstdio>
        !            34: 
        !            35: #include <readline/readline.h>
        !            36: #include <readline/history.h>
        !            37: 
        !            38: #if (defined __GNUC__) && (__GNUC__ < 3)
        !            39: #include <streambuf.h>
        !            40: #else
        !            41: #include <streambuf>
        !            42: using std::streamsize;
        !            43: using std::streambuf;
        !            44: #endif
        !            45: 
        !            46: class readlinebuf : public streambuf {
        !            47: public:
        !            48: #if (defined __GNUC__) && (__GNUC__ < 3)
        !            49:        typedef char char_type;
        !            50:        typedef int int_type;
        !            51:        typedef streampos pos_type;
        !            52:        typedef streamoff off_type;
        !            53: #endif
        !            54:        static const int_type eof = EOF; // this is -1
        !            55:        static const int_type not_eof = 0;
        !            56: 
        !            57: private:
        !            58:        const char* prompt_;
        !            59:        bool history_;
        !            60:        char* line_;
        !            61:        int low_;
        !            62:        int high_;
        !            63: 
        !            64: protected:
        !            65:                
        !            66:        virtual int_type showmanyc() const { return high_ - low_; }
        !            67:                
        !            68:        virtual streamsize xsgetn( char_type* buf, streamsize n ) {
        !            69:                int rd = n > (high_ - low_)? (high_ - low_) : n;
        !            70:                memcpy( buf, line_, rd );
        !            71:                low_ += rd;
        !            72:                        
        !            73:                if ( rd < n ) {
        !            74:                        low_ = high_ = 0;
        !            75:                        free( line_ ); // free( NULL ) is a noop
        !            76:                        line_ = readline( prompt_ );
        !            77:                        if ( line_ ) {
        !            78:                                high_ = strlen( line_ );
        !            79:                                if ( history_ && high_ ) add_history( line_ );
        !            80:                                rd += xsgetn( buf + rd, n - rd );
        !            81:                        }
        !            82:                }
        !            83:                        
        !            84:                return rd; 
        !            85:        }
        !            86:                
        !            87:        virtual int_type underflow() {
        !            88:                if ( high_ == low_ ) {
        !            89:                        low_ = high_ = 0;
        !            90:                        free( line_ ); // free( NULL ) is a noop
        !            91:                        line_ = readline( prompt_ );
        !            92:                        if ( line_ ) {
        !            93:                                high_ = strlen( line_ );
        !            94:                                if ( history_ && high_ ) add_history( line_ );
        !            95:                        }
        !            96:                }
        !            97:                        
        !            98:                if ( low_ < high_ ) return line_[low_];
        !            99:                else return eof;
        !           100:        }
        !           101:                
        !           102:        virtual int_type uflow() {
        !           103:                int_type c = underflow();
        !           104:                if ( c != eof ) ++low_;
        !           105:                return c;
        !           106:        }
        !           107:                
        !           108:        virtual int_type pbackfail( int_type c = eof ) {
        !           109:                if ( low_ > 0 ) --low_;
        !           110:                else if ( c != eof ) {
        !           111:                        if ( high_ > 0 ) {
        !           112:                                char* nl = (char*)realloc( line_, high_ + 1 );
        !           113:                                if ( nl ) {
        !           114:                                        line_ = (char*)memcpy( nl + 1, line_, high_ );
        !           115:                                        high_ += 1;
        !           116:                                        line_[0] = char( c );
        !           117:                                } else return eof;
        !           118:                        } else {
        !           119:                                assert( !line_ );
        !           120:                                line_ = (char*)malloc( sizeof( char ) );
        !           121:                                *line_ = char( c );
        !           122:                                high_ = 1;
        !           123:                        }
        !           124:                } else return eof;
        !           125: 
        !           126:                return not_eof;
        !           127:        }
        !           128:                
        !           129: public:
        !           130:        readlinebuf( const char* prompt = NULL, bool history = true ) 
        !           131:                : prompt_( prompt ), history_( history ),
        !           132:                  line_( NULL ), low_( 0 ), high_( 0 ) {
        !           133:                setbuf( 0, 0 );
        !           134:        }
        !           135:                
        !           136:                
        !           137: };
        !           138: 
        !           139: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>