parag@hpsdeb.sde.hp.com (Parag Patel) (05/15/91)
Submitted-by: Parag Patel <parag@hpsdeb.sde.hp.com> Posting-number: Volume 19, Issue 66 Archive-name: dvi/part03 ---- Cut Here and feed the following to sh ---- #!/bin/sh # This is part 03 of dvi # ============= pkfont.C ============== if test -f 'pkfont.C' -a X"$1" != X"-c"; then echo 'x - skipping pkfont.C (File already exists)' else echo 'x - extracting pkfont.C (Text)' sed 's/^X//' << 'SHAR_EOF' > 'pkfont.C' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. static const char rcsid[] = "$Header: pkfont.C,v 1.21 91/02/22 15:58:17 hmgr Exp $"; X // read font data from the METAFONT PK (packed font) files // // by Parag Patel X #include "defs.h" X X // these are for "drawing" an image of a character in a font const int WHITE = FALSE; const int BLACK = TRUE; X X // return a string containing the magnification sub-directory for the // requested magnification // char *pkmagdir(Dirlist &dirlist, long mag) { X // look for the closest resolution value to the one desired X int ent = -1; X long diff = MAXLONG; X X for (int i = 0; i < dirlist.size(); i++) X { X long magval = dirlist[i].val; X if (strchr(dirlist[i].name, '.') == NULL) X { X magval *= 1000; X magval /= RESOLUTION; X } X X long d = mag - magval; X long newdiff = d < 0 ? -d : d; // absolute value X if (newdiff < diff) X { X diff = newdiff; X ent = i; X } X } X debug(7, "PK dir ent=%s diff=%ld mag=%ld", X ent < 0 ? "" : dirlist[ent].name, diff, mag); X X // we should be within 1/32 (~3%) of the desired mag value X if (ent < 0 || diff > (mag >> 5)) X return ""; X X // return the new value as a string, if there was one X return dirlist[ent].name; } X X // setup a PK font file in memory // void setuppkfont(font &f, FILE *fp) { X // skip the comment X int len = (unsigned)getuval(1, fp); X while (len-- > 0) X (void)getuval(1, fp); X X // get and verify that the design size is ok - the PK file stores X // this value as a "fix_word" value while the DVI file keeps it as X // a "scaled-point" value - also note that the "basename" pointer X // is NULL only for the "dumpfont" main program X X long dsize = getsval(4, fp); X debug(4, "PK designsize=%ld", dsize); X if (f.basename != NULL && dsize >> 4 != f.designsize) X if (dochecksum && dsize != 0 && f.designsize != 0) X quit("Designsize in DVI and PK file %s does not match", f.path); X else X warn("Designsize in DVI and PK file %s does not match", f.path); X X // check the checksum X long check = getuval(4, fp); X debug(5, "PK checksum=%ld", check); X if (f.basename != NULL && check != f.checksum) X if (dochecksum && check != 0 && f.checksum != 0) X quit("Checksums in DVI and PK file %s do not match", f.path); X else X warn("Checksums in DVI and PK file %s do not match", f.path); X X // get the horizontal and vertical pixels per point values X f.hppp = getuval(4, fp); X f.vppp = getuval(4, fp); X X debug(3, "mag=%ld hppp=%ld vppp=%ld", f.mag, f.hppp, f.vppp); X X f.minm = MAXLONG; X f.maxm = -MAXLONG; X f.minn = MAXLONG; X f.maxn = -MAXLONG; X X // now initialize the info for each character in this font X int op; X while ((op = (int)getuval(1, fp)) != PKPOST) X { X switch (op) X { X // special opcodes - just ignore for now X case PKXXX1: X skipbytes(getuval(1, fp), fp); X continue; X case PKXXX2: X skipbytes(getuval(2, fp), fp); X continue; X case PKXXX3: X skipbytes(getuval(3, fp), fp); X continue; X case PKXXX4: X skipbytes(getuval(4, fp), fp); X continue; X X // special numeric opcode - also ignored X case PKYYY: X (void)getuval(4, fp); X continue; X X case PKNOOP: X continue; X default: X ; X } X X // save the location of this character in the file X long floc = ftell(fp) - 1; X X if (op > PKCHAR) X quit("Illegal opcode %d in PK file %s", op, f.path); X X int flag = op; X int size = (flag & 0x04) ? 2 : 1; X int addtolen = flag & 0x03; X if ((flag & 0x07) == 0x07) X size = 4; X X long packetlen, charcode; X X switch (size) X { X Case 1: X packetlen = getuval(1, fp) + (addtolen << 8); X charcode = getuval(1, fp); X X Case 2: X packetlen = getuval(2, fp) + (addtolen << 16); X charcode = getuval(1, fp); X X Case 4: X packetlen = getuval(4, fp); X charcode = getuval(4, fp); X X Default: X quit("?!?Eh? Internal error - size must be 1, 2, or 4."); X } X X if (charcode >= MAXCHARS) X quit("Char %ld too big in PF file %s", charcode, f.path); X fontchar & g = f.chr[charcode]; X X // save the location of the character data in the file X g.floc = floc; X X double tfmwidth; X long width, height, hoff, voff; X X switch (size) X { X Case 1: X tfmwidth = Getuval(3, fp); X g.dx = getuval(1, fp) << 16; X g.dy = 0; X width = getuval(1, fp); X height = getuval(1, fp); X hoff = getsval(1, fp); X voff = getsval(1, fp); X packetlen -= 8; X X Case 2: X tfmwidth = Getuval(3, fp); X g.dx = getuval(2, fp) << 16; X g.dy = 0; X width = getuval(2, fp); X height = getuval(2, fp); X hoff = getsval(2, fp); X voff = getsval(2, fp); X packetlen -= 13; X X Case 4: X tfmwidth = Getsval(4, fp); X g.dx = getuval(4, fp); X g.dy = getuval(4, fp); X width = getuval(4, fp); X height = getuval(4, fp); X hoff = getsval(4, fp); X voff = getsval(4, fp); X packetlen -= 28; X X Default: X quit("?!?Eh? Internal error - size must be 1, 2, or 4."); X } X X // calculate character min/max boundaries X g.minm = -hoff; X g.maxm = width - hoff; X g.minn = voff - height + 1; X g.maxn = voff; X X // set the size limits of the characters in this font X if (g.minm < f.minm) X f.minm = g.minm; X if (g.maxm > f.maxm) X f.maxm = g.maxm; X if (g.minn < f.minn) X f.minn = g.minn; X if (g.maxn > f.maxn) X f.maxn = g.maxn; X X // calculate the scaled points width from the pixel width X g.width = (double)tfmwidth / (double)16 * (double)f.designsize / X (double)65536L * (double)f.mag / 1000.0; X X // skip the character data and go to the next char X if (fseek(fp, packetlen, SEEK_CUR) < 0) X quit("Cannot seek past character data in %s", f.path); X } } X X static long packetlen = 0; X X // return a nybble (4-bit value) from a file - reset ourselves // if we are called with a NULL file - return the upper nybble // of a byte first and then the lower - as a side-effect, we decrement // the packetlen count for every byte read from the file // static int getnyb(FILE *fp) { X static boolean nybsave = FALSE; X static int nybdata = 0; X X packetlen--; X if (fp == NULL || nybsave) X { X nybsave = FALSE; X return nybdata & 0x0F; X } X nybsave = TRUE; X nybdata = (unsigned)getuval(1, fp); X return nybdata >> 4; } X X X static int dynf = 0; static int repeat = 0; X X // get a packed run-count value from a file using getnyb() above - // assumes that dynf above is initialized to a reasonable value // static int getpacked(FILE *fp) { X int i = getnyb(fp); X if (i == 0) X { X if (packetlen <= 0) X return 0; X int j; X do X { X j = getnyb(fp); X i++; X } while (j == 0); X while (i-- > 0) X j = (j << 4) + getnyb(fp); X return j - 15 + ((13 - dynf) << 4) + dynf; X } X if (i <= dynf) X return i; X if (i < 14) X return ((i - dynf - 1) << 4) + getnyb(fp) + dynf + 1; X if (i == 14) X repeat = getpacked(fp); X else X repeat = 1; X return getpacked(fp); } X X X // load the specified character "ch" from the PK file - we read this // character's PK commands to build a bitmap of the character in memory // void getpkchar(font &f, fontchar &g, int ch) { X // go to the file where this character is defined X if (fseek(f.fp, g.floc, SEEK_SET) < 0) X quit("Cannot fseek to start of font in %s", f.path); X FILE *fp = f.fp; X X // reset our get-nybble function X (void)getnyb(NULL); X X int flag = (unsigned)getuval(1, fp); X if (flag > PKCHAR) X quit("Illegal flag value %d in PK file %s", flag, f.path); X X // set up globals for getpacked() above X dynf = flag >> 4; X X int size = (flag & 0x04) ? 2 : 1; X long addtolen = flag & 0x03; X if ((flag & 0x07) == 0x07) X size = 4; X X long charcode; X X switch (size) X { X Case 1: X packetlen = getuval(1, fp) + (addtolen << 8); X charcode = getuval(1, fp); X X Case 2: X packetlen = getuval(2, fp) + (addtolen << 16); X charcode = getuval(1, fp); X X Case 4: X packetlen = getuval(4, fp); X charcode = getuval(4, fp); X X Default: X quit("?!?Eh? Internal error - size must be 1, 2, or 4"); X } X X if (charcode != ch) X quit("?!?Eh? Internal error - expected charcode for %d here", ch); X X long dx, dy, tfmwidth, width, height, hoff, voff; X X switch (size) X { X Case 1: X tfmwidth = getuval(3, fp); X dx = getuval(1, fp) << 16; X dy = 0; X width = getuval(1, fp); X height = getuval(1, fp); X hoff = getsval(1, fp); X voff = getsval(1, fp); X packetlen -= 8; X X Case 2: X tfmwidth = getuval(3, fp); X dx = getuval(2, fp) << 16; X dy = 0; X width = getuval(2, fp); X height = getuval(2, fp); X hoff = getsval(2, fp); X voff = getsval(2, fp); X packetlen -= 13; X X Case 4: X tfmwidth = getuval(4, fp); X dx = getuval(4, fp); X dy = getuval(4, fp); X width = getuval(4, fp); X height = getuval(4, fp); X hoff = getsval(4, fp); X voff = getsval(4, fp); X packetlen -= 28; X X Default: X quit("?!?Eh? Internal error - size must be 1, 2, or 4."); X } X { X int len; X const char *x = dev_char2dev(ch, len); X debug(5, "char=%d(%s) minm=%ld maxm=%ld minn=%ld maxn=%ld", X ch, x, g.minm, g.maxm, g.minn, g.maxn); X debug(5, " dx=%ld dy=%ld dx/=%ld dy/=%ld width=%ld/%f height=%ld", X dx, dy, dx >> 16, dy >> 16, width, g.width, height); X debug(5, " hoff=%ld voff=%ld len=%ld flag=%d dyn_f=%d", X hoff, voff, packetlen, flag, dynf); X } X X if (dynf < 0 || dynf > 14) X quit("?!?Eh? dyn_f value must be 0-14 inclusive - not %d", dynf); X X // initialize the character painting variables X register long m = 0; X register long n = height - 1; X int p = (flag & 0x08) ? BLACK : WHITE; X X // clear the global fontbits for the bitmap X for (long d = n; d >= 0; d--) X fontbits[d]->clear(); X X // paint the fontbits to build this character X if (dynf < 14) X { X // packed data X repeat = 0; X packetlen <<= 1; X while (packetlen > 0) X { X int count = getpacked(fp); X while (count-- > 0) X { X if (p) X *fontbits[n] += m; X if (++m >= width) X { X long r = n--; X n -= repeat; X m = 0; X for (; repeat > 0; repeat--) X *fontbits[r - repeat] = *fontbits[r]; X repeat = 0; X } X } X p = !p; X } X for (; repeat > 0; repeat--) X *fontbits[n - repeat] = *fontbits[n]; X } X else X { X // straight bit-map X while (packetlen-- > 0) X { X int byte = (unsigned)getuval(1, fp); X for (int mask = 0x0080; mask != 0; mask >>= 1) X { X if (byte & mask) X *fontbits[n] += m; X if (++m >= width) X { X n--; X m = 0; X } X } X } X } } SHAR_EOF chmod 0444 pkfont.C || echo 'restore of pkfont.C failed' Wc_c="`wc -c < 'pkfont.C'`" test 10380 -eq "$Wc_c" || echo 'pkfont.C: original size 10380, current size' "$Wc_c" fi # ============= bitvec.C ============== if test -f 'bitvec.C' -a X"$1" != X"-c"; then echo 'x - skipping bitvec.C (File already exists)' else echo 'x - extracting bitvec.C (Text)' sed 's/^X//' << 'SHAR_EOF' > 'bitvec.C' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. static const char rcsid[] = "$Header: bitvec.C,v 1.5 91/02/22 15:58:31 hmgr Exp $"; X // An array of bits // // By Parag Patel X #include <stdio.h> #include "bitvec.h" X X // the following are machine-dependant - change them if necessary // sizeof long == 32 bits == 2**5 --> 5, therefore ... const int NUM = 32; const int SHIFT = 5; const int MASK = 0x1F; const unsigned long EMPTY = 0L; X X // generic minimum function inline long MIN(long i1, long i2) { X return i1 < i2 ? i1 : i2; } X // this determines which particular "long" in the array has this element inline long ELT(long e) { X return e >> SHIFT; } X // this gets the bit position in a "long" for this vec element inline unsigned long BIT(long e) { X return ((unsigned long)(1L << (e & MASK))); } X // this adds an element to an array of longs inline void ADD(unsigned long *elts, long e) { X elts[ELT(e)] |= BIT(e); } X X // return a new vec of elts - clear it static unsigned long *newelts(long largest) { X register unsigned long *elts = new unsigned long[ELT(largest) + 1]; X X for (register long i = ELT(largest); i >= 0; i--) X elts[i] = EMPTY; X return elts; } X // bump the size of a vec void Bitvec::bumpsize(long largest) { X if (largest <= num) X return; X X // only re-allocate our array if we are out of ELTs X if (ELT(largest) != ELT(num)) X { X register unsigned long *ne = newelts(largest); X for (register long i = ELT(num); i >= 0; i--) X ne[i] = elts[i]; X delete elts; X elts = ne; X } X num = largest; } X // various constructors: X // make a new vec of the specified size Bitvec::Bitvec(long size) { X if (size <= 1) X size = 1; X elts = newelts(num = size - 1); } X // dup a vec Bitvec::Bitvec(const Bitvec &s) { X elts = newelts(num = s.num); X for (register long i = ELT(s.num); i >= 0; i--) X elts[i] = s.elts[i]; } X // assign a vec to a vec - also a dup Bitvec &Bitvec::operator=(const Bitvec &s) { X register long i, t; X X BUMPSIZE(s.num); X for (i = t = ELT(s.num); i >= 0; i--) X elts[i] = s.elts[i]; X for (i = ELT(num); i > t; i--) X elts[i] = EMPTY; X return *this; } X X // add an element to a vec Bitvec &Bitvec::add(long elt) { X if (elt < 0) X return *this; X BUMPSIZE(elt); X elts[ELT(elt)] |= BIT(elt); X return *this; } X // delete an element from a vec Bitvec &Bitvec::remove(long elt) { X if (elt < 0) X return *this; X elts[ELT(elt)] &= ~BIT(elt); X return *this; } X // is vec same as s? boolean Bitvec::operator==(const Bitvec &s) const { X register long i = MIN(num, s.num); X X for (i = ELT(i); i >= 0; i--) X if (elts[i] != s.elts[i]) X return FALSE; X if (num == s.num) X return TRUE; X X register long t; X if (num < s.num) X { X for (t = ELT(num), i = ELT(s.num); i > t; i--) X if (s.elts[i]) X return FALSE; X } X else X { X for (t = ELT(s.num), i = ELT(num); i > t; i--) X if (elts[i]) X return FALSE; X } X return TRUE; } X X // return the number of elements in the vec (cardinality) long Bitvec::size() const { X register long n = 0; X X for (register long i = ELT(num); i >= 0; i--) X for (register unsigned long m = 1; m; m <<= 1) X if (elts[i] & m) X n++; X return n; } X // clear the vec of all elements void Bitvec::clear() { X for (register long i = ELT(num); i >= 0; i--) X elts[i] = EMPTY; } SHAR_EOF chmod 0444 bitvec.C || echo 'restore of bitvec.C failed' Wc_c="`wc -c < 'bitvec.C'`" test 3331 -eq "$Wc_c" || echo 'bitvec.C: original size 3331, current size' "$Wc_c" fi # ============= hp2684.h ============== if test -f 'hp2684.h' -a X"$1" != X"-c"; then echo 'x - skipping hp2684.h (File already exists)' else echo 'x - extracting hp2684.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'hp2684.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: hp2684.h,v 1.10 91/02/22 15:58:37 hmgr Exp $ X // HP2684 LaserJet 2000 device-specific definitions. // The LaserJet 2000 Reference Manual should be consulted for more // information on the various constants. // // by Parag Patel X X class HP2684 : public HP33447 { protected: X HP2684(int maxf, int maxc, int maxpg, int maxld, int res, X int ho, int vo, int fhmn, int fhmx, int fvmn, X int fvmx, int fwd, int fhg, char *deffp) : X HP33447(maxf, maxc, maxpg, maxld, res, ho, vo, X fhmn, fhmx, fvmn, fvmx, fwd, fhg, deffp) { } public: X HP2684(); }; SHAR_EOF chmod 0444 hp2684.h || echo 'restore of hp2684.h failed' Wc_c="`wc -c < 'hp2684.h'`" test 632 -eq "$Wc_c" || echo 'hp2684.h: original size 632, current size' "$Wc_c" fi # ============= hp33440.h ============== if test -f 'hp33440.h' -a X"$1" != X"-c"; then echo 'x - skipping hp33440.h (File already exists)' else echo 'x - extracting hp33440.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'hp33440.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: hp33440.h,v 1.8 91/02/22 15:58:41 hmgr Exp $ X // LaserJetII series device-specific definitions. // The LaserJetII Reference Manual should be consulted for more // information on the various constants. // // by Parag Patel X X // LaserJetII // class HP33440 : public HP2686 { protected: X HP33440(int maxf, int maxc, int maxpg, int maxld, int res, X int ho, int vo, int fhmn, int fhmx, int fvmn, int fvmx, X int fwd, int fhg, char *deffp) : X HP2686(maxf, maxc, maxpg, maxld, res, ho, vo, X fhmn, fhmx, fvmn, fvmx, fwd, fhg, deffp) { } public: X HP33440(); }; X X // LaserJetIID - does double-sided but is otherwise identical to the II // class HP33447 : public HP33440 { protected: X HP33447(int maxf, int maxc, int maxpg, int maxld, int res, X int ho, int vo, int fhmn, int fhmx, int fvmn, X int fvmx, int fwd, int fhg, char *deffp); public: X HP33447(); X ~HP33447(); X void newpage(boolean odd, boolean first); }; SHAR_EOF chmod 0444 hp33440.h || echo 'restore of hp33440.h failed' Wc_c="`wc -c < 'hp33440.h'`" test 1015 -eq "$Wc_c" || echo 'hp33440.h: original size 1015, current size' "$Wc_c" fi # ============= hp2686.h ============== if test -f 'hp2686.h' -a X"$1" != X"-c"; then echo 'x - skipping hp2686.h (File already exists)' else echo 'x - extracting hp2686.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'hp2686.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: hp2686.h,v 1.13 91/02/22 15:58:47 hmgr Exp $ X // HP2686 LaserJet+ device-specific definitions. // The LaserJet+ Reference Manual should be consulted for more // information on the various constants. // // by Parag Patel X X class HP2686 : public Device { protected: X HP2686(int maxf, int maxc, int maxpg, int maxld, int res, X int ho, int vo, int fhmn, int fhmx, int fvmn, int fvmx, X int fwd, int fhg, char *deffp); X void downljchar(font &f, fontchar &g, int ch); public: X HP2686(); X ~HP2686(); X X const char *char2dev(int ch, int &len); X long sp2dev(double sp); X double dev2sp(long pix); X X void newpage(boolean odd, boolean first); X void downchar(font &f, fontchar &g, int ch); X void bigchar(font &f, fontchar &g, int ch); X void movehv(long h, long v); X void moveh(long); X void movev(long); X void push(); X void pop(); X void delfont(font &); X void newfont(font &); X void usefont(font &); X void rule(double v, double h); }; X #define HP2686_FPATH "/usr/lib/tex/fontbits/laser:/usr/lib/tex/fnt:/usr/local/tex/fontbits/laser" X // about 1 inch from both margins - tweaked until TeX test comes out right // when printed to a LaserJet - lots of fun with unprintable regions! #define HP2686_HOFFSET 245 #define HP2686_VOFFSET 300 SHAR_EOF chmod 0444 hp2686.h || echo 'restore of hp2686.h failed' Wc_c="`wc -c < 'hp2686.h'`" test 1357 -eq "$Wc_c" || echo 'hp2686.h: original size 1357, current size' "$Wc_c" fi # ============= defs.h ============== if test -f 'defs.h' -a X"$1" != X"-c"; then echo 'x - skipping defs.h (File already exists)' else echo 'x - extracting defs.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'defs.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: defs.h,v 1.22 91/02/22 15:58:55 hmgr Exp $ X // Header file for a C++ TeX DVI filter. // Strangely enough, this file should be device-INdependent. // // by Parag Patel X X // This program takes as input the DVI file generated by TeX or LaTeX // and converts it to a device-specific format that is used to actually // typeset (print) the document. The device-specific info should be in // the files "dev.h" and "dev.c". The HP2686 LaserJet+ is currently // supported, but others should be fairly easy to add, unless the code // isn't as device-indenpendent as it was intended to be. // // The DVI file format is described in the book "TeX: The Program" by // Donald E. Knuth (of course) pp. 234-243. This program also uses the // GF (Generic Font) format files to determine what to download to the // device/printer. This format is described in the book // "METAFONT: The Program" by Donald E. Knuth pp. 484-489. Both these // books should be used to determine exactly what the code is supposed // to be doing. The various number formats are also described in // these books. X X // some standard include files #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <math.h> #include <sys/types.h> #ifndef __ZTC__ # include <sys/param.h> # include <unistd.h> #endif #if !defined(BSD) && !defined(__ZTC__) # include <values.h> #endif X #ifdef __ZTC__ X extern "C" int getopt(int, const char**, const char*); # define NUMOPENFILES 7 #endif X #ifdef MSDOS # define PATHSEP ';' # define F_READ "rb" #endif #ifndef PATHSEP # define PATHSEP ':' #endif X #ifndef NUMOPENFILES # define NUMOPENFILES 5 #endif #ifndef MAXLONG # define MAXLONG 0x7FFFFFFFL #endif #ifndef MAXPATHLEN # define MAXPATHLEN 64 #endif #ifndef SEEK_SET # define SEEK_SET 0 # define SEEK_CUR 1 # define SEEK_END 2 #endif #ifndef _NFILE # define _NFILE 20 #endif #ifndef F_READ // for fopen(), because of POS-ICKS adding "rb" instead of "rt" # define F_READ "r" #endif X // handy macros for large switch statements #define Case break;case #define Default break;default X X // DVI-file specific id and tail filler bytes const int ID = 2; const int FILLER = 223; X // DVI file opcodes - thoroughly described in "TeX: The Program" enum opcodes { X SET0 = 0, // typeset range of characters X SET127 = 127, X X SET1 = 128, // typeset char and move cursor X SET2 = 129, X SET3 = 130, X SET4 = 131, X SETRULE = 132, // typeset a rule & move cursor X X PUT1 = 133, // just typeset a character X PUT2 = 134, X PUT3 = 135, X PUT4 = 136, X PUTRULE = 137, // typeset rule X X NOOP = 138, X X BOP = 139, // Beginning Of Page X EOP = 140, // End Of Page X PUSH = 141, // push internal DVI stack X POP = 142, // pop DVI stack X X RIGHT1 = 143, // move cursor right/left X RIGHT2 = 144, X RIGHT3 = 145, X RIGHT4 = 146, X X W0 = 147, // move right/left using W DVI var X W1 = 148, X W2 = 149, X W3 = 150, X W4 = 151, X X X0 = 152, // move right/left using X var X X1 = 153, X X2 = 154, X X3 = 155, X X4 = 156, X X DOWN1 = 157, // move cursor down/up X DOWN2 = 158, X DOWN3 = 159, X DOWN4 = 160, X X Y0 = 161, // move down/up using Y var X Y1 = 162, X Y2 = 163, X Y3 = 164, X Y4 = 165, X X Z0 = 166, // move down/up using Z var X Z1 = 167, X Z2 = 168, X Z3 = 169, X Z4 = 170, X X FONT0 = 171, // use a new font - range version X FONT63 = 234, X X FNT1 = 235, // use a new font X FNT2 = 236, X FNT3 = 237, X FNT4 = 238, X X XXX1 = 239, // special - user defined X XXX2 = 240, X XXX3 = 241, X XXX4 = 242, X X FNTDEF1 = 243, // define a font X FNTDEF2 = 244, X FNTDEF3 = 245, X FNTDEF4 = 246, X X PRE = 247, // preamble X POST = 248, // start of postamble X POSTPOST = 249, // end of postamble }; X X // this describes which pages exist in the DVI file struct pageinfo { X long page; X long section; X long loc; }; X // this describes which pages (or page ranges) that we wish to print struct pagespec { X long page, endpage; X long section, endsection; }; X X // other include files for this program #include "boolean.h" #include "bitvec.h" #include "darray.h" #include "dev.h" #include "font.h" #include "dirs.h" X // all other misc externs are here to keep 'em together #include "extern.h" SHAR_EOF chmod 0444 defs.h || echo 'restore of defs.h failed' Wc_c="`wc -c < 'defs.h'`" test 4214 -eq "$Wc_c" || echo 'defs.h: original size 4214, current size' "$Wc_c" fi # ============= extern.h ============== if test -f 'extern.h' -a X"$1" != X"-c"; then echo 'x - skipping extern.h (File already exists)' else echo 'x - extracting extern.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'extern.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: extern.h,v 1.24 91/02/22 15:59:02 hmgr Exp $ X // externs for various LaserJet+ DVI filter functions // // by Parag Patel X // misc. dynamic array types declare_array(Pageinfo, pageinfo); declare_array(Pagespec, pagespec); X class fontptr { public: X font *ptr; X fontptr() { ptr = NULL; } X operator font*() { return ptr; } X font *operator->() { return ptr; } X font *operator=(font *p) { return ptr = p; } }; declare_array(Fontlist, fontptr); X // globals.C extern char *fontpath; extern char *dviinput; extern int debuglevel; extern boolean verbose; extern boolean dochecksum; extern char *devname; extern boolean reverse; extern boolean landscape; extern boolean duplexv; extern boolean duplexh; extern boolean duparg; extern long usermag; extern font *currfont; extern Fontlist fontlist; extern Bitvec **fontbits; extern double H, V, W, X, Y, Z; extern void init_globals(); extern void fini_globals(); X // util.C extern void debug(int, char *, ...); extern void mesg(char *, ...); extern void warn(char *, ...); extern void error(char *, ...); extern void quit(char *, ...); extern long getuval(int, FILE *); extern long getsval(int, FILE *); extern void skipbytes(long num, FILE *fp); extern FILE *fopenp(char *path, char *file, char *type); X // stack.C extern void pushdvi(); extern void popdvi(); extern void cleardvi(); X // fonts.C extern void clearfonts(); extern void definefont(FILE*, long, long); extern void newfont(long); extern void makecurrent(boolean force = FALSE); extern void special(FILE*, long); extern void typeset(long, boolean, double); extern void typerule(FILE*, boolean, double); X // dirs.C extern Pathlist pathlist; extern void setupdirs(char *path); X // readfont.C extern void setupfont(font &); extern void downchar(int ch, boolean toomany); extern void dumpbits(int); X // gffont.C extern void setupgffont(font &f, FILE *fp); extern void getgfchar(font &f, fontchar &g, int); extern char *gfmagdir(Dirlist &, long mag); X // pkfont.C extern void setuppkfont(font &f, FILE *fp); extern void getpkchar(font &f, fontchar &g, int); extern char *pkmagdir(Dirlist &, long mag); X // dvi.C extern void dodvi(FILE *, Pagespec&); X X // convienient inlines - these would otherwise would have to go elsewhere X inline char *strnew(size_t len) { return (char*)malloc(len + 1); } inline void strfree(char *s) { if (s != NULL) free((void *)s); } inline char *strdup(const char *s) X { return s != NULL ? strcpy((char*)malloc(strlen(s) + 1), s) : NULL; } inline boolean streq(const char *s1, const char *s2) X { return (strcmp(s1, s2) == 0) ? TRUE: FALSE; } X inline double Getsval(int n, FILE *fp) { X return double(getsval(n, fp)); } X inline double Getuval(int n, FILE *fp) { X return double(getuval(n, fp)); } X inline void movedown(double m) { X V += m; } X inline void moveright(double m) { X H += m; } SHAR_EOF chmod 0444 extern.h || echo 'restore of extern.h failed' Wc_c="`wc -c < 'extern.h'`" test 2904 -eq "$Wc_c" || echo 'extern.h: original size 2904, current size' "$Wc_c" fi # ============= dirs.h ============== if test -f 'dirs.h' -a X"$1" != X"-c"; then echo 'x - skipping dirs.h (File already exists)' else echo 'x - extracting dirs.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'dirs.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: dirs.h,v 1.6 91/02/22 15:59:05 hmgr Exp $ X // for reading font directory names into memory for fast traversal // // by Parag Patel X #ifndef _D_I_R_S_ #define _D_I_R_S_ X X struct Dirent { X char *name; X long val; X X Dirent(); }; declare_array(Dirlist, Dirent); X X struct Pathent { X char *path; X Dirlist dirs; X X Pathent(); X Pathent &operator=(Pathent &x); }; declare_array(Pathlist, Pathent); X X X #endif /* _D_I_R_S_ */ SHAR_EOF chmod 0444 dirs.h || echo 'restore of dirs.h failed' Wc_c="`wc -c < 'dirs.h'`" test 506 -eq "$Wc_c" || echo 'dirs.h: original size 506, current size' "$Wc_c" fi # ============= font.h ============== if test -f 'font.h' -a X"$1" != X"-c"; then echo 'x - skipping font.h (File already exists)' else echo 'x - extracting font.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'font.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: font.h,v 1.13 91/02/22 15:59:11 hmgr Exp $ X // describe fonts // // by Parag Patel X X // X and Y are cartesian coordinates // sp == scaled points == points * 2^16 // si == scaled integer == num * 2^16 // spx == scaled pixels == pixels * 2^16 // pix == pixels (whatever they are for a device) X X // This is what a character in a METAFONT file should look like. // class fontchar { public: X boolean downloaded; // is char currently in printer? X boolean charbig; // is char too big for printer? X long dx; // X spx displacement for typesetting X long dy; // Y spx delta X double width; // sp width to move after typesetting X long minm; // start X pix coord for char X long maxm; // end X - these describe the box X long minn; // start Y - that this character should X long maxn; // end Y - fit within X long floc; // file pointer to start of char data }; X X // this describes a particular font that TeX wishes to use - it is // information from the DVI file and the GF file // class font { public: X int type; // GF or PK ID value X long checksum; // in both DVI and font files X long scaledsize; // scaled font size in sp X long designsize; // design size in sp (DVI & font) X long mag; // magnification calculated from above X char *path; // path name to font file X char *basename; // basename of above for messages X boolean onpage; // is font on the current page? X boolean toomany; // too many fonts on page - reload this one X boolean downloaded; // is font currently downloaded? X boolean setup; // is font setup in memory? X long use; // use count - least recently used X long num; // number of this font X long hppp; // horizontal pixels per point (si) X long vppp; // vertical pixels per point X long minm; // smallest X in this font X long maxm; // largest X - used to for gross char sizing X long minn; // smallest Y - when allocating memory for X long maxn; // largest Y - building bitmap images X FILE *fp; X fontchar *chr; X X font(); X ~font(); }; X X // current GF ID byte and FILLER byte values const int GFID = 131; const int GFILLER = 223; X // opcodes in a GF file // enum gfcodes { X PAINT0 = 0, // range of paint commands X PAINT63 = 63, X X PAINT1 = 64, // paint a row of pixels X PAINT2 = 65, X PAINT3 = 66, X X BOC = 67, // Beginning Of a Character description X BOC1 = 68, X EOC = 69, // End Of Character X X SKIP0 = 70, // vertical skip X SKIP1 = 71, X SKIP2 = 72, X SKIP3 = 73, X X NEWROW0 = 74, // another vertical skip (range) X NEWROW164 = 238, X X FXXX1 = 239, // special (user definable) X FXXX2 = 240, X FXXX3 = 241, X FXXX4 = 242, X X YYY = 243, // also special X X FNOOP = 244, // noop! X X CHARLOC = 245, // character locators X CHARLOC0 = 246, X X FPRE = 247, // preamble X FPOST = 248, // start of postamble X FPOSTPOST = 249, // end of postamble }; X X // current PK identification byte value const int PKID = 89; X // PK font file opcodes & special values enum pkcodes { X PKCHAR = 239, X X PKXXX1 = 240, X PKXXX2 = 241, X PKXXX3 = 242, X PKXXX4 = 243, X PKYYY = 244, X PKPOST = 245, X PKNOOP = 246, X PKPRE = 247, X X PKREPEAT = 14, X PKREPEAT1 = 15, X PKRUNLARGE = 0, X PKRUNBEGIN = 1, X PKRUNEND = 13, }; SHAR_EOF chmod 0444 font.h || echo 'restore of font.h failed' Wc_c="`wc -c < 'font.h'`" test 3299 -eq "$Wc_c" || echo 'font.h: original size 3299, current size' "$Wc_c" fi # ============= dev.h ============== if test -f 'dev.h' -a X"$1" != X"-c"; then echo 'x - skipping dev.h (File already exists)' else echo 'x - extracting dev.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'dev.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: dev.h,v 1.17 91/02/22 15:59:17 hmgr Exp $ X // Base device class definition. Specific devices should derive a // class from this base class, and overload every virtual function. // // by Parag Patel X X class font; class fontchar; X class Device { public: X const int maxfonts; X const int maxchars; X const int maxonpage; X const int maxloaded; X const int resolution; X const int hoff; X const int voff; X const int fhmin; X const int fhmax; X const int fvmin; X const int fvmax; X const int fwidth; X const int fheight; X char *deffontpath; X protected: X // a Device may only be created by a derived class and is never X // directly used X Device(int maxf, int maxc, int maxpg, int maxld, int res, X int ho, int vo, int fhmn, int fhmx, int fvmn, int fvmx, X int fwd, int fhg, char *deffp); X public: X virtual ~Device(); X X //virtual void color(long red, long green, long blue); X X // the following are pure virtual functions and MUST be overridden X // by a derived class since the are NOT defined X // X virtual const char *char2dev(int ch, int &len) = 0; X virtual long sp2dev(double sp) = 0; X virtual double dev2sp(long pix) = 0; X virtual void newpage(boolean odd, boolean first) = 0; X virtual void downchar(font & f, fontchar & g, int ch) = 0; X virtual void bigchar(font & f, fontchar & g, int ch) = 0; X virtual void movehv(long h, long v) = 0; X virtual void moveh(long n) = 0; X virtual void movev(long n) = 0; X virtual void push() = 0; X virtual void pop() = 0; X virtual void delfont(font & f) = 0; X virtual void newfont(font & f) = 0; X virtual void usefont(font & f) = 0; X virtual void rule(double v, double h) = 0; }; X X // The following macros are for backward compatibility with the older // code in this program. It was originally C code that was upgraded to // C++. Since there may only be a single "device" per invocation, // there's little need to change all the old code. Yet. X extern Device *device; X #define MAXFONTS device->maxfonts #define MAXCHARS device->maxchars X #define MAXONPAGE device->maxonpage #define MAXLOADED device->maxloaded X #define RESOLUTION device->resolution X #define HOFF device->hoff #define VOFF device->voff X #define FHMIN device->fhmin #define FHMAX device->fhmax #define FVMIN device->fvmin #define FVMAX device->fvmax #define FWIDTH device->fwidth #define FHEIGHT device->fheight X #define DEFFONTPATH device->deffontpath X #define dev_char2dev device->char2dev #define dev_sp2dev device->sp2dev #define dev_dev2sp device->dev2sp #define dev_newpage device->newpage #define dev_downchar device->downchar #define dev_bigchar device->bigchar #define dev_movehv device->movehv #define dev_moveh device->moveh #define dev_movev device->movev #define dev_push device->push #define dev_pop device->pop #define dev_delfont device->delfont #define dev_newfont device->newfont #define dev_usefont device->usefont #define dev_rule device->rule #define dev_color device->color SHAR_EOF chmod 0444 dev.h || echo 'restore of dev.h failed' Wc_c="`wc -c < 'dev.h'`" test 3077 -eq "$Wc_c" || echo 'dev.h: original size 3077, current size' "$Wc_c" fi # ============= darray.h ============== if test -f 'darray.h' -a X"$1" != X"-c"; then echo 'x - skipping darray.h (File already exists)' else echo 'x - extracting darray.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'darray.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: darray.h,v 1.3 91/02/22 15:59:22 hmgr Exp $ X // Handle simple dynamic arrays of arbitrary type and range. // They are automatically grown to fit any array-like reference. // by Parag Patel X #ifndef __DARRAY_H_ #define __DARRAY_H_ X X // this is used to create an ARRAY of a TYPE #define declare_array(ARRAY, TYPE) \ class ARRAY \ { \ X long len; \ X long max; \ X TYPE *arr; \ X TYPE &bumpsize(long); \ public: \ X ARRAY() { arr = 0; max = len = 0; } \ X ARRAY(long siz) \ X { arr = 0; max = len = 0; if (siz > 0) bumpsize(siz-1); } \ X ARRAY(const ARRAY &); \ X ~ARRAY() { delete[max] arr; } \ X ARRAY &operator=(const ARRAY &); \ X long size() const { return len; } \ X void reset(long l = 0) { bumpsize(l); len = l; } \ X TYPE &operator[](long e) \ X { if (e < len) return arr[e]; else return bumpsize(e); } \ }; X // this implements an ARRAY of a TYPE #define implement_array(ARRAY, TYPE) \ TYPE &ARRAY::bumpsize(long elt) \ { \ X if (elt < 0) \ X elt = 0; \ X if (elt >= max) \ X { \ X long omax = max; \ X if (max <= 0) \ X max = 1; \ X TYPE *narr = new TYPE[max = elt + (max > 1024 ? 1024 : max)]; \ X for (long i = 0; i < len; i++) \ X narr[i] = arr[i]; \ X delete[omax] arr; \ X arr = narr; \ X } \ X if (elt >= len) \ X len = elt + 1; \ X return arr[elt]; \ } \ ARRAY &ARRAY::operator=(const ARRAY &a) \ { \ X if (&a == this) \ X return *this; \ X if (a.len > len) \ X bumpsize(a.len); \ X len = a.len; \ X for (long i = 0; i < len; i++) \ X arr[i] = a.arr[i]; \ X return *this; \ } \ ARRAY::ARRAY(const ARRAY &t) \ { \ X arr = 0; \ X max = len = 0; \ X *this = t; \ } X #endif /* __DARRAY_H_ */ SHAR_EOF chmod 0444 darray.h || echo 'restore of darray.h failed' Wc_c="`wc -c < 'darray.h'`" test 1656 -eq "$Wc_c" || echo 'darray.h: original size 1656, current size' "$Wc_c" fi # ============= boolean.h ============== if test -f 'boolean.h' -a X"$1" != X"-c"; then echo 'x - skipping boolean.h (File already exists)' else echo 'x - extracting boolean.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'boolean.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: boolean.h,v 1.3 91/02/22 15:59:28 hmgr Exp $ X #ifndef __BOOLEAN_H_ #define __BOOLEAN_H_ X typedef int boolean; const boolean FALSE = 0; const boolean TRUE = 1; X #endif /* __BOOLEAN_H_ */ SHAR_EOF chmod 0444 boolean.h || echo 'restore of boolean.h failed' Wc_c="`wc -c < 'boolean.h'`" test 258 -eq "$Wc_c" || echo 'boolean.h: original size 258, current size' "$Wc_c" fi # ============= bitvec.h ============== if test -f 'bitvec.h' -a X"$1" != X"-c"; then echo 'x - skipping bitvec.h (File already exists)' else echo 'x - extracting bitvec.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'bitvec.h' && // Copyright (c) 1991 by Parag Patel. All Rights Reserved. // $Header: bitvec.h,v 1.4 91/02/22 15:59:36 hmgr Exp $ X #ifndef __BITVEC_H_ #define __BITVEC_H_ X #include "boolean.h" X // BUG: machine dependent macros: sizeof (unsigned long) must == 32 bits #define __B_V_BIT(n) ((unsigned long)(1L << (n & 0x1F))) #define __B_V_ELT(n) (n >> 5) X // a set of longs (esp. enums) - also an array of bits class Bitvec { X long num; X unsigned long *elts; X X void bumpsize(long); // grow the Bitvec X // inline for speed X void BUMPSIZE(long largest) { if (num < largest) bumpsize(largest); } X public: X Bitvec(long); // new size X Bitvec(Bitvec const &); // new Bitvec X Bitvec() { elts = new unsigned long; num = 0; elts[0] = 0L; } X ~Bitvec() { delete elts; } // destructor X X Bitvec& operator=(Bitvec const &); // dup X X Bitvec& add(long); // add to X Bitvec& remove(long); // delete from X Bitvec& operator+=(long e) { return add(e); } X Bitvec& operator-=(long e) { return remove(e); } X X long size() const; // number of elements in Bitvec X boolean isin(long bit) const X { return bit >= 0 && bit <= num && X (elts[__B_V_ELT(bit)] & __B_V_BIT(bit)); } X void clear(); // clear the set X X long get(long elt) const X { return (elt >= 0 && elt <= num && X (elts[__B_V_ELT(elt)] & __B_V_BIT(elt))) ? 1 : 0; } X long operator[](long elt) const { return get(elt); } X unsigned long *getelts() { return elts; } X X // equality testing: X boolean operator==(Bitvec const &s) const; X boolean operator!=(Bitvec const &s) const { return !(s == *this); } }; X #undef __B_V_ELT #undef __B_V_BIT X #endif /* __BITVEC_H_ */ SHAR_EOF chmod 0444 bitvec.h || echo 'restore of bitvec.h failed' Wc_c="`wc -c < 'bitvec.h'`" test 1665 -eq "$Wc_c" || echo 'bitvec.h: original size 1665, current size' "$Wc_c" fi # ============= ljdump.c ============== if test -f 'ljdump.c' -a X"$1" != X"-c"; then echo 'x - skipping ljdump.c (File already exists)' else echo 'x - extracting ljdump.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ljdump.c' && /* Copyright (c) 1991 by Parag Patel. All Rights Reserved. */ static char rcsid[] = "$Header: ljdump.c,v 1.8 91/02/22 15:59:49 hmgr Exp $"; X /* X NOT written by me. The real author refuses to stick his name in X here, but he can't stop me from adding this note! -- Parag X X BTW - This is C code - NOT C++! X */ X #include <stdio.h> #include <ctype.h> X #define SAME(a,b) (strcmp(a,b)==0) #define SEQ(s,c,x) (x[strlen(x)-1]==c && strncmp(s,x,strlen(s))==0) X int getnum(cp) char *cp; { X cp = &cp[strlen(cp)] - 2; X while (isdigit(*cp)) X cp--; X return atoi(cp + 1); } X void dump_data(nbytes) int nbytes; { X int max = 32; X int ch; X X printf("\t"); X while (nbytes-- > 0) X { X ch = getchar(); X if (max > 0) X printf("%.2X", ch); X X if (max-- == 0) X printf("->"); X } X putchar('\n'); } X void do_esc(seq) char *seq; { X typedef char byte; X typedef unsigned char ubyte; X typedef short word; X typedef unsigned short uword; X struct X { X uword size; X byte dummy0; X byte is_eightbit; X word dummy1; X uword baseline; X uword cell_width; X uword cell_height; X byte is_landscape; X byte is_proportional; X uword symbol_set; X uword pitch; X uword height; X word dummy2; X byte dummy3; X byte is_italic; X byte stroke_weight; X ubyte typeface; X } fontdesc; X struct X { X word dummy0; X word dummy1; X byte is_landscape; X byte dymmy2; X word left_offset; X word top_offset; X uword width; X uword height; X word deltax; X } chardesc; X X printf("^[%s", seq); X if (SEQ(")s", 'W', seq)) X { X fread(&fontdesc, sizeof fontdesc, 1, stdin); X printf("\n\t"); X if (fontdesc.is_proportional) X printf("proportional "); X else X printf("fixed "); X if (fontdesc.is_landscape) X printf("landscape "); X else X printf("portrait "); X if (fontdesc.is_italic) X printf("italic "); X printf("%d-bit chars, symbol set: %d%c\n", X fontdesc.is_eightbit + 7, X fontdesc.symbol_set >> 5, X (fontdesc.symbol_set & 0x1F) + 64); X printf("\tbaseline: %d dots\n", fontdesc.baseline); X printf("\tcell height: %d dots width: %d dots\n", X fontdesc.cell_height, fontdesc.cell_width); X printf("\tpitch: %.1f dots\n", fontdesc.pitch / 4.0); X printf("\theight: %.1f dots\n", fontdesc.height / 4.0); X printf("\tstroke weight: %d, typeface: %d\n", X fontdesc.stroke_weight, fontdesc.typeface); X } X else if (SEQ("(s", 'W', seq)) X { X fread(&chardesc, sizeof chardesc, 1, stdin); X if (chardesc.is_landscape) X printf("\n\tlandscape"); X printf("\n\ttop offset: %d dots, left offset: %d dots\n", X chardesc.top_offset, chardesc.left_offset); X printf("\theight: %d dots, width: %d dots\n", X chardesc.height, chardesc.width); X printf("\tdelta X: %.1f dots\n", chardesc.deltax / 4.0); X dump_data(getnum(seq) - sizeof chardesc); X } X else if (SEQ("*b", 'W', seq)) X { X dump_data(getnum(seq)); X } X else if (SEQ("*c", 'E', seq) && isprint(getnum(seq))) X printf(" ('%c')\n", getnum(seq)); X else X putchar('\n'); } X main() { X int ch; X char *cp; X char seq[100]; X X while ((ch = getchar()) != EOF) X { X switch (ch) X { X case '\033': X for (cp = seq; !isupper((ch = getchar())); *cp++ = ch) X ; X *cp++ = ch; X *cp = '\0'; X do_esc(seq); X break; X default: X printf("'%c' (%d) (0x%X) (0%o)\n", ch, ch, ch, ch); X break; X } X } X X exit(0); } SHAR_EOF chmod 0444 ljdump.c || echo 'restore of ljdump.c failed' Wc_c="`wc -c < 'ljdump.c'`" test 3296 -eq "$Wc_c" || echo 'ljdump.c: original size 3296, current size' "$Wc_c" fi exit 0 exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.