static void InitTypesetter (DviWidget dw) { while (dw->dvi.state) pop_env (dw); push_env (dw); FlushCharCache (dw); }
int ParseInput(DviWidget dw) { int n, k; int c; char Buffer[BUFSIZ]; int NextPage; int prevFont; int otherc; unsigned char tc; /* * make sure some state exists */ if (!dw->dvi.state) push_env (dw); for (;;) { switch (DviGetC(dw, &c)) { case '\n': break; case ' ': /* when input is text */ case 0: /* occasional noise creeps in */ break; case '{': /* push down current environment */ push_env(dw); break; case '}': pop_env(dw); break; /* * two motion digits plus a character */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': HorizontalMove(dw, (c-'0')*10 + DviGetC(dw,&otherc)-'0'); /* fall through */ case 'c': /* single ascii character */ (void) DviGetC(dw,&c); if (c == ' ') break; tc = c; PutCharacters (dw, &tc, 1); break; case 'C': GetWord(dw, Buffer, BUFSIZ); { DviCharNameMap *map; int i; unsigned char *ligature; c = -1; map = QueryFontMap (dw, dw->dvi.state->font_number); if (map) { c = DviCharIndex (map, Buffer); if (c == -1) { ligature = DviCharIsLigature (map, Buffer); if (ligature) { i = strlen ((char *) ligature); PutCharacters (dw, ligature, i); break; } } } prevFont = -1; if (c == -1) { for (i = 1; (map = QueryFontMap (dw, i)); i++) if (map->special) if ((c = DviCharIndex (map, Buffer)) != -1) { prevFont = dw->dvi.state->font_number; dw->dvi.state->font_number = i; break; } } if (c != -1) { tc = c; PutCharacters (dw, &tc, 1); } if (prevFont != -1) dw->dvi.state->font_number = prevFont; } break; case 'D': /* draw function */ GetLine(dw, Buffer, BUFSIZ); ParseDrawFunction(dw, Buffer); break; case 's': /* ignore fractional sizes */ n = GetNumber(dw); if (!dw->dvi.size_scale) { static int guesses[] = { 1, 4, 100, 1000, 1 }; int i; for (i = 0; i < 4; i++) if (8 <= n/guesses[i] && n/guesses[i] <= 24) { break; } dw->dvi.size_scale = guesses[i]; } dw->dvi.state->font_size = n; dw->dvi.state->line_width = n * (dw->dvi.device_resolution / (720 * dw->dvi.size_scale)); break; case 'f': n = GetNumber(dw); dw->dvi.state->font_number = n; break; case 'H': /* absolute horizontal motion */ k = GetNumber(dw); HorizontalGoto(dw, k); break; case 'h': /* relative horizontal motion */ k = GetNumber(dw); HorizontalMove(dw, k); break; case 'w': /* word space */ break; case 'V': n = GetNumber(dw); VerticalGoto(dw, n); break; case 'v': n = GetNumber(dw); VerticalMove(dw, n); break; case 'P': /* new spread */ break; case 'p': /* new page */ (void) GetNumber(dw); NextPage = dw->dvi.current_page + 1; RememberPagePosition(dw, NextPage); FlushCharCache (dw); return(NextPage); case 'n': /* end of line */ GetNumber(dw); GetNumber(dw); HorizontalGoto(dw, 0); break; case '#': /* comment */ case 'F': /* file info */ GetLine(dw, NULL, 0); break; case 't': /* text */ GetLine(dw, Buffer, BUFSIZ); PutCharacters (dw, (unsigned char *)Buffer, strlen (Buffer)); dw->dvi.state->x = ToDevice (dw, dw->dvi.cache.x); break; case 'x': /* device control */ ParseDeviceControl(dw); break; case EOF: dw->dvi.last_page = dw->dvi.current_page; FlushCharCache (dw); return dw->dvi.current_page; default: GetLine (dw, Buffer, BUFSIZ); fprintf (stderr, "Unknown command %s\n", Buffer); break; } } }
int ParseInput(register DviWidget dw) { int n, k; int c; char Buffer[BUFSIZ]; int NextPage; int otherc; StopSeen = 0; /* * make sure some state exists */ if (!dw->dvi.state) push_env (dw); for (;;) { switch (DviGetC(dw, &c)) { case '\n': break; case ' ': /* when input is text */ case 0: /* occasional noise creeps in */ break; case '{': /* push down current environment */ push_env(dw); break; case '}': pop_env(dw); break; /* * two motion digits plus a character */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': HorizontalMove(dw, (c-'0')*10 + DviGetC(dw,&otherc)-'0'); /* fall through */ case 'c': /* single ascii character */ DviGetC(dw,&c); if (c == ' ') break; Buffer[0] = c; Buffer[1] = '\0'; (void) PutCharacter (dw, Buffer); break; case 'C': GetWord (dw, Buffer, BUFSIZ); (void) PutCharacter (dw, Buffer); break; case 't': Buffer[1] = '\0'; while (DviGetC (dw, &c) != EOF && c != ' ' && c != '\n') { Buffer[0] = c; HorizontalMove (dw, PutCharacter (dw, Buffer)); } break; case 'u': n = GetNumber(dw); Buffer[1] = '\0'; while (DviGetC (dw, &c) == ' ') ; while (c != EOF && c != ' ' && c != '\n') { Buffer[0] = c; HorizontalMove (dw, PutCharacter (dw, Buffer) + n); DviGetC (dw, &c); } break; case 'D': /* draw function */ (void) GetLine(dw, Buffer, BUFSIZ); if (dw->dvi.display_enable) ParseDrawFunction(dw, Buffer); break; case 's': /* ignore fractional sizes */ n = GetNumber(dw); dw->dvi.state->font_size = n; break; case 'f': n = GetNumber(dw); dw->dvi.state->font_number = n; break; case 'H': /* absolute horizontal motion */ k = GetNumber(dw); HorizontalGoto(dw, k); break; case 'h': /* relative horizontal motion */ k = GetNumber(dw); HorizontalMove(dw, k); break; case 'w': /* word space */ Word (dw); break; case 'V': n = GetNumber(dw); VerticalGoto(dw, n); break; case 'v': n = GetNumber(dw); VerticalMove(dw, n); break; case 'P': /* new spread */ break; case 'p': /* new page */ (void) GetNumber(dw); NextPage = dw->dvi.current_page + 1; RememberPagePosition(dw, NextPage); FlushCharCache (dw); return(NextPage); case 'N': n = GetNumber(dw); PutNumberedCharacter (dw, n); break; case 'n': /* end of line */ GetNumber(dw); GetNumber(dw); Newline (dw); HorizontalGoto(dw, 0); break; case 'F': /* input files */ case '+': /* continuation of X device control */ case 'm': /* color */ case '#': /* comment */ GetLine(dw, NULL, 0); break; case 'x': /* device control */ ParseDeviceControl(dw); break; case EOF: dw->dvi.last_page = dw->dvi.current_page; FlushCharCache (dw); return dw->dvi.current_page; default: break; } } }
static thing_th *finalize_reading(text_buffer *tb, thing_th *expr) { tb_wipe(tb); pop_env(); return expr; }