⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readlinebuf.h

📁 在非GUI环境下
💻 H
字号:
/******************************************************************************* * $Revision: 1.2 $ * $Date: 2001/09/11 06:19:36 $ * $Author: vyzo $ * * 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;#endifclass 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -