1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
/*
* store.c - cawf(1) storage areas
*/
/*
* Copyright (c) 1991 Purdue University Research Foundation,
* West Lafayette, Indiana 47907. All rights reserved.
*
* Written by Victor A. Abell <abe@mace.cc.purdue.edu>, Purdue
* University Computing Center. Not derived from licensed software;
* derived from awf(1) by Henry Spencer of the University of Toronto.
*
* Permission is granted to anyone to use this software for any
* purpose on any computer system, and to alter it and redistribute
* it freely, subject to the following restrictions:
*
* 1. The author is not responsible for any consequences of use of
* this software, even if they arise from flaws in it.
*
* 2. The origin of this software must not be misrepresented, either
* by explicit claim or by omission. Credits must appear in the
* documentation.
*
* 3. Altered versions must be plainly marked as such, and must not
* be misrepresented as being the original software. Credits must
* appear in the documentation.
*
* 4. This notice may not be removed or altered.
*/
#include "cawf.h"
struct rx Pat[] = {
{ "^[.'](i[ef]|el)", NULL}, /* 0 */
{ "^[.']i[ef] !", NULL}, /* 1 */
{ "^[.']i[ef] !?\\\\n\\(\\.\\$(>|>=|=|<|<=)[0-9] ",
NULL}, /* 2 */
{ "^[.']i[ef] !?'\\\\\\$[0-9]'[^']*' ", NULL}, /* 3 */
{ "^[.']i[ef] !?[nt] ", NULL}, /* 4 */
{ "\\\\\\$[0-9]", NULL}, /* 5 */
{ "^[ \t]*$", NULL}, /* 6 */
{ "\\\\|\t|-| ", NULL}, /* 7 */
{ "[.!?:][]\\)'\\\"\\*]*$", NULL}, /* 8 */
{ ",fP", NULL}, /* 9 */
{ ",tP", NULL}, /* 10 */
{ "^(ta|ll|ls|in|ti|po|ne|sp|pl|nr)", NULL}, /* 11 */
{ "^(ll|ls|in|ti|po|pl)", NULL}, /* 12 */
{ "[]\\)'\\\"\\*]", NULL}, /* 13 */
{ "^(LH|CH|RH|LF|CF|RF)", NULL}, /* 14 */
{ "^[.']i[ef]", NULL}, /* 15 */
{ ",fR", NULL}, /* 16 */
{ NULL, NULL} /* END */
};
int Adj = BOTHADJ; /* output line adjustment mode */
unsigned char *Aftnxt = NULL; /* action after next line */
unsigned char *Args[] = { NULL, NULL, /* 10 macro arguments */
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, NULL
};
unsigned char *Argstack[10*MAXSP]; /* stack for Expand()'s "args[]" */
int Backc = 0; /* last word ended with '\\c' */
int Botmarg = 5; /* bottom margin */
int Centering = 0; /* centering count */
int Condstack[MAXSP]; /* stack for Expand()'s "cond" */
unsigned char *Cont = NULL; /* continue line append */
int Contlen = 0; /* continue line append length */
int Curmx = -1; /* current macro index */
char *Device = NULL; /* output device name */
char *Devconf = NULL; /* device configuration file path */
char *Devfont = NULL; /* output device font */
int Divert = 0; /* diversion status */
FILE *Efs = NULL; /* error file stream */
unsigned char *Eol = NULL; /* end of line information */
int Eollen = 0; /* end of line length */
int Err = 0; /* error flag */
unsigned char *F = NULL; /* field value */
struct fcode Fcode[] = { /* font codes */
{ 'B', '\0'}, /* Bold */
{ 'I', '\0'}, /* Italic */
{ 'R', '\0'}, /* Roman */
{ 'C', '\0'}, /* Courier */
{ '\0', '\0'}
};
int Fill = 0; /* fill status */
unsigned char Font[] = { '\0', '\0' }; /* current font */
int Fontctl; /* output font control */
char Fontstat = 'R'; /* output font status */
int Fph = 0; /* first page header status */
int Fsp = 0; /* files stack pointer (for .so) */
struct fontstr Fstr; /* font control strings */
unsigned char *Ftc = NULL; /* center footer */
unsigned char *Ftl = NULL; /* left footer */
unsigned char *Ftr = NULL; /* right footer */
unsigned char *Hdc = NULL; /* center header */
int Hdft = 0; /* header/footer status */
unsigned char *Hdl = NULL; /* left header */
unsigned char *Hdr = NULL; /* right header */
struct hytab Hychar[MAXHYCH]; /* hyphen characters */
FILE *Ifs = NULL; /* input file stream */
FILE *Ifs_stk[MAXFSTK]; /* Ifs stack */
int Ind = 0; /* indentation amount */
unsigned char *Inname = NULL; /* input file name */
unsigned char *Inn_stk[MAXFSTK]; /* Inname stack */
int LL = 78; /* line length (default) */
unsigned char Line[MAXLINE]; /* input line */
int Lockil = 0; /* pass 2 line number is locked
* (processing is inside macro) */
int Marg = 0; /* macro argument - man, ms, etc. */
struct macro Macrotab[MAXMACRO]; /* macro table */
unsigned char *Macrotxt[MAXMTXT]; /* macro text */
int Mtx = 0; /* macro text index */
int Mxstack[MAXSP]; /* stack for Expand()'s "mx" */
int Nfc; /* number of font codes */
int Nhnr[MAXNHNR]; /* ".NH" numbers */
int Nhy = 0; /* number of Hychar[] entries */
int Nleftstack[MAXSP]; /* stack for Expand()'s "nleft" */
int Nmac = 0; /* number of macros */
int Nnr = 0; /* number of Numb[] entries */
int Nospmode = 1; /* no space mode */
int Nparms = 0; /* number of Parms[] entries */
int NR = 0; /* number of record ala awk */
int NR_stk[MAXFSTK]; /* NR stack */
int Nsch = 0; /* number of Schar[] entries */
int Nstr = 0; /* number of entries in Str[] */
int Ntabs = 0; /* number of TAB positions */
struct nbr Numb[MAXNR]; /* number registers */
int Nxtln = 1; /* next line number */
int Outll = -1; /* output line length */
unsigned char Outln[MAXOLL*2]; /* output line */
int Outlx = 0; /* output line index */
int P2il = 0; /* pass 2 input line number */
unsigned char *P2name = NULL; /* pass 2 input file name */
int P3fill = 1; /* pass 3 fill status */
int Padchar[MAXOLL]; /* padding character locations */
int Padfrom = PADLEFT; /* which end to pad from */
int Padx = 0; /* Padchar[] index */
struct parms Parms[] = { /* parameter registers */
{ {'i', 'n'}, "indent", 0, 0 },
{ {'l', 'l'}, "linelen", 0, 0 },
{ {'l', 's'}, "vspace", 0, 0 },
{ {'t', 'i'}, "tempindent", 0, 0 },
{ {'p', 'o'}, "pageoffset", 0, 0 },
{ {'p', 'l'}, "pagelen", 0, 0 },
{ {'\0', '\0'}, NULL, 0, 0 }
};
unsigned char Pass1ln[MAXLINE]; /* pass 1 output line */
unsigned char Pass2ln[MAXLINE]; /* pass 2 output line */
int Pglen = 66; /* page length */
int Pgoff = 0; /* page offset */
char *Pname = NULL; /* program name */
unsigned char Prevfont = '\0'; /* previous font */
int Ptrstack[MAXSP]; /* stack for Expand()'s "ptr" */
struct scale Scale[] = { /* scaling factors */
{ 'i', (240.0) },
{ 'c', ((240.0 * 50.0)/127.0) },
{ 'P', (240.0/6.0) },
{ 'p', (240.0/72.0) },
{ 'u', (1.0) },
{ 'm', (1.0) },
{ 'n', (1.0) },
{ 'v', (1.0) },
{ '\0', (0.0) }
};
double Scalen = 0.0; /* 'n' scaling factor */
double Scaleu = 0.0; /* 'u' scaling factor */
double Scalev = 0.0; /* 'v' scaling factor */
struct schtab Schar[MAXSCH]; /* special characters */
int Sp = -1; /* stack pointer */
struct str Str[MAXSTR]; /* ".ds" strings */
int Sx = -1; /* string index */
int Tabs[MAXEXP+1]; /* TAB positions */
int Thispg = 1; /* this page number */
int Tind = 0; /* temporary indentation amount */
int Topmarg = 5; /* top margin */
unsigned char *Trtbl = NULL; /* .tr table */
int Uhyph = 0; /* hyphen usage state */
int Vspace = 1; /* vertical (inter-text-line) spacing */
unsigned char Word[MAXLINE]; /* pass 2 word buffer */
int Wordl = 0; /* effective length of Word[] */
int Wordx = 0; /* Word[] index */
int Dowarn = 1; /* Enable warnings if true */
|