This is roff.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 <ctype.h>
#include "wn.h"
FSSType NewFont;
FSSType OldFont;
RulerType OldRuler;
RulerType NewRuler;
extern char **ctrans;
int InALine = 0;
int InAPara = 0;
int ChangedFont = 1;
int ChangedRuler = 1;
int FooterHeight;
char *FontName();
A16BitInteger FontID();
#define HADJUST(x) (x>72 ? x-72 : 0)
#define MAXLINE 64
typedef struct fontentry FontEntry;
struct fontentry
{
int id; /* the font id */
char *name[4]; /* font names */
};
FontEntry FontTable[] =
{
FontTimes, "R", "B", "I", "(BI",
/*FontCourier, "(PR", "(PB", "I", "(BI",*/
0, 0, 0, 0, 0
};
DoBegin()
{
printf(".lg 0\n"); /* turn off troff ligatures */
/* be sure old ruler and font are different from new ruler and font */
OldRuler.leftMargin = 100000;
OldFont.fontID = 255;
}
SetHFTraps(headHeight,footHeight)
int headHeight, footHeight;
{
/* header */
printf(".wh 0 hh\n");
printf(".de hh\n.sp %dp\n..\n",headHeight);
/* footer */
printf(".wh %dp ff\n",-footHeight);
printf(".de ff\n.bp\n..\n");
FooterHeight = footHeight;
}
DoEnd()
{
}
DoFontChange(theChange)
FSSType *theChange;
{
NewFont.fontID = FontID(theChange->fontID);
NewFont.fontSize = theChange->fontSize;
NewFont.fontStyle = theChange->fontStyle & CanDoStyleMask;
ChangedFont = 1;
}
DoDataChar(theChar)
unsigned char theChar;
{
switch (theChar)
{
case '\r':
if (InALine)
puts("\n.br");
else
puts(".sp");
if (ChangedRuler)
ChangeTheRuler();
InAPara = InALine = 0;
break;
default:
if (!InAPara && ChangedRuler)
ChangeTheRuler();
if (ChangedFont)
ChangeTheFont();
if (!InAPara && NewRuler.leftMargin != NewRuler.paraIndent)
{
NewLine();
printf("'ti %dp\n",NewRuler.paraIndent-NewRuler.leftMargin);
}
if (!InALine && isspace(theChar))
fputs("\\&",stdout);
if (NewFont.fontStyle & StyleUline)
printf("\\o'_%s'",ctrans[theChar]);
else
fputs(ctrans[theChar],stdout);
InAPara = InALine = 1;
break;
}
}
DoMarker(theMarker)
unsigned int theMarker;
{
switch(theMarker)
{
case IDPNumMarker:
if (!InAPara && ChangedRuler)
ChangeTheRuler();
if (ChangedFont)
ChangeTheFont();
fputs("\\n%",stdout);
InALine = InAPara = 1;
break;
case IDDateMarker:
if (!InAPara && ChangedRuler)
ChangeTheRuler();
if (ChangedFont)
ChangeTheFont();
fputs("\\n(mo/\\n(dy/\\n(yr",stdout);
InALine = InAPara = 1;
break;
case IDTimeMarker:
fputs("Dropping time marker.\n",stderr);
break;
case IDFNumMarker:
fputs("Dropping footnote marker.\n",stderr);
break;
}
}
DoRulerChange(theRuler)
RulerType *theRuler;
{
bcopy(theRuler,&NewRuler,sizeof(NewRuler));
ChangedRuler = 1;
}
ChangeTheFont()
{
ChangedFont = 0; /* reset flag */
if (!bcmp(&NewFont,&OldFont,sizeof(OldFont)))
return;
printf("\\f%s",FontName()); /* this will do plain, bold, italic as well */
printf("\\s%d",(NewFont.fontSize*10)/12);
bcopy(&NewFont,&OldFont,sizeof(OldFont));
InALine = 1;
}
ChangeTheRuler()
{
A16BitInteger *theTS;
ChangedRuler = 0;
if (!bcmp(&NewRuler,&OldRuler,sizeof(NewRuler)))
return;
NewLine();
printf("'vs %d\n",NewRuler.lineSpacing);
printf("'ad %s\n",NewRuler.justification==JRight ? "r" :
((NewRuler.justification==JJust ? "b" :
(NewRuler.justification==JCenter ? "c" : "l"))));
printf("'in %dp\n",HADJUST(NewRuler.leftMargin));
printf("'ll %dp\n",HADJUST(NewRuler.rightMargin));
if (*(theTS = NewRuler.tabStops) ||
NewRuler.paraIndent<NewRuler.leftMargin)
{
printf("'ta");
if (NewRuler.paraIndent < NewRuler.leftMargin)
printf(" %dp",NewRuler.leftMargin-NewRuler.paraIndent);
for (;*theTS;theTS++)
{
switch (*theTS & 0x3)
{
case 1:
printf(" %dpC",((*theTS>>2) & 0x3fff) -
(NewRuler.leftMargin));
break;
case 2:
printf(" %dpR",((*theTS>>2) & 0x3fff) -
(NewRuler.leftMargin));
break;
default:
printf(" %dp",((*theTS>>2) & 0x3fff) -
(NewRuler.leftMargin));
break;
}
}
putchar('\n');
}
bcopy(&NewRuler,&OldRuler,sizeof(RulerType));
}
DoNewPage()
{
NewLine();
puts(".ff");
}
char *
FontName()
{
FontEntry *theEntry;
for (theEntry=FontTable; theEntry->name[1] ; theEntry++)
if (theEntry->id==NewFont.fontID)
return (theEntry->name[NewFont.fontStyle & 0x3]);
return (FontTable[0].name[NewFont.fontStyle & 0x3]);
}
A16BitInteger
FontID(theID)
A16BitInteger theID;
{
FontEntry *theEntry;
for (theEntry=FontTable; theEntry->name[1] ; theEntry++)
if (theEntry->id==theID)
return (theEntry->id);
/*fprintf(stderr,"Font id %d not mapped.\n",theID,FontTable[0].id);*/
return (FontTable[0].id);
}
NewLine()
{
if (InALine)
{
putchar('\n');
InALine = 0;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.