diff options
Diffstat (limited to 'readline/examples/readlinebuf.h')
-rw-r--r-- | readline/examples/readlinebuf.h | 139 |
1 files changed, 0 insertions, 139 deletions
diff --git a/readline/examples/readlinebuf.h b/readline/examples/readlinebuf.h deleted file mode 100644 index 91ef4d6..0000000 --- a/readline/examples/readlinebuf.h +++ /dev/null @@ -1,139 +0,0 @@ -/******************************************************************************* - * $Revision$ - * $Date$ - * $Author$ - * - * Contents: A streambuf which uses the GNU readline library for line I/O - * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu] - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - * - ******************************************************************************/ - -#ifndef _READLINEBUF_H_ -#define _READLINEBUF_H_ - -#include <iostream> -#include <cstring> -#include <cassert> -#include <cstdlib> -#include <cstdio> - -#include <readline/readline.h> -#include <readline/history.h> - -#if (defined __GNUC__) && (__GNUC__ < 3) -#include <streambuf.h> -#else -#include <streambuf> -using std::streamsize; -using std::streambuf; -#endif - -class readlinebuf : public streambuf { -public: -#if (defined __GNUC__) && (__GNUC__ < 3) - typedef char char_type; - typedef int int_type; - typedef streampos pos_type; - typedef streamoff off_type; -#endif - static const int_type eof = EOF; // this is -1 - static const int_type not_eof = 0; - -private: - const char* prompt_; - bool history_; - char* line_; - int low_; - int high_; - -protected: - - virtual int_type showmanyc() const { return high_ - low_; } - - virtual streamsize xsgetn( char_type* buf, streamsize n ) { - int rd = n > (high_ - low_)? (high_ - low_) : n; - memcpy( buf, line_, rd ); - low_ += rd; - - if ( rd < n ) { - low_ = high_ = 0; - free( line_ ); // free( NULL ) is a noop - line_ = readline( prompt_ ); - if ( line_ ) { - high_ = strlen( line_ ); - if ( history_ && high_ ) add_history( line_ ); - rd += xsgetn( buf + rd, n - rd ); - } - } - - return rd; - } - - virtual int_type underflow() { - if ( high_ == low_ ) { - low_ = high_ = 0; - free( line_ ); // free( NULL ) is a noop - line_ = readline( prompt_ ); - if ( line_ ) { - high_ = strlen( line_ ); - if ( history_ && high_ ) add_history( line_ ); - } - } - - if ( low_ < high_ ) return line_[low_]; - else return eof; - } - - virtual int_type uflow() { - int_type c = underflow(); - if ( c != eof ) ++low_; - return c; - } - - virtual int_type pbackfail( int_type c = eof ) { - if ( low_ > 0 ) --low_; - else if ( c != eof ) { - if ( high_ > 0 ) { - char* nl = (char*)realloc( line_, high_ + 1 ); - if ( nl ) { - line_ = (char*)memcpy( nl + 1, line_, high_ ); - high_ += 1; - line_[0] = char( c ); - } else return eof; - } else { - assert( !line_ ); - line_ = (char*)malloc( sizeof( char ) ); - *line_ = char( c ); - high_ = 1; - } - } else return eof; - - return not_eof; - } - -public: - readlinebuf( const char* prompt = NULL, bool history = true ) - : prompt_( prompt ), history_( history ), - line_( NULL ), low_( 0 ), high_( 0 ) { - setbuf( 0, 0 ); - } - - -}; - -#endif |