marcel@duteca.UUCP (Root) (12/29/88)
Posting-number: Volume 5, Issue 96 Submitted-by: "Root" <marcel@duteca.UUCP> Archive-name: dvi2tty dvi2tty: A program that shows TeX dvi files on ascii terminals. disdvi: A program that 'disassembles' dvi files. #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # README 948 bytes # README.ORG 1051 bytes # Makefile 128 bytes # dvi2tty.1 4291 bytes # disdvi.c 14657 bytes # dvi2tty.c 21151 bytes # dvistuff.c 30055 bytes # commands.h 3506 bytes # dvi2tty.h 3488 bytes # This archive created: Thu Dec 22 21:31:26 MET 1988 # By: marcel export PATH echo shar: extracting README if test -f 'README' then echo shar: over-writing existing file "'README'" fi sed -e 's/^-//' << \_E_O_F_ > README - DVI2TTY - - -dvi2tty is intended for previewing dvi-files on text-only -devices (terminals and lineprinters). -The program is an improved C version of the pascal program -written by Svante Lindahl (see README.ORG). -I translated it because I could not find a pascal compiler -on our machine that could compile it. - - DVIDIS - -dvidis is a simple hack that dumps a dvi file in a more readable form. -It is not a spectacular program but use it and improve as you wish. -I'd appreciate any enhancements made, bug reports etc. mailed to me. - - - -- Marcel ------------------------------------------ -| Marcel J.E. Mol | They hate you if your're clever -| Delft University of Technology | And they despise the fool -| The Netherlands | Till you're so fucking crazy -| UUCP: marcel@duteca.UUCP | You can't follow the rules. ------------------------------------------ - Lennon _E_O_F_ if test 948 -ne `wc -c < README `; then echo shar: "'README'" unpacked with wrong size! fi echo shar: extracting README.ORG if test -f 'README.ORG' then echo shar: over-writing existing file "'README.ORG'" fi sed -e 's/^-//' << \_E_O_F_ > README.ORG - -dvitty is intended for previewing dvi-files on text-only devices -(terminals and lineprinters). The output is not very pretty many -times, but it still saves quite a lot of work, especially if you -have a little ways to walk to a laserprinter, for example. - -The program was originally written in Hedrick-Pascal, running on -TOPS-20, and was later ported to UNIX (BSD, Berkeley-pascal). - -It is not very smart in all situations, but still serves it pur- -pose fairly well. - -For information on how to use see the man-page. - -Before compiling and installing inspect the "compile-time cust- -omization constants" and change them to suit your site. -These constants configure default pager and a little more. - -Please report complaints, suggestions, bugs and/or fixes to: - -Svante Lindahl, NADA, KTH Numerical Analysis & Computer Science -UUCP: {seismo,mcvax}!enea!ttds!zap Royal Institute of Technology, Sweden -ARPA: enea!ttds!zap@seismo.CSS.GOV EAN: zap@cs.kth.sunet - -The TOPS-20 version of the program can also be obtained from the above -address. _E_O_F_ if test 1051 -ne `wc -c < README.ORG `; then echo shar: "'README.ORG'" unpacked with wrong size! fi echo shar: extracting Makefile if test -f 'Makefile' then echo shar: over-writing existing file "'Makefile'" fi sed -e 's/^-//' << \_E_O_F_ > Makefile -all: dvi2tty disdvi - -dvi2tty:dvi2tty.o dvistuff.o - cc -so dvi2tty dvi2tty.o dvistuff.o - -disdvi:disdvi.o - cc -so disdvi disdvi.o _E_O_F_ if test 128 -ne `wc -c < Makefile `; then echo shar: "'Makefile'" unpacked with wrong size! fi echo shar: extracting dvi2tty.1 if test -f 'dvi2tty.1' then echo shar: over-writing existing file "'dvi2tty.1'" fi sed -e 's/^-//' << \_E_O_F_ > dvi2tty.1 -.TH DVI2TTY Local "7 June 1986" -.SH NAME -dvi2tty \- preview a dvi\-file on an ordinary ascii terminal -.SH SYNOPSIS -.B dvi2tty -[ options ] dvi\-file -.SH DESCRIPTION -.I dvi2tty -converts a TeX DVI\-file to a format that is apprporiate for terminals -and lineprinters. The program is intended to be used for -preliminary proofreading of TeX-ed documents. -By default the output is directed to the terminal, -possibly through a pager (depending on how the program was installed), -but it can be directed to a file or a pipe. -.PP -The output leaves much to be desired, but is still -usefull if you want to avoid walking to the -laserprinter (or whatever) for each iteration of your -document. -.br -Since -.I dvi2tty -produces output for terminals and lineprinters the -representation of documents is naturally quite primitive. -Fontchanges are totally ignored, which implies that -special symbols, such as mathematical symbols, get mapped into the -characters at the corresponding positions in the "standard" fonts. -.PP -If the width of the output text requires more columns than fits -in one line (c.f. the \-w option) it is broken into several lines by -.I dvi2tty -although they will be printed as one line on regular TeX output -devices (e.g.laserprinters). To show that a broken line is really -just one logical line an asterisk (``*'') in the last position -means that the logical line is continued on the next physical -line output by -.I dvi2tty. -Such a continuation line is started with a a space and an asterisk -in the first two columns. -.PP -Options may be specified in the environment variable DVI2TTY. -Any option on the commandline, conflicting with one in the -environment, will override the one from the environment. -.PP -.B Options: -.PP -.TP -.B \-o file -Write output to file ``file''. -.TP -.B \-p list -Print the pages chosen by list. -Numbers refer to TeX\-page numbers (known as \\count0). -An example of format for list is ``1,3:6,8'' -to choose pages 1, 3 through 6 and 8. -Negative numbers can be used exactly as in TeX, -e g \-1 comes before \-4 as in ``\-p-1:-4,17''. -.TP -.B \-P list -Like \-p except that page numbers refer to -the sequential ordering of the pages in the dvi\-file. -Negative numbers don't make a lot of sense here... -.TP -.B \-w n -Specify terminal width -.I n. -Legal range 16\-132. -Default is 80. If your terminal has the -ability to display in 132 columns it might -be a good idea to use \-w132 and toggle the -terminal into this mode as output will -probably look somewhat better. -.TP -.B \-q -Don't pipe the output through a pager. -This may be the default on some systems -(depending on the whims of the SA installing the program). -.TP -.B \-f -Pipe through a pager, $PAGER if defined, or whatever your SA compiled -in (often ``more''). This may be the default, but it is still okay -to redirect output with ``>'', the pager will not be used if output -is not going to a terminal. -.TP -.B \-F -Specify the pager program to be used. -This overides the $PAGER and the default pager. -.TP -.B \-Fprog -Use ``prog'' as program to pipe output into. Can be used to choose an -alternate pager (e g ``-Fless''). -.TP -.B \-l -Mark pagebreaks with the two-character sequence ``^L''. The default is -to mark them with a formfeed character. -.TP -.B \-u -Don't make any attempts to find special Scandinavian characters. -If such characters are in the text they will map to ``a'' and ``o''. -This is probably the default outside of Scandinavia. (The SA made -the decision when the program was installed.) -.TP -.B \-s -Try to find the special Scandinavian characters that on most (?) -terminals in Scandinavia are mapped to ``{|}[\\]''. -This can be the default, and output from files not containing these -special characters will be identical regardless of this option. -.SH FILES -/usr/ucb/more \ \ \ \ -probably the default pager. -.SH ENVIRONMENT -PAGER \ \ \ \ \ \ \ \ \ \ \ \ -the pager to use. -.br -DVI2TTY \ \ \ \ \ \ \ \ \ \ \ -can be set to hold commandline options. -.SH "SEE ALSO" -TeX, dvi2ps -.SH AUTHOR -Svante Lindahl, Royal Institute of Technology, Stockholm -.br -Improved C version: Marcel Mol -.br -{seismo, mcvax}!enea!ttds!zap -.br -marcel@duteca.UUCP -.SH BUGS -Blanks between words get lost quite easy. This is less -likely if you are using a wider output than the default 80. -.PP -Only one file may be specified on the commandline. _E_O_F_ if test 4291 -ne `wc -c < dvi2tty.1 `; then echo shar: "'dvi2tty.1'" unpacked with wrong size! fi echo shar: extracting disdvi.c if test -f 'disdvi.c' then echo shar: over-writing existing file "'disdvi.c'" fi sed -e 's/^-//' << \_E_O_F_ > disdvi.c -/*****************************************************************************/ -/* */ -/* disdvi --- disassembles TeX dvi files. */ -/* */ -/*****************************************************************************/ - -#include <stdio.h> -#include <ctype.h> -#include "commands.h" - -#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) - - -FILE * dvifp; -char * dvi_name; -long pc = 0; - -char * malloc (); - -void main (); -void bop (); -void preamble (); -void postamble (); -void postpostamble (); -void fontdef (); -void special (); -void printnonprint (); -unsigned long num (); -long snum (); - - - - -/*---------------------------------------------------------------------------*/ - -void main(argc, argv) -int argc; -char **argv; -{ - register int opcode; /* dvi opcode */ - register int i; - - 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+4) * 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; - - 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_%d\n", 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: %ld, %ld\n", sget4(), - 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: %ld, %ld\n", sget4(), - 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 : printf("FNT%d: %ld\n", opcode - FNT1 + 1, - num(opcode - FNT1 + 1)); - 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; - } - } - -} /* main */ - - -/*----------------------------------------------------------------------------*/ - - -void bop() -{ - int i; - - printf("BOP page number : %ld\n", sget4()); - for (i=0; i < 3; i++) { - printf("%06ld: ", pc - 1); - printf(" %6ld %6ld %6ld\n", sget4(), sget4(), sget4()); - } - printf("%06ld: ", pc - 1); - printf(" prev page offset : %06ld\n", sget4()); - -} /* bop */ - - -/*---------------------------------------------------------------------------*/ - -void postamble() -{ - - printf("POST last page offset : %06ld\n", sget4()); - printf("%06ld: ", pc - 1); - printf(" numerator : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" denominator : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" magnification : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" max page height : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" max page width : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" stack size needed: %d\n", (int) get2()); - printf("%06ld: ", pc - 1); - printf(" number of pages : %d\n", (int) get2()); - -} /* postamble */ - -void preamble() -{ - register int i; - - printf("PRE version : %d\n", (int) get1()); - printf("%06ld: ", pc - 1); - printf(" numerator : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" denominator : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" magnification : %ld\n", get4()); - printf("%06ld: ", pc - 1); - i = (int) get1(); - printf(" job name (%03d) :", 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 - 1); - printf(" version : %d\n", (int) get1()); - while ((i = (int) get1()) == TRAILER) { - printf("%06d: ", 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 - 1); - for (i = 0; i < len; i++) - putchar((int) get1()); - putchar('\n'); - -} /* special */ - - - -void fontdef(x) -register int x; -{ - register int i; - - printf("FNT_DEF%d: %ld\n", x, num(x)); - printf("%06ld: ", pc - 1); - printf(" checksum : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" scale : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" design : %ld\n", get4()); - printf("%06ld: ", pc - 1); - printf(" name : "); - for (i = (int) get1() + (int) get1(); i > 0; i--) - putchar((int) get1()); - putchar('\n'); - -} /* fontdef */ - - - -void printnonprint(ch) -register int ch; -{ - - printf("Char: "); - switch (ch) { - case 11 : printf("ff /* ligature (non-printing) */"); break; - case 12 : printf("fi /* ligature (non-printing) */"); break; - case 13 : printf("fl /* ligature (non-printing) */"); break; - case 14 : printf("ffi /* ligature (non-printing) */"); break; - case 15 : printf("ffl /* ligature (non-printing) */"); break; - case 16 : printf("i /* (non-printing) */"); break; - case 17 : printf("j /* (non-printing) */"); break; - case 25 : printf("ss /* german (non-printing) */"); break; - case 26 : printf("ae /* scadinavian (non-printing) */"); - break; - case 27 : printf("oe /* scadinavian (non-printing) */"); - break; - case 28 : printf("o /* scadinavian (non-printing) */"); - break; - case 29 : printf("AE /* scadinavian (non-printing) */"); - break; - case 30 : printf("OE /* scadinavian (non-printing) */"); - break; - case 31 : printf("O /* scadinavian (non-printing) */"); - break; - default : printf("0x%2X", 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 */ - - - -/* - - -================================================================================ -== DVI file format == -================================================================================ -no_ops >= 0 bytes (NOP, nops before the preamble) -preamble_marker 1 ubyte (PRE) -version_id 1 ubyte (should be version 2) -numerator 4 ubytes (numerater must equal the one in postamble) -denominator 4 ubytes (denominator must equal the one in postamble) -magnification 4 ubytes (magnification must equal the one in postamble) -id_len 1 ubyte (lenght of identification string) -id_string id_len ubytes (identification string) - -no_ops >= 0 bytes (NOP, nops before a page) -begin_of_page 1 ubyte (BOP) -page_nr 4 sbytes (page number) -do_be_do 36 bytes (filler ????) -prev_page_offset 4 sbytes (offset in file where previous page starts, -1 for none) -... PAGE DATA ... -end_of_page 1 ubyte (EOP) - -no_ops ??? >= 0 bytes (NOPS, I think they are allowed here...) -postamble_marker 1 ubyte (POST) -last_page_offset 4 sbytes (offset in file where last page starts) -numerator 4 ubytes (numerater must equal the one in preamble) -denominator 4 ubytes (denominator must equal the one in preamble) -magnification 4 ubytes (magnification must equal the one in preamble) -max_page_height 4 ubytes (maximum page height) -max_page_width 4 ubytes (maximum page width) -max_stack 2 ubytes (maximum stack depth needed) -total_pages 2 ubytes (number of pages in file) -... FONT DEFINITIONS ... - -postamble_offset 4 sbytes (offset in file where postamble starts) -version_id 1 ubyte (should be version 2) -trailer >= 4 ubytes (TRAILER) -<EOF> - - -FONT DEFINITIONS: - do { - switch (c = getc(dvi_fp) { - case FNTDEF1 : - case FNTDEF2 : - case FNTDEF3 : - case FNTDEF4 : define_font(c); - case POSTPOST : break; - default : error; - } - } while (c != POSTPOST); - -===== A font def looks like: - -1,2,3 or 4 ubytes TeXfontnumber for FNTDEF1 .. FNTDEF4 -4 ubytes checksum -4 ubytes scale -4 ubytes design size -1 byte deflen1 -1 byte deflen2 -deflen1 + deflen2 bytes fontname. - -===== A special looks like: - -1,2,3 or 4 ubytes telling length of special command for XXX1 .. XXX4 -all bytes in the special command are used as defined in the dvi driver. - - -*/ _E_O_F_ if test 14657 -ne `wc -c < disdvi.c `; then echo shar: "'disdvi.c'" unpacked with wrong size! fi echo shar: extracting dvi2tty.c if test -f 'dvi2tty.c' then echo shar: over-writing existing file "'dvi2tty.c'" fi sed -e 's/^-//' << \_E_O_F_ > dvi2tty.c -/****************************************************************************** - * Marcel Mol: 1988-10-25 (UUCP: dutesta!mol) - * dvi2tty.c dvi2tty.h dvistuff.c commands.h - * Converted program to C. - * bogart:/usr/alla/zap/dvitty/dvitty.p 1986-08-15 20:24:31, - * Version to be sent to mod.sources ready. - * New option since last version: - * -Fprog Pipe output to prog. Can be used to get a different - * pager than the default. - * bogart:/usr/alla/zap/dvitty/dvitty.p 1986-01-13 21:49:31, - * Environment variable DVITTY is read and options can be set from it. - * These are the currently implemented options: - * -ofile Write output to file, else write to stdout, - * possibly piped through a pager if stdout is a tty. - * -plist Print pages whos TeX-page-number are in list. - * List is on the form 1,3:6,8 to choose pages - * 1,3-6 and 8. TeX-nrs can be negative: -p-1:-4,4 - * -Plist Print pages whos sequential number are in list. - * -wn Print the lines with width n characters, default is - * 80. Wider lines gives better results. - * -q Don't try to pipe to a pager. - * -f Try to pipe to a pager if output is a tty. - * -Fname Specify a pager program. - * Default of -q and -f is a compile time option, a constant. - * -l Write '^L' instead of formfeed between pages. - * -u Don't try to find Scandinavian characters (they will - * print as a:s and o:s if this option is choosen). - * -s Scandinavian characters printed as }{|][\. - * Default of -s and -u is a compile time option, a constant. - * bogart:/usr/alla/zap/dvitty/dvitty.p 1986-01-10 18:51:03, - * Argument parsing, and random access functions (external, in C) - * and other OS-dependent stuff (in C). Removed private 'pager' & - * tries to pipe through PAGER (environment var) or, if PAGER not - * defined, /usr/ucb/more. Some changes for efficency. - * bogart:/usr/alla/svante/dvitty/dvitty.p 1985-07-15 20:51:00, - * The code for processing dvi-files running on UNIX (UCB-Pascal) - * but no argument parsing. - * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.140, 30-Mar-85 05:43:56, - * Edit: Svante Lindahl - * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.136, 15-Jan-85 13:52:59, - * Edit: Svante Lindahl, final Twenex version !!!?? - * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.121, 14-Jan-85 03:10:22, - * Edit: Svante Lindahl, cleaned up and fixed a lot of little things - * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.25, 15-Dec-84 05:29:56, - * Edit: Svante Lindahl, COMND-interface, including command line scanning - * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.23, 10-Dec-84 21:24:41, - * Edit: Svante Lindahl, added command line scanning with Rscan-JSYS - * VERA::<SVANTE-LINDAHL.DVITTY>DVITTY.PAS.48, 8-Oct-84 13:26:30, - * Edit: Svante Lindahl, fixed switch-parsing, destroyed by earlier patches - * VERA::<SVANTE-LINDAHL.DVITTY>DVITTY.PAS.45, 29-Sep-84 18:29:53, - * Edit: Svante Lindahl - * - * dvitty - get an ascii representation of a dvi-file, suitable for ttys - * - * This program, and any documentation for it, is copyrighted by Svante - * Lindahl. It may be copied for non-commercial use only, provided that - * any and all copyright notices are preserved. - * - * Please report any bugs and/or fixes to: - * - * UUCP: {seismo,mcvax,cernvax,diku,ukc,unido}!enea!ttds!zap - * ARPA: enea!ttds!zap@seismo.CSS.GOV - * or Svante_Lindahl_NADA%QZCOM.MAILNET@MIT-MULTICS.ARPA - * EAN: zap@cs.kth.sunet - */ - - -#include "dvi2tty.h" - - /*-----------------------------------------------------------------------*/ - /* The following constants may be toggled before compilation to */ - /* customize the default behaviour of the program for your site. */ - /* Whichever their settings are, the defaults can be overridden at */ - /* runtime. */ - /*-----------------------------------------------------------------------*/ - -#define DEFSCAND FALSE /* default is Scandinavian, toggle this if you */ - /* don't have terminals with Scand. nat. chars */ -#define WANTPAGER TRUE /* default: try to pipe through a pager (like */ - /* more) if stdout is tty and no -o switch */ -#define DEFPAGER "/usr/bin/pg" - - /*------------------ end of customization constants ---------------------*/ - -#define MAXLEN 100 /* size of char-arrays for strings */ - -/* - * USAGE CODES - */ - -#define wrnge 1 /* width switch arg out of range */ -#define ign 2 /* ignore cause, print 'Usage:..' */ -#define nan 3 /* not a number where one expected */ -#define gae 4 /* garbage at end */ -#define bdlst 5 /* bad page-numberlist */ -#define onef 6 /* only one dvifile allowed */ -#define bdopt 7 /* bad option */ -#define onepp 8 /* only one page list allowed */ -#define noarg 9 /* argument expected */ - -/*---------------------------------------------------------------------------*/ - -printlisttype * currentpage; /* current page to print */ -printlisttype * firstpage; /* first page selected */ -printlisttype * lastpage; /* last page selected */ - -FILE * DVIfile; -FILE * output; -bool outputtofile; /* tells if output goes to file or stdout */ -int ttywidth; /* max nr of chars per printed line */ - -int foo; /* utility variable, "register" */ -bool pager; /* tells if output is piped to a pager */ -char * path; /* name of the pager to run */ -char * progname; /* our name */ -int Argc; -char ** Argv; -char DVIfilename[MAXLEN]; -char * OUTfilename; - -/*---------------------------------------------------------------------------*/ - -char * getenv(); -FILE * popen(); - -void main(); -void setoption(); -void getargs(); -void getpages(); -void plcnxt(); -void getname(); -int getinteger(); -void usage(); - - -/****************************************************************************/ -/* */ -/* M A I N */ -/* */ -/****************************************************************************/ - -void main(argc, argv) -int argc; -char ** argv; -{ - - progname = *argv; - Argc = argc; - Argv = argv; - - getargs(); /* read command line arguments */ - - if ((DVIfile = fopen(DVIfilename, "r")) == NULL) - errorexit(filop); /* can't open dvifile */ - - if (outputtofile) { /* open the outfile, if needed */ - if ((output = fopen(OUTfilename, "w")) == NULL) - errorexit(filcr); - pager = FALSE; - } - else { - output = stdout; - if (isatty(fileno(output)) && pager) { /* try to pipe to a pager */ - if ((output = popen(path, "w")) == NULL) /* get pipe to pager */ - errorexit(pipcr); /* make output to output */ - } - else - pager = FALSE; - } - - dvimain(); - - if (pager) - pclose(output); /* close pipe to pager */ - - exit(0); - -} /* main */ - -/*----------------------------------------------------------------------------*/ - -void setoption(optch, optset, optwarg, str) -char optch; -char *optset, *optwarg; -char *str; -{ - int j = 0; - - while (strchr(optset, optch) != NULL) { - foo = optch; - switch (optch) { - case 'q' : pager = FALSE; break; - case 'f' : pager = TRUE; break; - case 'l' : noffd = TRUE; break; - case 's' : scascii = TRUE; break; - case 'u' : scascii = FALSE; break; - case 'P' : - sequenceon = TRUE; /* fall through */ - case 'p' : - if (pageswitchon) - usage(onepp); - getpages(j, str); - break; - case 'w' : - if (((str[j] < '0') || (str[j] > '9')) - && (str[j] != '-')) - usage(nan); - ttywidth = getinteger(&j, str, 80); - if (str[j] != '\0') - usage(gae); - if ((ttywidth < 16) || (ttywidth > 132)) - usage(wrnge); - break; - case 'o' : - OUTfilename = str; - outputtofile = TRUE; - j = strlen(str); - break; - case 'F' : - path = str; - j = strlen(str); - break; - default : - usage(bdopt); - } - if ((optch = str[j]) == '\0') - break; - j++; - if ((strchr(optwarg, optch) != NULL) && (str[j]='\0')) { - if (--Argc <= 0) - usage(noarg); - str = *++Argv; - j = 0; - } - } -} /* setoption */ - -/*----------------------------------------------------------------------------*/ - -void getargs() -{ - char *str, *envp; - bool DVIfound; /* if a dvi filename found */ - char *optset, *optwarg; - char optch; - - if (Argc <= 1) - usage(ign); - - pageswitchon = FALSE; /* show all pages */ - sequenceon = FALSE; /* selected pages are TeX-numbered */ - outputtofile = FALSE; /* write to stdout */ - noffd = FALSE; /* print formfeed between pages */ - scascii = DEFSCAND; /* scandinavian, compile time option */ - ttywidth = 80; /* default terminal width */ - DVIfound = FALSE; - optset = "wpPousqlfF";/* legal options */ - optwarg = "wpPoF"; /* options with argument */ - - if (pager = WANTPAGER) /* page program, compile time option */ - if ((envp = getenv("PAGER")) != NULL) /* find prefered pager */ - path = envp; /* default pager from env */ - else - path = DEFPAGER; /* pathname of pager program */ - - envp = getenv("DVI2TTY"); - while ((*envp == ' ') && (*envp != '\0')) - envp++; - while (*envp) { /* environment var args */ - if (strchr(optset, optch = *envp++) != NULL) { - /* - * we always pass one option, and arrange for optarg ourselfves, - * so setoption does not mesh up Argv - */ - if (strchr(optwarg, optch) != NULL) { - while ((*envp == ' ') && (*envp != '\0')) - envp++; - if (*envp == '\0') - usage(noarg); - str = envp; /* str points to optarg */ - while ((*envp != ' ') && (*envp != '\0')) - *envp++; /* set envp just after optarg */ - if (*envp != '\0') - *envp++ = '\0'; /* end optarg string */ - } - setoption(optch, optset, optwarg, str); - } - else - usage(bdopt); - while ((*envp == ' ') && (*envp != '\0')) - envp++; - } - - while (--Argc > 0) { /* command line args */ - str = *++Argv; - if (*str != '-') { /* argument is not an option */ - if (DVIfound) - usage(onef); - getname(str); - DVIfound = TRUE; - } - else if (strchr(optset, optch = *++str) != NULL) { - str++; /* point to rest of argument if any */ - if ((strchr(optwarg, optch) != NULL) && (*str == NULL)) { - if (--Argc <= 0) - usage(noarg); - str = *++Argv; - } - setoption(optch, optset, optwarg, str); - } - else - usage(bdopt); - } - - if (!DVIfound) - usage(ign); - -} /* getargs */ - -/*---------------------------------------------------------------------------*/ - -void getpages(j, str) -int j; -char *str; -{ - int i; - - pageswitchon = TRUE; - firstpage = (printlisttype *) malloc(sizeof(printlisttype)); - firstpage->all = FALSE; - firstpage->nxt = nil; - firstpage->pag = 0; - lastpage = firstpage; - currentpage = firstpage; - if ((str[j] >= '0') && (str[j] <= '9') || (str[j] == '-')) - foo = getinteger(&j, str, 0); - else - usage(nan); - while (foo != 0) { - plcnxt(foo); - if (str[j] == ',') { - j++; - if (((str[j] < '0') || (str[j] > '9')) && (str[j] != '-')) - usage(nan); - } - else if (str[j] == ':') { - j++; - if (((str[j] < '0') || (str[j] > '9')) && (str[j] != '-')) - usage(nan); - foo = getinteger(&j, str, 0); - if (currentpage->pag < 0) { - if (foo > 0) { - currentpage->all = TRUE; - plcnxt(foo); - } - else if (foo < currentpage->pag) - for (i = currentpage->pag - 1; i >= foo; i--) - plcnxt(i); - else - usage(bdlst); - } - else { - if (foo < currentpage->pag) - usage(bdlst); - for (i = currentpage->pag + 1; i <= foo; i++) - plcnxt(i); - } - if (str[j] == ',') { - j++; - if (((str[j] < '0') || (str[j] > '9')) && (str[j] != '-')) - usage(nan); - } - } - foo = getinteger(&j, str, 0); - } - if ((str[j] != ' ') || (str[j] != NULL)) - usage(gae); - currentpage = firstpage; - -} /* getpages */ - - -void plcnxt(pagnr) /* place page-nr next in list */ -int pagnr; -{ - currentpage = lastpage; - currentpage->pag = pagnr; - lastpage = (printlisttype *) malloc(sizeof(printlisttype)); - lastpage->all = FALSE; - lastpage->nxt = nil; - lastpage->pag = 0; - currentpage->nxt = lastpage; - -} /* plcnxt */ - -/*----------------------------------------------------------------------------*/ - -void getname(str) -char *str; -{ - int i; - - i = strlen(str); - if (i == 0) - usage(ign); - strcpy(DVIfilename, str); - if (!((i >= 5) && (str[i-1] == 'i') && (str[i-2] == 'v') && - (str[i-3] = 'd') && (str[i-4] = '.'))) { - strcat(DVIfilename, ".dvi"); - } - -} /* getname */ - -/*----------------------------------------------------------------------------*/ - -int getinteger(j, str, def) -int *j; -char *str; -int def; -{ - int cum; - int sgn; - char ch; - - ch = str[*j]; - if (ch == '-') { - sgn = -1; - ch = str[++(*j)]; - } - else - sgn = 1; - if ((ch >= '0') && (ch <= '9')) { - cum = 0; - while ((ch >= '0') && (ch <= '9')) { - cum = cum*10 + ch - '0'; - ch = str[++(*j)]; - } - return sgn * cum; - } - return def; - -} /* getinteger */ - -/*----------------------------------------------------------------------------*/ - -void errorexit(errorcode) -int errorcode; -{ - - fprintf(stderr, "%s: ", progname); - switch (errorcode) { - case illop : fprintf(stderr, "Illegal op-code found: %d\n", opcode); - break; - case stkof : fprintf(stderr, "Stack overflow\n"); - break; - case stkuf : fprintf(stderr, "Stack underflow\n"); - break; - case stkrq : fprintf(stderr, "Cannot create dvi stack\n"); - break; - case badid : fprintf(stderr, "Id-byte is not correct: %d\n ", opcode); - break; - case bdsgn : fprintf(stderr, "Bad signature: %d (not 223)\n", foo); - break; - case fwsgn : fprintf(stderr, "%d signature bytes (min. 4)\n", foo); - break; - case nopre : fprintf(stderr, "Missing preamble\n"); - break; - case nobop : fprintf(stderr, "Missing beginning-of-page command\n"); - break; - case nopp : fprintf(stderr, "Missing post-post command\n"); - break; - case bdpre : fprintf(stderr, "Preamble occured inside a page\n"); - break; - case bdbop : fprintf(stderr, "BOP-command occured inside a page\n"); - break; - case bdpst : fprintf(stderr, "Postamble occured before end-of-page\n"); - break; - case bdpp : fprintf(stderr, "Postpost occured before post-command\n"); - break; - case nopst : fprintf(stderr, "Missing postamble\n"); - break; - case illch : fprintf(stderr, "Character code out of range, 0..127\n"); - break; - case filop : fprintf(stderr, "Cannot open dvifile\n"); - break; - case filcr : fprintf(stderr, "Cannot create outfile\n"); - break; - case pipcr : fprintf(stderr, "Cannot create pipe to pager\n"); - break; - default : fprintf(stderr, "Unkown error code\n"); - break; - }; - if (outputtofile) - unlink(OUTfilename); - exit(errorcode); - -} /* errorexit */ - -/*----------------------------------------------------------------------------*/ - -void usage(uerr) -int uerr; -{ - - if (uerr != ign) { - fprintf(stderr,"%s: ", progname); - switch (uerr) { - case ign : fprintf(stderr, "%s", Copyright); - break; - case wrnge : fprintf(stderr, "width arg out of range:16-132"); - break; - case nan : fprintf(stderr, "numeric argument expected for %c", - foo); - break; - case gae : fprintf(stderr, "garbage at end of argument for %c", - foo); - break; - case bdlst : fprintf(stderr, "mal-formed list of pagenumbers"); - break; - case onef : fprintf(stderr, "only one infile argument allowed"); - break; - case noarg : fprintf(stderr, "option argument expected for %c", - foo); - break; - case bdopt : fprintf(stderr, "bad option %c", foo); - break; - case onepp : fprintf(stderr, "only one pagelist allowed"); - break; - default : fprintf(stderr, "unknown usage error"); - break; - } - fprintf(stderr, "\n"); - } - fprintf(stderr, "Usage: %s [ options ] dvifile[.dvi]\n", progname); - fprintf(stderr, "Options are:\n"); - fprintf(stderr, - " -ofile Write output to file, else write to stdout.\n"); - fprintf(stderr, - " -plist Print pages whos TeX-page-number are in list.\n"); - fprintf(stderr, - " -Plist Print pages whos sequential number are in list.\n"); - fprintf(stderr, - " -wn Print the lines with width n characters, default 80.\n"); - fprintf(stderr, " -f Try to pipe to a pager if output is a tty"); - if (WANTPAGER) - fprintf(stderr, " (default).\n"); - else - fprintf(stderr, ".\n"); - fprintf(stderr, " -q Don't try to pipe to a pager"); - if (WANTPAGER) - fprintf(stderr, ".\n"); - else - fprintf(stderr, " (default).\n"); - fprintf(stderr, - " -l Write ''^L'' instead of formfeed between pages.\n"); - fprintf(stderr, - " -u National Swedish characters printed as aaoAAO"); - if (DEFSCAND) - fprintf(stderr, ".\n"); - else - fprintf(stderr, " (default).\n"); - fprintf(stderr, - " -s National Swedish characters printed as }{|][\\"); - if (DEFSCAND) - fprintf(stderr, " (default).\n"); - else - fprintf(stderr, ".\n"); - exit(uerr); - -} /* usage */ - _E_O_F_ if test 21151 -ne `wc -c < dvi2tty.c `; then echo shar: "'dvi2tty.c'" unpacked with wrong size! fi echo shar: extracting dvistuff.c if test -f 'dvistuff.c' then echo shar: over-writing existing file "'dvistuff.c'" fi sed -e 's/^-//' << \_E_O_F_ > dvistuff.c - - -#include "dvi2tty.h" -#include <sys/types.h> -#include <sys/stat.h> -#include "commands.h" - -#define VERSIONID 2 /* dvi version number that pgm handles */ -#define VERTICALEPSILON 450000 /* crlf when increasing v more than this */ - -#define rightmargin 152 /* nr of columns allowed to the right of h=0*/ -#define leftmargin -50 /* give some room for negative h-coordinate */ -#define LINELEN 203 /* rightmargin - leftmargin + 1 */ - -#define MOVE TRUE /* if advancing h when outputing a rule */ -#define STAY FALSE /* if not advancing h when outputing a rule */ - -#define absolute 0 /* for seeking in files */ -#define relative 1 - -#define FORM 12 /* formfeed */ -#define SPACE 32 /* space */ -#define DEL 127 /* delete */ - -#define LASTCHAR 127 /* max dvi character, above are commands */ - -#define IMIN(a, b) (a<b ? a : b) -#define IMAX(a, b) (a>b ? a : b) - -#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 { - long hh; - long vv; - long ww; - long xx; - long yy; - long zz; -} stackitem; - -typedef struct lineptr { /* the lines of text to be output to outfile */ - long vv; /* vertical position of the line */ - int charactercount; /* pos of last char on line */ - struct lineptr *prev; /* preceding line */ - struct lineptr *next; /* succeding line */ - char text[LINELEN+1]; /* leftmargin..rightmargin */ -} linetype; - -/*---------------------------------------------------------------------------*/ - -bool pageswitchon; /* true if user-set pages to print */ -bool sequenceon; /* false if pagesw-nrs refers to TeX-nrs */ -bool scascii; /* if true make Scand. nat. chars right */ -bool noffd; /* if true output ^L instead of formfeed */ - -int opcode; /* dvi-opcodes */ - -long h, v; /* coordinates, horizontal and vertical */ -long w, x, y, z; /* horizontal and vertical amounts */ - -int pagecounter; /* sequence page number counter */ -long backpointer; /* pointer for offset to previous page */ -long pagenr; /* TeX page number */ -int stackmax; /* stacksize required */ - -long maxpagewidth; /* width of widest page in file */ -long charwidth; /* aprox width of character */ - -linetype * currentline; /* pointer to current line on current page */ -linetype * firstline; /* pointer to first line on current page */ -linetype * lastline; /* pointer to last line on current page */ -int firstcolumn; /* 1st column with something to print */ - -stackitem * stack; /* stack for dvi-pushes */ -int sptr; /* stack pointer */ - -/*---------------------------------------------------------------------------*/ - -void postamble (); -void preamble (); -void walkpages (); -void initpage (); -void dopage (); -void skippage (); -void printpage (); -bool inlist (); -void rule (); -void ruleaux (); -long horizontalmove (); -int skipnops (); -linetype * getline (); -linetype * findline (); -unsigned long num (); -long snum (); -void outchar (); -void putcharacter (); -void setchar (); - - -/*---------------------------------------------------------------------------*/ -/*---------------------------------------------------------------------------*/ - -/* - * The main function for processing the dvi file. - * Here we assume there are to file pointers: DVIfile and output. - * Also there we have a list of pages pointed to by 'currentpage', - * which is only used (in 'inlist()') when a page list is given. - */ - -void dvimain() -{ - - postamble(); /* seek and process the postamble */ - /* note that walkpages *must* immediately follow preamble */ - preamble(); /* process preamble */ - walkpages(); /* time to do the actual work! */ - -} /* dvimain */ - -/*---------------------------------------------------------------------------*/ - -void postamble() /* find and process postamble, use random access */ -{ - register long size; - register int count; - register struct stat st; - - fstat (fileno(DVIfile), &st); - size = (long) st.st_size; /* get size of file */ - count = -1; - do { /* back file up past signature bytes (223), to id-byte */ - if (size == 0) - errorexit(nopst); - size--; - fseek(DVIfile, size, absolute); - opcode = (long) get1(); - count++; - } while (opcode == TRAILER); - if (count < 4) { /* must have 4 trailer bytes */ - foo = count; - errorexit(fwsgn); - } - if (opcode != VERSIONID) - errorexit(badid); - fseek(DVIfile, size-4, absolute); /* back up to back-pointer */ - fseek(DVIfile, sget4(), absolute); /* and to start of postamble */ - if (get1() != POST) - errorexit(nopst); - fseek(DVIfile, 20L, relative); /* lastpageoffset, numerator, denominator */ - /* magnification, maxpageheight */ - maxpagewidth = sget4(); - charwidth = maxpagewidth / ttywidth; - stackmax = (int) get2(); - if ((stack = (stackitem *) malloc(stackmax * sizeof(stackitem))) == NULL) - errorexit(stkrq); - - /* get2() -- totalpages */ - /* fontdefs */ - -} /* postamble */ - -/*---------------------------------------------------------------------------*/ - -void preamble() /* process preamble, use random access */ -{ - - fseek(DVIfile, 0L, absolute); /* read the dvifile from the start */ - if ((opcode = skipnops()) != PRE) - errorexit(nopre); - opcode = get1(); /* check id in preamble, ignore rest of it */ - if (opcode != VERSIONID) - errorexit(badid); - fseek(DVIfile, 12L, relative); /* numerator, denominator, magnification */ - fseek(DVIfile, get1(), relative); /* skip job identification */ - -} /* preamble */ - -/*----------------------------------------------------------------------------*/ - -void walkpages() /* process the pages in the DVI-file */ -{ - register bool wantpage; - - pagecounter = 0; - while ((opcode = skipnops()) != POST) { - if (opcode != BOP) /* should be at start of page now */ - errorexit(nobop); - else { - pagecounter++; - pagenr = sget4(); /* get TeX page number */ - fseek(DVIfile, 36L, relative); /* skip page header */ - backpointer = sget4(); /* get previous page offset */ - if (pageswitchon) - if (sequenceon) - wantpage = inlist(pagecounter); - else - wantpage = inlist(pagenr); - else - wantpage = TRUE; - - if (wantpage) { - initpage(); - dopage(); - printpage(); - } - else { - skippage(); - } - } - } - -} /* walkpages */ - -/*---------------------------------------------------------------------------*/ - -void initpage() -{ - - h = 0L; v = 0L; /* initialize coordinates */ - x = 0L; w = 0L; y = 0L; z = 0L; /* initialize amounts */ - sptr = 0; /* initialize stack */ - currentline = getline(); /* initialize list of lines */ - currentline->vv = 0L; - firstline = currentline; - lastline = currentline; - firstcolumn = rightmargin; - if (pageswitchon) { - if ((sequenceon && (pagecounter != firstpage->pag)) || - (!sequenceon && (pagenr != firstpage->pag))) - if (noffd) - fprintf(output, "^L\n"); - else - putc(FORM, output); - } - else - if (backpointer != -1) - if (noffd) - fprintf(output, "^L\n"); - else - putc(FORM, output); - -} /* initpage */ - -/*----------------------------------------------------------------------------*/ - -void dopage() -{ - - while ((opcode = (int) get1()) != EOP) {/* process page until eop reached */ - if (opcode > POST_POST) - errorexit(illop); - else if (opcode <= LASTCHAR) - outchar(opcode); - else - switch (opcode) { - case SET1 : setchar(get1()); break; - case SET2 : setchar(get2()); break; - case SET3 : setchar(get3()); break; - case SET4 : setchar(get4()); break; - case SET_RULE : rule(MOVE, sget4(), sget4()); break; - case PUT1 : putcharacter(get1()); break; - case PUT2 : putcharacter(get2()); break; - case PUT3 : putcharacter(get3()); break; - case PUT4 : putcharacter(get4()); break; - case PUT_RULE : rule(STAY, sget4(), sget4()); break; - case NOP : break; /* no-op */ - case BOP : errorexit(bdbop); break; - case EOP : break; /* strange place to have EOP */ - case PUSH : if (sptr >= stackmax) /* push */ - errorexit(stkof); - stack[sptr].hh = h; - stack[sptr].vv = v; - stack[sptr].ww = w; - stack[sptr].xx = x; - stack[sptr].yy = y; - stack[sptr].zz = z; - sptr++; - break; - case POP : if (sptr == 0) /* pop */ - errorexit(stkuf); - sptr--; - h = stack[sptr].hh; - v = stack[sptr].vv; - w = stack[sptr].ww; - x = stack[sptr].xx; - y = stack[sptr].yy; - z = stack[sptr].zz; - break; - case RIGHT1 : (void) horizontalmove(sget1()); break; - case RIGHT2 : (void) horizontalmove(sget2()); break; - case RIGHT3 : (void) horizontalmove(sget3()); break; - case RIGHT4 : (void) horizontalmove(sget4()); break; - case W0 : h += w; break; - case W1 : w = horizontalmove(sget1()); break; - case W2 : w = horizontalmove(sget2()); break; - case W3 : w = horizontalmove(sget3()); break; - case W4 : w = horizontalmove(sget4()); break; - case X0 : h += x; break; - case X1 : x = horizontalmove(sget1()); break; - case X2 : x = horizontalmove(sget2()); break; - case X3 : x = horizontalmove(sget3()); break; - case X4 : x = horizontalmove(sget4()); break; - case DOWN1 : v += sget1(); break; - case DOWN2 : v += sget2(); break; - case DOWN3 : v += sget3(); break; - case DOWN4 : v += sget4(); break; - case Y0 : v += y; break; - case Y1 : y = sget1(); v += y; break; - case Y2 : y = sget2(); v += y; break; - case Y3 : y = sget3(); v += y; break; - case Y4 : y = sget4(); v += y; break; - case Z0 : v += z; break; - case Z1 : z = sget1(); v += z; break; - case Z2 : z = sget2(); v += z; break; - case Z3 : z = sget3(); v += z; break; - case Z4 : z = sget4(); v += z; break; - case FNT1 : - case FNT2 : - case FNT3 : /* ignore font changes */ - case FNT4 : fseek(DVIfile, (long) opcode-FNT1+1, relative); - break; - case XXX1 : fseek(DVIfile, get1(), relative); break; - case XXX2 : fseek(DVIfile, get2(), relative); break; - case XXX3 : fseek(DVIfile, get3(), relative); break; - case XXX4 : fseek(DVIfile, get4(), relative); break; - case FNT_DEF1 : - case FNT_DEF2 : - case FNT_DEF3 : /* ignore font definitions */ - case FNT_DEF4 : fseek(DVIfile, (long) opcode-FNT_DEF1+1+12, relative); - fseek(DVIfile, get1() + get1(), relative); - break; - case PRE : errorexit(bdpre); break; - case POST : errorexit(bdpst); break; - case POST_POST: errorexit(bdpp); break; - } - } - -} /* dopage */ - -/*----------------------------------------------------------------------------*/ - -void skippage() /* skip past one page */ -{ - register int opcode; - - while ((opcode = get1()) != EOP) { - if (opcode > POST_POST) - errorexit(illop); - else - switch (opcode) { - case SET1 : - case PUT1 : - case RIGHT1 : - case W1 : - case X1 : - case DOWN1 : - case Y1 : - case Z1 : - case FNT1 : fseek(DVIfile, 1L, relative); break; - case SET2 : - case PUT2 : - case RIGHT2 : - case W2 : - case X2 : - case DOWN2 : - case Y2 : - case Z2 : - case FNT2 : fseek(DVIfile, 2L, relative); break; - case SET3 : - case PUT3 : - case RIGHT3 : - case W3 : - case X3 : - case DOWN3 : - case Y3 : - case Z3 : - case FNT3 : fseek(DVIfile, 3L, relative); break; - case SET4 : - case PUT4 : - case RIGHT4 : - case W4 : - case X4 : - case DOWN4 : - case Y4 : - case Z4 : - case FNT4 : fseek(DVIfile, 4L, relative); break; - case SET_RULE : - case PUT_RULE : fseek(DVIfile, 8L, relative); break; - case BOP : errorexit(bdbop); break; - case XXX1 : fseek(DVIfile, get1(), relative); break; - case XXX2 : fseek(DVIfile, get2(), relative); break; - case XXX3 : fseek(DVIfile, get3(), relative); break; - case XXX4 : fseek(DVIfile, get4(), relative); break; - case FNT_DEF1 : - case FNT_DEF2 : - case FNT_DEF3 : - case FNT_DEF4 : fseek(DVIfile, (long) opcode-FNT_DEF1+1+12, relative); - fseek(DVIfile, get1()+get1(), relative); - break; - case PRE : errorexit(bdpre); break; - case POST : errorexit(bdpst); break; - case POST_POST: errorexit(bdpp); break; - } - } - -} /* skippage */ - -/*---------------------------------------------------------------------------*/ - -void printpage() /* 'end of page', writes lines of page to output file */ -{ - register int i, j; - register char ch; - - if (sptr != 0) - fprintf(stderr, "dvitty: warning - stack not empty at eop.\n"); - currentline = firstline; - do { - if (currentline != firstline) { - foo = ((currentline->vv - currentline->prev->vv)/VERTICALEPSILON)-1; - if (foo > 3) - foo = 3; /* linespacings not too large */ - for (i = 1; i <= foo; i++) - putc('\n', output); - } - if (currentline->charactercount >= leftmargin) { - i = firstcolumn; - j = 1; - foo = ttywidth - 2; - do { - ch = currentline->text[i - leftmargin]; - if (ch >= SPACE) - putc(ch, output); - if ((j > foo) && (currentline->charactercount > i+1)) { - fprintf(output, "*\n"); /* if line to large */ - fprintf(output, " *"); /* mark output */ - j = 2; - } - i++; - j++; - } while (i <= currentline->charactercount); - } - putc('\n', output); - currentline = currentline->next; - } while (currentline != nil); - - currentline = firstline; - while (currentline->next != nil) { - currentline = currentline->next; - free(currentline->prev); - } - free(currentline); /* free last line */ - currentline = nil; - -} /* printpage */ - -/*----------------------------------------------------------------------------*/ - -bool inlist(pagenr) /* ret true if in list of pages */ -register int pagenr; -{ - - while ((currentpage->pag < 0) && (currentpage->pag != pagenr) && - !currentpage->all && (currentpage->nxt != nil)) - currentpage = currentpage->nxt; - if ((currentpage->all && (pagenr < currentpage->pag)) || - (currentpage->pag == pagenr)) - return TRUE; - else if (pagenr > 0) { - while ((currentpage->pag != pagenr) && (currentpage->nxt != nil)) - currentpage = currentpage->nxt; - if (currentpage->pag == pagenr) - return TRUE; - } - return FALSE; - -} /* inlist */ - -/*----------------------------------------------------------------------------*/ - -void rule(moving, rulewt, ruleht) -register bool moving; -register long rulewt, ruleht; -{ /* output a rule (vertical or horizontal), increment h if moving is true */ - - register char ch; /* character to set rule with */ - register long saveh, savev; - /* rule -- starts up the recursive routine */ - if (!moving) - saveh = h; - if ((ruleht <= 0) || (rulewt <= 0)) - h += rulewt; - else { - savev = v; - if ((ruleht / rulewt) > 0) - ch = '|'; - else if (ruleht > (VERTICALEPSILON / 2)) - ch = '='; - else - ch = '_'; - ruleaux(rulewt, ruleht, ch); - v = savev; - } - if (!moving) - h = saveh; - -} /* rule */ - - - -void ruleaux(rulewt, ruleht, ch) /* recursive that does the job */ -register long rulewt, ruleht; -register char ch; -{ - register long wt, lmh, rmh; - - wt = rulewt; - lmh = h; /* save left margin */ - if (h < 0) { /* let rules that start at negative h */ - wt -= h; /* start at coordinate 0, but let it */ - h = 0; /* have the right length */ - } - while (wt > 0) { /* output the part of the rule that */ - rmh = h; /* goes on this line */ - outchar(ch); - wt -= (h-rmh); /* decrease the width left on line */ - } - ruleht -= VERTICALEPSILON; /* decrease the height */ - if (ruleht > VERTICALEPSILON) { /* still more vertical? */ - rmh = h; /* save current h (right margin) */ - h = lmh; /* restore left margin */ - v -= (VERTICALEPSILON + VERTICALEPSILON / 10); - ruleaux(rulewt, ruleht, ch); - h = rmh; /* restore right margin */ - } - -} /* ruleaux */ - -/*----------------------------------------------------------------------------*/ - -long horizontalmove(amount) -register long amount; -{ - - if (abs(amount) > (charwidth / 4)) { - foo = 3*charwidth / 4; - if (amount > 0) - amount = ((amount+foo) / charwidth) * charwidth; - else - amount = ((amount-foo) / charwidth) * charwidth; - h += amount; - return amount; - } - else - return 0; - -} /* horizontalmove */ - -/*----------------------------------------------------------------------------*/ - -int skipnops() /* skips by no-op commands */ -{ - register int opcode; - - while ((opcode = (int) num(1)) == NOP); - return opcode; - -} /* skipnops */ - -/*----------------------------------------------------------------------------*/ - -linetype *getline() /* returns an initialized line-object */ -{ - register int i; - register linetype *temp; - - temp = (linetype *) malloc(sizeof(linetype)); - temp->charactercount = leftmargin - 1; - temp->prev = nil; - temp->next = nil; - for (i = 0; i < LINELEN; i++) - temp->text[i] = ' '; - temp->text[i] = '\0'; - return temp; - -} /* getline */ - -/*----------------------------------------------------------------------------*/ - -linetype *findline() /* find best fit line were text should go */ -{ /* and generate new line if needed */ - register linetype *temp; - register int topd, botd; - - if (v <= firstline->vv) { - if (firstline->vv - v > VERTICALEPSILON) { - temp = getline(); - temp->next = firstline; - firstline->prev = temp; - temp->vv = v; - firstline = temp; - } - return firstline; - } - - if (v >= lastline->vv) { - if (v - lastline->vv > VERTICALEPSILON) { - temp = getline(); - temp->prev = lastline; - lastline->next = temp; - temp->vv = v; - lastline = temp; - } - return lastline; - } - - temp = lastline; - while ((temp->vv > v) && (temp != firstline)) - temp = temp->prev; - - /* temp->vv < v < temp->next->vv */ - topd = v - temp->vv; - botd = temp->next->vv - v; - if ((topd < VERTICALEPSILON) || (botd < VERTICALEPSILON)) - if (topd < botd) - return temp; - else - return temp->next; - - /* no line fits suitable, generate a new one */ - currentline = getline(); - currentline->next = temp->next; - currentline->prev = temp; - temp->next->prev = currentline; - temp->next = currentline; - currentline->vv = v; - return currentline; - -} /* findline */ - -/*----------------------------------------------------------------------------*/ - -unsigned long num(size) -register int size; -{ - register int i; - register long x = 0; - - for (i = 0; i < size; i++) - x = (x << 8) + (unsigned) getc(DVIfile); - return x; - -} /* num */ - - -long snum(size) -register int size; -{ - register int i; - register long x = 0; - - x = getc(DVIfile); - if (x & 0x80) - x -= 0x100; - for (i = 1; i < size; i++) - x = (x << 8) + (unsigned) getc(DVIfile); - return x; - -} /* snum */ - -/*----------------------------------------------------------------------------*/ - -void outchar(ch) /* output ch to appropriate line */ -register char ch; -{ - register int i, j; - - if (abs(v - currentline->vv) > VERTICALEPSILON / 2) - currentline = findline(); - switch (ch) { - case 11 : outchar('f'); ch = 'f'; break; /* ligature */ - case 12 : outchar('f'); ch = 'i'; break; /* ligature */ - case 13 : outchar('f'); ch = 'l'; break; /* ligature */ - case 14 : outchar('f'); outchar('f'); - ch = 'i'; break; /* ligature */ - case 15 : outchar('f'); outchar('f'); - ch = 'l'; break; /* ligature */ - case 16 : ch = 'i'; break; - case 17 : ch = 'j'; break; - case 25 : outchar('s'); ch = 's'; break; /* German double s */ - case 26 : outchar('a'); ch = 'e'; break; /* Dane/Norw ae */ - case 27 : outchar('o'); ch = 'e'; break; /* Dane/Norw oe */ - case 28 : if (scascii) - ch = '|'; /* Dane/Norw /o */ - else - ch = 'o'; - break; - case 29 : outchar('A'); ch = 'E'; break; /* Dane/Norw AE */ - case 30 : outchar('O'); ch = 'E'; break; /* Dane/Norw OE */ - case 31 : if (scascii) - ch = '\\'; /* Dane/Norw /O */ - else - ch = 'O'; - break; -#if 0 - case 92 : ch = '"'; break; /* beginning qoute */ - case 123 : ch = '-'; break; - case 124 : ch = '_'; break; - case 125 : ch = '"'; break; - case 126 : ch = '"'; break; -#endif - } -#ifdef 0 - j = (int) (((double) h / (double) maxpagewidth) * (ttywidth-1)) + 1; -#else - j = h / charwidth; -#endif - if (j > rightmargin) - j = rightmargin; - else if (j < leftmargin) - j = leftmargin; - foo = leftmargin - 1; - /*-------------------------------------------------------------*/ - /* The following is very specialized code, it handles national */ - /* Swedish characters. They are respectively: a and o with two */ - /* dots ("a & "o) and a with a circle (Oa). In Swedish "ASCII" */ - /* these characters replace }{|][ and \. TeX outputs these by */ - /* first issuing the dots or circle and then backspace and set */ - /* the a or o. When dvitty finds an a or o it searches in the */ - /* near vicinity for the character codes that represent circle */ - /* or dots and if one is found the corresponding national char */ - /* replaces the special character codes. */ - /*-------------------------------------------------------------*/ - if (scascii) { - if ((ch == 'a') || (ch == 'A') || (ch == 'o') || (ch == 'O')) { - for (i = IMAX(leftmargin, j-2); - i <= IMIN(rightmargin, j+2); - i++) - if ((currentline->text[i - leftmargin] == 127) || - (currentline->text[i - leftmargin] == 23)) - foo = i; - if (foo >= leftmargin) { - j = foo; - switch (currentline->text[j - leftmargin]) { - case 127 : if (ch == 'a') - ch = '{'; - else if (ch == 'A') /* dots ... */ - ch = '['; - else if (ch == 'o') - ch = '|'; - else if (ch == 'O') - ch = '\\'; - break; - case 23 : if (ch == 'a') - ch = '}'; - else if (ch == 'A') /* circle */ - ch = ']'; - break; - } - } - } - } - /*----------------- end of 'Scandinavian code' ----------------*/ - if (foo == leftmargin-1) - while ((currentline->text[j - leftmargin] != SPACE) - && (j < rightmargin)) { - j++; - h += charwidth; - } - if ( ((ch >= SPACE) && (ch != DEL)) || - (scascii && (ch == 23)) ) { - if (j < rightmargin) - currentline->text[j - leftmargin] = ch; - else - currentline->text[rightmargin - leftmargin] = '@'; - if (j > currentline->charactercount) - currentline->charactercount = j; - if (j < firstcolumn) - firstcolumn = j; - h += charwidth; - } - -} /* outchar */ - -/*----------------------------------------------------------------------------*/ - -void putcharacter(charnr) /* output character, don't change h */ -register int charnr; -{ - register long saveh; - - saveh = h; - if ((charnr >= 0) && (charnr <= LASTCHAR)) - outchar(charnr); - else - setchar(charnr); - h = saveh; - -} /* putcharacter */ - -/*----------------------------------------------------------------------------*/ - -void setchar(charnr) -int charnr; -{ /* should print characters with character code>127 from current font */ - /* note that the parameter is a dummy, since ascii-chars are<=127 */ - - outchar('#'); - -} /* setchar */ - _E_O_F_ if test 30055 -ne `wc -c < dvistuff.c `; then echo shar: "'dvistuff.c'" unpacked with wrong size! fi echo shar: extracting commands.h if test -f 'commands.h' then echo shar: over-writing existing file "'commands.h'" fi sed -e 's/^-//' << \_E_O_F_ > commands.h -/* DVI COMMANDS */ -#define SETC_000 0 /* typeset character 0 and move right */ -#define SETC_127 127 /* typeset character 127 and move right */ -#define SET1 128 /* typeset a character and move right */ -#define SET2 129 /* ??? */ -#define SET3 130 /* ??? */ -#define SET4 131 /* ??? */ -#define SET_RULE 132 /* typeset a rule and move right */ -#define PUT1 133 /* typeset a character */ -#define PUT2 134 /* ??? */ -#define PUT3 135 /* ??? */ -#define PUT4 136 /* ??? */ -#define PUT_RULE 137 /* typeset a rule */ -#define NOP 138 /* no operation */ -#define BOP 139 /* beginning of page */ -#define EOP 140 /* ending of page */ -#define PUSH 141 /* save the current positions */ -#define POP 142 /* restore previous positions */ -#define RIGHT1 143 /* move right */ -#define RIGHT2 144 /* ??? */ -#define RIGHT3 145 /* ??? */ -#define RIGHT4 146 /* ??? */ -#define W0 147 /* move right by |w| */ -#define W1 148 /* move right and set |w| */ -#define W2 149 /* ??? */ -#define W3 150 /* ??? */ -#define W4 151 /* ??? */ -#define X0 152 /* move right by |x| */ -#define X1 153 /* move right and set |x| */ -#define X2 154 /* ??? */ -#define X3 155 /* ??? */ -#define X4 156 /* ??? */ -#define DOWN1 157 /* move down */ -#define DOWN2 158 /* ??? */ -#define DOWN3 159 /* ??? */ -#define DOWN4 160 /* ??? */ -#define Y0 161 /* move down by |y| */ -#define Y1 162 /* move down and set |y| */ -#define Y2 163 /* ??? */ -#define Y3 164 /* ??? */ -#define Y4 165 /* ??? */ -#define Z0 166 /* move down by |z| */ -#define Z1 167 /* move down and set |z| */ -#define Z2 168 /* ??? */ -#define Z3 169 /* ??? */ -#define Z4 170 /* ??? */ -#define FONT_00 171 /* set current font to 0 */ -#define FONT_63 234 /* set current font to 0 */ -#define FNT1 235 /* set current font */ -#define FNT2 236 /* Same as FNT1, except that arg is 2 bytes */ -#define FNT3 237 /* Same as FNT1, except that arg is 3 bytes */ -#define FNT4 238 /* Same as FNT1, except that arg is 4 bytes */ -#define XXX1 239 /* extension to \.DVI primitives */ -#define XXX2 240 /* Like XXX1, but 0<=k<65536 */ -#define XXX3 241 /* Like XXX1, but 0<=k<@t$2^{24}$@> */ -#define XXX4 242 /* potentially long extension to \.DVI - primitives */ -#define FNT_DEF1 243 /* define the meaning of a font number */ -#define FNT_DEF2 244 /* ??? */ -#define FNT_DEF3 245 /* ??? */ -#define FNT_DEF4 246 /* ??? */ -#define PRE 247 /* preamble */ -#define POST 248 /* postamble beginning */ -#define POST_POST 249 /* postamble ending */ -#define TRAILER 223 /* trailer bytes in dvi file */ - - /* undefined_commands 250,251,252,253,254,255 */ _E_O_F_ if test 3506 -ne `wc -c < commands.h `; then echo shar: "'commands.h'" unpacked with wrong size! fi echo shar: extracting dvi2tty.h if test -f 'dvi2tty.h' then echo shar: over-writing existing file "'dvi2tty.h'" fi sed -e 's/^-//' << \_E_O_F_ > dvi2tty.h -#define Copyright "dvi2tty.c Copyright (C) 1984, 1985, 1986 Svante Lindahl.\n\ -Copyright (C) 1988 M.J.E. Mol" - -#include <stdio.h> - -#define TRUE 1 -#define FALSE 0 -#define nil NULL - -/* - * ERROR CODES , don't start with 0 - */ - -#define illop 1 /* illegal op-code */ -#define stkof 2 /* stack over-flow */ -#define stkuf 3 /* stack under-flow */ -#define stkrq 4 /* stack requirement */ -#define badid 5 /* id is not right */ -#define bdsgn 6 /* signature is wrong */ -#define fwsgn 7 /* too few signatures */ -#define nopre 8 /* no pre-amble where expected */ -#define nobop 9 /* no bop-command where expected */ -#define nopp 10 /* no postpost where expected */ -#define bdpre 11 /* unexpected preamble occured */ -#define bdbop 12 /* unexpected bop-command occured */ -#define bdpst 13 /* unexpected post-command occured */ -#define bdpp 14 /* unexpected postpost */ -#define nopst 15 /* no post-amble where expected */ -#define illch 16 /* character code out of range */ -#define filop 17 /* cannot access file */ -#define filcr 18 /* cannot creat file */ -#define pipcr 19 /* cannot creat pipe */ - -/*---------------------------------------------------------------------------*/ - -typedef char bool; - -typedef struct prlistptr { /* list of pages selected for output */ - int pag; /* number of pages */ - bool all; /* pages in intervall selected */ - struct prlistptr *prv; /* previous item in list */ - struct prlistptr *nxt; /* next item in list */ - int adr; /* nr of byte in file where bop is */ -} printlisttype; - -/*---------------------------------------------------------------------------*/ - -extern bool outputtofile; /* output to file or stdout(dvi2tty.c)*/ -extern bool pageswitchon; /* user-set pages to print(dvistuff.c)*/ -extern bool sequenceon; /* not TeX pagenrs (dvistuff.c) */ -extern bool scascii; /* Scand. nat. chars (dvistuff.c) */ -extern bool noffd; /* output ^L or formfeed (dvistuff.c) */ - -extern printlisttype *currentpage; /* current page to print (dvi2tty.c) */ -extern printlisttype *firstpage; /* first page selected (dvi2tty.c) */ -extern printlisttype *lastpage; /* last page selected (dvi2tty.c) */ - -extern int ttywidth; /* screen width (dvi2tty.c) */ -extern int foo; /* temporary 'register' (dvi2tty.c) */ -extern int opcode; /* dvi opcode (dvistuff.c) */ - -extern FILE *DVIfile; /* dvi file (dvi2tty.c) */ -extern FILE *output; /* output file (dvi2tty.c) */ - -/*---------------------------------------------------------------------------*/ - -/* dvi2tty.c */ -void errorexit(); - -/* dvistuff.c */ -void dvimain(); _E_O_F_ if test 3488 -ne `wc -c < dvi2tty.h `; then echo shar: "'dvi2tty.h'" unpacked with wrong size! fi # end of shell archive exit 0 -- ######################################### # Marcel J.E. Mol # They hate you if your're clever # Delft, University of Technology # And they despise the fool # Mekelweg .... enzovoorts # Till you're so fucking crazy # Delft # You can't follow the rules. ######################################### - Lennon