static void SaveToFile(Widget w, FILE *fp) { DviWidget dw = (DviWidget)w; long pos; int c; if (dw->dvi.tmpFile) { pos = ftell(dw->dvi.tmpFile); if (dw->dvi.ungot) { pos--; dw->dvi.ungot = 0; /* The ungot character is in the tmpFile, so we don't want to read it from file. */ (void)getc(dw->dvi.file); } } else pos = ftell(dw->dvi.file); FileSeek(dw, 0L); while (DviGetC(dw, &c) != EOF) if (putc(c, fp) == EOF) { /* XXX print error message */ break; } FileSeek(dw, pos); }
static void ParseDeviceControl(DviWidget dw) /* Parse the x commands */ { char str[20], str1[50]; int c, n; GetWord (dw, str, 20); switch (str[0]) { /* crude for now */ case 'T': /* output device */ GetWord (dw, str, 20); SetDevice (dw, str); break; case 'i': /* initialize */ InitTypesetter (dw); break; case 't': /* trailer */ break; case 'p': /* pause -- can restart */ break; case 's': /* stop */ StopSeen = 1; return; case 'r': /* resolution when prepared */ break; case 'f': /* font used */ n = GetNumber (dw); GetWord (dw, str, 20); GetLine (dw, str1, 50); SetFontPosition (dw, n, str, str1); break; case 'H': /* char height */ break; case 'S': /* slant */ break; } while (DviGetC (dw, &c) != '\n') /* skip rest of input line */ if (c == EOF) return; return; }
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; } } }