8 #include <X11/IntrinsicP.h>
9 #include <X11/StringDefs.h>
20 static int StopSeen = 0;
21 static void ParseDrawFunction(DviWidget, char *);
22 static void ParseDeviceControl(DviWidget);
23 static void push_env(DviWidget);
24 static void pop_env(DviWidget);
26 #define HorizontalMove(dw, delta) ((dw)->dvi.state->x += (delta))
30 ParseInput(register DviWidget dw)
41 * make sure some state exists
47 switch (DviGetC(dw, &c)) {
50 case ' ': /* when input is text */
51 case 0: /* occasional noise creeps in */
53 case '{': /* push down current environment */
60 * two motion digits plus a character
62 case '0': case '1': case '2': case '3': case '4':
63 case '5': case '6': case '7': case '8': case '9':
64 HorizontalMove(dw, (c-'0')*10 +
65 DviGetC(dw,&otherc)-'0');
67 case 'c': /* single ascii character */
73 (void) PutCharacter (dw, Buffer);
76 GetWord (dw, Buffer, BUFSIZ);
77 (void) PutCharacter (dw, Buffer);
81 while (DviGetC (dw, &c) != EOF
82 && c != ' ' && c != '\n') {
84 HorizontalMove (dw, PutCharacter (dw, Buffer));
90 while (DviGetC (dw, &c) == ' ')
92 while (c != EOF && c != ' ' && c != '\n') {
95 PutCharacter (dw, Buffer) + n);
100 case 'D': /* draw function */
101 (void) GetLine(dw, Buffer, BUFSIZ);
102 if (dw->dvi.display_enable)
103 ParseDrawFunction(dw, Buffer);
105 case 's': /* ignore fractional sizes */
107 dw->dvi.state->font_size = n;
111 dw->dvi.state->font_number = n;
113 case 'H': /* absolute horizontal motion */
115 HorizontalGoto(dw, k);
117 case 'h': /* relative horizontal motion */
119 HorizontalMove(dw, k);
121 case 'w': /* word space */
132 case 'P': /* new spread */
134 case 'p': /* new page */
135 (void) GetNumber(dw);
136 NextPage = dw->dvi.current_page + 1;
137 RememberPagePosition(dw, NextPage);
142 PutNumberedCharacter (dw, n);
144 case 'n': /* end of line */
148 HorizontalGoto(dw, 0);
150 case 'F': /* input files */
151 case '+': /* continuation of X device control */
152 case 'm': /* color */
153 case '#': /* comment */
154 GetLine(dw, NULL, 0);
156 case 'x': /* device control */
157 ParseDeviceControl(dw);
160 dw->dvi.last_page = dw->dvi.current_page;
162 return dw->dvi.current_page;
170 push_env(DviWidget dw)
174 new_state = (DviState *) XtMalloc (sizeof (*new_state));
176 *new_state = *(dw->dvi.state);
178 new_state->font_size = 10;
179 new_state->font_number = 1;
183 new_state->next = dw->dvi.state;
184 dw->dvi.state = new_state;
188 pop_env(DviWidget dw)
193 dw->dvi.state = old->next;
194 XtFree ((char *) old);
198 InitTypesetter (DviWidget dw)
200 while (dw->dvi.state)
206 #define DRAW_ARGS_MAX 128
209 ParseDrawFunction(DviWidget dw, char *buf)
211 int v[DRAW_ARGS_MAX];
215 v[0] = v[1] = v[2] = v[3] = 0;
221 for (i = 0; i < DRAW_ARGS_MAX; i++) {
222 if (sscanf(ptr, "%d", v + i) != 1)
226 while (*ptr != '\0' && *ptr != ' ')
231 case 'l': /* draw a line */
232 DrawLine(dw, v[0], v[1]);
234 case 'c': /* circle */
235 DrawCircle(dw, v[0]);
238 DrawFilledCircle(dw, v[0]);
240 case 'e': /* ellipse */
241 DrawEllipse(dw, v[0], v[1]);
244 DrawFilledEllipse(dw, v[0], v[1]);
247 DrawArc(dw, v[0], v[1], v[2], v[3]);
250 DrawPolygon(dw, v, i);
253 DrawFilledPolygon(dw, v, i);
255 case '~': /* wiggly line */
256 DrawSpline(dw, v, i);
259 dw->dvi.line_thickness = v[0];
262 if (i > 0 && v[0] >= 0 && v[0] <= DVI_FILL_MAX)
268 warning("unknown drawing function %s", buf);
277 dw->dvi.state->x += v[0];
282 dw->dvi.state->y += v[i];
284 dw->dvi.state->x += v[i];
291 ParseDeviceControl(DviWidget dw) /* Parse the x commands */
293 char str[20], str1[50];
296 GetWord (dw, str, 20);
297 switch (str[0]) { /* crude for now */
298 case 'T': /* output device */
299 GetWord (dw, str, 20);
302 case 'i': /* initialize */
305 case 't': /* trailer */
307 case 'p': /* pause -- can restart */
312 case 'r': /* resolution when prepared */
314 case 'f': /* font used */
316 GetWord (dw, str, 20);
317 GetLine (dw, str1, 50);
318 SetFontPosition (dw, n, str, str1);
320 case 'H': /* char height */
322 case 'S': /* slant */
325 while (DviGetC (dw, &c) != '\n') /* skip rest of input line */
335 c-continued-statement-offset: 8
339 c-tab-always-indent: nil