home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics 16,000
/
graphics-16000.iso
/
msdos
/
plotting
/
pcgplots
/
basicio.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-24
|
15KB
|
488 lines
// 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