v05i096: dvi2tty
Root
marcel at duteca.UUCP
Thu Dec 29 11:51:53 AEST 1988
Posting-number: Volume 5, Issue 96
Submitted-by: "Root" <marcel at 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 at 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 at seismo.CSS.GOV EAN: zap at 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 at 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 at seismo.CSS.GOV
- * or Svante_Lindahl_NADA%QZCOM.MAILNET at MIT-MULTICS.ARPA
- * EAN: zap at 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
More information about the Comp.sources.misc
mailing list