2004-05-15 23:24:00 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <limits.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <string.h>
|
2004-05-16 07:55:57 +00:00
|
|
|
#include <unistd.h>
|
2004-05-15 23:24:00 +00:00
|
|
|
|
2004-05-16 07:55:57 +00:00
|
|
|
#undef MB_CUR_MAX
|
|
|
|
#define MB_CUR_MAX 3
|
2004-05-15 23:24:00 +00:00
|
|
|
|
2004-05-16 07:55:57 +00:00
|
|
|
#define NROFF (!TROFF)
|
2004-05-15 23:24:00 +00:00
|
|
|
|
|
|
|
/* Site dependent definitions */
|
|
|
|
|
|
|
|
#ifndef TMACDIR
|
|
|
|
#define TMACDIR "lib/tmac/tmac."
|
|
|
|
#endif
|
|
|
|
#ifndef FONTDIR
|
|
|
|
#define FONTDIR "lib/font"
|
|
|
|
#endif
|
|
|
|
#ifndef NTERMDIR
|
|
|
|
#define NTERMDIR "lib/term/tab."
|
|
|
|
#endif
|
|
|
|
#ifndef TDEVNAME
|
|
|
|
#define TDEVNAME "post"
|
|
|
|
#endif
|
|
|
|
#ifndef NDEVNAME
|
|
|
|
#define NDEVNAME "37"
|
|
|
|
#endif
|
|
|
|
#ifndef TEXHYPHENS
|
|
|
|
#define TEXHYPHENS "/usr/lib/tex/macros/hyphen.tex"
|
|
|
|
#endif
|
|
|
|
#ifndef ALTHYPHENS
|
|
|
|
#define ALTHYPHENS "lib/tmac/hyphen.tex" /* another place to look */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef unsigned char Uchar;
|
|
|
|
typedef unsigned short Ushort;
|
|
|
|
|
|
|
|
typedef /*unsigned*/ long Tchar;
|
|
|
|
|
|
|
|
typedef struct Blockp Blockp;
|
|
|
|
typedef struct Diver Diver;
|
|
|
|
typedef struct Stack Stack;
|
|
|
|
typedef struct Divsiz Divsiz;
|
|
|
|
typedef struct Contab Contab;
|
|
|
|
typedef struct Numtab Numtab;
|
|
|
|
typedef struct Numerr Numerr;
|
|
|
|
typedef struct Env Env;
|
|
|
|
typedef struct Term Term;
|
|
|
|
typedef struct Chwid Chwid;
|
|
|
|
typedef struct Font Font;
|
|
|
|
typedef struct Spnames Spnames;
|
|
|
|
typedef struct Wcache Wcache;
|
|
|
|
typedef struct Tbuf Tbuf;
|
|
|
|
|
|
|
|
/* this simulates printf into a buffer that gets flushed sporadically */
|
|
|
|
/* the BSD goo is because SunOS sprintf doesn't return anything useful */
|
|
|
|
|
|
|
|
#ifdef BSD4_2
|
|
|
|
#define OUT (obufp += strlen(sprintf(obufp,
|
|
|
|
#define PUT ))) > obuf+BUFSIZ ? flusho() : 1
|
|
|
|
#else
|
|
|
|
#define OUT (obufp += sprintf(obufp,
|
|
|
|
#define PUT )) > obuf+BUFSIZ ? flusho() : 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define oputs(a) OUT "%s", a PUT
|
|
|
|
#define oput(c) ( *obufp++ = (c), obufp > obuf+BUFSIZ ? flusho() : 1 )
|
|
|
|
|
|
|
|
extern char errbuf[];
|
|
|
|
#define ERROR sprintf(errbuf,
|
|
|
|
#define WARN ), errprint()
|
|
|
|
#define FATAL ), errprint(), exit(1)
|
|
|
|
|
|
|
|
/* starting values for typesetting parameters: */
|
|
|
|
|
|
|
|
#define PS 10 /* default point size */
|
|
|
|
#define FT 1 /* default font position */
|
|
|
|
#define ULFONT 2 /* default underline font */
|
|
|
|
#define BDFONT 3 /* default emboldening font */
|
|
|
|
#define BIFONT 4 /* default bold italic font */
|
|
|
|
#define LL (unsigned) 65*INCH/10 /* line length; 39picas=6.5in */
|
|
|
|
#define VS ((12*INCH)/72) /* initial vert space */
|
|
|
|
|
|
|
|
|
|
|
|
#define EMPTS(pts) (((long)Inch*(pts) + 36) / 72)
|
|
|
|
#define EM (TROFF? EMPTS(pts): t.Em)
|
|
|
|
#define INCH (TROFF? Inch: 240)
|
|
|
|
#define HOR (TROFF? Hor: t.Adj)
|
|
|
|
#define VERT (TROFF? Vert: t.Vert)
|
|
|
|
#define PO (TROFF? Inch: 0)
|
|
|
|
#define SPS (TROFF? EMPTS(pts)/3: INCH/10)
|
|
|
|
#define SS (TROFF? 12: INCH/10)
|
|
|
|
#define ICS (TROFF? EMPTS(pts): 2*INCH/10)
|
|
|
|
#define DTAB (TROFF? (INCH/2): 0)
|
|
|
|
|
|
|
|
/* These "characters" are used to encode various internal functions
|
|
|
|
/* Some make use of the fact that most ascii characters between
|
|
|
|
/* 0 and 040 don't have any graphic or other function.
|
|
|
|
/* The few that do have a purpose (e.g., \n, \b, \t, ...
|
|
|
|
/* are avoided by the ad hoc choices here.
|
|
|
|
/* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define LEADER 001
|
|
|
|
#define IMP 004 /* impossible char; glues things together */
|
|
|
|
#define TAB 011
|
|
|
|
#define RPT 014 /* next character is to be repeated many times */
|
|
|
|
#define CHARHT 015 /* size field sets character height */
|
|
|
|
#define SLANT 016 /* size field sets amount of slant */
|
|
|
|
#define DRAWFCN 017 /* next several chars describe arb drawing fcns */
|
|
|
|
# define DRAWLINE 'l' /* line: 'l' dx dy char */
|
|
|
|
# define DRAWCIRCLE 'c' /* circle: 'c' r */
|
|
|
|
# define DRAWELLIPSE 'e' /* ellipse: 'e' rx ry */
|
|
|
|
# define DRAWARC 'a' /* arc: 'a' dx dy dx dy */
|
|
|
|
# define DRAWSPLINE '~' /* quadratic B spline: '~' dx dy dx dy ... */
|
|
|
|
/* other splines go thru too */
|
|
|
|
/* NOTE: the use of ~ is a botch since it's often used in .tr commands */
|
|
|
|
/* better to use a letter like s, but change it in the postprocessors too */
|
|
|
|
/* for now, this is taken care of in n9.c and t10.c */
|
|
|
|
# define DRAWBUILD 'b' /* built-up character (e.g., { */
|
|
|
|
|
|
|
|
#define LEFT 020 /* \{ */
|
|
|
|
#define RIGHT 021 /* \} */
|
|
|
|
#define FILLER 022 /* \& and similar purposes */
|
|
|
|
#define XON 023 /* \X'...' starts here */
|
|
|
|
#define OHC 024 /* optional hyphenation character \% */
|
|
|
|
#define CONT 025 /* \c character */
|
|
|
|
#define PRESC 026 /* printable escape */
|
|
|
|
#define UNPAD 027 /* unpaddable blank */
|
|
|
|
#define XPAR 030 /* transparent mode indicator */
|
|
|
|
#define FLSS 031 /* next Tchar contains vertical space */
|
|
|
|
/* used when recalling diverted text */
|
|
|
|
#define WORDSP 032 /* paddable word space */
|
|
|
|
#define ESC 033 /* current escape character */
|
|
|
|
#define XOFF 034 /* \X'...' ends here */
|
|
|
|
/* matches XON, but they will probably never nest */
|
|
|
|
/* so could drop this when another control is needed */
|
|
|
|
#define HX 035 /* next character is value of \x'...' */
|
|
|
|
#define MOTCH 036 /* this "character" is really motion; used by cbits() */
|
|
|
|
|
|
|
|
#define HYPHEN c_hyphen
|
|
|
|
#define EMDASH c_emdash /* \(em */
|
|
|
|
#define RULE c_rule /* \(ru */
|
|
|
|
#define MINUS c_minus /* minus sign on current font */
|
|
|
|
#define LIG_FI c_fi /* \(ff */
|
|
|
|
#define LIG_FL c_fl /* \(fl */
|
|
|
|
#define LIG_FF c_ff /* \(ff */
|
|
|
|
#define LIG_FFI c_ffi /* \(Fi */
|
|
|
|
#define LIG_FFL c_ffl /* \(Fl */
|
|
|
|
#define ACUTE c_acute /* acute accent \(aa */
|
|
|
|
#define GRAVE c_grave /* grave accent \(ga */
|
|
|
|
#define UNDERLINE c_under /* \(ul */
|
|
|
|
#define ROOTEN c_rooten /* root en \(rn */
|
|
|
|
#define BOXRULE c_boxrule /* box rule \(br */
|
|
|
|
#define LEFTHAND c_lefthand /* left hand for word overflow */
|
|
|
|
#define DAGGER c_dagger /* dagger for end of sentence/footnote */
|
|
|
|
|
|
|
|
#define HYPHALG 1 /* hyphenation algorithm: 0=>good old troff, 1=>tex */
|
|
|
|
|
|
|
|
|
|
|
|
/* array sizes, and similar limits: */
|
|
|
|
|
|
|
|
#define MAXFONTS 99 /* Maximum number of fonts in fontab */
|
2005-12-14 20:07:55 +00:00
|
|
|
#define NM 91 /* requests + macros */
|
2004-05-15 23:24:00 +00:00
|
|
|
#define NN NNAMES /* number registers */
|
|
|
|
#define NNAMES 15 /* predefined reg names */
|
|
|
|
#define NIF 15 /* if-else nesting */
|
|
|
|
#define NS 128 /* name buffer */
|
|
|
|
#define NTM 1024 /* tm buffer */
|
|
|
|
#define NEV 3 /* environments */
|
|
|
|
#define EVLSZ 10 /* size of ev stack */
|
|
|
|
|
2005-12-29 20:55:46 +00:00
|
|
|
#define STACKSIZE (12*1024) /* stack for macros and strings in progress */
|
2004-05-15 23:24:00 +00:00
|
|
|
#define NHYP 10 /* max hyphens per word */
|
|
|
|
#define NHEX 512 /* byte size of exception word list */
|
|
|
|
#define NTAB 100 /* tab stops */
|
|
|
|
#define NSO 5 /* "so" depth */
|
|
|
|
#define NMF 5 /* number of -m flags */
|
|
|
|
#define WDSIZE 500 /* word buffer click size */
|
|
|
|
#define LNSIZE 4000 /* line buffer click size */
|
|
|
|
#define OLNSIZE 5000 /* output line buffer click; bigger for 'w', etc. */
|
|
|
|
#define NDI 5 /* number of diversions */
|
|
|
|
|
|
|
|
#define ALPHABET alphabet /* number of characters in basic alphabet. */
|
|
|
|
/* 128 for parochial USA 7-bit ascii, */
|
|
|
|
/* 256 for "European" mode with e.g., Latin-1 */
|
|
|
|
|
|
|
|
/* NCHARS must be greater than
|
|
|
|
ALPHABET (ascii stuff) + total number of distinct char names
|
|
|
|
from all fonts that will be run in this job (including
|
|
|
|
unnamed ones and \N's)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define NCHARS (8*1024) /* maximum size of troff character set*/
|
|
|
|
|
|
|
|
|
|
|
|
/* However for nroff you want only :
|
|
|
|
1. number of special codes in charset of DESC, which ends up being the
|
|
|
|
value of nchtab and which must be less than 512.
|
|
|
|
2. ALPHABET, which apparently is the size of the portion of the tables reserved
|
|
|
|
for special control symbols
|
|
|
|
Apparently the max N of \N is irrelevant; */
|
|
|
|
/* to allow \N of up to 254 with up to 338 special characters
|
|
|
|
you need NCHARS of 338 + ALPHABET = 466 */
|
|
|
|
|
|
|
|
#define NROFFCHARS 1024 /* maximum size of nroff character set */
|
|
|
|
|
|
|
|
#define NTRTAB NCHARS /* number of items in trtab[] */
|
|
|
|
#define NWIDCACHE NCHARS /* number of items in widcache[] */
|
|
|
|
|
|
|
|
#define NTRAP 20 /* number of traps */
|
|
|
|
#define NPN 20 /* numbers in "-o" */
|
|
|
|
#define FBUFSZ 512 /* field buf size words */
|
|
|
|
#define IBUFSZ 4096 /* bytes */
|
|
|
|
#define NC 1024 /* cbuf size words */
|
|
|
|
#define NOV 10 /* number of overstrike chars */
|
|
|
|
#define NPP 10 /* pads per field */
|
|
|
|
|
|
|
|
/*
|
|
|
|
Internal character representation:
|
|
|
|
Internally, every character is carried around as
|
|
|
|
a 32 bit cookie, called a "Tchar" (typedef long).
|
|
|
|
Bits are numbered 31..0 from left to right.
|
|
|
|
If bit 15 is 1, the character is motion, with
|
|
|
|
if bit 16 it's vertical motion
|
|
|
|
if bit 17 it's negative motion
|
|
|
|
If bit 15 is 0, the character is a real character.
|
|
|
|
if bit 31 zero motion
|
|
|
|
bits 30..24 size
|
|
|
|
bits 23..16 font
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* in the following, "L" should really be a Tchar, but ... */
|
|
|
|
/* numerology leaves room for 16 bit chars */
|
|
|
|
|
|
|
|
#define MOT (01uL << 16) /* motion character indicator */
|
|
|
|
#define VMOT (01uL << 30) /* vertical motion bit */
|
|
|
|
#define NMOT (01uL << 29) /* negative motion indicator */
|
|
|
|
/* #define MOTV (MOT|VMOT|NMOT) /* motion flags */
|
|
|
|
/* #define MAXMOT (~MOTV) /* maximum motion permitted */
|
|
|
|
#define MAXMOT 0xFFFF
|
|
|
|
|
|
|
|
#define ismot(n) ((n) & MOT)
|
|
|
|
#define isvmot(n) (((n) & (MOT|VMOT)) == (MOT|VMOT)) /* must have tested MOT previously */
|
|
|
|
#define isnmot(n) (((n) & (MOT|NMOT)) == (MOT|NMOT)) /* ditto */
|
|
|
|
#define absmot(n) ((n) & 0xFFFF)
|
|
|
|
|
|
|
|
#define ZBIT (01uL << 31) /* zero width char */
|
|
|
|
#define iszbit(n) ((n) & ZBIT)
|
|
|
|
|
|
|
|
#define FSHIFT 17
|
|
|
|
#define SSHIFT (FSHIFT+7)
|
|
|
|
#define SMASK (0177uL << SSHIFT) /* 128 distinct sizes */
|
|
|
|
#define FMASK (0177uL << FSHIFT) /* 128 distinct fonts */
|
|
|
|
#define SFMASK (SMASK|FMASK) /* size and font in a Tchar */
|
|
|
|
#define sbits(n) (((n) >> SSHIFT) & 0177)
|
|
|
|
#define fbits(n) (((n) >> FSHIFT) & 0177)
|
|
|
|
#define sfbits(n) (((n) & SFMASK) >> FSHIFT)
|
|
|
|
#define cbits(n) ((n) & 0x1FFFF) /* isolate character bits, */
|
|
|
|
/* but don't include motions */
|
|
|
|
extern int realcbits(Tchar);
|
|
|
|
|
|
|
|
#define setsbits(n,s) n = (n & ~SMASK) | (Tchar)(s) << SSHIFT
|
|
|
|
#define setfbits(n,f) n = (n & ~FMASK) | (Tchar)(f) << FSHIFT
|
|
|
|
#define setsfbits(n,sf) n = (n & ~SFMASK) | (Tchar)(sf) << FSHIFT
|
|
|
|
#define setcbits(n,c) n = (n & ~0xFFFFuL | (c)) /* set character bits */
|
|
|
|
|
|
|
|
#define BYTEMASK 0377
|
|
|
|
#define BYTE 8
|
|
|
|
|
|
|
|
#define SHORTMASK 0XFFFF
|
|
|
|
#define SHORT 16
|
|
|
|
|
|
|
|
#define TABMASK ((unsigned) INT_MAX >> 1)
|
|
|
|
#define RTAB ((TABMASK << 1) & ~TABMASK)
|
|
|
|
#define CTAB (RTAB << 1)
|
|
|
|
|
|
|
|
#define TABBIT 02 /* bits in gchtab */
|
|
|
|
#define LDRBIT 04
|
|
|
|
#define FCBIT 010
|
|
|
|
|
|
|
|
#define PAIR(A,B) (A|(B<<SHORT))
|
|
|
|
|
|
|
|
|
|
|
|
extern int Inch, Hor, Vert, Unitwidth;
|
|
|
|
|
|
|
|
struct Spnames
|
|
|
|
{
|
|
|
|
int *n;
|
|
|
|
char *v;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Spnames spnames[];
|
|
|
|
|
|
|
|
/*
|
|
|
|
String and macro definitions are stored conceptually in a giant array
|
|
|
|
indexed by type Offset. In olden times, this array was real, and thus
|
|
|
|
both huge and limited in size, leading to the "Out of temp file space"
|
|
|
|
error. In this version, the array is represented by a list of blocks,
|
|
|
|
pointed to by blist[].bp. Each block is of size BLK Tchars, and BLK
|
|
|
|
MUST be a power of 2 for the macros below to work.
|
|
|
|
|
|
|
|
The blocks associated with a particular string or macro are chained
|
|
|
|
together in the array blist[]. Each blist[i].nextoff contains the
|
|
|
|
Offset associated with the next block in the giant array, or -1 if
|
|
|
|
this is the last block in the chain. If .nextoff is 0, the block is
|
|
|
|
free.
|
|
|
|
|
|
|
|
To find the right index in blist for an Offset, divide by BLK.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define NBLIST 2048 /* starting number of blocks in all definitions */
|
|
|
|
|
|
|
|
#define BLK 128 /* number of Tchars in a block; must be 2^N with defns below */
|
|
|
|
|
|
|
|
#define rbf0(o) (blist[bindex(o)].bp[boffset(o)])
|
|
|
|
#define bindex(o) ((o) / BLK)
|
|
|
|
#define boffset(o) ((o) & (BLK-1))
|
|
|
|
#define pastend(o) (((o) & (BLK-1)) == 0)
|
|
|
|
/* #define incoff(o) ( (++o & (BLK-1)) ? o : blist[bindex(o-1)].nextoff ) */
|
|
|
|
#define incoff(o) ( (((o)+1) & (BLK-1)) ? o+1 : blist[bindex(o)].nextoff )
|
|
|
|
|
|
|
|
#define skipline(f) while (getc(f) != '\n')
|
|
|
|
#define is(s) (strcmp(cmd, s) == 0)
|
|
|
|
#define eq(s1, s2) (strcmp(s1, s2) == 0)
|
|
|
|
|
|
|
|
|
|
|
|
typedef unsigned long Offset; /* an offset in macro/string storage */
|
|
|
|
|
|
|
|
struct Blockp { /* info about a block: */
|
|
|
|
Tchar *bp; /* the data */
|
|
|
|
Offset nextoff; /* offset of next block in a chain */
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Blockp *blist;
|
|
|
|
|
|
|
|
#define RD_OFFSET (1 * BLK) /* .rd command uses block 1 */
|
|
|
|
|
|
|
|
struct Diver { /* diversion */
|
|
|
|
Offset op;
|
|
|
|
int dnl;
|
|
|
|
int dimac;
|
|
|
|
int ditrap;
|
|
|
|
int ditf;
|
|
|
|
int alss;
|
|
|
|
int blss;
|
|
|
|
int nls;
|
|
|
|
int mkline;
|
|
|
|
int maxl;
|
|
|
|
int hnl;
|
|
|
|
int curd;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Stack { /* stack frame */
|
|
|
|
int nargs;
|
|
|
|
Stack *pframe;
|
|
|
|
Offset pip;
|
|
|
|
int pnchar;
|
|
|
|
Tchar prchar;
|
|
|
|
int ppendt;
|
|
|
|
Tchar pch;
|
|
|
|
Tchar *lastpbp;
|
|
|
|
int mname;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Stack s;
|
|
|
|
|
|
|
|
struct Divsiz {
|
|
|
|
int dix;
|
|
|
|
int diy;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Contab { /* command or macro */
|
|
|
|
unsigned int rq;
|
|
|
|
Contab *link;
|
|
|
|
void (*f)(void);
|
|
|
|
Offset mx;
|
|
|
|
Offset emx;
|
|
|
|
Divsiz *divsiz;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define C(a,b) {a, 0, b, 0, 0} /* how to initialize a contab entry */
|
|
|
|
|
|
|
|
extern Contab contab[NM];
|
|
|
|
|
|
|
|
struct Numtab { /* number registers */
|
|
|
|
unsigned int r; /* name */
|
|
|
|
int val;
|
|
|
|
short fmt;
|
|
|
|
short inc;
|
|
|
|
Numtab *link;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Numtab numtab[NN];
|
|
|
|
|
|
|
|
#define PN 0
|
|
|
|
#define NL 1
|
|
|
|
#define YR 2
|
|
|
|
#define HP 3
|
|
|
|
#define CT 4
|
|
|
|
#define DN 5
|
|
|
|
#define MO 6
|
|
|
|
#define DY 7
|
|
|
|
#define DW 8
|
|
|
|
#define LN 9
|
|
|
|
#define DL 10
|
|
|
|
#define ST 11
|
|
|
|
#define SB 12
|
|
|
|
#define CD 13
|
|
|
|
#define PID 14
|
|
|
|
|
|
|
|
struct Wcache { /* width cache, indexed by character */
|
|
|
|
short fontpts;
|
|
|
|
short width;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Tbuf { /* growable Tchar buffer */
|
|
|
|
Tchar *_bufp;
|
|
|
|
unsigned int _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* the infamous environment block */
|
|
|
|
|
|
|
|
#define ics envp->_ics
|
|
|
|
#define sps envp->_sps
|
|
|
|
#define spacesz envp->_spacesz
|
|
|
|
#define lss envp->_lss
|
|
|
|
#define lss1 envp->_lss1
|
|
|
|
#define ll envp->_ll
|
|
|
|
#define ll1 envp->_ll1
|
|
|
|
#define lt envp->_lt
|
|
|
|
#define lt1 envp->_lt1
|
|
|
|
#define ic envp->_ic
|
|
|
|
#define icf envp->_icf
|
|
|
|
#define chbits envp->_chbits
|
|
|
|
#define spbits envp->_spbits
|
|
|
|
#define nmbits envp->_nmbits
|
|
|
|
#define apts envp->_apts
|
|
|
|
#define apts1 envp->_apts1
|
|
|
|
#define pts envp->_pts
|
|
|
|
#define pts1 envp->_pts1
|
|
|
|
#define font envp->_font
|
|
|
|
#define font1 envp->_font1
|
|
|
|
#define ls envp->_ls
|
|
|
|
#define ls1 envp->_ls1
|
|
|
|
#define ad envp->_ad
|
|
|
|
#define nms envp->_nms
|
|
|
|
#define ndf envp->_ndf
|
|
|
|
#define nmwid envp->_nmwid
|
|
|
|
#define fi envp->_fi
|
|
|
|
#define cc envp->_cc
|
|
|
|
#define c2 envp->_c2
|
|
|
|
#define ohc envp->_ohc
|
|
|
|
#define tdelim envp->_tdelim
|
|
|
|
#define hyf envp->_hyf
|
|
|
|
#define hyoff envp->_hyoff
|
|
|
|
#define hyphalg envp->_hyphalg
|
|
|
|
#define un1 envp->_un1
|
|
|
|
#define tabc envp->_tabc
|
|
|
|
#define dotc envp->_dotc
|
|
|
|
#define adsp envp->_adsp
|
|
|
|
#define adrem envp->_adrem
|
|
|
|
#define lastl envp->_lastl
|
|
|
|
#define nel envp->_nel
|
|
|
|
#define admod envp->_admod
|
|
|
|
#define wordp envp->_wordp
|
|
|
|
#define spflg envp->_spflg
|
|
|
|
#define linep envp->_linep
|
|
|
|
#define wdend envp->_wdend
|
|
|
|
#define wdstart envp->_wdstart
|
|
|
|
#define wne envp->_wne
|
|
|
|
#define ne envp->_ne
|
|
|
|
#define nc envp->_nc
|
|
|
|
#define nb envp->_nb
|
|
|
|
#define lnmod envp->_lnmod
|
|
|
|
#define nwd envp->_nwd
|
|
|
|
#define nn envp->_nn
|
|
|
|
#define ni envp->_ni
|
|
|
|
#define ul envp->_ul
|
|
|
|
#define cu envp->_cu
|
|
|
|
#define ce envp->_ce
|
|
|
|
#define in envp->_in
|
|
|
|
#define in1 envp->_in1
|
|
|
|
#define un envp->_un
|
|
|
|
#define wch envp->_wch
|
|
|
|
#define pendt envp->_pendt
|
|
|
|
#define pendw envp->_pendw
|
|
|
|
#define pendnf envp->_pendnf
|
|
|
|
#define spread envp->_spread
|
|
|
|
#define it envp->_it
|
|
|
|
#define itmac envp->_itmac
|
|
|
|
#define hyptr envp->_hyptr
|
|
|
|
#define tabtab envp->_tabtab
|
|
|
|
#define line envp->_line._bufp
|
|
|
|
#define lnsize envp->_line._size
|
|
|
|
#define word envp->_word._bufp
|
|
|
|
#define wdsize envp->_word._size
|
|
|
|
|
|
|
|
#define oline _oline._bufp
|
|
|
|
#define olnsize _oline._size
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note:
|
|
|
|
* If this structure changes in ni.c, you must change
|
|
|
|
* this as well, and vice versa.
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct Env {
|
|
|
|
int _ics;
|
|
|
|
int _sps;
|
|
|
|
int _spacesz;
|
|
|
|
int _lss;
|
|
|
|
int _lss1;
|
|
|
|
int _ll;
|
|
|
|
int _ll1;
|
|
|
|
int _lt;
|
|
|
|
int _lt1;
|
|
|
|
Tchar _ic;
|
|
|
|
int _icf;
|
|
|
|
Tchar _chbits;
|
|
|
|
Tchar _spbits;
|
|
|
|
Tchar _nmbits;
|
|
|
|
int _apts;
|
|
|
|
int _apts1;
|
|
|
|
int _pts;
|
|
|
|
int _pts1;
|
|
|
|
int _font;
|
|
|
|
int _font1;
|
|
|
|
int _ls;
|
|
|
|
int _ls1;
|
|
|
|
int _ad;
|
|
|
|
int _nms;
|
|
|
|
int _ndf;
|
|
|
|
int _nmwid;
|
|
|
|
int _fi;
|
|
|
|
int _cc;
|
|
|
|
int _c2;
|
|
|
|
int _ohc;
|
|
|
|
int _tdelim;
|
|
|
|
int _hyf;
|
|
|
|
int _hyoff;
|
|
|
|
int _hyphalg;
|
|
|
|
int _un1;
|
|
|
|
int _tabc;
|
|
|
|
int _dotc;
|
|
|
|
int _adsp;
|
|
|
|
int _adrem;
|
|
|
|
int _lastl;
|
|
|
|
int _nel;
|
|
|
|
int _admod;
|
|
|
|
Tchar *_wordp;
|
|
|
|
int _spflg;
|
|
|
|
Tchar *_linep;
|
|
|
|
Tchar *_wdend;
|
|
|
|
Tchar *_wdstart;
|
|
|
|
int _wne;
|
|
|
|
int _ne;
|
|
|
|
int _nc;
|
|
|
|
int _nb;
|
|
|
|
int _lnmod;
|
|
|
|
int _nwd;
|
|
|
|
int _nn;
|
|
|
|
int _ni;
|
|
|
|
int _ul;
|
|
|
|
int _cu;
|
|
|
|
int _ce;
|
|
|
|
int _in;
|
|
|
|
int _in1;
|
|
|
|
int _un;
|
|
|
|
int _wch;
|
|
|
|
int _pendt;
|
|
|
|
Tchar *_pendw;
|
|
|
|
int _pendnf;
|
|
|
|
int _spread;
|
|
|
|
int _it;
|
|
|
|
int _itmac;
|
|
|
|
Tchar *_hyptr[NHYP];
|
|
|
|
long _tabtab[NTAB];
|
|
|
|
Tbuf _line;
|
|
|
|
Tbuf _word;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Env env[];
|
|
|
|
extern Env *envp;
|
|
|
|
|
|
|
|
enum { MBchar = 'U', Troffchar = 'C', Number = 'N', Install = 'i', Lookup = 'l' };
|
|
|
|
/* U => utf, for instance; C => \(xx, N => \N'...' */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Chwid { /* data on one character */
|
|
|
|
Ushort num; /* character number:
|
|
|
|
0 -> not on this font
|
|
|
|
>= ALPHABET -> its number among all Cxy's */
|
|
|
|
Ushort code; /* char code for actual device. used for \N */
|
|
|
|
char *str; /* code string for nroff */
|
|
|
|
Uchar wid; /* width */
|
|
|
|
Uchar kern; /* ascender/descender */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Font { /* characteristics of a font */
|
|
|
|
int name; /* int name, e.g., BI (2 chars) */
|
|
|
|
char longname[64]; /* long name of this font (e.g., "Bembo" */
|
|
|
|
char *truename; /* path name of table if not in standard place */
|
|
|
|
int nchars; /* number of width entries for this font */
|
|
|
|
char specfont; /* 1 == special font */
|
|
|
|
int spacewidth; /* width of space on this font */
|
|
|
|
int defaultwidth; /* default width of characters on this font */
|
|
|
|
Chwid *wp; /* widths, etc., of the real characters */
|
|
|
|
char ligfont; /* 1 == ligatures exist on this font */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* ligatures, ORed into ligfont */
|
|
|
|
|
|
|
|
#define LFF 01
|
|
|
|
#define LFI 02
|
|
|
|
#define LFL 04
|
|
|
|
#define LFFI 010
|
|
|
|
#define LFFL 020
|
|
|
|
|
|
|
|
/* tracing modes */
|
|
|
|
#define TRNARGS 01 /* trace legality of numeric arguments */
|
|
|
|
#define TRREQ 02 /* trace requests */
|
|
|
|
#define TRMAC 04 /* trace macros */
|
|
|
|
#define RQERR 01 /* processing request/macro */
|
|
|
|
|
|
|
|
/* typewriter driving table structure */
|
|
|
|
|
|
|
|
|
|
|
|
extern Term t;
|
|
|
|
struct Term {
|
|
|
|
int bset; /* these bits have to be on */
|
|
|
|
int breset; /* these bits have to be off */
|
|
|
|
int Hor; /* #units in minimum horiz motion */
|
|
|
|
int Vert; /* #units in minimum vert motion */
|
|
|
|
int Newline; /* #units in single line space */
|
|
|
|
int Char; /* #units in character width */
|
|
|
|
int Em; /* ditto */
|
|
|
|
int Halfline; /* half line units */
|
|
|
|
int Adj; /* minimum units for horizontal adjustment */
|
|
|
|
char *twinit; /* initialize terminal */
|
|
|
|
char *twrest; /* reinitialize terminal */
|
|
|
|
char *twnl; /* terminal sequence for newline */
|
|
|
|
char *hlr; /* half-line reverse */
|
|
|
|
char *hlf; /* half-line forward */
|
|
|
|
char *flr; /* full-line reverse */
|
|
|
|
char *bdon; /* turn bold mode on */
|
|
|
|
char *bdoff; /* turn bold mode off */
|
|
|
|
char *iton; /* turn italic mode on */
|
|
|
|
char *itoff; /* turn italic mode off */
|
|
|
|
char *ploton; /* turn plot mode on */
|
|
|
|
char *plotoff; /* turn plot mode off */
|
|
|
|
char *up; /* sequence to move up in plot mode */
|
|
|
|
char *down; /* ditto */
|
|
|
|
char *right; /* ditto */
|
|
|
|
char *left; /* ditto */
|
|
|
|
|
|
|
|
Font tfont; /* widths and other info, as in a troff font */
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Term t;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* for error reporting; keep track of escapes/requests with numeric arguments
|
|
|
|
*/
|
|
|
|
struct Numerr {
|
|
|
|
char type; /* request or escape? */
|
|
|
|
char esc; /* was escape sequence named esc */
|
|
|
|
char escarg; /* argument of esc's like \D'l' */
|
|
|
|
unsigned int req; /* was request or macro named req */
|
|
|
|
};
|