Annotation of embedaddon/readline/examples/readlinebuf.h, revision 1.1.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>