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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#ifndef PI
#define PI 3.1415926535897932384626433832795028841971693993751
#endif
#define MAXWID 8.5 /* default limits max picture to 8.5 x 11; */
#define MAXHT 11 /* change to taste without peril */
#define dprintf if(dbg)printf
extern char errbuf[200];
#define ERROR sprintf(errbuf,
#define FATAL ), yyerror(errbuf), exit(1)
#define WARNING ), yyerror(errbuf)
#define DEFAULT 0
#define HEAD1 1
#define HEAD2 2
#define HEAD12 (HEAD1+HEAD2)
#define INVIS 4
#define CW_ARC 8 /* clockwise arc */
#define DOTBIT 16 /* line styles */
#define DASHBIT 32
#define FILLBIT 64 /* gray-fill on boxes, etc. */
#define CENTER 01 /* text attributes */
#define LJUST 02
#define RJUST 04
#define ABOVE 010
#define BELOW 020
#define SPREAD 040
#define SCALE 1.0 /* default scale: units/inch */
#define WID 0.75 /* default width for boxes and ellipses */
#define WID2 0.375
#define HT 0.5 /* default height and line length */
#define HT2 (HT/2)
#define HT5 (HT/5)
#define HT10 (HT/10)
/* these have to be like so, so that we can write */
/* things like R & V, etc. */
#define H 0
#define V 1
#define R_DIR 0
#define U_DIR 1
#define L_DIR 2
#define D_DIR 3
#define ishor(n) (((n) & V) == 0)
#define isvert(n) (((n) & V) != 0)
#define isright(n) ((n) == R_DIR)
#define isleft(n) ((n) == L_DIR)
#define isdown(n) ((n) == D_DIR)
#define isup(n) ((n) == U_DIR)
typedef float ofloat; /* for o_val[] in obj; could be double */
typedef struct obj { /* stores various things in variable length */
int o_type;
int o_count; /* number of things */
int o_nobj; /* index in objlist */
int o_mode; /* hor or vert */
float o_x; /* coord of "center" */
float o_y;
int o_nt1; /* 1st index in text[] for this object */
int o_nt2; /* 2nd; difference is #text strings */
int o_attr; /* HEAD, CW, INVIS, etc., go here */
int o_size; /* linesize */
int o_nhead; /* arrowhead style */
struct symtab *o_symtab; /* symtab for [...] */
float o_ddval; /* value of dot/dash expression */
float o_fillval; /* gray scale value */
ofloat o_val[1]; /* actually this will be > 1 in general */
/* type is not always FLOAT!!!! */
} obj;
typedef union { /* the yacc stack type */
int i;
char *p;
obj *o;
double f;
struct symtab *st;
} YYSTYPE;
extern YYSTYPE yylval, yyval;
struct symtab {
char *s_name;
int s_type;
YYSTYPE s_val;
struct symtab *s_next;
};
typedef struct { /* attribute of an object */
int a_type;
int a_sub;
YYSTYPE a_val;
} Attr;
typedef struct {
int t_type; /* CENTER, LJUST, etc. */
char t_op; /* optional sign for size changes */
char t_size; /* size, abs or rel */
char *t_val;
} Text;
#define String 01
#define Macro 02
#define File 04
#define Char 010
#define Thru 020
#define Free 040
typedef struct { /* input source */
int type; /* Macro, String, File */
char *sp; /* if String or Macro */
} Src;
extern Src src[], *srcp; /* input source stack */
typedef struct {
FILE *fin;
char *fname;
int lineno;
} Infile;
extern Infile infile[], *curfile;
#define MAXARGS 20
typedef struct { /* argument stack */
char *argstk[MAXARGS]; /* pointers to args */
char *argval; /* points to space containing args */
} Arg;
extern int dbg;
extern obj **objlist;
extern int nobj, nobjlist;
extern Attr *attr;
extern int nattr, nattrlist;
extern Text *text;
extern int ntextlist;
extern int ntext;
extern int ntext1;
extern double curx, cury;
extern int hvmode;
extern int codegen;
extern int PEseen;
extern double deltx, delty;
extern int lineno;
extern int synerr;
extern double xmin, ymin, xmax, ymax;
struct pushstack {
double p_x;
double p_y;
int p_hvmode;
double p_xmin;
double p_ymin;
double p_xmax;
double p_ymax;
struct symtab *p_symtab;
};
extern struct pushstack stack[];
extern int nstack;
extern int cw;
#define Log10(x) errcheck(log10(x), "log")
#define Exp(x) errcheck(exp(x), "exp")
#define Sqrt(x) errcheck(sqrt(x), "sqrt")
char* addnewline(char *p) /* add newline to end of p */;
obj* addpos(obj *p, obj *q);
void addtattr(int sub) /* add text attrib to existing item */;
void arc(double xc, double yc, double x0, double y0, double x1, double y1) /* draw arc with center xc,yc */;
void arc_extreme(double x0, double y0, double x1, double y1, double xc, double yc);
obj* arcgen(int type) /* handles circular and (eventually) elliptical arcs */;
void arrow(double x0, double y0, double x1, double y1, double w, double h, double ang, int nhead) /* draw arrow (without shaft) */ /* head wid w, len h, rotated ang */ /* and drawn with nhead lines */;
int baldelim(int c, char *s) /* replace c by balancing entry in s */;
void blockadj(obj *p) /* adjust coords in block starting at p */;
obj* blockgen(obj *p, obj *q) /* handles [...] */;
obj* boxgen(void);
void checkscale(char *s) /* if s is "scale", adjust default variables */;
obj* circgen(int type);
void copy(void) /* begin input from file, etc. */;
void copydef(struct symtab *p) /* remember macro symtab ptr */;
void copyfile(char *s) /* remember file to start reading from */;
struct symtab* copythru(char *s) /* collect the macro name or body for thru */;
void copyuntil(char *s) /* string that terminates a thru */;
int curdir(void) /* convert current dir (hvmode) to RIGHT, LEFT, etc. */;
void definition(char *s) /* collect definition for s and install */ /* definitions picked up lexically */;
char* delimstr(char *s) /* get body of X ... X */ /* message if too big */;
void do_thru(void) /* read one line, make into a macro expansion */;
void dodef(struct symtab *stp) /* collect args and switch input to defn */;
void dot(void);
void dotbox(double x0, double y0, double x1, double y1, int ddtype, double ddval) /* dotted or dashed box */;
void dotext(obj *p) /* print text strings of p in proper vertical spacing */;
void dotline(double x0, double y0, double x1, double y1, int ddtype, double ddval);
void dotline(double x0, double y0, double x1, double y1, int ddtype, double ddval) /* dotted line */;
void ellipse(double x, double y, double r1, double r2);
void endfor(void) /* end one iteration of for loop */;
void eprint(void) /* try to print context around error */;
double errcheck(double x, char *s);
void exprsave(double f);
void extreme(double x, double y) /* record max and min x and y values */;
void fillend(void);
void fillstart(double v) /* only choose black, light grey (.75), or white, for now */;
obj* fixpos(obj *p, double x, double y);
void forloop(char *, double, double, int, double, char *) /* set up a for loop */;
void fpecatch(int arg);
void freedef(char *s) /* free definition for string s */;
void freesymtab(struct symtab *p) /* free space used by symtab at p */;
int getarg(char *p) /* pick up single argument, store in p, return length */;
YYSTYPE getblk(obj *p, char *s) /* find union type for s in p */;
double getblkvar(obj *p, char *s) /* find variable s2 in block p */;
obj* getblock(obj *p, char *s) /* find variable s in block p */;
double getcomp(obj *p, int t) /* return component of a position */;
void getdata(void);
obj* getfirst(int n, int t) /* find n-th occurrence of type t */;
double getfval(char *s) /* return float value of variable s */;
obj* gethere(void) /* make a place for curx,cury */;
obj* getlast(int n, int t) /* find n-th previous occurrence of type t */;
obj* getpos(obj *p, int corner) /* find position of point */;
YYSTYPE getvar(char *s) /* return value of variable s (usually pointer) */;
char * grow(char *ptr, char *name, int num, int size) /* make array bigger */;
char* ifstat(double expr, char *thenpart, char *elsepart);
int input(void);
void label(char *s, int t, int nh) /* text s of type t nh half-lines up */;
obj* leftthing(int c) /* called for {... or [... */ /* really ought to be separate functions */;
obj* linegen(int type);
struct symtab* lookup(char *s) /* find s in symtab */;
int main(int argc, char **argv);
void makeattr(int type, int sub, YYSTYPE val) /* add attribute type and val */;
obj* makebetween(double f, obj *p1, obj* p2) /* make position between p1 and p2 */;
void makefattr(int type, int sub, double f) /* double attr */;
void makeiattr(int type, int i) /* int attr */;
obj* makenode(int type, int n);
void makeoattr(int type, obj *o) /* obj* attr */;
obj* makepos(double x, double y) /* make a position cell */;
void maketattr(int sub, char *p) /* text attribute: takes two */;
struct symtab* makevar(char *s, int t, YYSTYPE v) /* make variable named s in table */ /* assumes s is static or from tostring */;
void makevattr(char *p) /* varname attribute */;
obj* movegen(void);
int nextchar(void);
void nextfor(void) /* do one iteration of a for loop */;
void pbstr(char *s);
void popsrc(void) /* restore an old one */;
void print(void);
void printexpr(double f) /* print expression for debugging */;
void printlf(int line, char *name);
void printpos(obj *p) /* print position for debugging */;
void pushsrc(int type, char *ptr) /* new input source */;
int quadrant(double x, double y);
void reset(void);
void resetvar(void) /* reset variables listed */;
obj* rightthing(obj *p, int c) /* called for ... ] or ... } */;
void savetext(int t, char *s) /* record text elements for current object */;
void setdefaults(void) /* set default sizes for variables like boxht */;
int setdir(int n) /* set direction (hvmode) from LEFT, RIGHT, etc. */;
void setfval(char *s, double f) /* set variable s to f */;
void shell_exec(void) /* do it */;
void shell_init(void) /* set up to interpret a shell command */;
void shell_text(char *s) /* add string to command being collected */;
void space(double x0, double y0, double x1, double y1) /* set limits of page */;
void spline(double x, double y, double/*sic*/ n, float *p, int dashed, double ddval);
char* sprintgen(char *fmt);
obj* subpos(obj *p, obj *q);
obj* textgen(void);
char* tostring(char *s);
void troff(char *s);
obj* troffgen(char *s) /* save away a string of troff commands */;
void undefine(char *s) /* undefine macro */;
int unput(int c);
int whatpos(obj *p, int corner, double *px, double *py) /* what is the position (no side effect) */;
void yyerror(char *s);
int yyparse(void);
#include "tex.h"
|