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.