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