1 /*
2  * Convert the standard plot input into a readable form for debugging.
3  */
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <netinet/in.h>
9 
10 #if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) && !defined(__bsdi__)
11 char	*progname = NULL;
12 #define setprogname(x) progname = x
13 #define getprogname() progname
14 #endif
15 
16 float		deltx;
17 float		delty;
18 
19 static void	fplt(FILE * fin);
20 static int	getsi(FILE * fin);
21 static void	getstr(register char *s, register FILE * fin, int len);
22 
23 void		pl_space(int x0, int y0, int x1, int y1);
24 void		pl_openpl(void);
25 void		pl_closepl(void);
26 void		pl_openvt(void);
27 void		pl_closevt(void);
28 void		pl_erase(void);
29 void		pl_move(int xi, int yi);
30 void		pl_cont(int xi, int yi);
31 void		pl_line(int x0, int y0, int x1, int y1);
32 void		pl_point(int xi, int yi);
33 void		pl_label(char *s);
34 void		pl_arc(int xcent, int ycent, int xbeg, int ybeg, int xend, int yend);
35 void		pl_circle(int xc, int yc, int r);
36 void		pl_linemod(char *line);
37 void		pl_dot(int xi, int yi, int dx, int n, int *pat);
38 
39 
40 int
main(int argc,char ** argv)41 main(int argc, char **argv)
42 {
43 	int		std = 1;
44 	FILE	       *fin;
45 
46 	setprogname(argv[0]);
47 	while (argc-- > 1) {
48 		if (*argv[1] == '-')
49 			switch (argv[1][1]) {
50 			case 'l':
51 				deltx = atoi(&argv[1][2]) - 1;
52 				break;
53 			case 'w':
54 				delty = atoi(&argv[1][2]) - 1;
55 				break;
56 			}
57 		else {
58 			std = 0;
59 			if ((fin = fopen(argv[1], "r")) == NULL) {
60 				fprintf(stderr, "%s: can't open %s\n", getprogname(), argv[1]);
61 				exit(1);
62 			}
63 			fplt(fin);
64 			fclose(fin);
65 		}
66 
67 		argv++;
68 	}
69 
70 	if (std)
71 		fplt(stdin);
72 
73 	exit(0);
74 }
75 
76 static void
fplt(FILE * fin)77 fplt(FILE * fin)
78 {
79 	int		c;
80 	char		s[256];
81 	int		xi, yi, x0, y0, x1, y1, r, dx, n, i;
82 	int	       *pat;
83 	unsigned int	pat_len = 256;
84 
85 	pat = malloc(pat_len * sizeof(int));
86 
87 	pl_openpl();
88 	while ((c = getc(fin)) != EOF) {
89 		switch (c) {
90 		case 'm':
91 			xi = getsi(fin);
92 			yi = getsi(fin);
93 			pl_move(xi, yi);
94 			break;
95 		case 'l':
96 			x0 = getsi(fin);
97 			y0 = getsi(fin);
98 			x1 = getsi(fin);
99 			y1 = getsi(fin);
100 			pl_line(x0, y0, x1, y1);
101 			break;
102 		case 't':
103 			getstr(s, fin, 256);
104 			pl_label(s);
105 			break;
106 		case 'e':
107 			pl_erase();
108 			break;
109 		case 'p':
110 			xi = getsi(fin);
111 			yi = getsi(fin);
112 			pl_point(xi, yi);
113 			break;
114 		case 'n':
115 			xi = getsi(fin);
116 			yi = getsi(fin);
117 			pl_cont(xi, yi);
118 			break;
119 		case 's':
120 			x0 = getsi(fin);
121 			y0 = getsi(fin);
122 			x1 = getsi(fin);
123 			y1 = getsi(fin);
124 			pl_space(x0, y0, x1, y1);
125 			break;
126 		case 'a':
127 			xi = getsi(fin);
128 			yi = getsi(fin);
129 			x0 = getsi(fin);
130 			y0 = getsi(fin);
131 			x1 = getsi(fin);
132 			y1 = getsi(fin);
133 			pl_arc(xi, yi, x0, y0, x1, y1);
134 			break;
135 		case 'c':
136 			xi = getsi(fin);
137 			yi = getsi(fin);
138 			r = getsi(fin);
139 			pl_circle(xi, yi, r);
140 			break;
141 		case 'f':
142 			getstr(s, fin, 256);
143 			pl_linemod(s);
144 			break;
145 		case 'd':
146 			xi = getsi(fin);
147 			yi = getsi(fin);
148 			dx = getsi(fin);
149 			n = getsi(fin);
150 			if (n > pat_len) {
151 				pat_len *= 2;
152 				pat = realloc(pat, pat_len * sizeof(int));
153 			}
154 			for (i = 0; i < n; i++)
155 				pat[i] = getsi(fin);
156 			pl_dot(xi, yi, dx, n, pat);
157 			break;
158 		default:
159 			pl_closevt();
160 			fprintf(stderr, "%s: malformed input\n", getprogname());
161 			free(pat);
162 			exit(1);
163 		}
164 	}
165 
166 	pl_closepl();
167 	free(pat);
168 }
169 
170 /* get an integer. */
171 static int
getsi(register FILE * fin)172 getsi(register FILE * fin)
173 {
174 	short		b;
175 
176 	if (fread(&b, sizeof(b), 1, fin) < 1) {
177 		pl_closevt();
178 		fprintf(stderr, "%s: malformed input\n", getprogname());
179 		exit(1);
180 	}
181 	return ntohs(b);
182 }
183 
184 static void
getstr(register char * s,register FILE * fin,int len)185 getstr(register char *s, register FILE * fin, int len)
186 {
187 	if (fgets(s, len, fin) == NULL) {
188 		pl_closevt();
189 		fprintf(stderr, "%s: malformed input\n", getprogname());
190 		exit(1);
191 	}
192 	s[strlen(s) - 1] = '\0';
193 }
194 
195 /* Print out the arguments to plot routines. */
196 
197 void
pl_space(int x0,int y0,int x1,int y1)198 pl_space(int x0, int y0, int x1, int y1)
199 {
200 	printf("s %d %d %d %d\n", x0, y0, x1, y1);
201 }
202 
203 void
pl_openpl(void)204 pl_openpl(void)
205 {
206 }
207 
208 void
pl_openvt(void)209 pl_openvt(void)
210 {
211 }
212 
213 void
pl_closepl(void)214 pl_closepl(void)
215 {
216 }
217 
218 void
pl_closevt(void)219 pl_closevt(void)
220 {
221 }
222 
223 void
pl_erase(void)224 pl_erase(void)
225 {
226 	printf("e\n");
227 }
228 
229 void
pl_move(int xi,int yi)230 pl_move(int xi, int yi)
231 {
232 	printf("m %d %d\n", xi, yi);
233 }
234 
235 void
pl_cont(int xi,int yi)236 pl_cont(int xi, int yi)
237 {
238 	printf("n %d %d\n", xi, yi);
239 }
240 
241 void
pl_line(int x0,int y0,int x1,int y1)242 pl_line(int x0, int y0, int x1, int y1)
243 {
244 	printf("l %d %d %d %d\n", x0, y0, x1, y1);
245 }
246 
247 void
pl_point(int xi,int yi)248 pl_point(int xi, int yi)
249 {
250 	printf("p %d %d\n", xi, yi);
251 }
252 
253 void
pl_label(char * s)254 pl_label(char *s)
255 {
256 	printf("t%s\n\n", s);
257 }
258 
259 void
pl_arc(int xcent,int ycent,int xbeg,int ybeg,int xend,int yend)260 pl_arc(int xcent, int ycent, int xbeg, int ybeg, int xend, int yend)
261 {
262 	printf("a %d %d %d %d %d %d\n", xcent, ycent, xbeg, ybeg, xend, yend);
263 }
264 
265 void
pl_circle(int xc,int yc,int r)266 pl_circle(int xc, int yc, int r)
267 {
268 	printf("c %d %d %d\n", xc, yc, r);
269 }
270 
271 void
pl_linemod(char * line)272 pl_linemod(char *line)
273 {
274 	printf("f%s\n\n", line);
275 }
276 
277 void
pl_dot(int xi,int yi,int dx,int n,int pat[])278 pl_dot(int xi, int yi, int dx, int n, int pat[])
279 {
280 	register int	i;
281 
282 	printf("d %d %d %d %d ", xi, yi, dx, n);
283 	for (i = 0; i < n; i++)
284 		printf("%d ", pat[i]);
285 	printf("\n\n");
286 }
287