This is wn.c in view mode; [Download] [Up]
/***********************************************************************
* This program Copyright 1988 by Steven Dorner and the University of
* Illinois Board of Trustees
*
* No warrantees expressed or implied.
*
* This program may be redistributed, provided no charge is made for it.
***********************************************************************/
#include <stdio.h>
#include <signal.h>
#include "wn.h"
#include "table.h"
#include "nextTable.h"
unsigned long GetInteger();
FILE *TheFile;
int Verbose = 0;
char **ctrans;
main(argc,argv)
int argc;
char **argv;
{
DocInfoType theDI;
DocInfoType theOldDI;
A32BitInteger magic;
A32BitInteger version;
ctrans = MacTrans;
for (argc--,argv++; argc&&**argv=='-'; argc--,argv++)
if (argv[0][1]=='v') Verbose=1;
else if (argv[0][1]=='n') ctrans = NeXTTrans;
for (; argc; argc--,argv++)
{
if ((TheFile=fopen(*argv,"r"))==NULL)
{
fprintf(stderr,"Couldn't open %s.\n",*argv);
continue;
}
DoBegin();
magic = GetInteger("magic",4);
version = GetInteger("version",4);
if (Verbose) fputs("\nDocInfo:\n",stderr);
GetDI(&theDI);
if (Verbose) fputs("\nOld DocInfo:\n",stderr);
GetDI(&theOldDI);
SetHFTraps(theDI.headHeight+theDI.pageLayout.pageSlop,theDI.footHeight);
Go(theDI.docMap);
DoEnd();
fclose(TheFile);
}
}
Go(theMapAddr)
HandleDiskAddress theMapAddr;
{
A32BitInteger theOffset;
MapType theMap;
theOffset = theMapAddr & 0xffffff;
SeekTo(theOffset);
GetMap(&theMap);
GoMap(&theMap);
}
GoMap(theMap)
MapType *theMap;
{
int mapCount;
MapElement *theElement;
mapCount = theMap->byteCount / 6;
for (theElement=theMap->mapArray;mapCount;mapCount--,theElement++)
{
if (!(theElement->mapData & NOTTEXT))
GoTextElement(theElement);
}
}
GetMap(theMap)
MapType *theMap;
{
char *malloc();
int mapCount;
MapElement *theElement;
theMap->byteCount = GetInteger("theMap->byteCount",sizeof(theMap->byteCount));
mapCount = theMap->byteCount/6;
theMap->mapArray = (MapElement *) malloc(mapCount*sizeof(MapElement));
for (theElement=theMap->mapArray ; mapCount ; mapCount--,theElement++)
GetMapE(theElement);
}
GetMapE(theElement)
MapElement *theElement;
{
theElement->mapData = GetInteger("theElement->mapData",sizeof(theElement->mapData));
theElement->textHeight = GetInteger("theElement->textHeight",sizeof(theElement->textHeight));
}
SeekTo(theOffset)
long theOffset;
{
if (fseek(TheFile,theOffset,0)<0)
{
fprintf(stderr,"Seek failed.\n");
exit(1);
}
}
unsigned long
GetInteger(what,count)
char *what;
int count;
{
unsigned long theValue=0;
int theChar;
int got;
for (got=0;got<count;got++)
{
theValue *= 256;
theChar = getc(TheFile);
if (theChar == EOF)
{
fprintf(stderr,"unexpected EOF\n");
exit(1);
}
theValue += (unsigned) theChar;
}
if (Verbose)
fprintf(stderr,"%s: %d (0x%0*x)\n",what,theValue,2*count,theValue);
return(theValue);
}
GetDI(it)
DocInfoType *it;
{
it->docMap = GetInteger("it->docMap",sizeof(HandleDiskAddress));
it->headFootMap = GetInteger("it->headFootMap",sizeof(HandleDiskAddress));
it->footNMap = GetInteger("it->footNMap",sizeof(HandleDiskAddress));
it->docWords = GetInteger("it->docWords",sizeof(HandleDiskAddress));
it->docPrintRecord = GetInteger("it->docPrintRecord",sizeof(HandleDiskAddress));
it->screenLayout = GetInteger("it->screenLayout",sizeof(Handle));
it->docDate = GetInteger("it->docDate",sizeof(Handle));
it->docTime = GetInteger("it->docTime",sizeof(Handle));
it->hScrollBar = GetInteger("it->hScrollBar",sizeof(Handle));
it->vScrollBar = GetInteger("it->vScrollBar",sizeof(Handle));
it->unused3 = GetInteger("it->unused3",sizeof(A32BitInteger));
it->docDirID = GetInteger("it->docDirID",sizeof(A32BitInteger));
it->docRefNum = GetInteger("it->docRefNum",sizeof(A16BitInteger));
it->docVRefNum = GetInteger("it->docVRefNum",sizeof(A16BitInteger));
it->unused6 = GetInteger("it->unused6",sizeof(A32BitInteger));
it->docKind = GetInteger("it->docKind",sizeof(Byte));
it->docView = GetInteger("it->docView",sizeof(Byte));
it->dontSaveChanges = GetInteger("it->dontSaveChanges",sizeof(Boolean));
it->doSmartPaste = GetInteger("it->doSmartPaste",sizeof(Boolean));
it->graphicSelected = GetInteger("it->graphicSelected",sizeof(Boolean));
it->markersVis = GetInteger("it->markersVis",sizeof(Boolean));
it->newDoc = GetInteger("it->newDoc",sizeof(Boolean));
it->returnInserted = GetInteger("it->returnInserted",sizeof(Boolean));
it->selectVis = GetInteger("it->selectVis",sizeof(Boolean));
it->spaceVis = GetInteger("it->spaceVis",sizeof(Boolean));
it->squeezeWhenBurn = GetInteger("it->squeezeWhenBurn",sizeof(Boolean));
it->wordsSelected = GetInteger("it->wordsSelected",sizeof(Boolean));
it->writeProtected = GetInteger("it->writeProtected",sizeof(Boolean));
it->unused2 = GetInteger("it->unused2",sizeof(Byte));
GetRect(&it->docRect);
it->docVExtension = GetInteger("it->docVExtension",sizeof(A32BitInteger));
it->footHeight = GetInteger("it->footHeight",sizeof(A16BitInteger));
GetRect(&it->graphicRect);
it->headHeight = GetInteger("it->headHeight",sizeof(A16BitInteger));
it->lastPxlsTilWind = GetInteger("it->lastPxlsTilWind",sizeof(A32BitInteger));
GetPL(&it->pageLayout);
GetEP(&it->selectionEdges);
it->systemName = GetInteger("it->systemName",sizeof(A16BitInteger));
it->wastedBytes = GetInteger("it->wastedBytes",sizeof(A32BitInteger));
it->unused7 = GetInteger("it->unused7",sizeof(A32BitInteger));
it->backupExists = GetInteger("it->backupExists",sizeof(Boolean));
it->docSqueezed = GetInteger("it->docSqueezed",sizeof(Boolean));
GetDS(&it->docSize);
}
GetPoint(it)
Point *it;
{
it->v = GetInteger("it->v",sizeof(A16BitInteger));
it->h = GetInteger("it->h",sizeof(A16BitInteger));
}
GetRect(it)
Rect *it;
{
GetPoint(&it->top);
GetPoint(&it->bottom);
}
GetTE(it)
TextEdge *it;
{
it->tBlockTE = GetInteger("it->tBlockTE",sizeof(HandleDiskAddress));
it->offsetTE = GetInteger("it->offsetTE",sizeof(A16BitInteger));
GetPoint(&it->topTE);
it->heightTE = GetInteger("it->heightTE",sizeof(A16BitInteger));
}
GetEP(it)
EdgePair *it;
{
GetTE(&it->startSelect);
GetTE(&it->endSelect);
}
GetPaper(it)
PaperType *it;
{
it->pHeight = GetInteger("it->pHeight",sizeof(A16BitInteger));
it->pWidth = GetInteger("it->pWidth",sizeof(A16BitInteger));
}
GetBorder(it)
BorderType *it;
{
it->leftBorder = GetInteger("it->leftBorder",sizeof(A32BitFixedPointNumber));
it->rightBorder = GetInteger("it->rightBorder",sizeof(A32BitFixedPointNumber));
it->nonStdPaper = GetInteger("it->nonStdPaper",sizeof(Boolean));
it->altBorders = GetInteger("it->altBorders",sizeof(Boolean));
}
GetCL(it)
ColLOType *it;
{
it->maxColumn = GetInteger("it->maxColumn",sizeof(Byte));
it->column = GetInteger("it->column",sizeof(Byte));
it->widthOfColumns = GetInteger("it->widthOfColumns",sizeof(A16BitInteger));
it->leftEdge = GetInteger("it->leftEdge",sizeof(A16BitInteger));
}
GetPL(it)
PageLOType *it;
{
it->autoFootNote = GetInteger("it->autoFootNote",sizeof(Boolean));
it->fractWidths = GetInteger("it->fractWidths",sizeof(Boolean));
GetBorder(&it->borders);
GetCL(&it->colLayout);
it->docVRes = GetInteger("it->docVRes",sizeof(A16BitInteger));
it->docHRes = GetInteger("it->docHRes",sizeof(A16BitInteger));
it->firstPageNumber = GetInteger("it->firstPageNumber",sizeof(A16BitInteger));
it->pageSlop = GetInteger("it->pageSlop",sizeof(A16BitInteger));
GetPaper(&it->paperSize);
GetRect(&it->printableRect);
it->rulerReduction = GetInteger("it->rulerReduction",sizeof(A16BitInteger));
it->unused8 = GetInteger("it->unused8",sizeof(A32BitInteger));
}
GetDS(it)
DocSizeType *it;
{
it->startDiskAdr = GetInteger("it->startDiskAdr",sizeof(A32BitInteger));
it->cleanEOF = GetInteger("it->cleanEOF",sizeof(A32BitInteger));
it->ourEOF = GetInteger("it->ourEOF",sizeof(A32BitInteger));
it->fileEOF = GetInteger("it->fileEOF",sizeof(A32BitInteger));
it->nextDiskAdr = GetInteger("it->nextDiskAdr",sizeof(A32BitInteger));
}
GoTextElement(theElement)
MapElement *theElement;
{
A16BitInteger byteCount;
unsigned char *buffer;
unsigned char *theChar;
unsigned char dataChar;
char *malloc();
SeekTo(theElement->mapData & 0xffffff);
byteCount = GetInteger("byteCount",sizeof(byteCount));
if (!byteCount)
return;
theChar = buffer = (unsigned char *) malloc(byteCount);
if (!fread(buffer,byteCount,1,TheFile))
{
fprintf(stderr,"read error.\n");
kill(getpid(),SIGQUIT);
exit(1);
}
if (theElement->mapData & FORCEDPAGE)
DoNewPage();
while (theChar - buffer < byteCount)
{
switch(*theChar)
{
case FmtFont: /* Font, size, or style change */
GoFontChange(&theChar);
break;
case FmtGraphics: /* Embedded graphics */
SkipFmt(&theChar);
break;
case FmtMarker: /* Page #, date, time, and footnote marker */
GoMarker(&theChar);
break;
case FmtRuler: /* Paragraph ruler formats */
GoRulerChange(&theChar);
break;
case Fmt4Unused: /* Reserved for future use */
SkipFmt(&theChar);
break;
case FmtTabFill: /* Tab fill */
SkipFmt(&theChar);
break;
case FmtY: /* Subscript or superscript */
SkipFmt(&theChar);
break;
case Fmt1Unused: /* Reserved for future use */
SkipFmt(&theChar);
break;
case FmtFooter: /* Footer definition */
break;
case FmtHeader: /* Header definition */
break;
case FmtFootnote: /* Footnote definition */
break;
case FmtSoftHyphen: /* Soft hyphen */
break;
case Fmt2Unused: /* Reserved for future use */
break;
case Fmt3Unused: /* Reserved for future use */
break;
case LiteralCode: /* Used to represent characters F0 to FF */
dataChar = *++theChar;
dataChar += LiteralCode;
DoDataChar(dataChar);
break;
default:
DoDataChar(*theChar);
break;
}
theChar++;
}
free(buffer);
}
SkipFmt(thePointer)
unsigned char **thePointer;
{
register unsigned char *theChar;
for (theChar= *thePointer; *theChar != FmtEndFmt ; theChar++);
*thePointer = theChar; /* update pointer */
}
#define SETDATACHAR()\
if ((dataChar = *theChar++)==LiteralCode)\
dataChar += *theChar++
GoMarker(thePointer)
unsigned char **thePointer;
{
unsigned char dataChar;
unsigned char *theChar = *thePointer + 1;
SETDATACHAR();
DoMarker(dataChar);
while (*theChar != FmtEndFmt) theChar++;
*thePointer = theChar; /* update pointer */
}
GoFontChange(thePointer)
unsigned char **thePointer;
{
unsigned char dataChar;
register unsigned char *theChar = *thePointer + 1;
FSSType theFont;
SETDATACHAR();
theFont.fontID = dataChar * 256;
SETDATACHAR();
theFont.fontID += dataChar;
SETDATACHAR();
theFont.fontSize = dataChar;
SETDATACHAR();
theFont.fontStyle = dataChar;
DoFontChange(&theFont);
while (*theChar != FmtEndFmt) theChar++;
*thePointer = theChar;
}
GoRulerChange(thePointer)
unsigned char **thePointer;
{
unsigned char dataChar;
RulerType theRuler;
unsigned char *theChar;
theChar = *thePointer + 1;
SETDATACHAR();
theRuler.leftMargin = dataChar * 256;
SETDATACHAR();
theRuler.leftMargin += dataChar;
SETDATACHAR();
theRuler.rightMargin = dataChar * 256;
SETDATACHAR();
theRuler.rightMargin += dataChar;
SETDATACHAR();
theRuler.paraIndent = dataChar * 256;
SETDATACHAR();
theRuler.paraIndent += dataChar;
SETDATACHAR();
theRuler.justification = dataChar;
SETDATACHAR();
theRuler.lineSpacing = dataChar;
GetTabs(&theChar,theRuler.tabStops);
DoRulerChange(&theRuler);
*thePointer = theChar;
}
GetTabs(thePointer,tabStops)
unsigned char **thePointer;
A16BitInteger tabStops[];
{
unsigned char *theChar;
A16BitInteger *theStop;
int byteCount=0;
theChar = *thePointer;
theStop = tabStops;
*theStop = 0;
for (; *theChar != FmtEndFmt ; theChar++)
{
*theStop += *theChar;
if (*theChar != LiteralCode)
{
if ((byteCount++ % 2)==1)
*++theStop = 0;
else
*theStop *= 256;
}
}
*thePointer = theChar;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.