OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gdb-6.8/] [pre-binutils-2.20.1-sync/] [readline/] [examples/] [readlinebuf.h] - Diff between revs 157 and 223

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.