dviselect (Part 2 of 6)
Skip Montanaro
montnaro at sprite.crd.ge.com
Tue Nov 14 08:20:36 AEST 1989
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 2 (of 6)."
# Contents: h/Makefile h/README h/conv.h h/convstruct.h h/dvi.h
# h/dviclass.h h/dvicodes.h h/dvistruct.h h/fio.h h/font.h
# h/gfclass.h h/gfcodes.h h/imPcodes.h h/imagen.h h/num.h
# h/postamble.h h/search.h h/tfm.h h/types.h
# Wrapped by montnaro at sprite on Sat Nov 11 17:13:28 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f h/Makefile -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/Makefile\"
else
echo shar: Extracting \"h/Makefile\" \(271 characters\)
sed "s/^X//" >h/Makefile <<'END_OF_h/Makefile'
XHDR =arith.h binding.h box.h conv.h dvi.h dviclass.h dvicodes.h \
X error.h fio.h font.h gfclass.h gfcodes.h imPcodes.h imagen.h \
X io.h num.h postamble.h search.h str.h tfm.h types.h verser.h
X
Xgoal:
X @echo Nothing to make here
X
X$(HDR):
X co -q $@
X
Xhdr: $(HDR)
X @echo Done
END_OF_h/Makefile
if test 271 -ne `wc -c <h/Makefile`; then
echo shar: \"h/Makefile\" unpacked with wrong size!
fi
chmod +x h/Makefile
# end of overwriting check
fi
if test -f h/README -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/README\"
else
echo shar: Extracting \"h/README\" \(36 characters\)
sed "s/^X//" >h/README <<'END_OF_h/README'
XThis directory is for header files.
END_OF_h/README
if test 36 -ne `wc -c <h/README`; then
echo shar: \"h/README\" unpacked with wrong size!
fi
chmod +x h/README
# end of overwriting check
fi
if test -f h/conv.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/conv.h\"
else
echo shar: Extracting \"h/conv.h\" \(3295 characters\)
sed "s/^X//" >h/conv.h <<'END_OF_h/conv.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * Conversions. Conversion factors convert between values in scaled
X * points and values in device-dependenent units. The results of all
X * conversions are rounded to the nearest integral value, of type (i32).
X */
X
X/*
X * This is now done using `double' values, but may be changed to
X * fixed-point or some other `fast' method, as long as the results
X * are consistent and reasonably accurate. The structure `conversion'
X * holds the conversion-method-dependent quantities; the macros
X * fromSP and toSP apply the conversion to a value. (Note that
X * fromSP and toSP need not be macros, but should be fast.)
X *
X * SetConversion sets the (single, global) conversion factor.
X * If a driver needs special conversions, there is another routine,
X * CSetConversion that sets a specific conversion, and cfromSP and
X * ctoSP to apply these.
X *
X * IS USING DOTS PER INCH SUFFICIENT? (Pixels per point might be better.)
X *
X * Note that it is necessary to set the global conversion factor before
X * using any fonts.
X */
X
Xtypedef struct conversion {
X double c_fromsp; /* multiplier to convert from scaled points */
X double c_tosp; /* multiplier to convert to scaled points:
X could divide by c_fromsp, but this should
X be faster and more accurate */
X double c_mag; /* the magnification this conversion
X represents; mainly for GetFont() */
X double c_dpi; /* dpi (should be pixels per point?) */
X} Conv;
X
X/*
X * In order to do this, we need to round properly. The compilers I
X * have tend to generate very poor code for this. The following is
X * intended to help them out. Smarter compilers can do better, but
X * if they are smart enough, they will realise that the variables
X * here are not used anywhere else, and discard them. (For a compiler
X * to do this given separate compliation, `static' is a must.)
X */
X
X#ifdef lint /* or a smart compiler */
X
X#define ROUND(f) ((i32) ((f) < 0.0 ? (f) - 0.5 : (f) + 0.5))
X#define CEIL(f) ((double) (i32) (f) < (f) ? (i32) (f) + 1 : (i32) (f))
X
X#else
X
Xstatic double _half = 0.5;
Xstatic double _zero = 0.0;
Xstatic double _d;
X
X#define ROUND(f) ((i32) (_d = (f), _d < _zero ? _d - _half : _d + _half))
X
X#ifdef NEGATIVE_FLOAT_ROUNDS_TO_NEGATIVE_INFINITY
X
X#define CEIL(f) (-(i32) -(f))
X
X#else /* we will assume that floating to integer truncates */
X
Xstatic i32 _i;
X
X#define CEIL(f) (_i = _d = (f), _i < _d ? _i + 1 : _i)
X
X#endif /* round towards negative infinity */
X
X#endif /* lint */
X
X#define SetConversion(dpi, usermag, num, denom, dvimag) \
X CSetConversion(&Conversion, dpi, usermag, num, denom, dvimag)
X
X#define cfromSP(c, v) ROUND((c)->c_fromsp * (v))
X#define ctoSP(c, v) ROUND((c)->c_tosp * (v))
X
X#define fromSP(v) cfromSP(&Conversion, v)
X#define toSP(v) ctoSP(&Conversion, v)
X
X/*
X * Conversions for rules are a bit different: we must round up, rather
X * than off. ConvRule applies the global conversion value for a rule
X * value (height or width); CConvRule applies a specific conversion.
X */
X
X#define CConvRule(c, v) CEIL((c)->c_fromsp * (v))
X#define ConvRule(v) CConvRule(&Conversion, v)
X
Xvoid CSetConversion();
END_OF_h/conv.h
if test 3295 -ne `wc -c <h/conv.h`; then
echo shar: \"h/conv.h\" unpacked with wrong size!
fi
chmod +x h/conv.h
# end of overwriting check
fi
if test -f h/convstruct.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/convstruct.h\"
else
echo shar: Extracting \"h/convstruct.h\" \(400 characters\)
sed "s/^X//" >h/convstruct.h <<'END_OF_h/convstruct.h'
Xtypedef struct conversion {
X double c_fromsp; /* multiplier to convert from scaled points */
X double c_tosp; /* multiplier to convert to scaled points:
X could divide by c_fromsp, but this should
X be faster and more accurate */
X double c_mag; /* the magnification this conversion
X represents; mainly for GetFont() */
X double c_dpi; /* dpi (should be pixels per point?) */
X} Conv;
END_OF_h/convstruct.h
if test 400 -ne `wc -c <h/convstruct.h`; then
echo shar: \"h/convstruct.h\" unpacked with wrong size!
fi
chmod +x h/convstruct.h
# end of overwriting check
fi
if test -f h/dvi.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/dvi.h\"
else
echo shar: Extracting \"h/dvi.h\" \(876 characters\)
sed "s/^X//" >h/dvi.h <<'END_OF_h/dvi.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/* DVI file info */
X
X/*
X * Units of distance are stored in scaled points, but we can convert to
X * units of 10^-7 meters by multiplying by the numbers in the preamble.
X */
X
X/* the structure of the stack used to hold the values (h,v,w,x,y,z) */
X
Xtypedef struct dvi_stack {
X i32 h; /* the saved h */
X i32 v; /* the saved v */
X i32 w; /* etc */
X i32 x;
X i32 y;
X i32 z;
X} DviStack;
X
Xextern DviStack dvi_current; /* the current values of h, v, etc */
Xextern int dvi_f; /* the current font */
X
X#define dvi_h dvi_current.h
X#define dvi_v dvi_current.v
X#define dvi_w dvi_current.w
X#define dvi_x dvi_current.x
X#define dvi_y dvi_current.y
X#define dvi_z dvi_current.z
END_OF_h/dvi.h
if test 876 -ne `wc -c <h/dvi.h`; then
echo shar: \"h/dvi.h\" unpacked with wrong size!
fi
chmod +x h/dvi.h
# end of overwriting check
fi
if test -f h/dviclass.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/dviclass.h\"
else
echo shar: Extracting \"h/dviclass.h\" \(1662 characters\)
sed "s/^X//" >h/dviclass.h <<'END_OF_h/dviclass.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * Macros to convert DVI opcodes to (hopefully) simpler values.
X */
X
X/*
X * Large range types.
X */
X#define DVI_IsChar(code) ((code) < 128)
X#define DVI_IsFont(code) ((code) >= 171 && (code) < 235)
X
X/*
X * Symbolic names for generic types (for things with parameters).
X * These are obtained via the macro DVI_DT(int c), where 0 <= c <= 255.
X */
X#define DT_CHAR 0
X#define DT_SET 1
X#define DT_SETRULE 2
X#define DT_PUT 3
X#define DT_PUTRULE 4
X#define DT_NOP 5
X#define DT_BOP 6
X#define DT_EOP 7
X#define DT_PUSH 8
X#define DT_POP 9
X#define DT_RIGHT 10
X#define DT_W0 11
X#define DT_W 12
X#define DT_X0 13
X#define DT_X 14
X#define DT_DOWN 15
X#define DT_Y0 16
X#define DT_Y 17
X#define DT_Z0 18
X#define DT_Z 19
X#define DT_FNTNUM 20
X#define DT_FNT 21
X#define DT_XXX 22
X#define DT_FNTDEF 23
X#define DT_PRE 24
X#define DT_POST 25
X#define DT_POSTPOST 26
X#define DT_UNDEF 27
X
X/*
X * Symbolic names for parameter lengths, obtained via the macro
X * DVL_OpLen(int c).
X *
X * N.B.: older drivers may assume that 0 => none, 1-4 => 1-4 bytes
X * and 5-7 => unsigned version of 1-4---so DO NOT change these values!
X */
X#define DPL_NONE 0
X#define DPL_SGN1 1
X#define DPL_SGN2 2
X#define DPL_SGN3 3
X#define DPL_SGN4 4
X#define DPL_UNS1 5
X#define DPL_UNS2 6
X#define DPL_UNS3 7
X/* there are no unsigned four byte parameters */
X
X#define DVI_OpLen(code) (dvi_oplen[code])
X#define DVI_DT(code) (dvi_dt[code])
Xextern char dvi_oplen[];
Xextern char dvi_dt[];
END_OF_h/dviclass.h
if test 1662 -ne `wc -c <h/dviclass.h`; then
echo shar: \"h/dviclass.h\" unpacked with wrong size!
fi
chmod +x h/dviclass.h
# end of overwriting check
fi
if test -f h/dvicodes.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/dvicodes.h\"
else
echo shar: Extracting \"h/dvicodes.h\" \(2554 characters\)
sed "s/^X//" >h/dvicodes.h <<'END_OF_h/dvicodes.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/* DVI opcodes */
X
X#define DVI_VERSION 2 /* version number that should appear in
X pre- and post-ambles */
X
X#define DVI_SET1 128 /* set character, 1 byte param */
X#define DVI_SET2 129 /* set character, 2 byte param */
X#define DVI_SET3 130 /* set character, 3 byte param */
X#define DVI_SET4 131 /* set character, 4 byte param */
X#define DVI_SETRULE 132 /* set a rule */
X#define DVI_PUT1 133 /* put char, don't move right */
X#define DVI_PUT2 134 /* put char, 2 byte */
X#define DVI_PUT3 135 /* etc */
X#define DVI_PUT4 136
X#define DVI_PUTRULE 137 /* put rule, don't move right */
X#define DVI_NOP 138 /* no-op */
X#define DVI_BOP 139 /* begin page */
X#define DVI_EOP 140 /* end page */
X#define DVI_PUSH 141 /* push h,v,w,x,y,z */
X#define DVI_POP 142 /* pop h,v,w,x,y,z */
X#define DVI_RIGHT1 143 /* move right, 1 byte signed param */
X#define DVI_RIGHT2 144 /* move right, 2 byte signed param */
X#define DVI_RIGHT3 145 /* etc */
X#define DVI_RIGHT4 146
X#define DVI_W0 147 /* h += w */
X#define DVI_W1 148 /* w = 1 byte signed param, h += w */
X#define DVI_W2 149 /* w = 2 byte etc, h += w */
X#define DVI_W3 150
X#define DVI_W4 151
X#define DVI_X0 152 /* like DVI_W0 but for x */
X#define DVI_X1 153 /* etc */
X#define DVI_X2 154
X#define DVI_X3 155
X#define DVI_X4 156
X#define DVI_DOWN1 157 /* v += 1 byte signed param */
X#define DVI_DOWN2 158 /* v += 2 byte signed param */
X#define DVI_DOWN3 159 /* etc */
X#define DVI_DOWN4 160
X#define DVI_Y0 161 /* y = 1 byte signed param, v += y */
X#define DVI_Y1 162 /* etc */
X#define DVI_Y2 163
X#define DVI_Y3 164
X#define DVI_Y4 165
X#define DVI_Z0 166 /* z = 1 byte signed param, v += z */
X#define DVI_Z1 167 /* etc */
X#define DVI_Z2 168
X#define DVI_Z3 169
X#define DVI_Z4 170
X#define DVI_FNTNUM0 171
X
X#define DVI_FNT1 235 /* select font, 1 byte param */
X#define DVI_FNT2 236 /* etc */
X#define DVI_FNT3 237
X#define DVI_FNT4 238
X#define DVI_XXX1 239 /* for \special: if length < 256 */
X#define DVI_XXX2 240 /* etc */
X#define DVI_XXX3 241
X#define DVI_XXX4 242
X#define DVI_FNTDEF1 243 /* Define font, 1 byte param (0 to 63) */
X#define DVI_FNTDEF2 244 /* etc */
X#define DVI_FNTDEF3 245
X#define DVI_FNTDEF4 246
X#define DVI_PRE 247 /* preamble */
X#define DVI_POST 248 /* postamble */
X#define DVI_POSTPOST 249 /* end of postamble */
X#define DVI_FILLER 223 /* filler bytes at end of dvi file */
END_OF_h/dvicodes.h
if test 2554 -ne `wc -c <h/dvicodes.h`; then
echo shar: \"h/dvicodes.h\" unpacked with wrong size!
fi
chmod +x h/dvicodes.h
# end of overwriting check
fi
if test -f h/dvistruct.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/dvistruct.h\"
else
echo shar: Extracting \"h/dvistruct.h\" \(595 characters\)
sed "s/^X//" >h/dvistruct.h <<'END_OF_h/dvistruct.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/* DVI file info */
X
X/*
X * Units of distance are stored in scaled points, but we can convert to
X * units of 10^-7 meters by multiplying by the numbers in the preamble.
X */
X
X/* the structure of the stack used to hold the values (h,v,w,x,y,z) */
Xtypedef struct dvi_stack {
X i32 h; /* the saved h */
X i32 v; /* the saved v */
X i32 w; /* etc */
X i32 x;
X i32 y;
X i32 z;
X} DviStack;
END_OF_h/dvistruct.h
if test 595 -ne `wc -c <h/dvistruct.h`; then
echo shar: \"h/dvistruct.h\" unpacked with wrong size!
fi
chmod +x h/dvistruct.h
# end of overwriting check
fi
if test -f h/fio.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/fio.h\"
else
echo shar: Extracting \"h/fio.h\" \(1456 characters\)
sed "s/^X//" >h/fio.h <<'END_OF_h/fio.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * File I/O: numbers.
X *
X * We deal in fixed format numbers and (FILE *)s here.
X * For pointer I/O, see pio.h.
X *
X * N.B.: These do the `wrong thing' at EOF. It is imperative
X * that the caller add appropriate `if (feof(fp))' statements.
X */
X
X/*
X * Get one unsigned byte. Note that this is a proper expression.
X * The reset have more limited contexts, and are therefore OddLy
X * CapItaliseD.
X */
X#define fgetbyte(fp) (getc(fp))
X
X/*
X * Get a two-byte unsigned integer, a three-byte unsigned integer,
X * or a four-byte signed integer.
X */
X#define fGetWord(fp, r) ((r) = getc(fp) << 8, (r) |= getc(fp))
X#define fGet3Byte(fp,r) ((r) = getc(fp) << 16, (r) |= getc(fp) << 8, \
X (r) |= getc(fp))
X#define fGetLong(fp, r) ((r) = getc(fp) << 24, (r) |= getc(fp) << 16, \
X (r) |= getc(fp) << 8, (r) |= getc(fp))
X
X/*
X * Fast I/O write (and regular write) macros.
X */
X#define putbyte(fp, r) (putc((r), fp))
X
X#define PutWord(fp, r) (putc((r) >> 8, fp), putc((r), fp))
X#define Put3Byte(fp, r) (putc((r) >> 16, fp), putc((r) >> 8, fp), \
X putc((r), fp))
X#define PutLong(fp, r) (putc((r) >> 24, fp), putc((r) >> 16, fp), \
X putc((r) >> 8, fp), putc((r), fp))
X
X/*
X * Function types
X */
Xi32 GetByte(), GetWord(), Get3Byte(), GetLong();
END_OF_h/fio.h
if test 1456 -ne `wc -c <h/fio.h`; then
echo shar: \"h/fio.h\" unpacked with wrong size!
fi
chmod +x h/fio.h
# end of overwriting check
fi
if test -f h/font.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/font.h\"
else
echo shar: Extracting \"h/font.h\" \(7100 characters\)
sed "s/^X//" >h/font.h <<'END_OF_h/font.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * Font file information, readers, etc.
X */
X
X#ifndef _CTEX_TYPES_
X#include "types.h"
X#endif
X
X/*
X * First, font independent information: per glyph info, and per font
X * info.
X */
Xstruct glyph {
X short g_flags; /* see below */
X /*
X * The following cannot be used with GetRasterlessFont
X */
X short g_rotation; /* see below */
X char *g_raster; /* raster, if known */
X /*
X * These, however, do come with rasterless fonts,
X * even though they relate only to the raster.
X */
X i32 g_height; /* height of bounding box */
X i32 g_width; /* width of bounding box */
X i32 g_yorigin; /* y origin (>= 0 -> within box) */
X i32 g_xorigin; /* x origin (>= 0 -> within box) */
X /*
X * This of course comes with every font.
X */
X i32 g_rawtfmwidth; /* the tfmwidth as read from the file */
X i32 g_tfmwidth; /* width in scaled points (not FIXes!) */
X i32 g_xescapement; /* x escapement (`chardx') */
X i32 g_yescapement; /* y escapement (`chardy') */
X /*
X * This is provided purely for DVI to device conversion programs.
X */
X int g_pixwidth; /* width in pixels */
X /*
X * Mainly for internal use, index is the glyph index within the
X * font. That is, f->f_gly[i]->g_index == i.
X */
X int g_index; /* character index */
X /*
X * g_details and g_integer are purely for the font reading
X * subroutines to use however they will. g_next makes lists
X * of glyphs while the glyphs are free.
X */
X union { /* various options */
X char *g_details; /* details: arbitrary */
X i32 g_integer; /* 32 bit integer */
X struct glyph *g_next; /* linked list */
X } g_un;
X};
X
X/*
X * Glyph flags.
X */
X#define GF_VALID 0x0001 /* glyph is `real' */
X#define GF_USR0 0x0100 /* reserved to user code */
X#define GF_USR1 0x0200 /* reserved to user code */
X#define GF_USR2 0x0400 /* reserved to user code */
X#define GF_USR3 0x0800 /* reserved to user code */
X
X/*
X * Rotations are in quarter-pi steps, counterclockwise of course.
X * This order must be maintained; see rotate.c.
X */
X#define ROT_NORM 0 /* no rotation: `normal' position */
X#define ROT_LEFT 1 /* 1/4 turn counterclockwise */
X#define ROT_DOWN 2 /* 1/2 turn, i.e., upside-down */
X#define ROT_RIGHT 3 /* 3/4 turn ccw, or 1/4 turn cw */
X
Xstruct font {
X int f_flags; /* see below */
X struct fontops *f_ops; /* operations */
X /*
X * f_details is provided for font reading subroutines.
X * It is intended to be cast to a pointer to a structure
X * that is allocated by those routines, and used to keep
X * track of whatever information those routines need to
X * determine glyph boxes and (if asked for) rasters.
X */
X char *f_details; /* type dependent stuff */
X /*
X * f_path is the full pathname to the font file, filled in
X * by GetFont and GetRasterlessFont. Note that since we
X * hold on to the path until the font is freed, it should be
X * possible to cache glyph accesses on memory-poor machines.
X */
X char *f_path; /* font file pathname */
X /*
X * f_dvimag and f_dvidsz are the magnification and design size
X * values from the DVI file. f_font and f_scaled correspond to
X * TeX's idea of the proper name for the font (e.g., `cmr10',
X * `cmbx10 scaled 1440'). (Note that f_scaled is just the
X * ratio of f_dvimag and f_dvidsz; you could save a bit of memory
X * by eliminating it and altering the routine Font_TeXName()).
X * f_checksum should be set by the font reading routines to
X * the font checksum. If the value is nonzero, it will be
X * compared to the checksum in the DVI file.
X */
X i32 f_dvimag; /* magnification from DVI file */
X i32 f_dvidsz; /* design size from DVI file */
X char *f_font; /* TeX's name for the font */
X int f_scaled; /* the ratio of dvimag to dvidsz, x1000 */
X i32 f_design_size;
X i32 f_checksum; /* font checksum, or 0 */
X i32 f_hppp; /* horizontal pixels per point */
X i32 f_vppp; /* vertical pixels per point */
X /*
X * f_lowch and f_highch bound the region in which f_gly
X * indicies are valid. Specificially, f_gly[i] may be
X * read or written if and only if i is in the half-open
X * interval [f_lowch..f_highch). f_gly is an array of
X * pointers to glyph structures. The structures themselves
X * are not allocated until requested.
X *
X * f_glybase is the actual return from malloc(), since it
X * is theoretically possible for f_gly-f_lowch to become
X * NULL.
X */
X int f_lowch; /* first character */
X int f_highch; /* last character, plus 1 */
X struct glyph **f_gly; /* glyphs */
X struct glyph **f_glybase;
X};
X
X/*
X * Font flags.
X */
X#define FF_RASTERS 0x0001 /* font has rasters */
X#define FF_USR0 0x0100 /* reserved to user code */
X#define FF_USR1 0x0200 /* reserved to user code */
X#define FF_USR2 0x0400 /* reserved to user code */
X#define FF_USR3 0x0800 /* reserved to user code */
X
X/*
X * Operations on fonts.
X *
X * The `fo_dpitomag' field is used as a multiplier for a desired
X * resolution in dots per inch. The result of the multiplication
X * is converted to a font name by multipying by 1000.0 and rounding.
X * The idea is that PXL files will have a multiplier of 5.0, and
X * others will have a multiplier of 1.0. This suffices for the
X * present, at any rate; in the future, this field may be replaced
X * with something more general.
X *
X * N.B.: more operations may be added as they are discovered to be
X * useful.
X */
Xstruct fontops {
X char *fo_name; /* name, e.g., "gf" */
X double fo_dpitomag; /* multiplier */
X int (*fo_read)(); /* open and read the font itself */
X int (*fo_getgly)(); /* obtain specified glyphs (range) */
X#ifdef notdef
X int (*fo_freegly)(); /* release specified glyphs */
X#endif
X int (*fo_rasterise)(); /* rasterise specified glyphs */
X int (*fo_freefont)(); /* discard font (free details) */
X struct fontops *fo_next; /* purely for font.c */
X};
X
X/*
X * Return a pointer to the glyph information for character `c' in
X * font `f'.
X */
X#define GLYPH(f, c) \
X ((c) < (f)->f_lowch || (c) >= (f)->f_highch ? (struct glyph *) 0 : \
X ((f)->f_gly[c] ? (f)->f_gly[c] : GetGlyph(f, c)))
X
X/*
X * True iff glyph `g' is valid. Useful for checking return values
X * from GLYPH().
X */
X#define GVALID(g) ((g) && ((g)->g_flags & GF_VALID))
X
X/*
X * True iff glyph g has a raster.
X */
X#define HASRASTER(g) ((g)->g_height || (g)->g_width)
X
X/*
X * Return a pointer to the raster information for glyph `g' in font
X * `f' at rotation `r'.
X */
X#define RASTER(g, f, r) ((g)->g_rotation == (r) && (g)->g_raster ? \
X (g)->g_raster : GetRaster(g, f, r))
X
X/*
X * Function types.
X */
Xstruct font *GetFont(), *GetRasterlessFont();
Xstruct glyph *GetGlyph();
Xchar *GetRaster();
Xvoid FreeFont();
Xvoid FreeGlyph();
Xvoid FreeRaster();
Xchar *Font_TeXName();
Xdouble DMagFactor(); /* from magfactor.c */
X
X/*
X * Normally from stdio.h
X */
X#ifndef NULL
X#define NULL 0
X#endif
X
X/*
X * The following environment variable overrides the default font
X * configuration file. That default is used when fontinit() is not
X * called, or is passed a null pointer.
X */
X#define CONFENV "TEXFONTDESC"
END_OF_h/font.h
if test 7100 -ne `wc -c <h/font.h`; then
echo shar: \"h/font.h\" unpacked with wrong size!
fi
chmod +x h/font.h
# end of overwriting check
fi
if test -f h/gfclass.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/gfclass.h\"
else
echo shar: Extracting \"h/gfclass.h\" \(1730 characters\)
sed "s/^X//" >h/gfclass.h <<'END_OF_h/gfclass.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * GF classification codes
X */
X
X/*
X * Predicate for simple paint commands. This is presumably the most
X * common GF operation; it may be profitable to check for this before
X * switching out on the command type.
X */
X#define GF_IsPaint(c) ((c) < 64)
X
X/*
X * Symbolic names for command `types', as returned by the macro
X * GT_TYPE(int c).
X */
X#define GT_PAINT0 0 /* paint without parameter */
X#define GT_PAINT 1 /* paint with parameter */
X#define GT_BOC 2 /* long BOC */
X#define GT_BOC1 3 /* short BOC */
X#define GT_EOC 4 /* EOC */
X#define GT_SKIP0 5 /* parameterless SKIP */
X#define GT_SKIP 6 /* parmeterised SKIP */
X#define GT_NEW_ROW 7 /* NEW_ROW_n */
X#define GT_XXX 8 /* XXXn */
X#define GT_YYY 9 /* YYY */
X#define GT_NOP 10 /* no op */
X#define GT_CHAR_LOC 11 /* CHAR_LOC */
X#define GT_CHAR_LOC0 12 /* abbreviated CHAR_LOC */
X#define GT_PRE 13
X#define GT_POST 14
X#define GT_POSTPOST 15
X#define GT_UNDEF 16
X
X/*
X * Symbolic names for parameter lengths, obtained via the macro
X * GT_OpLen(int c).
X */
X#define GPL_NONE 0 /* no parameter, or too complex */
X#define GPL_UNS1 1 /* one one-byte parameter in 0..255 */
X#define GPL_UNS2 2 /* one two-byte parameter in 0..65535 */
X#define GPL_UNS3 3 /* one three-byte parameter in 0..16777215 */
X#define GPL_SGN4 4 /* one four-byte signed parameter */
X/*
X * there are no unsigned four byte parameters, and no shorter signed
X * parameters
X */
X
X#define GF_OpLen(code) (gf_oplen[code])
X#define GF_TYPE(code) (gf_gt[code])
Xextern char gf_oplen[];
Xextern char gf_gt[];
END_OF_h/gfclass.h
if test 1730 -ne `wc -c <h/gfclass.h`; then
echo shar: \"h/gfclass.h\" unpacked with wrong size!
fi
chmod +x h/gfclass.h
# end of overwriting check
fi
if test -f h/gfcodes.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/gfcodes.h\"
else
echo shar: Extracting \"h/gfcodes.h\" \(1732 characters\)
sed "s/^X//" >h/gfcodes.h <<'END_OF_h/gfcodes.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * GF (generic font) opcodes.
X */
X
X#define GF_PAINT_0 0 /* paint with `d' = 0 */
X /* ... through PAINT_63, d = 63 */
X#define GF_PAINT1 64 /* paint, with a one-byte parameter */
X#define GF_PAINT2 65 /* paint, with a two-byte parameter */
X#define GF_PAINT3 66 /* paint, with a three-byte parameter */
X#define GF_BOC 67 /* beginning of character */
X#define GF_BOC1 68 /* compressed form of BOC */
X#define GF_EOC 69 /* end of character */
X#define GF_SKIP0 70 /* finish this row, begin next with white */
X#define GF_SKIP1 71 /* finish row, one byte parameter */
X#define GF_SKIP2 72
X#define GF_SKIP3 73
X#define GF_NEW_ROW_0 74 /* begin a new row, ready to blacken */
X#define GF_NEW_ROW_1 75 /* begin a new row, but one col. from left */
X /* through GF_NEW_ROW_164 */
X#define GF_XXX1 239 /* special (interpreter dependent) command */
X#define GF_XXX2 240 /* like XXX1, but two byte length parameter */
X#define GF_XXX3 241
X#define GF_XXX4 242
X#define GF_YYY 243 /* takes four byte parameter, otherwise nop */
X /* (generated by METAFONT for numspecial) */
X#define GF_NOP 244 /* no op */
X#define GF_CHAR_LOC 245 /* character locator */
X#define GF_CHAR_LOC0 246 /* abbreviated form of CHAR_LOC */
X#define GF_PRE 247 /* introduces preamble */
X#define GF_POST 248 /* introduces postamble */
X#define GF_POSTPOST 249 /* marks end of postamble */
X
X /* codes 250 through 255 are undefined */
X
X#define GF_ID 131 /* identifies this revision of GF */
X
X#define GF_FILLER 223 /* filler bytes at end of GF file */
END_OF_h/gfcodes.h
if test 1732 -ne `wc -c <h/gfcodes.h`; then
echo shar: \"h/gfcodes.h\" unpacked with wrong size!
fi
chmod +x h/gfcodes.h
# end of overwriting check
fi
if test -f h/imPcodes.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/imPcodes.h\"
else
echo shar: Extracting \"h/imPcodes.h\" \(2346 characters\)
sed "s/^X//" >h/imPcodes.h <<'END_OF_h/imPcodes.h'
X/* imPRESS command codes */
X
X#define imP_SP 128 /* advance one space */
X#define imP_SP1 129 /* advance one space plus 1 pixel */
X
X#define imP_OLD_MMOVE 130
X#define imP_Forw 131 /* one pixel forward */
X#define imP_Backw 132 /* one pixel backward */
X#define imP_MMove 133 /* move in main advance dir. */
X#define imP_SMove 134 /* move in secondary advance dir. */
X#define imP_SetHAbs 135 /* set absolute H pos */
X#define imP_SetHRel 136 /* set relative H pos */
X#define imP_SetVAbs 137 /* set absolute V pos */
X#define imP_SetVRel 138 /* set relative V pos */
X
X/*
X * rephrase for imagen1-special.c
X */
X#define imP_SET_ABS_H 135 /* set absolute H pos */
X#define imP_SET_REL_H 136 /* set relative H pos */
X#define imP_SET_ABS_V 137 /* set absolute V pos */
X#define imP_SET_REL_V 138 /* set relative V pos */
X
X#define CIRC_ARC 150
X#define ELLIPSE_ARC 151
X#define CIRC_SEGM 160
X
X#define imSRULE 192
X#define imP_Rule 193 /* print a rule */
X
X#define imP_SET_HPOS 195
X#define imP_SET_VPOS 196
X#define imP_CRLF 197 /* move to begin. of line */
X#define imP_SGLY 198
X
X#define imP_DefGlyph 199 /* define a glyph */
X
X#define imP_BGLY 199 /* for imagen1-special.c */
X
X#define imP_DelGlyph 200 /* mark a glyph for deletion */
X#define imP_DELC 201
X#define imP_DELF 202
X
X#define imP_SetHVSystem 205 /* set the H/V coordinate system */
X#define imP_SET_HV_SYSTEM 205 /* for imagen1-special.c */
X
X#define imP_SetAdvDirs 206 /* set the advance directions */
X#define imP_SetFamily 207 /* use this particular family */
X#define imP_SetILSpace 208 /* set the interline spacing */
X#define imP_SetBOL 209 /* define the beginning of line */
X#define imP_SetSP 210 /* define the space between words */
X
X#define imP_CreateFam 211 /* define a family table */
X#define imP_PUSH 211 /* for imagen1-special.c */
X#define imP_POP 212
X
X#define imP_Page 213 /* go to (0,0) */
X#define imP_SET_PUSH_MASK 214
X
X#define imP_EndPage 219 /* print the current page */
X
X#define imP_CREATE_FAMILY_TABLE 221
X#define imP_CREATE_MAP 222
X
X#define SET_PUM 225
X
X#define imP_CREATE_PATH 230
X#define imP_SET_TEXTURE 231
X#define imP_SET_PEN 232
X#define imP_FILL_PATH 233
X#define imP_DRAW_PATH 234
X#define imP_BITMAP 235
X#define imP_SET_MAGN 236
X
X
X#define imP_ForceDel 240 /* force glyph deletion */
X
X#define imP_DEFINE_MACRO 242
X#define imP_EXEC_MACRO 243
X#define imP_EOF 255 /* end of document */
END_OF_h/imPcodes.h
if test 2346 -ne `wc -c <h/imPcodes.h`; then
echo shar: \"h/imPcodes.h\" unpacked with wrong size!
fi
chmod +x h/imPcodes.h
# end of overwriting check
fi
if test -f h/imagen.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/imagen.h\"
else
echo shar: Extracting \"h/imagen.h\" \(777 characters\)
sed "s/^X//" >h/imagen.h <<'END_OF_h/imagen.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/* imagen globals */
X
X/* Accounting: */
X#ifndef ACCOUNT_FILE
X/*
X#define ACCOUNT_FILE "/usr/adm/imagen_acct"/* if defined, the name of the
X imagen page accounting file */
X#endif ACCOUNT_FILE
X
X#define MaxImFamily 128 /* hardware limitation on font family index */
X#define DefaultDPI 300 /* 300 for Imagen 8/300, 240 for Imprint-10 */
X
X#define DefaultMaxDrift 3 /* default value for MaxDrift */
X
X/* Default margins, in dots */
X/* CRUFT ALERT: depending on DPI variable */
X#define DefaultTopMargin (DPI) /* 1" margins */
X#define DefaultLeftMargin (DPI)
END_OF_h/imagen.h
if test 777 -ne `wc -c <h/imagen.h`; then
echo shar: \"h/imagen.h\" unpacked with wrong size!
fi
chmod +x h/imagen.h
# end of overwriting check
fi
if test -f h/num.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/num.h\"
else
echo shar: Extracting \"h/num.h\" \(1123 characters\)
sed "s/^X//" >h/num.h <<'END_OF_h/num.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * Pointer I/O: numbers.
X *
X * We deal in fixed format numbers and pointers here.
X * For file I/O, see fio.h.
X */
X
X/*
X * Get one unsigned byte. Note that this is a proper expression.
X * The rest have more limited contexts, and are therefore OddLy
X * CapItaliseD.
X */
X#define pgetbyte(p) UnSign8(*(p)++)
X
X/*
X * Get a two-byte unsigned integer, a three-byte unsigned integer,
X * or a four-byte signed integer.
X */
X#define pGetWord(p, r) ((r) = UnSign8(*(p)++) << 8, \
X (r) |= UnSign8(*(p)++))
X#define pGet3Byte(p,r) ((r) = UnSign8(*(p)++) << 16, \
X (r) |= UnSign8(*(p)++) << 8, \
X (r) |= UnSign8(*(p)++))
X#define pGetLong(p, r) ((r) = UnSign8(*(p)++) << 24, \
X (r) |= UnSign8(*(p)++) << 16, \
X (r) |= UnSign8(*(p)++) << 8, \
X (r) |= UnSign8(*(p)++))
X
X/*
X * ADD pputbyte, pPutWord, pPut3Byte, pPutLong HERE IF THEY PROVE
X * USEFUL. (But then must consider changing PutWord &c in fio.h.)
X */
END_OF_h/num.h
if test 1123 -ne `wc -c <h/num.h`; then
echo shar: \"h/num.h\" unpacked with wrong size!
fi
chmod +x h/num.h
# end of overwriting check
fi
if test -f h/postamble.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/postamble.h\"
else
echo shar: Extracting \"h/postamble.h\" \(1895 characters\)
sed "s/^X//" >h/postamble.h <<'END_OF_h/postamble.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/* Definitions for ScanPostAmble */
X
X/*
X * ScanPostAmble reads the postamble of a DVI file from the (stdio)
X * file specified in its first argument. It is handed two pointers to
X * functions. The first (ScanPostAmble's second argument) is called
X * after the header information has been read, and given a pointer to a
X * PostAmbleInfo structure. It is the job of this function to extract the
X * required information from this structure (which is deallocated when
X * ScanPostAmble returns).
X *
X * The second function is called once for each font definition occurring in
X * the postamble, and is given a pointer to a PostAmbleFont structure. This
X * function should do whatever the device needs to read the actual font.
X *
X * If the DVI file appears malformed, ScanPostAmble will print an error
X * message and exit. (Drastic, perhaps, but effective.)
X */
X
Xstruct PostAmbleInfo {
X i32 pai_PrevPagePointer; /* previous page pointer */
X i32 pai_Numerator; /* numerator from dvi file */
X i32 pai_Denominator; /* denominator from dvi file*/
X i32 pai_DVIMag; /* \magnification */
X i32 pai_TallestPageHeight; /* height of tallest page */
X i32 pai_WidestPageWidth; /* width of widest page */
X int pai_DVIStackSize; /* DVI stack size required */
X int pai_NumberOfPages; /* total number of pages in DVI file */
X};
X
Xstruct PostAmbleFont {
X char *paf_name; /* name of font (null terminated) */
X int paf_n1; /* length of first part of name */
X int paf_n2; /* length of second part of name */
X i32 paf_DVIFontIndex; /* font index number */
X i32 paf_DVIChecksum; /* checksum from DVI file */
X i32 paf_DVIMag; /* "at size" */
X i32 paf_DVIDesignSize; /* design size of font */
X};
END_OF_h/postamble.h
if test 1895 -ne `wc -c <h/postamble.h`; then
echo shar: \"h/postamble.h\" unpacked with wrong size!
fi
chmod +x h/postamble.h
# end of overwriting check
fi
if test -f h/search.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/search.h\"
else
echo shar: Extracting \"h/search.h\" \(1279 characters\)
sed "s/^X//" >h/search.h <<'END_OF_h/search.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/* search structures and routines for 32-bit key, arbitrary data */
X
Xstruct search {
X unsigned s_dsize; /* data object size (includes key size) */
X unsigned s_space; /* space left (in terms of objects) */
X unsigned s_n; /* number of objects in the table */
X char *s_data; /* data area */
X};
X
X/* returns a pointer to the search table (for future search/installs) */
Xstruct search *SCreate(); /* create a search table */
X
X/* returns a pointer to the data object found or created */
Xchar *SSearch(); /* search for a data object */
X
X/* the third argument to SSearch controls operation as follows: */
X#define S_LOOKUP 0x00 /* pseudo flag */
X#define S_CREATE 0x01 /* create object if not found */
X#define S_EXCL 0x02 /* complain if already exists */
X
X/* in addition, it is modified before return to hold status: */
X#define S_COLL 0x04 /* collision (occurs iff S_EXCL set) */
X#define S_FOUND 0x08 /* found (occurs iff existed already) */
X#define S_NEW 0x10 /* created (occurs iff S_CREATE && !S_EXCL) */
X#define S_ERROR 0x20 /* problem creating (out of memory) */
END_OF_h/search.h
if test 1279 -ne `wc -c <h/search.h`; then
echo shar: \"h/search.h\" unpacked with wrong size!
fi
chmod +x h/search.h
# end of overwriting check
fi
if test -f h/tfm.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/tfm.h\"
else
echo shar: Extracting \"h/tfm.h\" \(2711 characters\)
sed "s/^X//" >h/tfm.h <<'END_OF_h/tfm.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * TFM file information.
X */
X
X/*
X * TFM files start with a series of unsigned 16 bit integers. We
X * read this into the structure `tfm_header'. These are type i32
X * so that they may be used as integer quantities without concern
X * as to sign extension.
X */
Xstruct tfmheader {
X i32 th_lf; /* length of the file (16 bit words) */
X i32 th_lh; /* length of the header data (words) */
X i32 th_bc; /* beginning character */
X i32 th_ec; /* ending character (inclusive) */
X i32 th_nw; /* number of words in width table */
X i32 th_nh; /* number of words in height table */
X i32 th_nd; /* number of words in depth table */
X i32 th_ni; /* words in italic correction table */
X i32 th_nl; /* words in ligature/kern table */
X i32 th_nk; /* words in kern table */
X i32 th_ne; /* words in extensible character table */
X i32 th_np; /* number of font parameter words */
X};
X
X/*
X * The remainder of the TFM file comprises the following information,
X * all of which are 32 bit quantities:
X *
X * header: array [0..lh-1] of stuff
X * char_info: array [bc..ec] of char_info_word
X * width: array [0..nw-1] of fix_word
X * height: array [0..nh-1] of fix_word
X * depth: array [0..nd-1] of fix_word
X * italic: array [0..ni-1] of fix_word
X * lig_kern: array [0..nl-1] of lig_kern_command
X * kern: array [0..ne-1] of extensible_recipie
X * param: array [0..np-1] of fix_word
X */
X
X/*
X * A char_info_word is built of four unsigned eight-bit quantities. The first
X * is an index into the width table (this saves 24 bits for every
X * character that has the same width as another character). The
X * second is a composite height and depth index. The third is a
X * composite italic index and tag, and the fourth is a remainder.
X *
X * XXX needs explaining
X */
Xstruct char_info_word {
X char ci_width; /* width index */
X char ci_h_d; /* height and depth index */
X char ci_i_t; /* italic index and tag */
X char ci_remainder; /* ??? */
X};
X
X/*
X * These macros split up h_and_d and i_and_t values.
X */
X#define T_CI_H(ci) (((ci)->ci_h_d >> 4) & 0xf)
X#define T_CI_D(ci) ((ci)->ci_h_d & 0xf)
X#define T_CI_I(ci) (((ci)->ci_i_t >> 2) & 0x3f)
X#define T_CI_T(ci) ((ci)->ci_i_t & 3)
X
X/*
X * This structure contains everything one might need to know about
X * a TFM file at run-time.
X *
X * XXX incomplete, or wrong, as yet
X */
Xstruct tfmdata {
X struct tfmheader t_hdr; /* full header */
X struct char_info_word *t_ci; /* char info */
X i32 *t_width; /* widths table */
X i32 *t_height; /* heights */
X i32 *t_depth; /* depths */
X};
END_OF_h/tfm.h
if test 2711 -ne `wc -c <h/tfm.h`; then
echo shar: \"h/tfm.h\" unpacked with wrong size!
fi
chmod +x h/tfm.h
# end of overwriting check
fi
if test -f h/types.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"h/types.h\"
else
echo shar: Extracting \"h/types.h\" \(1282 characters\)
sed "s/^X//" >h/types.h <<'END_OF_h/types.h'
X/*
X * Copyright (c) 1987 University of Maryland Department of Computer Science.
X * All rights reserved. Permission to copy for any purpose is hereby granted
X * so long as this copyright notice remains intact.
X */
X
X/*
X * C-TeX types (system dependent).
X */
X
X#ifndef _CTEX_TYPES_
X#define _CTEX_TYPES_
X
X/* a 16 bit integer (signed) */
Xtypedef short i16;
X
X/* a 32 bit integer (signed) */
Xtypedef long i32;
X
X/* macros to sign extend quantities that are less than 32 bits long */
X#if defined(u3b) || defined(u3b2) || defined(u3b5) || defined(ibm03)
X#define Sign8(n) ((n) & (1 << 7) ? ((n) | 0xffffff00) : (n))
X#define Sign16(n) ((i32) (short) (n))
X#define Sign24(n) ((n) & (1 << 23) ? ((n) | 0xff000000) : (n))
X#else
X#if defined(sun) || defined(hp300)
X/* Sun mishandles (int)(char)(constant), but this subterfuge works: */
X#define Sign8(n) ((i32) (char) (int) (n))
X#else
X#define Sign8(n) ((i32) (char) (n))
X#endif /* sun */
X#define Sign16(n) ((i32) (short) (n))
X#define Sign24(n) (((n) << 8) >> 8)
X#endif /* u3b || u3b2 || u3b5 */
X
X/* macros to truncate quantites that are signed but shouldn't be */
X#define UnSign8(n) ((n) & 0xff)
X#define UnSign16(n) ((n) & 0xffff)
X#define UnSign24(n) ((n) & 0xffffff)
X
X/* note that we never have unsigned 32 bit integers */
X
X#endif /* _CTEX_TYPES_ */
END_OF_h/types.h
if test 1282 -ne `wc -c <h/types.h`; then
echo shar: \"h/types.h\" unpacked with wrong size!
fi
chmod +x h/types.h
# end of overwriting check
fi
echo shar: End of archive 2 \(of 6\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 6 archives.
echo "Now do 'make dviselect'"
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Skip Montanaro (montanaro at crdgw1.ge.com)
More information about the Alt.sources
mailing list