1 #define	dprintf	if(dbg)printf
2 #ifndef PI
3 #define	PI	3.141592654
4 #endif
5 
6 #define	DEFAULT	0
7 
8 #define	HEAD1	1
9 #define	HEAD2	2
10 #define	HEAD12	(HEAD1+HEAD2)
11 #define	INVIS	4
12 #define	CW_ARC	8	/* clockwise arc */
13 #define	DOTBIT	16
14 #define	DASHBIT	32
15 
16 #define	CENTER	01	/* text attributes */
17 #define	LJUST	02
18 #define	RJUST	04
19 #define	ABOVE	010
20 #define	BELOW	020
21 #define	SPREAD	040
22 #define	FILL	0100
23 
24 #define	SCALE	1.0	/* default scale: units/inch */
25 #define	WID	0.75	/* default width for boxes and ellipses */
26 #define	WID2	0.375
27 #define	HT	0.5	/* default height and line length */
28 #define	HT2	0.25	/* because no floating init exprs! */
29 #define	HT5	0.1
30 #define	HT10	0.05
31 
32 /* these have to be like so, so that we can write */
33 /* things like R & V, etc. */
34 #define	H	0
35 #define	V	1
36 #define	R_DIR	0
37 #define	U_DIR	1
38 #define	L_DIR	2
39 #define	D_DIR	3
40 #define	ishor(n)	(((n) & V) == 0)
41 #define	isvert(n)	(((n) & V) != 0)
42 #define	isright(n)	((n) == R_DIR)
43 #define	isleft(n)	((n) == L_DIR)
44 #define	isdown(n)	((n) == D_DIR)
45 #define	isup(n)		((n) == U_DIR)
46 
47 typedef struct Point {
48 	float	x;
49 	float	y;
50 };
51 
52 typedef struct obj {	/* stores various things in variable length */
53 	int	o_type;
54 	int	o_count;	/* number of things */
55 	int	o_nobj;		/* index in objlist */
56 	int	o_mode;		/* hor or vert */
57 	float	o_x;		/* coord of "center" */
58 	float	o_y;
59 	int	o_nt1;		/* 1st index in text[] for this object */
60 	int	o_nt2;		/* 2nd; difference is #text strings */
61 	int	o_attr;		/* HEAD, CW, INVIS go here */
62 	int	o_size;		/* linesize */
63 	int	o_nhead;	/* arrowhead style */
64 	struct symtab *o_symtab; /* symtab for [...] */
65 	float	o_ddval;	/* value of dot/dash expression */
66 	float	o_val[1];	/* actually this will be > 1 in general */
67 				/* type is not always FLOAT!!!! */
68 } obj;
69 
70 typedef union {		/* the yacc stack type */
71 	int	i;
72 	char	*p;
73 	obj	*o;
74 	float	f;
75 } YYSTYPE;
76 
77 extern	YYSTYPE	yylval, yyval;
78 
79 struct symtab {
80 	char	*s_name;
81 	int	s_type;
82 	YYSTYPE	s_val;
83 	struct symtab *s_next;
84 };
85 
86 typedef struct {	/* attribute of an object */
87 	int	a_type;
88 	int	a_sub;
89 	YYSTYPE	a_val;
90 } Attr;
91 
92 typedef struct {
93 	int	t_type;		/* CENTER, LJUST, etc. */
94 	char	t_op;		/* optional sign for size changes */
95 	char	t_size;		/* size, abs or rel */
96 	char	*t_val;
97 } Text;
98 
99 #define	String	01
100 #define	Macro	02
101 #define	File	04
102 #define	Char	010
103 #define	Thru	020
104 #define	Free	040
105 
106 typedef struct {	/* input source */
107 	int	type;	/* Macro, String, File */
108 	char	*sp;	/* if String or Macro */
109 } Src;
110 
111 extern	Src	src[], *srcp;	/* input source stack */
112 
113 typedef struct {
114 	FILE	*fin;
115 	char	*fname;
116 	int	lineno;
117 } Infile;
118 
119 extern	Infile	infile[], *curfile;
120 
121 #define	MAXARGS	20
122 typedef struct {	/* argument stack */
123 	char	*argstk[MAXARGS];	/* pointers to args */
124 	char	*argval;	/* points to space containing args */
125 } Arg;
126 
127 extern	int	dbg;
128 extern	obj	**objlist;
129 extern	int	nobj, nobjlist;
130 extern	Attr	*attr;
131 extern	int	nattr, nattrlist;
132 extern	Text	*text;
133 extern	int	ntextlist;
134 extern	int	ntext;
135 extern	int	ntext1;
136 extern	float	curx, cury;
137 extern	int	hvmode;
138 extern	int	codegen;
139 extern	char	*malloc(), *realloc(), *tostring(), *grow();
140 extern	float	getfval(), getcomp(), getblkvar();
141 extern	YYSTYPE	getvar();
142 extern	struct symtab *lookup(), *makevar();
143 extern	char	*ifstat(), *delimstr(), *sprintgen();
144 
145 extern	float	deltx, delty;
146 extern	int	lineno;
147 extern	int	synerr;
148 
149 extern	float	xmin, ymin, xmax, ymax;
150 extern	obj	*leftthing(), *boxgen(), *circgen(), *arcgen();
151 extern	obj	*linegen(), *splinegen(), *movegen(), *textgen(), *plotgen();
152 extern	obj	*troffgen(), *rightthing(), *blockgen();
153 extern	obj	*makenode(), *makepos(), *fixpos(), *addpos(), *subpos(), *makebetween();
154 extern	obj	*getpos(), *gethere(), *getfirst(), *getlast(), *getblock();
155 
156 struct pushstack {
157 	float	p_x;
158 	float	p_y;
159 	int	p_hvmode;
160 	float	p_xmin;
161 	float	p_ymin;
162 	float	p_xmax;
163 	float	p_ymax;
164 	struct symtab *p_symtab;
165 };
166 extern	struct pushstack stack[];
167 extern	int	nstack;
168 extern	int	cw;
169 
170 extern	double	errcheck();
171 #define	Log10(x) errcheck(log10(x), "log")
172 #define	Exp(x)	errcheck(exp(x), "exp")
173 #define	Sqrt(x)	errcheck(sqrt(x), "sqrt")
174