/** \file lispio.h * definitions of pure input output classes. */ #ifndef __lispio_h__ #define __lispio_h__ #include "yacasbase.h" // Hope this forward declaration doesn't screw us over... class InputDirectories; class InputStatus : public YacasBase { public: InputStatus() : iFileName("none") , iLineNumber(-1) {}; ~InputStatus(); void SetTo(LispChar * aFileName); void RestoreFrom(InputStatus& aPreviousStatus); inline LispInt LineNumber(); inline LispChar * FileName(); inline void NextLine(); inline InputStatus(const InputStatus& aOther) : iFileName(aOther.iFileName) , iLineNumber(aOther.iLineNumber) { } inline InputStatus& operator=(const InputStatus& aOther) { iFileName = aOther.iFileName; iLineNumber = aOther.iLineNumber; return *this; } private: LispChar * iFileName; LispInt iLineNumber; }; inline LispInt InputStatus::LineNumber() { return iLineNumber; } inline LispChar * InputStatus::FileName() { return iFileName; } inline void InputStatus::NextLine() { iLineNumber++; } /** \class LispInput : pure abstract class declaring the interface * that needs to be implemented by a file (something that expressions * can be read from). */ class LispInput : public YacasBase { public: /** Constructor with InputStatus. InputStatus retains the information * needed when an error occurred, and the file has already been * closed. */ LispInput(InputStatus& aStatus) : iStatus(aStatus) {}; virtual ~LispInput(); /// Return the next character in the file virtual LispChar Next() = 0; /** Peek at the next character in the file, without advancing the file * pointer. */ virtual LispChar Peek() = 0; virtual InputStatus& Status() const {return iStatus;}; /// Check if the file position is past the end of the file. virtual LispBoolean EndOfStream() = 0; /** StartPtr returns the start of a buffer, if there is one. * Implementations of this class can keep the file in memory * as a whole, and return the start pointer and current position. * Especially the parsing code requires this, because it can then * efficiently look up a symbol in the hash table without having to * first create a buffer to hold the symbol in. If StartPtr is supported, * the whole file should be in memory for the whole period the file * is being read. */ virtual LispChar * StartPtr() = 0; virtual LispInt Position() = 0; virtual void SetPosition(LispInt aPosition) = 0; protected: InputStatus& iStatus; }; /** \class LispOutput : interface an output object should adhere to. */ class LispOutput : public YacasBase { public: virtual ~LispOutput(); /// Write out one character. virtual void PutChar(LispChar aChar) = 0; public: void Write(const LispChar * aString); }; #endif