8 #include <X11/IntrinsicP.h>
9 #include <X11/StringDefs.h>
14 static int StopSeen = 0;
15 static ParseDrawFunction(), ParseDeviceControl();
16 static push_env(), pop_env();
18 #define HorizontalMove(dw, delta) ((dw)->dvi.state->x += (delta))
22 register DviWidget dw;
33 * make sure some state exists
39 switch (DviGetC(dw, &c)) {
42 case ' ': /* when input is text */
43 case 0: /* occasional noise creeps in */
45 case '{': /* push down current environment */
52 * two motion digits plus a character
54 case '0': case '1': case '2': case '3': case '4':
55 case '5': case '6': case '7': case '8': case '9':
56 HorizontalMove(dw, (c-'0')*10 +
57 DviGetC(dw,&otherc)-'0');
59 case 'c': /* single ascii character */
65 (void) PutCharacter (dw, Buffer);
68 GetWord (dw, Buffer, BUFSIZ);
69 (void) PutCharacter (dw, Buffer);
73 while (DviGetC (dw, &c) != EOF
74 && c != ' ' && c != '\n') {
76 HorizontalMove (dw, PutCharacter (dw, Buffer));
82 while (DviGetC (dw, &c) == ' ')
84 while (c != EOF && c != ' ' && c != '\n') {
87 PutCharacter (dw, Buffer) + n);
92 case 'D': /* draw function */
93 (void) GetLine(dw, Buffer, BUFSIZ);
94 if (dw->dvi.display_enable)
95 ParseDrawFunction(dw, Buffer);
97 case 's': /* ignore fractional sizes */
99 dw->dvi.state->font_size = n;
103 dw->dvi.state->font_number = n;
105 case 'H': /* absolute horizontal motion */
107 HorizontalGoto(dw, k);
109 case 'h': /* relative horizontal motion */
111 HorizontalMove(dw, k);
113 case 'w': /* word space */
124 case 'P': /* new spread */
126 case 'p': /* new page */
127 (void) GetNumber(dw);
128 NextPage = dw->dvi.current_page + 1;
129 RememberPagePosition(dw, NextPage);
134 PutNumberedCharacter (dw, n);
136 case 'n': /* end of line */
140 HorizontalGoto(dw, 0);
142 case 'F': /* input files */
143 case '+': /* continuation of X device control */
144 case 'm': /* color */
145 case '#': /* comment */
146 GetLine(dw, NULL, 0);
148 case 'x': /* device control */
149 ParseDeviceControl(dw);
152 dw->dvi.last_page = dw->dvi.current_page;
154 return dw->dvi.current_page;
167 new = (DviState *) XtMalloc (sizeof (*new));
169 *new = *(dw->dvi.state);
172 new->font_number = 1;
176 new->next = dw->dvi.state;
187 dw->dvi.state = old->next;
188 XtFree ((char *) old);
195 while (dw->dvi.state)
201 #define DRAW_ARGS_MAX 128
204 ParseDrawFunction(dw, buf)
208 int v[DRAW_ARGS_MAX];
212 v[0] = v[1] = v[2] = v[3] = 0;
218 for (i = 0; i < DRAW_ARGS_MAX; i++) {
219 if (sscanf(ptr, "%d", v + i) != 1)
223 while (*ptr != '\0' && *ptr != ' ')
228 case 'l': /* draw a line */
229 DrawLine(dw, v[0], v[1]);
231 case 'c': /* circle */
232 DrawCircle(dw, v[0]);
235 DrawFilledCircle(dw, v[0]);
237 case 'e': /* ellipse */
238 DrawEllipse(dw, v[0], v[1]);
241 DrawFilledEllipse(dw, v[0], v[1]);
244 DrawArc(dw, v[0], v[1], v[2], v[3]);
247 DrawPolygon(dw, v, i);
250 DrawFilledPolygon(dw, v, i);
252 case '~': /* wiggly line */
253 DrawSpline(dw, v, i);
256 dw->dvi.line_thickness = v[0];
259 if (i > 0 && v[0] >= 0 && v[0] <= DVI_FILL_MAX)
265 warning("unknown drawing function %s", buf);
274 dw->dvi.state->x += v[0];
279 dw->dvi.state->y += v[i];
281 dw->dvi.state->x += v[i];
288 ParseDeviceControl(dw) /* Parse the x commands */
291 char str[20], str1[50];
293 extern int LastPage, CurrentPage;
295 GetWord (dw, str, 20);
296 switch (str[0]) { /* crude for now */
297 case 'T': /* output device */
298 GetWord (dw, str, 20);
301 case 'i': /* initialize */
304 case 't': /* trailer */
306 case 'p': /* pause -- can restart */
311 case 'r': /* resolution when prepared */
313 case 'f': /* font used */
315 GetWord (dw, str, 20);
316 GetLine (dw, str1, 50);
317 SetFontPosition (dw, n, str, str1);
319 case 'H': /* char height */
321 case 'S': /* slant */
324 while (DviGetC (dw, &c) != '\n') /* skip rest of input line */
334 c-continued-statement-offset: 8
338 c-tab-always-indent: nil