home *** CD-ROM | disk | FTP | other *** search
- // C++ .h file for gplot, gdoc, gtex, basic I/O -*-c++-*-
- // copyright Phil Andrews, Pittsburgh Supercomputing Center, 1992
- // all rights reserved
- // RCS revision history
- // $Log$
- #ifndef basicio_h
- #define basicio_h
- #include <stdio.h>
- #include <string.h>
- ////
- #if __MSDOS__
- typedef unsigned char huge * HugePt;
- #endif
- // external UNIX I/O
- ////
- extern "C" {
- int open(const char*, int, ...);
- int close(int);
- int read(int, void*, unsigned int);
- int fstat(int, struct stat*);
- }
- ////
- // forward declarations
- class tokenHolder;
- ////
- // the basic output object
- ////
- class outputObject {
- public:
- virtual outputObject *outString(const char*, int, int useInWidth = 0,
- int inWidth = 0);
- virtual outputObject *outString(const char*);
- virtual outputObject *outChar(char);
- virtual outputObject *addSpace() {return outString(" ", 1);} // default
- };
- ////
- // basic file output object
- ////
- class fileOutput : public outputObject {
- public:
- fileOutput(const char*, int=80);
- virtual ~fileOutput();
- virtual int opened() { return !!fout;}
- virtual outputObject *outString(const char*, int, int useInWidth = 0,
- int inWidth = 0);
- virtual outputObject *flushBuffer(int noLines = 1);
- virtual outputObject *addSpace();
- protected:
- FILE *fout;
- char *lineBuffer;
- long bufferIndex, bufferSize;
- };
- ////
- // basic string output object
- ////
- class stringOutput : public outputObject {
- public:
- stringOutput(int inSize=1024)
- {myContents = new char[mySize = inSize];
- myContents[lastPos=0] = 0;}
- virtual ~stringOutput() {if (mySize) delete myContents;}
- virtual int opened() { return !!myContents;}
- virtual outputObject *outString(const char*, int, int useInWidth = 0,
- int inWidth = 0);
- virtual char *contents() {return myContents;}
- virtual int size() {return mySize;}
- virtual int pos() {return lastPos;}
- protected:
- char *myContents;
- int mySize, lastPos;
- };
- ////
- // class for storing positional information on a stack
- ////
- class posPtr {
- public:
- posPtr(int inValue, posPtr *inNext = NULL)
- {myValue = inValue; myNext = inNext;}
- int value() { return myValue;}
- posPtr *next() { return myNext;}
- private:
- int myValue;
- posPtr *myNext;
- };
- ////
- // the basic text object
- ////
- class textObject {
- public:
- textObject();
- virtual ~textObject();
- // pure virtual functions, must be provided by descendants
- virtual textObject *drawString(const char*, int size = -1,
- int useInWidth = 0,
- int inWidth = 0) = 0;
- virtual int maxWidth() = 0;
- virtual int pageHeight() = 0;
- virtual int stringWidth(const char*, int size) = 0;
- virtual int stringHeight(const char*, int) = 0;
- // default functions
- virtual textObject *outSpace();
- virtual textObject *newLine(int noLines = 1);
- virtual textObject *blankLine();
- virtual textObject *endLine();
- virtual textObject *breakLeft(tokenHolder*);
- virtual textObject *breakCenter(tokenHolder*);
- virtual textObject *breakRight(tokenHolder*);
- virtual textObject *breakBoth(tokenHolder*);
- virtual textObject *breakNone(tokenHolder*);
- virtual textObject *kern(int);
- virtual int descent(const char*, int) {return 0;}
- virtual int lineHeight() {return stringHeight("M", 1);}
- virtual int hpos() {return myHpos;}
- virtual int vpos() {return myVpos;}
- virtual int pageWidth() {return maxWidth() - rightMargin();}
- virtual int leftMargin() {return leftMarginPtr->value();}
- virtual int rightMargin() {return rightMarginPtr->value();}
- virtual void pushLeftMargin();
- virtual int popLeftMargin();
- virtual void pushHpos();
- virtual int popHpos();
- virtual void pushRightMargin();
- virtual int popRightMargin();
- virtual void pushVpos();
- virtual int popVpos();
- const char *currentFontName() {return myCurrentFontName;}
- void setCurrentFontName(const char*);
- virtual int setFont(const char*, int=1) {return 1;} // default
- protected:
- int myHpos, myVpos;
- posPtr *leftMarginPtr, *rightMarginPtr, *hposPtr, *vposPtr;
- char *myCurrentFontName;
- int myCurrentFontNameSize, maxCurrentFontNameSize;
- };
- ////
- // output to a named file
- ////
- class outputFile : public textObject, public fileOutput {
- public:
- outputFile(const char *inName, int inSize=80)
- : fileOutput(inName, inSize) {}
- virtual textObject *newLine(int noLines = 1);
- virtual int hpos() { return bufferIndex;}
- virtual int maxWidth() { return bufferSize;}
- virtual int pageWidth() { return maxWidth();}
- virtual int pageHeight() { return 0;}
- virtual int stringWidth(const char*, int size) {return size;}
- virtual int stringHeight(const char*, int) {return 0;}
- virtual textObject *kern(int);
- virtual textObject *drawString(const char *inStr, int size = -1,
- int useInWidth = 0, int inWidth = 0);
- virtual textObject *outSpace() {++bufferIndex; return this;}
- };
- ////
- // output to a character array
- ////
- class outputArray : public textObject, public stringOutput {
- public:
- outputArray(int inSize=1024, int inWidth = 0) : stringOutput(inSize)
- {myWidth = inWidth;}
- virtual textObject *newLine(int noLines = 1);
- virtual int hpos() {return lastPos;}
- virtual int maxWidth() {return (myWidth) ? myWidth : mySize;}
- virtual int pageWidth() {return (myWidth) ? myWidth : mySize;}
- virtual int pageHeight() {return 0;}
- virtual int stringWidth(const char*, int size) {return size;}
- virtual int stringHeight(const char*, int) {return 0;}
- virtual textObject *kern(int) {return this;}
- virtual textObject *drawString(const char *inStr, int inSize = -1,
- int useInWidth = 0, int inWidth = 0)
- {outString(inStr, inSize, useInWidth, inWidth); return this;}
- virtual textObject *outSpace() {return drawString(" ", 1);}
- protected:
- int myWidth;
- };
- ////
- // tokens to be fed to an output object
- ////
- class outputToken {
- public:
- outputToken();
- virtual ~outputToken();
- virtual int width(textObject*) {return 0;}
- virtual int descent(textObject*) {return 0;}
- virtual int height(textObject*) {return 0;}
- virtual int breakPenalty(textObject*) {return 1;}
- virtual int deletable() {return 0;}
- virtual void draw(textObject*) {}
- outputToken *next() {return myNext;}
- outputToken *prev() {return myPrev;}
- tokenHolder *owner() {return myOwner;}
- void unlink() { myNext = myPrev = NULL;}
- virtual int newLine() {return 0;}
- virtual int isFont() {return 0;}
- void setNext(outputToken *inNext) {myNext = inNext;}
- void setPrev(outputToken *inPrev) {myPrev = inPrev;}
- void setOwner(tokenHolder *inOwner) {myOwner = inOwner;}
- virtual int noLines() {return 0;} // default
- virtual int noTokens() {return 1;} // default
- virtual outputToken *token() {return this;}
- virtual outputToken *nextToken();
- virtual outputToken *prevToken();
- virtual unsigned int rank() {return 0;}
- protected:
- outputToken *myNext, *myPrev;
- tokenHolder *myOwner;
- int myWidth;
- };
- ////
- // class to contain a formatted block
- ////
- class tokenHolder : public outputToken {
- public:
- tokenHolder();
- ~tokenHolder();
- void draw(textObject*);
- tokenHolder *addToken(outputToken*, int canBreak = 0);
- tokenHolder *addToken(const char*, int canBreak = 0);
- tokenHolder *addToken(char, int canBreak = 0);
- tokenHolder *addLine(const char*);
- tokenHolder *addSpace(const char*);
- tokenHolder *addSpace(int);
- tokenHolder *addSpace(float);
- tokenHolder *addSpace(char);
- outputToken *start() {return contents;}
- outputToken *end() {return lastToken;}
- void newStart(outputToken *inToken);
- void newEnd(outputToken *inToken);
- virtual int noTokens();
- virtual int noLines();
- virtual int width(textObject*);
- int linesBefore() {return myLinesBefore;}
- int linesAfter() {return myLinesAfter;}
- tokenHolder *setLinesBefore(int i) {myLinesBefore = i; return this;}
- tokenHolder *setLinesAfter(int i) {myLinesAfter = i; return this;}
- virtual outputToken *token()
- {return (contents && (myToken = contents->token()))?myToken : nextToken();}
- virtual outputToken *nextToken()
- {return (myNext)?myNext->token():(myOwner)?myOwner->nextToken():NULL;}
- virtual outputToken *prevToken()
- {return (myPrev)?myPrev->token():(myOwner)?myOwner->prevToken():NULL;}
- private:
- int myLinesBefore, myLinesAfter;
- outputToken *contents;
- outputToken *lastToken, *myToken;
- };
- ////
- // next output token
- ////
- inline outputToken *outputToken::nextToken()
- {
- return (myNext) ? myNext->token() : (myOwner)? myOwner->nextToken() : NULL;
- }
- ////
- // previous output token
- ////
- inline outputToken *outputToken::prevToken()
- {
- return (myPrev) ? myPrev->token() : (myOwner)? myOwner->prevToken() : NULL;
- }
- ////
- // class to output a space
- ////
- class outputSpace : public outputToken{
- public:
- outputSpace(outputToken *inToken = NULL, int notDeletable = 0)
- : outputToken() {myPrev = inToken; myDeletable = !notDeletable;}
- virtual int width(textObject*);
- virtual void draw(textObject*);
- virtual int breakPenalty(textObject*) { return 0;}
- virtual int deletable() {return myDeletable;}
- protected:
- int myDeletable;
- };
- ////
- // optional break class, like a space, but no width, no drawing
- ////
- class optionalBreak : public outputSpace{
- public:
- optionalBreak(outputToken *inToken = NULL) : outputSpace(inToken) {}
- virtual int width(textObject*) {return 0;}
- virtual void draw(textObject*) {}
- };
- ////
- // class to hold a string (conserve space with a union)
- ////
- class outputString : public outputToken{
- public:
- outputString(const char *inptr, int inSize, outputToken *inToken = NULL);
- outputString(const char inChar, outputToken *inToken = NULL);
- virtual ~outputString();
- virtual int width(textObject *inText);
- virtual int descent(textObject *inText)
- {return inText->descent(bptr(), size);}
- virtual int height(textObject *inText)
- {return inText->stringHeight(bptr(), size);}
- virtual void draw(textObject*);
- protected:
- union {char *bptr; char barray[sizeof(char*)];} myUnion;
- char *bptr() {return (size > sizeof(char*)) ? myUnion.bptr : myUnion.barray;}
- int size;
- };
- ////
- // class to hold a single character
- ////
- class outputChar : public outputToken{
- public:
- outputChar(char inChar, outputToken *inToken = NULL)
- {schar = inChar; myPrev = inToken;}
- virtual int width(textObject *inText);
- virtual int descent(textObject *inText) {return inText->descent(&schar, 1);}
- virtual int height(textObject *inText)
- {return inText->stringHeight(&schar, 1);}
- virtual void draw(textObject*);
- protected:
- char schar;
- };
- ////
- // output a new line
- ////
- class outputNL : public outputToken{
- public:
- outputNL(outputToken* = NULL, int inBefore = 0);
- outputNL(int);
- virtual void draw(textObject *inText) {inText->newLine(myNoLines);}
- virtual int newLine() {return 1;}
- virtual int noLines() {return myNoLines;}
- protected:
- int myNoLines;
- };
- ////
- // inline tokenholder functions
- ////
- inline tokenHolder *tokenHolder::addLine(const char *inStr)
- {addToken(inStr); addToken(new outputNL()); return this;}
- inline tokenHolder *tokenHolder::addSpace(const char *inStr)
- {addToken(inStr); addToken(new outputSpace()); return this;}
- inline tokenHolder *tokenHolder::addSpace(char inC)
- {addToken(inC); addToken(new outputSpace()); return this;}
- ////
- // typedef for file positioning
- ////
- typedef long filePos;
- ////
- // basic memory class (may be used for I/O)
- ////
- class basicMem {
- public:
- basicMem() {myIndex = mySize = 0; myMem= NULL;}
- ~basicMem() {if (mySize) delete myMem;}
- char *contents() {return myMem;}
- unsigned int index() {return myIndex;}
- unsigned int size() {return mySize;}
- protected:
- char *myMem;
- unsigned int myIndex, mySize;
- };
- ////
- // the basic file
- ////
- class basicFile {
- public:
- basicFile(); // constructor
- virtual ~basicFile(); // destructor
- #ifdef macintosh
- filePos pos()
- {
- long file_pos;
- GetFPos( frefNum, &file_pos);
- return (filePos)file_pos ;
- }
- int openedFile() {return 1;} // always open
- int goTo(filePos inPos)
- {
- OSErr ret;
- ret = SetFPos(frefNum,fsFromStart, (long)inPos);
- if (ret == noErr) return 0;
- else if (ret == eofErr) return EOF;
- else FailOSErr(ret );
- }
- #elif __MSDOS__
- filePos pos()
- {
- long file_pos;
- file_pos = tell( frefHand);
- return (filePos)file_pos ;
- }
- int openedFile() {return 1;} // always open
- int goTo(filePos inPos)
- {
- if (lseek( frefHand, (long)inPos, SEEK_SET) == inPos) return 0; //OK
- else return 1; // failure
- }
- #else
- filePos pos() {return ftell(filePtr);}
- int openedFile() {return !!filePtr;}
- int goTo(filePos inPos) {return fseek(filePtr, inPos, 0);}
- #endif
- filePos lastPos() {return myLastPos;}
- protected:
- FILE *filePtr;
- short frefHand; /* ref # for Mac, Handle for pc */
- static char *digits; // needed for both input and output
- #if __MSDOS__
- HugePt buffer, tempBuffer;
- unsigned int hGlobalBuffer;
- #else
- unsigned char *buffer, *tempBuffer;
- #endif
- unsigned long bufferSize, tempBufferSize, tempBufferIndex;
- int doubleBuffer(long);
- filePos myLastPos;
- };
- ////
- // general input
- ////
- class genInput {
- public:
- #if __MSDOS__
- virtual int getBytes(unsigned int noBytes, HugePt) = 0;
- #else
- virtual int getBytes(unsigned int noBytes, unsigned char*) = 0;
- #endif
- };
- ////
- // basic file input
- ////
- class basicInput : public genInput, public basicFile {
- public:
- basicInput(const char *, short=0);
- basicInput(FILE*, short=0, int=0);
- #if __MSDOS__
- virtual int getBytes(unsigned int noBytes, HugePt);
- #else
- virtual int getBytes(unsigned int noBytes, unsigned char*);
- #endif
- virtual int getOffBytes(unsigned int noBytes, unsigned long offset=0)
- {return getBytes(noBytes, buffer + offset);} // convenience function
- protected:
- unsigned long aIndex, bIndex;
- };
- ////
- // basic memory input
- ////
- class memInput : public basicMem, public genInput {
- public:
- memInput() : basicMem() {}
- virtual int getBytes(unsigned int noBytes, unsigned char *inPtr);
- };
- ////
- // basic file output
- ////
- class basicOutput : public basicFile {
- public:
- basicOutput(const char *, short=0);
- int outSep();
- int textIntOut(int inVal, int noSep = 0);
- int textRealOut(float inVal);
- int textHexDump(const unsigned char *inPtr, int);
- int textHexOut(unsigned char);
- protected:
- int outLine(const char *inStr) {return outS(inStr) && endLine();}
- int outToken(const char *inStr) {return outSep() && outS(inStr);}
- int outS(const char*);
- int outC(char c) {return outS(&c, 1);}
- int endLine() {return flushLine();}
- int lineSize, lineIndex, lastSep;
- int outS(const char*, int);
- int putBytes(int inLen) {return putBytes(buffer, inLen);}
- #if __MSDOS__
- int putBytes(HugePt,int);
- #else
- int putBytes(unsigned char *, int);
- #endif
- int flushLine(int=0);
- };
- ////
- // make a kern
- ////
- class outputKern : public outputToken{
- public:
- outputKern(int, outputToken*);
- virtual void draw(textObject*);
- private:
- int myKern;
- };
- #endif
-