ftp.nice.ch/pub/next/unix/text/Wn2troff.s.tar.gz#/Wn2troff/wn.c

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.