diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
commit | 487ca4806cc046076293cf6cc5fbba0db282bac7 (patch) | |
tree | 847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/dvi2tty/disdvi.c | |
parent | a3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff) |
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvi2tty/disdvi.c')
-rw-r--r-- | Build/source/texk/dvi2tty/disdvi.c | 495 |
1 files changed, 495 insertions, 0 deletions
diff --git a/Build/source/texk/dvi2tty/disdvi.c b/Build/source/texk/dvi2tty/disdvi.c new file mode 100644 index 00000000000..dba9754787a --- /dev/null +++ b/Build/source/texk/dvi2tty/disdvi.c @@ -0,0 +1,495 @@ +/*****************************************************************************/ +/* */ +/* disdvi --- disassembles TeX dvi files. */ +/* */ +/* */ +/* 2.0 23/01/89 M.J.E. Mol (c) 1989 marcel@duteca.tudelft.nl */ +/* 2.1 19/01/90 M.J.E. Mol Maintain a list of fonts and */ +/* show fontnames in font changes. */ +/* Show character code when printing ligatures */ +/* */ +/* */ +/*****************************************************************************/ + + +char *disdvi = "@(#) disdvi.c 2.1 19/01/90 M.J.E. Mol (c) 1989, 1990"; + +#include <stdio.h> +#include <ctype.h> +#include "commands.h" + +#if defined(KPATHSEA) +#define NO_DEBUG +#include <kpathsea/config.h> +#include <kpathsea/c-proto.h> +#include <kpathsea/lib.h> +#else +#if defined(MSDOS) +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#endif +#endif + +#define LASTCHAR 127 /* max dvi character, above are commands */ + +#define get1() num(1) +#define get2() num(2) +#define get3() num(3) +#define get4() num(4) +#define sget1() snum(1) +#define sget2() snum(2) +#define sget3() snum(3) +#define sget4() snum(4) + +typedef struct _font { + long num; + struct _font * next; + char * name; +} font; + +font * fonts = NULL; +FILE * dvifp; +char * dvi_name; +long pc = 0; + +#ifdef KPATHSEA +extern int main P2H(int argc,char **argv ); +extern void bop P1H(void); +extern void postamble P1H(void); +extern void preamble P1H(void); +extern void postpostamble P1H(void); +extern void special P1H(int x); +extern void fontdef P1H(int x); +extern char *fontname P1H(long fntnum); +extern void printnonprint P1H(int ch); +extern unsigned long num P1H(int size); +extern long snum P1H(int size); +#else +char * malloc (); + +int main (); +void bop (); +void preamble (); +void postamble (); +void postpostamble (); +void fontdef (); +char * fontname (); +void special (); +void printnonprint (); +unsigned long num (); +long snum (); +#endif + + + +/*---------------------------------------------------------------------------*/ + +int main(argc, argv) +int argc; +char **argv; +{ + register int opcode; /* dvi opcode */ + register int i; + int fontnum; + + if (argc > 2) { + fprintf(stderr, "To many arguments\n"); + fprintf(stderr, "Usage: %s [dvi-file]\n", *argv); + exit(1); + } + + if (argc == 2) { + if ((i = strlen(argv[1])) == 0) { + fprintf(stderr, "Illegal empty filename\n"); + fprintf(stderr, "Usage: %s [dvi-file]\n", *argv); + exit(2); + } + if ((i >= 5) && (argv[1][i-4] == '.') && (argv[1][i-3] == 'd') && + (argv[1][i-2] == 'v') && (argv[1][i-1] == 'i')) + dvi_name = argv[1]; + else { + dvi_name = malloc((i+5) * sizeof(char)); + strcpy(dvi_name, argv[1]); + strcat(dvi_name, ".dvi"); + } + if ((dvifp = fopen(dvi_name, "r")) == NULL) { + perror(dvi_name); + exit(3); + } + } + else + dvifp = stdin; + +#if defined(MSDOS) + setmode(fileno(dvifp), O_BINARY); +#endif + + while ((opcode = (int) get1()) != EOF) { /* process until end of file */ + printf("%06ld: ", pc - 1); + if ((opcode <= LASTCHAR) && isprint(opcode)) { + printf("Char: "); + while ((opcode <= LASTCHAR) && isprint(opcode)) { + putchar(opcode); + opcode = (int) get1(); + } + putchar('\n'); + printf("%06ld: ", pc - 1); + } + + if (opcode <= LASTCHAR) + printnonprint(opcode); /* it must be a non-printable */ + else if ((opcode >= FONT_00) && (opcode <= FONT_63)) + printf("FONT_%02d /* %s */\n", opcode - FONT_00, + fontname(opcode - FONT_00)); + else + switch (opcode) { + case SET1 : + case SET2 : + case SET3 : + case SET4 : printf("SET%d: %ld\n", opcode - SET1 + 1, + num(opcode - SET1 + 1)); + break; + case SET_RULE : printf("SET_RULE: height: %ld\n", sget4()); + printf("%06ld: ", pc); + printf(" length: %ld\n", sget4()); + break; + case PUT1 : + case PUT2 : + case PUT3 : + case PUT4 : printf("PUT%d: %ld\n", opcode - PUT1 + 1, + num(opcode - PUT1 + 1)); + break; + case PUT_RULE : printf("PUT_RULE: height: %ld\n", sget4()); + printf("%06ld: ", pc); + printf(" length: %ld\n", sget4()); + break; + case NOP : printf("NOP\n"); break; + case BOP : bop(); break; + case EOP : printf("EOP\n"); break; + case PUSH : printf("PUSH\n"); break; + case POP : printf("POP\n"); break; + case RIGHT1 : + case RIGHT2 : + case RIGHT3 : + case RIGHT4 : printf("RIGHT%d: %ld\n", opcode - RIGHT1 + 1, + snum(opcode - RIGHT1 + 1)); + break; + case W0 : printf("W0\n"); break; + case W1 : + case W2 : + case W3 : + case W4 : printf("W%d: %ld\n", opcode - W0, + snum(opcode - W0)); + break; + case X0 : printf("X0\n"); break; + case X1 : + case X2 : + case X3 : + case X4 : printf("X%d: %ld\n", opcode - X0, + snum(opcode - X0)); + break; + case DOWN1 : + case DOWN2 : + case DOWN3 : + case DOWN4 : printf("DOWN%d: %ld\n", opcode - DOWN1 + 1, + snum(opcode - DOWN1 + 1)); + break; + case Y0 : printf("Y0\n"); break; + case Y1 : + case Y2 : + case Y3 : + case Y4 : printf("Y%d: %ld\n", opcode - Y0, + snum(opcode - Y0)); + break; + case Z0 : printf("Z0\n"); break; + case Z1 : + case Z2 : + case Z3 : + case Z4 : printf("Z%d: %ld\n", opcode - Z0, + snum(opcode - Z0)); + break; + case FNT1 : + case FNT2 : + case FNT3 : + case FNT4 : fontnum = num(opcode -FNT1 + 1); + printf("FNT%d: %d /* %s */\n", + opcode - FNT1 + 1, fontnum, + fontname(fontnum)); + break; + case XXX1 : + case XXX2 : + case XXX3 : + case XXX4 : special(opcode - XXX1 + 1); break; + case FNT_DEF1 : + case FNT_DEF2 : + case FNT_DEF3 : + case FNT_DEF4 : fontdef(opcode - FNT_DEF1 + 1); break; + case PRE : preamble(); break; + case POST : postamble(); break; + case POST_POST: postpostamble(); break; + } + } + + return 0; +} /* main */ + + +/*----------------------------------------------------------------------------*/ + + +void bop() +{ + int i; + + printf("BOP page number : %ld", sget4()); + for (i=0; i < 9; i++) { + if (i % 3 == 0) + printf("\n%06ld: ", pc); + printf(" %6ld", sget4()); + } + printf("\n%06ld: ", pc); + printf(" prev page offset : %06ld\n", sget4()); + +} /* bop */ + + +/*---------------------------------------------------------------------------*/ + +void postamble() +{ + + printf("POST last page offset : %06ld\n", sget4()); + printf("%06ld: ", pc); + printf(" numerator : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" denominator : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" magnification : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" max page height : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" max page width : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" stack size needed: %d\n", (int) get2()); + printf("%06ld: ", pc); + printf(" number of pages : %d\n", (int) get2()); + +} /* postamble */ + +void preamble() +{ + register int i; + + printf("PRE version : %d\n", (int) get1()); + printf("%06ld: ", pc); + printf(" numerator : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" denominator : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" magnification : %ld\n", get4()); + printf("%06ld: ", pc); + i = (int) get1(); + printf(" job name (%3d) :", i); + while (i-- > 0) + putchar((int) get1()); + putchar('\n'); + +} /* preamble */ + + +void postpostamble() +{ + register int i; + + printf("POSTPOST postamble offset : %06ld\n", get4()); + printf("%06ld: ", pc); + printf(" version : %d\n", (int) get1()); + while ((i = (int) get1()) == TRAILER) { + printf("%06ld: ", pc - 1); + printf("TRAILER\n"); + } + while (i != EOF) { + printf("%06ld: ", pc - 1); + printf("BAD DVI FILE END: 0x%02X\n", i); + i = (int) get1(); + } + +} /* postpostamble */ + + + +void special(x) +register int x; +{ + register long len; + register long i; + + len = num(x); + printf("XXX%d: %ld bytes\n", x, len); + printf("%06ld: ", pc); + for (i = 0; i < len; i++) /* a bit dangerous ... */ + putchar((int) get1()); /* can be non-printables */ + putchar('\n'); + +} /* special */ + + + +void fontdef(x) +register int x; +{ + register int i; + char * name; + font * fnt; + int namelen; + long fntnum; + int new = 0; + + fntnum = num(x); + printf("FNT_DEF%d: %ld\n", x, fntnum); + printf("%06ld: ", pc); /* avoid side-effect on pc in get4() */ + printf(" checksum : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" scale : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" design : %ld\n", get4()); + printf("%06ld: ", pc); + printf(" name : "); + namelen = (int) get1() + (int) get1(); + fnt = fonts; + while (fnt != NULL && fnt->num != fntnum) + fnt = fnt->next; + if (fnt == NULL) { + if ((fnt = (font *) malloc(sizeof(font))) == NULL) { + perror("fontdef"); + exit(1); + } + fnt->num = fntnum; + new = 1; + } + else + free(fnt->name); /* free old name */ + if ((name = (char *) malloc((namelen+1) * sizeof(char))) == NULL) { + perror("fontdef"); + exit(1); + } + + for (i = 0; i < namelen; i++) + name[i] = get1(); + name[namelen] = '\0'; + fnt->name = name; + if (new) { + fnt->next = fonts; + fonts = fnt; + } + + printf("%s\n", name); + +} /* fontdef */ + + + +char * fontname(fntnum) +long fntnum; +{ + font * fnt; + + fnt = fonts; + while (fnt != NULL && fnt->num != fntnum) + fnt = fnt->next; + if (fnt != NULL) + return fnt->name; + else + return "unknown fontname"; + +} /* fontname */ + + + +void printnonprint(ch) +register int ch; +{ + + printf("Char: "); + switch (ch) { + case 11 : printf("ff /* ligature (non-printing) 0x%02X */", + ch); + break; + case 12 : printf("fi /* ligature (non-printing) 0x%02X */", + ch); + break; + case 13 : printf("fl /* ligature (non-printing) 0x%02X */", + ch); + break; + case 14 : printf("ffi /* ligature (non-printing) 0x%02X */", + ch); + break; + case 15 : printf("ffl /* ligature (non-printing) 0x%02X */", + ch); + break; + case 16 : printf("i /* (non-printing) 0x%02X */", ch); + break; + case 17 : printf("j /* (non-printing) 0x%02X */", ch); + break; + case 25 : printf("ss /* german (non-printing) 0x%02X */", ch); + break; + case 26 : printf("ae /* scadinavian (non-printing) 0x%02X */", + ch); + break; + case 27 : printf("oe /* scadinavian (non-printing) 0x%02X */", + ch); + break; + case 28 : printf("o /* scadinavian (non-printing) 0x%02X */", + ch); + break; + case 29 : printf("AE /* scadinavian (non-printing) 0x%02X */", + ch); + break; + case 30 : printf("OE /* scadinavian (non-printing) 0x%02X */", + ch); + break; + case 31 : printf("O /* scadinavian (non-printing) 0x%02X */", + ch); + break; + default : printf("0x%02X", ch); break; + } + putchar('\n'); + +} + + + +unsigned long num(size) +register int size; +{ + register int i; + register long x = 0; + + pc += size; + for (i = 0; i < size; i++) + x = (x << 8) + (unsigned) getc(dvifp); + return x; + +} /* num */ + + + +long snum(size) +register int size; +{ + register int i; + register long x = 0; + + pc += size; + x = getc(dvifp); + if (x & 0x80) + x -= 0x100; + for (i = 1; i < size; i++) + x = (x << 8) + (unsigned) getc(dvifp); + return x; + +} /* snum */ + + + |