8 #include <X11/IntrinsicP.h>
9 #include <X11/StringDefs.h>
14 static int StopSeen = 0;
15 static void ParseDrawFunction(DviWidget, char *);
16 static void ParseDeviceControl(DviWidget);
17 static void push_env(DviWidget);
18 static void pop_env(DviWidget);
21 extern int PutCharacter(DviWidget, char *);
22 extern int PutNumberedCharacter(DviWidget, int);
23 extern void HorizontalGoto(DviWidget, int);
24 extern void Word(DviWidget);
25 extern void VerticalGoto(DviWidget, int);
26 extern void VerticalMove(DviWidget, int);
27 extern void FlushCharCache(DviWidget);
28 extern void Newline(DviWidget);
29 extern void DrawLine(DviWidget, int, int);
30 extern void DrawCircle(DviWidget, int);
31 extern void DrawFilledCircle(DviWidget, int);
32 extern void DrawEllipse(DviWidget, int, int);
33 extern void DrawFilledEllipse(DviWidget, int, int);
34 extern void DrawArc(DviWidget, int, int, int, int);
35 extern void DrawPolygon(DviWidget, int *, int);
36 extern void DrawFilledPolygon(DviWidget, int *, int);
37 extern void DrawSpline(DviWidget, int *, int);
40 extern void SetDevice(DviWidget, const char *);
43 extern void RememberPagePosition(DviWidget, int);
46 extern void SetFontPosition(DviWidget, int, const char *, const char *);
49 extern int GetNumber(DviWidget);
51 #define HorizontalMove(dw, delta) ((dw)->dvi.state->x += (delta))
55 ParseInput(register DviWidget dw)
66 * make sure some state exists
72 switch (DviGetC(dw, &c)) {
75 case ' ': /* when input is text */
76 case 0: /* occasional noise creeps in */
78 case '{': /* push down current environment */
85 * two motion digits plus a character
87 case '0': case '1': case '2': case '3': case '4':
88 case '5': case '6': case '7': case '8': case '9':
89 HorizontalMove(dw, (c-'0')*10 +
90 DviGetC(dw,&otherc)-'0');
92 case 'c': /* single ascii character */
98 (void) PutCharacter (dw, Buffer);
101 GetWord (dw, Buffer, BUFSIZ);
102 (void) PutCharacter (dw, Buffer);
106 while (DviGetC (dw, &c) != EOF
107 && c != ' ' && c != '\n') {
109 HorizontalMove (dw, PutCharacter (dw, Buffer));
115 while (DviGetC (dw, &c) == ' ')
117 while (c != EOF && c != ' ' && c != '\n') {
120 PutCharacter (dw, Buffer) + n);
125 case 'D': /* draw function */
126 (void) GetLine(dw, Buffer, BUFSIZ);
127 if (dw->dvi.display_enable)
128 ParseDrawFunction(dw, Buffer);
130 case 's': /* ignore fractional sizes */
132 dw->dvi.state->font_size = n;
136 dw->dvi.state->font_number = n;
138 case 'H': /* absolute horizontal motion */
140 HorizontalGoto(dw, k);
142 case 'h': /* relative horizontal motion */
144 HorizontalMove(dw, k);
146 case 'w': /* word space */
157 case 'P': /* new spread */
159 case 'p': /* new page */
160 (void) GetNumber(dw);
161 NextPage = dw->dvi.current_page + 1;
162 RememberPagePosition(dw, NextPage);
167 PutNumberedCharacter (dw, n);
169 case 'n': /* end of line */
173 HorizontalGoto(dw, 0);
175 case 'F': /* input files */
176 case '+': /* continuation of X device control */
177 case 'm': /* color */
178 case '#': /* comment */
179 GetLine(dw, NULL, 0);
181 case 'x': /* device control */
182 ParseDeviceControl(dw);
185 dw->dvi.last_page = dw->dvi.current_page;
187 return dw->dvi.current_page;
195 push_env(DviWidget dw)
199 new_state = (DviState *) XtMalloc (sizeof (*new_state));
201 *new_state = *(dw->dvi.state);
203 new_state->font_size = 10;
204 new_state->font_number = 1;
208 new_state->next = dw->dvi.state;
209 dw->dvi.state = new_state;
213 pop_env(DviWidget dw)
218 dw->dvi.state = old->next;
219 XtFree ((char *) old);
223 InitTypesetter (DviWidget dw)
225 while (dw->dvi.state)
231 #define DRAW_ARGS_MAX 128
234 ParseDrawFunction(DviWidget dw, char *buf)
236 int v[DRAW_ARGS_MAX];
240 v[0] = v[1] = v[2] = v[3] = 0;
246 for (i = 0; i < DRAW_ARGS_MAX; i++) {
247 if (sscanf(ptr, "%d", v + i) != 1)
251 while (*ptr != '\0' && *ptr != ' ')
256 case 'l': /* draw a line */
257 DrawLine(dw, v[0], v[1]);
259 case 'c': /* circle */
260 DrawCircle(dw, v[0]);
263 DrawFilledCircle(dw, v[0]);
265 case 'e': /* ellipse */
266 DrawEllipse(dw, v[0], v[1]);
269 DrawFilledEllipse(dw, v[0], v[1]);
272 DrawArc(dw, v[0], v[1], v[2], v[3]);
275 DrawPolygon(dw, v, i);
278 DrawFilledPolygon(dw, v, i);
280 case '~': /* wiggly line */
281 DrawSpline(dw, v, i);
284 dw->dvi.line_thickness = v[0];
287 if (i > 0 && v[0] >= 0 && v[0] <= DVI_FILL_MAX)
293 warning("unknown drawing function %s", buf);
302 dw->dvi.state->x += v[0];
307 dw->dvi.state->y += v[i];
309 dw->dvi.state->x += v[i];
316 ParseDeviceControl(DviWidget dw) /* Parse the x commands */
318 char str[20], str1[50];
321 GetWord (dw, str, 20);
322 switch (str[0]) { /* crude for now */
323 case 'T': /* output device */
324 GetWord (dw, str, 20);
327 case 'i': /* initialize */
330 case 't': /* trailer */
332 case 'p': /* pause -- can restart */
337 case 'r': /* resolution when prepared */
339 case 'f': /* font used */
341 GetWord (dw, str, 20);
342 GetLine (dw, str1, 50);
343 SetFontPosition (dw, n, str, str1);
345 case 'H': /* char height */
347 case 'S': /* slant */
350 while (DviGetC (dw, &c) != '\n') /* skip rest of input line */
360 c-continued-statement-offset: 8
364 c-tab-always-indent: nil