0707070014231030370407550057030000000000400277220522634650100001100000000000post.src 0707070014230361420407550057030057030000021040140522633073100002000000000000post.src/common 0707070014230361431006440057030057030000011040300522627500500003200000007173post.src/common/request.c /* * * Things used to handle special requests (eg. manual feed) globally or on a per * page basis. Requests are passed through to the translator using the -R option. * The argument to -R can be "request", "request:page", or "request:page:file". * If page is omitted (as in the first form) or set to 0 request will be applied * to the global environment. In all other cases it applies only to the selected * page. If a file is given, page must be supplied, and the lookup is in that file * rather than *requestfile. * */ #include <stdio.h> #include "gen.h" /* general purpose definitions */ #include "request.h" /* a few special definitions */ #include "path.h" /* for the default request file */ Request request[MAXREQUEST]; /* next page or global request */ int nextreq = 0; /* goes in request[nextreq] */ char *requestfile = REQUESTFILE; /* default lookup file */ /*****************************************************************************/ saverequest(want) char *want; /* grab code for this stuff */ { char *page; /* and save it for this page */ char *strtok(); /* * * Save the request until we get to appropriate page - don't even bother with * the lookup right now. Format of *want string is "request", "request:page", or * "request:page:file", and we assume we can change the string here as needed. * If page is omitted or given as 0 the request will be done globally. If *want * includes a file, request and page must also be given, and in that case *file * will be used for the lookup. * */ if ( nextreq < MAXREQUEST ) { request[nextreq].want = strtok(want, ": "); if ( (page = strtok(NULL, ": ")) == NULL ) request[nextreq].page = 0; else request[nextreq].page = atoi(page); if ( (request[nextreq].file = strtok(NULL, ": ")) == NULL ) request[nextreq].file = requestfile; nextreq++; } else error(NON_FATAL, "too many requests - ignoring %s", want); } /* End of saverequest */ /*****************************************************************************/ writerequest(page, fp_out) int page; /* write everything for this page */ FILE *fp_out; /* to this file */ { int i; /* loop index */ /* * * Writes out all the requests that have been saved for page. Page 0 refers to * the global environment and is done during initial setup. * */ for ( i = 0; i < nextreq; i++ ) if ( request[i].page == page ) dumprequest(request[i].want, request[i].file, fp_out); } /* End of writerequest */ /*****************************************************************************/ dumprequest(want, file, fp_out) char *want; /* look for this string */ char *file; /* in this file */ FILE *fp_out; /* and write the value out here */ { char buf[100]; /* line buffer for reading *file */ FILE *fp_in; /* * * Looks for *want in the request file and if it's found the associated value * is copied to the output file. Keywords (ie. the *want strings) begin an @ in * the first column of file, while the values (ie. the stuff that's copied to * the output file) starts on the next line and extends to the next keyword or * to the end of file. * */ if ( (fp_in = fopen(file, "r")) != NULL ) { while ( fgets(buf, sizeof(buf), fp_in) != NULL ) if ( buf[0] == '@' && strncmp(want, &buf[1], strlen(want)) == 0 ) while ( fgets(buf, sizeof(buf), fp_in) != NULL ) if ( buf[0] == '#' || buf[0] == '%' ) continue; else if ( buf[0] != '@' ) fprintf(fp_out, "%s", buf); else break; fclose(fp_in); } /* End if */ } /* End of dumprequest */ /*****************************************************************************/ 0707070014230361441006440057030057030000011040150522627500500003200000001035post.src/common/tempnam.c #include <stdio.h> #include <errno.h> #if defined(V9) || defined(BSD4_2) char *tempnam(dir, pfx) char *dir, *pfx; { int pid; unsigned int len; char *tnm, *malloc(); static int seq = 0; pid = getpid(); len = strlen(dir) + strlen(pfx) + 10; if ((tnm = malloc(len)) != NULL) { sprintf(tnm, "%s", dir); if (access(tnm, 7) == -1) return(NULL); do { sprintf(tnm, "%s/%s%d%d", dir, pfx, pid, seq++); errno = 0; if (access(tnm, 7) == -1) if (errno == ENOENT) return(tnm); } while (1); } return(tnm); } #endif 0707070014230361451006440057030057030000011040160522627500500003200000001432post.src/common/request.h /* * * Things used to handle special PostScript requests (like manual feed) globally * or on a per page basis. All the translators I've supplied accept the -R option * that can be used to insert special PostScript code before the global setup is * done, or at the start of named pages. The argument to the -R option is a string * that can be "request", "request:page", or "request:page:file". If page isn't * given (as in the first form) or if it's 0 in the last two, the request applies * to the global environment, otherwise request holds only for the named page. * If a file name is given a page number must be supplied, and in that case the * request will be looked up in that file. * */ #define MAXREQUEST 30 typedef struct { char *want; int page; char *file; } Request; 0707070014230361461006440057030057030000011041310522633073100002700000002213post.src/common/path.h /* * * pathname definitions for important files and directories. * */ #define DPOST "/usr/lib/postscript/dpost.ps" #define POSTBGI "/usr/lib/postscript/postbgi.ps" #define POSTDAISY "/usr/lib/postscript/postdaisy.ps" #define POSTDMD "/usr/lib/postscript/postdmd.ps" #define POSTMD "/usr/lib/postscript/postmd.ps" #define POSTPLOT "/usr/lib/postscript/postplot.ps" #define POSTPRINT "/usr/lib/postscript/postprint.ps" #define POSTNPRINT "/usr/lib/postscript/postnprint.ps" #define POSTTEK "/usr/lib/postscript/posttek.ps" #define POSTGIF "/usr/lib/postscript/postgif.ps" #define BASELINE "/usr/lib/postscript/baseline.ps" #define COLOR "/usr/lib/postscript/color.ps" #define DRAW "/usr/lib/postscript/draw.ps" #define FORMFILE "/usr/lib/postscript/forms.ps" #define SHADEFILE "/usr/lib/postscript/shade.ps" #define KERNING "/usr/lib/postscript/kerning.ps" #define REQUESTFILE "/usr/lib/postscript/ps.requests" #define ROUNDPAGE "/usr/lib/postscript/roundpage.ps" #define ENCODINGDIR "/usr/lib/postscript" #define HOSTDIR "/usr/lib/font/postscript" #define FONTDIR "/usr/lib/font" #define POSTLIBDIR "/usr/lib/postscript" #define TEMPDIR "/tmp" 0707070014230357551006400057030057030000011024350522633073100002600000002157post.src/common/gen.h /* * * A few definitions that shouldn't have to change. Used by most programs in * this package. * */ #define PROGRAMVERSION "3.3.2" #define NON_FATAL 0 #define FATAL 1 #define USER_FATAL 2 #define OFF 0 #define ON 1 #define FALSE 0 #define TRUE 1 #define BYTE 8 #define BMASK 0377 #define POINTS 72.3 #ifndef PI #define PI 3.141592654 #endif #define ONEBYTE 0 #define UTFENCODING 1 #define READING ONEBYTE #define WRITING ONEBYTE /* * * DOROUND controls whether some translators include file ROUNDPAGE (path.h) * after the prologue. Used to round page dimensions obtained from the clippath * to know paper sizes. Enabled by setting DOROUND to TRUE (or 1). * */ #define DOROUND TRUE /* * * Default resolution and the height and width of a page (in case we need to get * to upper left corner) - only used in BoundingBox calculations!! * */ #define DEFAULT_RES 72 #define PAGEHEIGHT 11.0 * DEFAULT_RES #define PAGEWIDTH 8.5 * DEFAULT_RES /* * * Simple macros. * */ #define ABS(A) ((A) >= 0 ? (A) : -(A)) #define MIN(A, B) ((A) < (B) ? (A) : (B)) #define MAX(A, B) ((A) > (B) ? (A) : (B)) 0707070014230361501006440057030057030000011040500522627500500002700000007564post.src/common/misc.c /* * * General purpose routines. * */ #include <stdio.h> #include <ctype.h> #include <fcntl.h> #include "gen.h" #include "ext.h" #include "path.h" int nolist = 0; /* number of specified ranges */ int olist[50]; /* processing range pairs */ /*****************************************************************************/ out_list(str) char *str; { int start, stop; /* * * Grab page ranges from str, save them in olist[], and update the nolist * count. Range syntax matches nroff/troff syntax. * */ while ( *str && nolist < sizeof(olist) - 2 ) { start = stop = str_convert(&str, 0); if ( *str == '-' && *str++ ) stop = str_convert(&str, 9999); if ( start > stop ) error(FATAL, "illegal range %d-%d", start, stop); olist[nolist++] = start; olist[nolist++] = stop; if ( *str != '\0' ) str++; } /* End while */ olist[nolist] = 0; } /* End of out_list */ /*****************************************************************************/ in_olist(num) int num; { int i; /* * * Return ON if num is in the current page range list. Print everything if * there's no list. * */ if ( nolist == 0 ) return(ON); for ( i = 0; i < nolist; i += 2 ) if ( num >= olist[i] && num <= olist[i+1] ) return(ON); return(OFF); } /* End of in_olist */ /*****************************************************************************/ setencoding(name) char *name; { char path[150]; /* * * Include the font encoding file selected by name. It's a full pathname if * it begins with /, otherwise append suffix ".enc" and look for the file in * ENCODINGDIR. Missing files are silently ignored. * */ if ( name == NULL ) name = "Default"; if ( *name == '/' ) strcpy(path, name); else sprintf(path, "%s/%s.enc", ENCODINGDIR, name); if ( cat(path) == TRUE ) writing = strncmp(name, "UTF", 3) == 0; } /* End of setencoding */ /*****************************************************************************/ cat(file) char *file; { int fd_in; int fd_out; char buf[512]; int count; /* * * Copy *file to stdout. Return FALSE is there was a problem. * */ fflush(stdout); if ( (fd_in = open(file, O_RDONLY)) == -1 ) return(FALSE); fd_out = fileno(stdout); while ( (count = read(fd_in, buf, sizeof(buf))) > 0 ) write(fd_out, buf, count); close(fd_in); return(TRUE); } /* End of cat */ /*****************************************************************************/ str_convert(str, err) char **str; int err; { int i; /* * * Grab the next integer from **str and return its value or err if *str * isn't an integer. *str is modified after each digit is read. * */ if ( ! isdigit(**str) ) return(err); for ( i = 0; isdigit(**str); *str += 1 ) i = 10 * i + **str - '0'; return(i); } /* End of str_convert */ /*****************************************************************************/ error(kind, mesg, a1, a2, a3) int kind; char *mesg; unsigned a1, a2, a3; { /* * * Print an error message and quit if kind is FATAL. * */ if ( mesg != NULL && *mesg != '\0' ) { fprintf(stderr, "%s: ", prog_name); fprintf(stderr, mesg, a1, a2, a3); if ( lineno > 0 ) fprintf(stderr, " (line %d)", lineno); if ( position > 0 ) fprintf(stderr, " (near byte %d)", position); putc('\n', stderr); } /* End if */ if ( kind == FATAL && ignore == OFF ) { if ( temp_file != NULL ) unlink(temp_file); exit(x_stat | 01); } /* End if */ } /* End of error */ /*****************************************************************************/ void interrupt(sig) int sig; { /* * * Signal handler for translators. * */ if ( temp_file != NULL ) unlink(temp_file); exit(1); } /* End of interrupt */ /*****************************************************************************/ 0707070014230361511006440057030057030000011040540522627500500002600000002032post.src/common/ext.h /* * * External varibles - most are in glob.c. * */ extern char **argv; /* global so everyone can use them */ extern int argc; extern int x_stat; /* program exit status */ extern int debug; /* debug flag */ extern int ignore; /* what we do with FATAL errors */ extern long lineno; /* line number */ extern long position; /* byte position */ extern char *prog_name; /* and program name - for errors */ extern char *temp_file; /* temporary file - for some programs */ extern char *fontencoding; /* text font encoding scheme */ extern int dobbox; /* enable BoundingBox stuff if TRUE */ extern double pageheight; /* only for BoundingBox calculations! */ extern double pagewidth; extern int reading; /* input */ extern int writing; /* and output encoding */ extern char *optarg; /* for getopt() */ extern int optind; extern void interrupt(); extern char *malloc(); extern char *calloc(); extern char *tempnam(); extern char *strtok(); extern long ftell(); extern double atof(); extern double sqrt(); extern double atan2(); 0707070014230361521006440057030057030000011040170522627500500002700000001461post.src/common/glob.c /* * * Global varibles - for PostScript translators. * */ #include <stdio.h> #include "gen.h" char **argv; /* global so everyone can use them */ int argc; int x_stat = 0; /* program exit status */ int debug = OFF; /* debug flag */ int ignore = OFF; /* what we do with FATAL errors */ long lineno = 0; /* line number */ long position = 0; /* byte position */ char *prog_name = ""; /* and program name - for errors */ char *temp_file = NULL; /* temporary file - for some programs */ char *fontencoding = NULL; /* text font encoding scheme */ int dobbox = FALSE; /* enable BoundingBox stuff if TRUE */ double pageheight = PAGEHEIGHT; /* only for BoundingBox calculations! */ double pagewidth = PAGEWIDTH; int reading = READING; /* input */ int writing = WRITING; /* and output encoding */ 0707070014230361531006440057030057030000011040700522627500500003300000007534post.src/common/comments.h /* * * Currently defined file structuring comments from Adobe - plus a few others. * Ones that end with a colon expect arguments, while those ending with a newline * stand on their own. Truly overkill on Adobe's part and mine for including them * all! * * All PostScript files should begin with a header that starts with one of the * following comments. * */ #define NONCONFORMING "%!PS\n" #define MINCONFORMING "%!PS-Adobe-\n" #define OLDCONFORMING "%!PS-Adobe-1.0\n" #define CONFORMING "%!PS-Adobe-2.0\n" #define CONFORMINGEPS "%!PS-Adobe-2.0 EPS\n" #define CONFORMINGQUERY "%!PS-Adobe-2.0 Query\n" #define CONFORMINGEXITSERVER "%!PS-Adobe-2.0 ExitServer\n" /* * * Header comments - immediately follow the appropriate document classification * comment. * */ #define TITLE "%%Title:" #define CREATOR "%%Creator:" #define CREATIONDATE "%%CreationDate:" #define FOR "%%For:" #define ROUTING "%%Routing:" #define BOUNDINGBOX "%%BoundingBox:" #define PAGES "%%Pages:" #define REQUIREMENTS "%%Requirements:" #define DOCUMENTFONTS "%%DocumentFonts:" #define DOCUMENTNEEDEDFONTS "%%DocumentNeededFonts:" #define DOCUMENTSUPPLIEDFONTS "%%DocumentSuppliedFonts:" #define DOCUMENTNEEDEDPROCSETS "%%DocumentNeededProcSets:" #define DOCUMENTSUPPLIEDPROCSETS "%%DocumentSuppliedProcSets:" #define DOCUMENTNEEDEDFILES "%%DocumentNeededFiles:" #define DOCUMENTSUPPLIEDFILES "%%DocumentSuppliedFiles:" #define DOCUMENTPAPERSIZES "%%DocumentPaperSizes:" #define DOCUMENTPAPERFORMS "%%DocumentPaperForms:" #define DOCUMENTPAPERCOLORS "%%DocumentPaperColors:" #define DOCUMENTPAPERWEIGHTS "%%DocumentPaperWeights:" #define DOCUMENTPRINTERREQUIRED "%%DocumentPrinterREquired:" #define ENDCOMMENTS "%%EndComments\n" #define ENDPROLOG "%%EndProlog\n" /* * * Body comments - can appear anywhere in a document. * */ #define BEGINSETUP "%%BeginSetup\n" #define ENDSETUP "%%EndSetup\n" #define BEGINDOCUMENT "%%BeginDocument:" #define ENDDOCUMENT "%%EndDocument\n" #define BEGINFILE "%%BeginFile:" #define ENDFILE "%%EndFile\n" #define BEGINPROCSET "%%BeginProcSet:" #define ENDPROCSET "%%EndProcSet\n" #define BEGINBINARY "%%BeginBinary:" #define ENDBINARY "%%EndBinary\n" #define BEGINPAPERSIZE "%%BeginePaperSize:" #define ENDPAPERSIZE "%%EndPaperSize\n" #define BEGINFEATURE "%%BeginFeature:" #define ENDFEATURE "%%EndFeature\n" #define BEGINEXITSERVER "%%BeginExitServer:" #define ENDEXITSERVER "%%EndExitServer\n" #define TRAILER "%%Trailer\n" /* * * Page level comments - usually will occur once per page. * */ #define PAGE "%%Page:" #define PAGEFONTS "%%PageFonts:" #define PAGEFILES "%%PageFiles:" #define PAGEBOUNDINGBOX "%%PageBoundingBox:" #define BEGINPAGESETUP "%%BeginPageSetup\n" #define BEGINOBJECT "%%BeginObject:" #define ENDOBJECT "%%EndObject\n" /* * * Resource requirements - again can appear anywhere in a document. * */ #define INCLUDEFONT "%%IncludeFont:" #define INCLUDEPROCSET "%%IncludeProcSet:" #define INCLUDEFILE "%%IncludeFile:" #define EXECUTEFILE "%%ExecuteFile:" #define CHANGEFONT "%%ChangeFont:" #define PAPERFORM "%%PaparForm:" #define PAPERCOLOR "%%PaperColor:" #define PAPERWEIGHT "%%PaperWeight:" #define PAPERSIZE "%%PaperSize:" #define FEATURE "%%Feature:" #define ENDOFFILE "%%EOF\n" #define CONTINUECOMMENT "%%+" #define ATEND "(atend)" /* * * Some non-standard document comments. Global definitions are occasionally used * in dpost and are marked by BEGINGLOBAL and ENDGLOBAL. The resulting document * violates page independence, but can easily be converted to a conforming file * using a utililty program. * */ #define BEGINSCRIPT "%%BeginScript\n" #define BEGINGLOBAL "%%BeginGlobal\n" #define ENDGLOBAL "%%EndGlobal\n" #define ENDPAGE "%%EndPage:" #define FORMSPERPAGE "%%FormsPerPage:" #define VERSION "%%Version:" 0707070014230361541006440057030057030000011041100522627500600002700000012551post.src/common/bbox.c /* * * Boundingbox code for PostScript translators. The boundingbox for each page * is accumulated in bbox - the one for the whole document goes in docbbox. A * call to writebbox() puts out an appropriate comment, updates docbbox, and * resets bbox for the next page. The assumption made at the end of writebbox() * is that we're really printing the current page only if output is now going * to stdout - a valid assumption for all supplied translators. Needs the math * library. * */ #include <stdio.h> #include <ctype.h> #include <fcntl.h> #include <math.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* a few general purpose definitions */ #include "ext.h" /* external variable declarations */ typedef struct bbox { int set; double llx, lly; double urx, ury; } Bbox; Bbox bbox = {FALSE, 0.0, 0.0, 0.0, 0.0}; Bbox docbbox = {FALSE, 0.0, 0.0, 0.0, 0.0}; double ctm[6] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0}; double matrix1[6], matrix2[6]; /*****************************************************************************/ cover(x, y) double x, y; { /* * * Adds point (x, y) to bbox. Coordinates are in user space - the transformation * to default coordinates happens in writebbox(). * */ if ( bbox.set == FALSE ) { bbox.llx = bbox.urx = x; bbox.lly = bbox.ury = y; bbox.set = TRUE; } else { if ( x < bbox.llx ) bbox.llx = x; if ( y < bbox.lly ) bbox.lly = y; if ( x > bbox.urx ) bbox.urx = x; if ( y > bbox.ury ) bbox.ury = y; } /* End else */ } /* End of cover */ /*****************************************************************************/ writebbox(fp, keyword, slop) FILE *fp; /* the comment is written here */ char *keyword; /* the boundingbox comment string */ int slop; /* expand (or contract?) the box a bit */ { Bbox ubbox; /* user space bounding box */ double x, y; /* * * Transforms the numbers in the bbox[] using ctm[], adjusts the corners a bit * (depending on slop) and then writes comment. If *keyword is BoundingBox use * whatever's been saved in docbbox, otherwise assume the comment is just for * the current page. * */ if ( strcmp(keyword, BOUNDINGBOX) == 0 ) bbox = docbbox; if ( bbox.set == TRUE ) { ubbox = bbox; bbox.set = FALSE; /* so cover() works properly */ x = ctm[0] * ubbox.llx + ctm[2] * ubbox.lly + ctm[4]; y = ctm[1] * ubbox.llx + ctm[3] * ubbox.lly + ctm[5]; cover(x, y); x = ctm[0] * ubbox.llx + ctm[2] * ubbox.ury + ctm[4]; y = ctm[1] * ubbox.llx + ctm[3] * ubbox.ury + ctm[5]; cover(x, y); x = ctm[0] * ubbox.urx + ctm[2] * ubbox.ury + ctm[4]; y = ctm[1] * ubbox.urx + ctm[3] * ubbox.ury + ctm[5]; cover(x, y); x = ctm[0] * ubbox.urx + ctm[2] * ubbox.lly + ctm[4]; y = ctm[1] * ubbox.urx + ctm[3] * ubbox.lly + ctm[5]; cover(x, y); bbox.llx -= slop + 0.5; bbox.lly -= slop + 0.5; bbox.urx += slop + 0.5; bbox.ury += slop + 0.5; fprintf(fp, "%s %d %d %d %d\n", keyword, (int)bbox.llx, (int)bbox.lly,(int)bbox.urx, (int)bbox.ury); bbox = ubbox; } /* End if */ resetbbox((fp == stdout) ? TRUE : FALSE); } /* End of writebbox */ /*****************************************************************************/ resetbbox(output) int output; { /* * * Adds bbox to docbbox and resets bbox for the next page. Only update docbbox * if we really did output on the last page. * */ if ( docbbox.set == TRUE ) { cover(docbbox.llx, docbbox.lly); cover(docbbox.urx, docbbox.ury); } /* End if */ if ( output == TRUE ) { docbbox = bbox; docbbox.set = TRUE; } /* End if */ bbox.set = FALSE; } /* End of resetbbox */ /*****************************************************************************/ scale(sx, sy) double sx, sy; { /* * * Scales the default matrix. * */ matrix1[0] = sx; matrix1[1] = 0; matrix1[2] = 0; matrix1[3] = sy; matrix1[4] = 0; matrix1[5] = 0; concat(matrix1); } /* End of scale */ /*****************************************************************************/ translate(tx, ty) double tx, ty; { /* * * Translates the default matrix. * */ matrix1[0] = 1.0; matrix1[1] = 0.0; matrix1[2] = 0.0; matrix1[3] = 1.0; matrix1[4] = tx; matrix1[5] = ty; concat(matrix1); } /* End of translate */ /*****************************************************************************/ rotate(angle) double angle; { /* * * Rotates by angle degrees. * */ angle *= 3.1416 / 180; matrix1[0] = matrix1[3] = cos(angle); matrix1[1] = sin(angle); matrix1[2] = -matrix1[1]; matrix1[4] = 0.0; matrix1[5] = 0.0; concat(matrix1); } /* End of rotate */ /*****************************************************************************/ concat(m1) double m1[]; { double m2[6]; /* * * Replaces the ctm[] by the result of the matrix multiplication m1[] x ctm[]. * */ m2[0] = ctm[0]; m2[1] = ctm[1]; m2[2] = ctm[2]; m2[3] = ctm[3]; m2[4] = ctm[4]; m2[5] = ctm[5]; ctm[0] = m1[0] * m2[0] + m1[1] * m2[2]; ctm[1] = m1[0] * m2[1] + m1[1] * m2[3]; ctm[2] = m1[2] * m2[0] + m1[3] * m2[2]; ctm[3] = m1[2] * m2[1] + m1[3] * m2[3]; ctm[4] = m1[4] * m2[0] + m1[5] * m2[2] + m2[4]; ctm[5] = m1[4] * m2[1] + m1[5] * m2[3] + m2[5]; } /* End of concat */ /*****************************************************************************/ 0707070014230361551006440057030057030000011040560522627500600003500000001604post.src/common/pathtemplate /* * * pathname definitions for important files and directories. * */ #define DPOST "POSTLIB/dpost.ps" #define POSTBGI "POSTLIB/postbgi.ps" #define POSTDAISY "POSTLIB/postdaisy.ps" #define POSTDMD "POSTLIB/postdmd.ps" #define POSTMD "POSTLIB/postmd.ps" #define POSTPLOT "POSTLIB/postplot.ps" #define POSTPRINT "POSTLIB/postprint.ps" #define POSTNPRINT "POSTLIB/postnprint.ps" #define POSTTEK "POSTLIB/posttek.ps" #define POSTGIF "POSTLIB/postgif.ps" #define BASELINE "POSTLIB/baseline.ps" #define COLOR "POSTLIB/color.ps" #define DRAW "POSTLIB/draw.ps" #define FORMFILE "POSTLIB/forms.ps" #define SHADEFILE "POSTLIB/shade.ps" #define KERNING "POSTLIB/kerning.ps" #define REQUESTFILE "POSTLIB/ps.requests" #define ROUNDPAGE "POSTLIB/roundpage.ps" #define ENCODINGDIR "POSTLIB" #define HOSTDIR "HOSTDIR" #define FONTDIR "FONTDIR" #define POSTLIBDIR "POSTLIB" #define TEMPDIR "/tmp" 0707070014230357541006400057030057030000011040360522633073100003200000002342post.src/common/common.mk MAKE=/bin/make MAKEFILE=common.mk SYSTEM=V9 VERSION=3.3.2 FONTDIR=/usr/lib/font HOSTDIR=/usr/lib/font/postscript POSTLIB=/usr/lib/postscript ROUNDPAGE=TRUE CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) LDFLAGS=$(LDFLGS) all : install : all clean : rm -f *.o clobber : clean bbox.o : bbox.c ext.h gen.h $(CC) $(CFLAGS) -c bbox.c glob.o : glob.c gen.h $(CC) $(CFLAGS) -c glob.c misc.o : misc.c ext.h gen.h path.h $(CC) $(CFLAGS) -c misc.c request.o : request.c gen.h path.h request.h $(CC) $(CFLAGS) -c request.c rune.o : rune.c rune.h $(CC) $(CFLAGS) -c rune.c tempnam.o : tempnam.c $(CC) $(CFLAGS) -D$(SYSTEM) -c tempnam.c changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ -e "s'^HOSTDIR=.*'HOSTDIR=$(HOSTDIR)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ -e "s'^ROUNDPAGE=.*'ROUNDPAGE=$(ROUNDPAGE)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e 's:"FONTDIR:"$(FONTDIR):' \ -e 's:"HOSTDIR:"$(HOSTDIR):' \ -e 's:"POSTLIB:"$(POSTLIB):' \ pathtemplate >path.h; \ sed \ -e "s'^#define.*DOROUND.*'#define DOROUND $(ROUNDPAGE)'" \ gen.h >Xgen.h; \ mv Xgen.h gen.h 0707070014230361571006440057030057030000011040570522627500600002700000000566post.src/common/rune.h /* * * Rune declarations - for supporting UTF encoding. * */ #define RUNELIB 1 #ifdef RUNELIB typedef unsigned short Rune; enum { UTFmax = 3, /* maximum bytes per rune */ Runesync = 0x21, /* cannot represent part of a utf sequence (<) */ Runeself = 0xA0, /* rune and utf sequences are the same (<) */ Runeerror = 0x80, /* decoding error in utf */ }; #endif 0707070014230361601006440057030057030000011040740522627500600002700000004760post.src/common/rune.c /* * * Rune library routines for supporting UTF encoding. * */ #include "rune.h" #ifdef RUNELIB enum { Char1 = Runeself, Rune1 = Runeself, Char21 = 0xA1, Rune21 = 0x0100, Char22 = 0xF6, Rune22 = 0x4016, Char3 = 0xFC, Rune3 = 0x10000, /* really 0x38E2E */ Esc = 0xBE, Bad = Runeerror, }; static unsigned char U[256]; static unsigned char T[256]; static void mktable() { int i, u; for(i=0; i<256; i++) { u = i + (0x5E-0xA0); if(i < 0xA0) u = i + (0xDF-0x7F); if(i < 0x7F) u = i + (0x00-0x21); if(i < 0x21) u = i + (0xBE-0x00); U[i] = u; T[u] = i; } } int chartorune(rune, str) Rune *rune; char *str; { int c, c1, c2; long l; if(U[0] == 0) mktable(); /* * one character sequence * 00000-0009F => 00-9F */ c = *(unsigned char*)str; if(c < Char1) { *rune = c; return 1; } /* * two character sequence * 000A0-000FF => A0; A0-FF */ c1 = *(unsigned char*)(str+1); if(c < Char21) { if(c1 >= Rune1 && c1 < Rune21) { *rune = c1; return 2; } goto bad; } /* * two character sequence * 00100-04015 => A1-F5; 21-7E/A0-FF */ c1 = U[c1]; if(c1 >= Esc) goto bad; if(c < Char22) { *rune = (c-Char21)*Esc + c1 + Rune21; return 2; } /* * three character sequence * 04016-38E2D => A6-FB; 21-7E/A0-FF */ c2 = U[*(unsigned char*)(str+2)]; if(c2 >= Esc) goto bad; if(c < Char3) { l = (c-Char22)*Esc*Esc + c1*Esc + c2 + Rune22; if(l >= Rune3) goto bad; *rune = l; return 3; } /* * bad decoding */ bad: *rune = Bad; return 1; } int runetochar(str, rune) char *str; Rune *rune; { long c; if(T[0] == 0) mktable(); /* * one character sequence * 00000-0009F => 00-9F */ c = *rune; if(c < Rune1) { str[0] = c; return 1; } /* * two character sequence * 000A0-000FF => A0; A0-FF */ if(c < Rune21) { str[0] = Char1; str[1] = c; return 2; } /* * two character sequence * 00100-04015 => A1-F5; 21-7E/A0-FF */ if(c < Rune22) { c -= Rune21; str[0] = c/Esc + Char21; str[1] = T[c%Esc]; return 2; } /* * three character sequence * 04016-38E2D => A6-FB; 21-7E/A0-FF */ c -= Rune22; str[0] = c/(Esc*Esc) + Char22; str[1] = T[c/Esc%Esc]; str[2] = T[c%Esc]; return 3; } int runelen(c) long c; { Rune rune; char str[10]; rune = c; return runetochar(str, &rune); } int fullrune(str, n) char *str; int n; { int c; if(n > 0) { c = *(unsigned char*)str; if(c < Char1) return 1; if(n > 1) if(c < Char22 || n > 2) return 1; } return 0; } #endif RUNELIB 0707070014231030400407550057030057030000020277230522633100400001700000000000post.src/dpost 0707070014231030411006440057030057030000010277240522627500600002600000002711post.src/dpost/README Troff to PostScript translator. The big change is in the font table routines. The old binary format and makedev are gone. Troff and dpost now both read ASCII tables. Translating the ASCII font tables in dpost (and troff) means some startup overhead. Both programs run a bit slower, but it's a small price to pay for the added flexibility. Long PostScript font names can now be included in the font tables. They should follow the fontname keyword as in, fontname Times-Roman The fontname field helps with the DocumentFonts comment, font name abbreviations (formally required to be in the prologue), and is used to manage host resident fonts. dpost can also now calculate a reasonably tight BoundingBox, which helps picture inclusion. By default the calculations are disabled. Use the -B option when you BoundingBox and PageBoundingBox comments. If you're stubborn and always want the comment set dobbox (in file dpost.c) to TRUE. You'll still need -B to get the the best fit. Most other changes are bug fixes. Color support has been improved, and now works with the drawing routines. The different text encoding schemes are all still in. Level 2 is well tested and is now the default. For a different default change DFLTENCODING (file dpost.h). Don't make level 3 the default unless you can live with ragged right margins. A typical command line would be, pic file | tbl | eqn | troff -mm | dpost >file.ps file.ps is PostScript and can be sent directly to a printer. 0707070014231030421006440057030057030000010277400522627500600002700000015654post.src/dpost/color.c /* * * Routines that handle color requests passed through as device control commands * in the form "x X SetColor:red". The following PostScript procedures are needed: * * setcolor * * mark /color setcolor mark * mark /color1 /color2 setcolor mark * * Called whenever we want to change PostScript's current color graphics * state parameter. One or two color arguments can be given. In each case * the colors are looked up in the PostScript colordict dictionary that's * defined in *colorfile. Two named colors implies reverse video printing * with the background given in /color2 and the text printed in /color1. * Unknown colors are mapped into defaults - black for a single color and * white on black for reverse video. * * drawrvbox * * leftx rightx drawrvbox - * * Fills a box that extends from leftx to rightx with the background color * that was requested when setcolor set things up for reverse video mode. * The vertical extent of the box is determined using FontBBox just before * the first string is printed, and the height remains in effect until * there's an explicit color change. In otherwords font or size changes * won't always produce correct result in reverse video mode. * * setdecoding * * num setdecoding - * * Selects the text decoding procedure (ie. what's assigned to PostScript * procedure t) from the decodingdefs array defined in the prologue. num * should be the value assigned to variable encoding (in dpost) and will * remain constant throughout a job, unless special features, like reverse * video printing, are requested. The text encoding scheme can be set on * the command line using the -e option. Print time and the size of the * output file will usually decrease as the value assigned to encoding * increases. * * * The recognized collection of "x X SetColor:" commands are: * * x X SetColor: selects black * x X SetColor:color selects color * x X SetColor:color1 on color2 reverse video * x X SetColor:color1 color2 reverse video again * x X SetColor:num1 num2 num3 rgb explicit rgb color request * x X SetColor:num1 num2 num3 hsb explicit hsb color request * * In the last three examples num1, num2, and num3 should be numbers between 0 and * 1 inclusive and are passed on as aguments to the approrpriate PostScript color * command (eg. setrgbcolor). Unknown color names (ie. the ones that setcolor * doesn't find in colordict) are mapped into defaults. For one color the default * is black, while for reverse video it's white text on a black background. * * dpost makes sure the current color is maintained across page boundaries, which * may not be what you want if you're using a macro package like mm that puts out * page footers and headers. Adding a color request to troff and keeping track of * the color in each environment may be the best solution. * * To get reverse video printing follow the "x X SetColor:" command with two or * three arguments. "x X SetColor:white on black" or "x X SetColor:white black" * both produce white text on a black background. Any two colors named in colordict * (in file *colorfile) can be chosen so "x X SetColor:yellow on blue" also works. * Each reverse video mode request selects the vertical extent of the background * box based on the font and size in use just before the first string is printed. * Font and/or size changes aren't guaranteed to work properly in reverse video * printing. * */ #include <stdio.h> #include <ctype.h> #include "gen.h" /* general purpose definitions */ #include "ext.h" /* external variable definitions */ #define DEFAULTCOLOR "black" char color[50] = DEFAULTCOLOR; /* current color */ int gotcolor = FALSE; /* TRUE after *colorfile is downloaded */ int wantcolor = FALSE; /* TRUE if we really ask for a color */ /* * * All these should be defined in dpost.c. * */ extern int lastend; extern int encoding; extern int maxencoding; extern int realencoding; extern char *colorfile; extern FILE *tf; /*****************************************************************************/ getcolor() { /* * * Responsible for making sure the PostScript color procedures are downloaded from * *colorfile. Done at most once per job, and only if the job really uses color. * For now I've decided not to quit if we can't read the color file. * */ if ( gotcolor == FALSE ) exportfile(colorfile); if ( tf == stdout ) gotcolor = TRUE; } /* End of getcolor */ /*****************************************************************************/ newcolor(name) char *name; /* of the color */ { char *p; /* next character in *name */ int i; /* goes in color[i] */ /* * * Converts *name to lower case and saves the result in color[] for use as the * current color. The first time something other than DEFAULTCOLOR is requested * sets wantcolor to TRUE. Characters are converted to lower case as they're put * in color[] and we quit when we find a newline or get to the end of *name. The * isupper() test is for Berkley systems. * */ for ( p = name; *p && (*p == ' ' || *p == ':'); p++ ) ; for ( i = 0; i < sizeof(color) - 1 && *p != '\n' && *p; i++, p++ ) if ( isupper(*p) ) color[i] = tolower(*p); else color[i] = *p; if ( i == 0 ) strcpy(color, DEFAULTCOLOR); else color[i] = '\0'; if ( strcmp(color, DEFAULTCOLOR) != 0 ) wantcolor = TRUE; } /* End of newcolor */ /*****************************************************************************/ setcolor() { int newencoding; /* text encoding scheme that's needed */ char *p; /* for converting what's in color[] */ /* * * Sets the color being used by the printer to whatever's stored as the current * color (ie. the string in color[]). wantcolor is only set to TRUE if we've been * through newcolor() and asked for something other than DEFAULTCOLOR (probably * black). While in reverse video mode encoding gets set to maxencoding + 1 in * dpost and 0 on the printer. Didn't see much point in trying to extend reverse * video to all the different encoding schemes. realencoding is restored when we * leave reverse video mode. * */ if ( wantcolor == TRUE ) { flushtext(); getcolor(); lastend = -1; newencoding = realencoding; if ( islower(color[0]) == 0 ) /* explicit rgb or hsb request */ fprintf(tf, "%s\n", color); else { putc('/', tf); for ( p = color; *p && *p != ' '; p++ ) putc(*p, tf); for ( ; *p && *p == ' '; p++ ) ; if ( strncmp(p, "on ", 3) == 0 ) p += 3; if ( *p != '\0' ) { fprintf(tf, " /%s", p); newencoding = maxencoding + 1; } /* End if */ fprintf(tf, " setcolor\n"); } /* End else */ if ( newencoding != encoding ) { encoding = newencoding; fprintf(tf, "%d setdecoding\n", encoding); resetpos(); } /* End if */ } /* End if */ } /* End of setcolor */ /*****************************************************************************/ 0707070014231027441006400057030057030000010254600522633100400002700000012240post.src/dpost/dpost.1 .ds dF /usr/lib/font .ds dQ /usr/lib/postscript .TH DPOST 1 "DWB 3.2" .SH NAME .B dpost \- .B troff postprocessor for PostScript printers .SH SYNOPSIS \*(mBdpost\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B dpost translates .I files created by .BR troff (1) into PostScript and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-m num Magnify each logical page by the factor .IR num (default is 1.0). Pages are scaled uniformly about the origin, which is located near the upper left corner of each page. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default, .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP mode. Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP .OP \-w num Set the line width used to implement .B troff graphics commands to .I num points, where a point is approximately 1/72 of an inch. By default .I num is set to 0.3 points. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed near the upper left corner of the page, with positive x to the right and positive y down the page. Positive .I num moves everything right. The default offset is 0 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves text down the page. The default offset is 0. .TP .OP \-B Include .MW %%BoundingBox comments in the output file. Should only be used when the comments are needed for picture inclusion. Output is forced onto an 8.5\(mu11-inch page. .TP .OP \-E name Set the character encoding for text fonts to .IR name . Requesting .I name means include file .MI \*(dQ/ name .enc \f1. A nonexistent encoding file is silently ignored. There is no default. .TP .OP \-F dir Use .I dir as the font directory. The default .I dir is .MR \*(dF , and .B dpost reads .SM ASCII font files from directory .MR \*(dF/devpost . .TP .OP \-H dir Use .I dir as the host-resident font directory. A file in .I dir that matches the name of the .B troff font is assumed to be a host resident font program and is included in .B dpost output. There is no default. .TP .OP \-L \^file Use .I file as the PostScript prologue. The default is .MR \*(dQ/dpost.ps . .TP .OP \-T name Use font files for device .I name as the best description of available PostScript fonts. By default, .I name is \*(mBpost\fP and .B dpost reads .SM ASCII files from .MR \*(dF/devpost . .br .ne 1i .PP Three options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C \^file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include .I string in the output file; .I string must be legitimate PostScript. .TP .OP \-R action Requests special .I action (e.g., .MR manualfeed ) on a per page or global basis. The .I action string can be given as .IR request \|, .IM request : page\f1\|, or .IM request : page : file\f1\|. If .I page is omitted or given as 0 the request applies to all pages. If .I file is omitted the request lookup is done in .MR \*(dQ/ps.requests . .PP All .I files should be prepared by .B troff for the same device. Device tables that describe real PostScript fonts that can be used by .B dpost should include .EX PDL PostScript .EE in their .SM DESC file. Tables that depend on a non-standard character set encoding indicate that fact by an .MW Encoding entry in their .SM DESC file. For example, .EX Encoding Latin1 .EE means include file .MR \*(dQ/Latin1.enc . The .OP \-E option overrides the .SM DESC setting. .SH EXAMPLES .PP A typical command line might be: .EX pic \f2files\fP | tbl | eqn | troff -mm | dpost .EE .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully translated, while 2 often indicates a syntax error in the input .IR files . .SH WARNINGS .PP .B dpost output does not usually conform to Adobe's file-structuring conventions. Send the output through .B postreverse to produce a minimally conforming PostScript file. .PP Emulation is expensive and does not always produce satisfactory results. No attempt has been made to implement the character sets or fonts available on all devices supported by .BR troff . Missing characters are replaced by white space, and unrecognized fonts default to one of the Times fonts (e.g., .MR R , .MR I , .MR B , or .MR BI ). .SH FILES .MW \*(dF/devpost/* .br .MW \*(dF/devpost/charlib/* .br .MW \*(dQ/dpost.ps .br .MW \*(dQ/color.ps .br .MW \*(dQ/draw.ps .br .MW \*(dQ/forms.ps .br .MW \*(dQ/ps.requests .SH SEE ALSO .BR buildtables (1), .BR postio (1), .BR postprint (1), .BR postreverse (1), .BR psencoding (1), .BR troff (1), .BR font (5), .BR troff (5) 0707070014231030441006440057030057030000010300000522627500600002700000130466post.src/dpost/dpost.c /* * * dpost - troff post-processor for PostScript printers. * * A program that translates output generated by the device independent troff * into PostScript. Much was borrowed from dimpress and dps (formally dlzw), * and even though the code has changed, credit has to be given to Richard * Flood for his early work on the PostScript driver. * * The big change is in the font table routines. The old binary format and * makedev are gone. dpost and troff now read ASCII tables, and both skip * unrecognized entries in the ASCII tables. That means problems, like where * to put the real name of the PostScript font, have disappeared. The added * flexibility means some overhead translating the ASCII tables, but the * overhead isn't too bad. * * dpost can also now calculate a reasonably tight BoundingBox, which helps * picture inclusion. The calculations, by default, are disabled. Couldn't * justify the overhead for a comment, particularly one that's only needed * occasionally. Use the -B option to get the comment. * * Output produced by dpost is still nonconforming. Definitions made in pages * and exported to the job's global environment are the primary problem. It's * an efficient approach, but means pages are not independent. Violations are * bracketed by %%BeginGlobal and %%EndGlobal comments and can be pulled into * the prologue by utility programs (like postreverse) that recognize the new * comments. * * The program handles files formatted for any device, although the best and * most efficient output is generated when the font and description files * match PostScript's resident fonts. Emulation is relatively expensive, and * can produce output files that are more than twice the size of the input * files. * * Several different methods can be used to encode lines of text. What's done * depends on the value assigned to encoding. Print time should decrease as * encoding increases (up to MAXENCODING). Setting encoding to 3 (or higher) * is not normally recommended. It's fast and produces very compact output, * but rounding errors in troff's width tables can accumulate and lead to a * ragged right margin. encoding can be changed on the command line using the * -e option. * * PostScript fonts don't support all of troff's characters. Some are built * by special PostScript procedures in directory *fontdir/devpost/charlib. * The charlib approach is not meant to replace user defined fonts. It was * a quick implementation designed to handle characters that aren't used * often - charlib should not be overused! The charlib lookup is triggered * when a character in a font table is assigned a code less than 32. * * Most defaults are set in the prologue, but can be changed by options. The * -P option passes arbitrary PostScript into the setup section of the output * file. It can be used to set (or change) values that can't be accessed by * other options. For example, * * dpost -P'/useclippath false def' file > file.ps * * defines useclippath to be false. Everything passed through using the -P * (-C to copy a file) options become part of the job's global environment. * Definitions override defaults in the prologue. * * dpost expects to find the following procedures in the prologue: * * setup * * mark ... setup - * * Initialization procedure mainly responsible for setting up an * appropriate coordinate system. * * pagesetup * * page pagesetup - * * Called at the start of each page, immediately after the page * level save. Argument is the current page number. * * setdecoding * * num setdecoding - * * Select the decoding procedure used to print text strings encoded * by dpost. num is whatever has been assigned to encoding. * * f * * size font f - * * Set the font and size used for character imaging. The font name * argument is (normally) the name troff used. Mapping to the real * PostScript font name is made using the fontname field in the * ASCII width tables. * * m * * x y m - * * Move to point (x, y). Not used for positioning words in text * strings. * * t * * mark text t mark * * Everything on the stack (up to the mark) is treated as a line * of text to be decoded and printed. What's on the stack depends * on encoding. * * w * * string x y w - * * Print a single word starting at position (x, y). Only used in * the more complicated encoding schemes, like the ones based on * widthshow. * * done * * Make sure the last page prints. Always called, but only needed * when printing more than one page on each sheet of paper. * * output language from troff: * all numbers are character strings * * sn size in points * fn font as number from 1-n * cx ascii character x * Cxyz funny char xyz. terminated by white space * Hn go to absolute horizontal position n * Vn go to absolute vertical position n (down is positive) * hn go n units horizontally (relative) * vn ditto vertically * nnc move right nn, then print c (exactly 2 digits!) * (this wart is an optimization that shrinks output file size * about 35% and run-time about 15% while preserving ascii-ness) * Dt ...\n draw operation 't': * Dl x y line from here by x,y * Dc d circle of diameter d with left side here * De x y ellipse of axes x,y with left side here * Da x1 y1 x2 y2 arc counter-clockwise from current point (x, y) to * (x + x1 + x2, y + y1 + y2) * D~ x y x y ... wiggly line by x,y then x,y ... * nb a end of line (information only -- no action needed) * b = space before line, a = after * p new page begins -- set v to 0 * #...\n comment * x ...\n device control functions: * x i init * x T s name of device is s * x r n h v resolution is n/inch * h = min horizontal motion, v = min vert * x p pause (can restart) * x s stop -- done forever * x t generate trailer * x f n s font position n contains font s * x H n set character height to n * x S n set slant to N * * Subcommands like "i" are often spelled out like "init". * */ #include <stdio.h> #include <fcntl.h> #include <signal.h> #include <math.h> #include <ctype.h> #include <time.h> #include "comments.h" /* structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* prologue and a few other files */ #include "ext.h" /* external variable declarations */ #include "font.h" /* font table definitions */ #include "dpost.h" /* a few definitions just used here */ #include "motion.h" /* positioning macros */ char *prologue = DPOST; /* the PostScript prologue */ char *colorfile = COLOR; /* color support */ char *drawfile = DRAW; /* drawing routines */ char *formfile = FORMFILE; /* multiple pages on each sheet */ char *baselinefile = BASELINE; /* for text along curved baseline */ char *fontdir = FONTDIR; /* font table directories */ char *hostfontdir = NULL; /* host resident font directory */ char *realdev = DEVNAME; /* use these width tables */ char devname[20] = ""; /* job formatted for this device */ Fontmap fontmap[] = FONTMAP; /* font translation table - emulation */ char *useencoding = NULL; /* text font encoding - from -E option */ int copies = 1; /* copies of each sheet */ int printed = 0; /* pages processed and printed */ int formsperpage = 1; /* pages on each sheet of paper */ int picflag = ON; /* enable/disable picture inclusion */ int encoding = DFLTENCODING; /* how text is translated to PostScript */ int realencoding = DFLTENCODING; /* where we started */ int maxencoding = MAXENCODING; /* max that users can select */ int landscape = FALSE; /* for BoundingBox calculations only */ double magnification = 1.0; double xoffset = 0.0; double yoffset = 0.0; int smnt; /* special fonts start here */ int devres; /* device resolution */ int unitwidth; /* and unitwidth - from DESC file */ char downloaded[MAXCH+32+ALPHABET]; /* status of charlib characters */ int nfonts = 0; /* number of font positions */ int size = 10; /* current point size */ int font = 0; /* and font position */ int hpos = 0; /* where troff wants to be */ int vpos = 0; float lastw = 0; /* width of the last input character */ int lastc = 0; /* its name (or index) - for charlib() */ int fontheight = 0; /* points from x H ... */ int fontslant = 0; /* angle from x S ... */ int res; /* resolution assumed in input file */ float widthfac = 1.0; /* for emulation = res/devres */ int lastsize = -1; /* for tracking printer's current size */ int lastfont = -1; /* current font */ float lastx = -1; /* and current position */ int lasty = -1; int lastend; /* where last character on this line was */ int seenpage = FALSE; /* expect fonts are now all mounted */ int gotspecial = FALSE; /* append special fonts - emulation */ float pointslop = SLOP; /* horizontal error in points */ int slop; /* and machine units */ int rvslop; /* to extend box in reverse video mode */ int textcount = 0; /* strings accumulated so far */ int stringstart = 0; /* where the next one starts */ int spacecount = 0; /* spaces in current string */ Line line[MAXSTACK+3]; /* data about words accumulated so far */ char strings[STRINGSPACE]; /* strings temporarily saved here */ char *strptr; /* next free slot in strings[] */ FILE *tf = NULL; /* most output goes here */ FILE *fp_acct = NULL; /* accounting file */ char *optnames = "a:c:e:m:n:o:p:tw:x:y:A:BC:E:J:F:H:L:OP:R:S:T:DI"; extern int gotcolor; /* read *colorfile when TRUE */ extern Font fonts[]; /* data about every font we see */ extern Font *mount[]; /* troff mounts fonts here */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * Translates output from troff into PostScript. Input files must be formatted * for the same device. Each input file begins on a new page. * */ argc = agc; /* global so everyone can use them */ argv = agv; prog_name = argv[0]; /* for error messages */ init_signals(); /* interrupt handling */ header(); /* structuring comments */ options(); /* command line options */ arguments(); /* translate the input files */ done(); /* add trailing comments etc. */ account(); /* job accounting data */ exit(x_stat); } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Make sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; int old_optind = optind; /* * * Scan the option list for things needed now (e.g. prologue file), but could * be changed from defaults. An attempt to follow to Adobe's 2.0 structuring * conventions. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) setpaths(optarg); else if ( ch == 'B' ) dobbox = TRUE; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* restored for options() */ fprintf(stdout, "%s", NONCONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); if ( dobbox == TRUE ) fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); if ( DOROUND ) cat(ROUNDPAGE); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; extern char *optarg; extern int optind; /* * * Command line options - there are too many! * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* number of copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'e': /* select the encoding scheme */ if ( (encoding = atoi(optarg)) < 0 || encoding > MAXENCODING ) encoding = DFLTENCODING; realencoding = encoding; break; case 'm': /* magnification */ magnification = atof(optarg); fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ landscape = (*optarg == 'l') ? TRUE : FALSE; if ( landscape == TRUE ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 't': /* compatibility */ break; case 'w': /* line width - for drawing */ fprintf(stdout, "/linewidth %s def\n", optarg); break; case 'x': /* shift horizontally */ xoffset = atof(optarg); fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* shift vertically */ yoffset = atof(optarg); fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'B': /* enable BoundingBox calculations */ dobbox = TRUE; fprintf(stdout, "/rotation 1 def\n"); fprintf(stdout, "/gotpagebbox true def\n"); break; case 'C': /* copy file to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding - override DESC */ useencoding = optarg; break; case 'F': /* font table directory */ fontdir = optarg; break; case 'H': /* host resident font directory */ hostfontdir = optarg; break; case 'L': /* prologue file */ setpaths(optarg); /* already been done in header() */ break; case 'O': /* disable picture inclusion */ picflag = OFF; break; case 'P': /* copy string to output */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* global or page level request */ saverequest(optarg); break; case 'S': /* horizontal position error */ if ( (pointslop = atof(optarg)) < 0 ) pointslop = 0; break; case 'T': /* target printer */ realdev = optarg; break; case 'D': /* debug flag */ debug = ON; tf = stdout; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't know the option */ error(FATAL, ""); break; default: error(FATAL, "missing case for option %c", ch); break; } /* End switch */ } /* End while */ argc -= optind; argv += optind; } /* End of options */ /*****************************************************************************/ setpaths(name) char *name; { char *path; /* * * Extends the -L option to permit modification of more than just the prologue * file pathname. Syntax is -Lpath or -Lname:path. For debugging and development * only! * */ for ( path = name; *path; path++ ) if ( *path == ':' || *path == ' ' ) { while ( *path == ':' || *path == ' ' ) path++; break; } /* End if */ if ( *path == '\0' ) /* didn't find "name:" prefix */ path = name; if ( path == name || strncmp(name, "prologue", strlen("prologue")) == 0 ) prologue = path; else if ( strncmp(name, "draw", strlen("draw")) == 0 ) drawfile = path; else if ( strncmp(name, "color", strlen("color")) == 0 ) colorfile = path; else if ( strncmp(name, "form", strlen("form")) == 0 ) formfile = path; else if ( strncmp(name, "baseline", strlen("baseline")) == 0 ) baselinefile = path; } /* End of setpaths */ /*****************************************************************************/ setup() { double t; /* * * Job and BoundingBox initialization. Called once from t_init() - must know * the resolution before generating the PostScript call to setup. dpost only * includes an encoding file if it's set in the DESC file or requested with * the -E option. * */ writerequest(0, stdout); /* global requests e.g. manual feed */ fprintf(stdout, "/resolution %d def\n", res); if ( useencoding != NULL || fontencoding != NULL ) setencoding((useencoding != NULL) ? useencoding : fontencoding); fprintf(stdout, "setup\n"); fprintf(stdout, "%d setdecoding\n", realencoding); if ( formsperpage > 1 ) { /* multiple pages */ if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); if ( dobbox == TRUE ) { /* ctm[] - must agree with prologue */ translate(pagewidth/2.0, pageheight/2.0); if ( landscape == TRUE ) { rotate(90.0); t = pagewidth; pagewidth = pageheight; pageheight = t; } /* End if */ translate(-pagewidth/2.0, pageheight/2.0); translate(72.0 * xoffset, -72.0 * yoffset); scale(magnification, magnification); scale(72.0/devres, 72.0/devres); } /* End if */ } /* End of setup */ /*****************************************************************************/ arguments() { FILE *fp; /* * * Everything else is an input file. No arguments or '-' means stdin. * */ if ( argc < 1 ) conv(stdin); else while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp = stdin; else if ( (fp = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); conv(fp); if ( fp != stdin ) fclose(fp); argc--; argv++; } /* End while */ } /* End of arguments */ /*****************************************************************************/ done() { int i; int n; /* * * Force out the last page and add trailing comments. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %d\n", PAGES, printed); for ( i = 0, n = 0; i < MAXFONTS+1; i++ ) if ( (fonts[i].flags & USED) && fonts[i].fontname != NULL ) { if ( n++ == 0 ) fprintf(stdout, "%s", DOCUMENTFONTS); else if ( (n - 1) % 8 == 0 ) fprintf(stdout, "\n%s", CONTINUECOMMENT); fprintf(stdout, " %s", fonts[i].fontname); } /* End if */ if ( n > 0 ) putc('\n', stdout); if ( dobbox == TRUE ) writebbox(stdout, BOUNDINGBOX, 10); } /* End of done */ /*****************************************************************************/ account() { /* * * Accounting record to fp_acct - provided it's not NULL. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ conv(fp) register FILE *fp; { register int c; int m, n, n1, m1; char str[50]; /* * * Read troff output from file fp and translate it into PostScript. The final * t_page() call means input files start on a new page. * */ redirect(-1); /* do output only after a page command */ lineno = 1; while ((c = getc(fp)) != EOF) { switch (c) { case '\n': /* just count this line */ lineno++; break; case ' ': /* when input is text */ case 0: /* occasional noise creeps in */ break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* two motion digits plus a character */ hmot((c-'0')*10 + getc(fp)-'0'); put1(getc(fp)); break; case 'c': /* single ascii character */ put1(getc(fp)); break; case 'C': /* special character */ fscanf(fp, "%s", str); put1(chindex(str)); break; case 'N': /* character at position n */ fscanf(fp, "%d", &m); flushtext(); oput(m); break; case 'D': /* drawing functions */ flushtext(); getdraw(); if ( size != lastsize ) t_sf(); switch ((c=getc(fp))) { case 'p': /* draw a path */ while (fscanf(fp, "%d %d", &n, &m) == 2) drawline(n, m); lineno++; break; case 'l': /* draw a line */ fscanf(fp, "%d %d %c", &n, &m, &n1); drawline(n, m); break; case 'c': /* circle */ fscanf(fp, "%d", &n); drawcirc(n); break; case 'e': /* ellipse */ fscanf(fp, "%d %d", &m, &n); drawellip(m, n); break; case 'a': /* counter-clockwise arc */ case 'A': /* clockwise arc */ fscanf(fp, "%d %d %d %d", &n, &m, &n1, &m1); drawarc(n, m, n1, m1, c); break; case 'q': /* spline without end points */ drawspline(fp, 1); lineno++; break; case '~': /* wiggly line */ drawspline(fp, 2); lineno++; break; default: error(FATAL, "unknown drawing function %c", c); break; } /* End switch */ break; case 's': /* use this point size */ fscanf(fp, "%d", &size); /* ignore fractional sizes */ break; case 'f': /* use font mounted here */ fscanf(fp, "%s", str); setfont(t_font(str)); break; case 'H': /* absolute horizontal motion */ fscanf(fp, "%d", &n); hgoto(n); break; case 'h': /* relative horizontal motion */ fscanf(fp, "%d", &n); hmot(n); break; case 'w': /* word space */ break; case 'V': /* absolute vertical position */ fscanf(fp, "%d", &n); vgoto(n); break; case 'v': /* relative vertical motion */ fscanf(fp, "%d", &n); vmot(n); break; case 'p': /* new page */ fscanf(fp, "%d", &n); t_page(n); break; case 'n': /* end of line */ while ( (c = getc(fp)) != '\n' && c != EOF ) ; hgoto(0); lineno++; break; case '#': /* comment */ while ( (c = getc(fp)) != '\n' && c != EOF ) ; lineno++; break; case 'x': /* device control function */ devcntrl(fp); lineno++; break; default: error(FATAL, "unknown input character %o %c", c, c); done(); } /* End switch */ } /* End while */ t_page(-1); /* print the last page */ flushtext(); } /* End of conv */ /*****************************************************************************/ devcntrl(fp) FILE *fp; { char str[50], buf[256], str1[100]; int c, n; /* * * Interpret device control commands, ignoring any we don't recognize. The * "x X ..." commands are a device dependent collection generated by troff's * \X'...' request. * */ fscanf(fp, "%s", str); switch ( str[0] ) { case 'f': /* load font in a position */ fscanf(fp, "%d %s", &n, str); fgets(buf, sizeof buf, fp); /* in case there's a filename */ ungetc('\n', fp); /* fgets() goes too far */ str1[0] = '\0'; /* in case there's nothing to come in */ sscanf(buf, "%s", str1); loadfont(n, str, str1); break; case 'i': /* initialize */ t_init(); break; case 'p': /* pause */ break; case 'r': /* resolution assumed when prepared */ fscanf(fp, "%d", &res); break; case 's': /* stop */ case 't': /* trailer */ flushtext(); break; case 'H': /* char height */ fscanf(fp, "%d", &n); t_charht(n); break; case 'S': /* slant */ fscanf(fp, "%d", &n); t_slant(n); break; case 'T': /* device name */ fscanf(fp, "%s", devname); break; case 'X': /* copy through - from troff */ fscanf(fp, " %[^: \n]:", str); fgets(buf, sizeof(buf), fp); ungetc('\n', fp); if ( strcmp(str, "PI") == 0 || strcmp(str, "PictureInclusion") == 0 ) picture(buf); else if ( strcmp(str, "InlinePicture") == 0 ) inlinepic(fp, buf); else if ( strcmp(str, "BeginPath") == 0 ) beginpath(buf, FALSE); else if ( strcmp(str, "DrawPath") == 0 ) drawpath(buf, FALSE); else if ( strcmp(str, "BeginObject") == 0 ) beginpath(buf, TRUE); else if ( strcmp(str, "EndObject") == 0 ) drawpath(buf, TRUE); else if ( strcmp(str, "NewBaseline") == 0 ) newbaseline(buf); else if ( strcmp(str, "DrawText") == 0 ) drawtext(buf); else if ( strcmp(str, "SetText") == 0 ) settext(buf); else if ( strcmp(str, "SetColor") == 0 ) { newcolor(buf); setcolor(); } else if ( strcmp(str, "INFO") == 0 ) { flushtext(); fprintf(tf, "%%INFO%s", buf); } else if ( strcmp(str, "PS") == 0 || strcmp(str, "PostScript") == 0 ) { flushtext(); fprintf(tf, "%s", buf); } else if ( strcmp(str, "ExportPS") == 0 ) { /* dangerous!! */ if ( tf == stdout ) { restore(); fprintf(tf, "%s", buf); save(); } /* End if */ } /* End else */ break; } /* End switch */ while ( (c = getc(fp)) != '\n' && c != EOF ) ; } /* End of devcntrl */ /*****************************************************************************/ loadfont(m, f, name) int m; char *f; char *name; { char path[150]; /* * * Load position m with font f. Font file pathname is *fontdir/dev*realdev/*f * or name, if name isn't empty. Use mapfont() to replace the missing font * if we're emulating another device, name is empty, and the first mount * fails. * */ if ( name[0] == '\0' ) sprintf(path, "%s/dev%s/%s", fontdir, realdev, f); else sprintf(path, "%s", name); if ( mountfont(path, m) == -1 ) { if ( name[0] == '\0' ) { sprintf(path, "%s/dev%s/%s", fontdir, realdev, mapfont(f)); if ( mountfont(path, m) == -1 ) { sprintf(path, "%s/dev%s/%s", fontdir, realdev, f); error(FATAL, "can't load %s at %d", path, m); } /* End if */ } else error(FATAL, "can't load %s at %d", path, m); } /* End if */ if ( smnt == 0 && mount[m]->specfont ) smnt = m; if ( m == lastfont ) /* force a call to t_sf() */ lastfont = -1; if ( m > nfonts ) { /* got more positions */ nfonts = m; gotspecial = FALSE; } /* End if */ } /* End of loadfont */ /*****************************************************************************/ char *mapfont(name) char *name; { int i; /* * * Map a missing font name into one that should be available. Only used when * we're emulating another device and the first mount fails. Consider deleting * this routine. * */ for ( i = 0; fontmap[i].name != NULL; i++ ) if ( strcmp(name, fontmap[i].name) == 0 ) return(fontmap[i].use); switch ( *++name ) { case 'I': return("I"); case 'B': return("B"); case 'X': return("BI"); default: return("R"); } /* End switch */ } /* End of mapfont */ /*****************************************************************************/ loadspecial() { /* * * Fix - later. * */ gotspecial = TRUE; } /* End of loadspecial */ /*****************************************************************************/ t_init() { char path[150]; static int initialized = FALSE; /* * * Finish initialization - just read an "x init" command. Assumes we already * know the input file resolution. * */ flushtext(); /* moved - for cat'ed troff files */ if ( initialized == FALSE ) { if ( strcmp(devname, realdev) ) { sprintf(path, "%s/dev%s/DESC", fontdir, devname); if ( checkdesc(path) ) realdev = devname; } /* End if */ sprintf(path, "%s/dev%s/DESC", fontdir, realdev); if ( getdesc(path) == -1 ) error(FATAL, "can't open %s", path); nfonts = 0; gotspecial = FALSE; widthfac = (float) res /devres; slop = pointslop * res / POINTS + .5; rvslop = res * .025; setup(); initialized = TRUE; } /* End if */ hpos = vpos = 0; size = 10; reset(); } /* End of t_init */ /*****************************************************************************/ t_page(pg) int pg; { static int lastpg = 0; /* * * Finish the previous page and get ready for the next one. End page output * goes to /dev/null at the start of each input file. Start page output goes * to /dev/null at the end of each input file. * * Consider doing showpage after page level restore (as Adobe recommends). If * the order is changed use restore() and save(). forms.ps will likely also * need fixing. * */ if ( tf == stdout ) printed++; flushtext(); /* just in case */ fprintf(tf, "cleartomark\n"); fprintf(tf, "showpage\n"); fprintf(tf, "saveobj restore\n"); if ( dobbox == TRUE ) writebbox(tf, PAGEBOUNDINGBOX, 10); fprintf(tf, "%s %d %d\n", ENDPAGE, lastpg, printed); redirect(pg); fprintf(tf, "%s %d %d\n", PAGE, pg, printed+1); if ( dobbox == TRUE ) fprintf(tf, "%s %s\n", PAGEBOUNDINGBOX, ATEND); fprintf(tf, "/saveobj save def\n"); fprintf(tf, "mark\n"); writerequest(printed+1, tf); fprintf(tf, "%d pagesetup\n", printed+1); if ( encoding != realencoding ) fprintf(tf, "%d setdecoding\n", encoding); if ( gotcolor == TRUE ) setcolor(); lastpg = pg; /* for the next ENDPAGE comment */ hpos = vpos = 0; /* get ready for the next page */ reset(); /* force position and font stuff - later */ seenpage = TRUE; } /* End of t_page */ /*****************************************************************************/ t_font(s) char *s; { int n; /* * * Converts the string *s into an integer and checks to make sure it's a legal * font position. Also arranges to mount all the special fonts after the last * legitimate font (by calling loadspecial()), provided it hasn't already been * done. * */ n = atoi(s); if ( seenpage == TRUE ) { if ( n < 0 || n > nfonts ) error(FATAL, "illegal font position %d", n); if ( gotspecial == FALSE ) loadspecial(); } /* End if */ return(n); } /* End of t_font */ /*****************************************************************************/ setfont(m) int m; { /* * * Use the font mounted at position m. Bounds checks are probably unnecessary. * Changing the font and size used by the printer is handled in t_sf(). * */ if ( m < 0 || m > MAXFONTS ) error(FATAL, "illegal font %d", m); font = m; } /* End of setfont */ /*****************************************************************************/ t_sf() { Font *fpos; char temp[150]; /* * * Force a new font or size. Generates name definitions for fonts that haven't * been named, grabs host resident font files and keeps track of the fonts used * by this job. When necessary also adjusts the font's height and slant. Should * only be called immediately before printing a character. * */ if ( tf == stdout && mounted(font) ) { flushtext(); fpos = mount[font]; if ( (fpos->flags & USED) == 0 ) { if ( (fpos->flags & NAMED) == 0 && fpos->fontname != NULL ) { sprintf(temp, "/%s /%s def\n", fpos->name, fpos->fontname); exportstring(temp); fpos->flags |= NAMED; /* unnecessary */ } /* End if */ if ( hostfontdir != NULL ) { sprintf(temp, "%s/%s", hostfontdir, fpos->name); exportfile(temp); } /* End if */ } /* End if */ fprintf(tf, "%d %s f\n", size, fpos->name); if ( fontheight != 0 || fontslant != 0 ) fprintf(tf, "%d %d changefont\n", fontslant, (fontheight != 0) ? fontheight : size); lastfont = font; lastsize = size; fpos->flags |= USED; } /* End if */ } /* End of t_sf */ /*****************************************************************************/ t_charht(n) int n; { /* * * Set character height to n points. Disabled if n is 0 or the current size. * */ fontheight = (n == size) ? 0 : n; lastfont = -1; } /* End of t_charht */ /*****************************************************************************/ t_slant(n) int n; { /* * * Set slant to n degrees. Disable slanting if n is 0. * */ fontslant = n; lastfont = -1; } /* End of t_slant */ /*****************************************************************************/ xymove(x, y) int x, y; { /* * * Make the the printer and post-processor agree about the current position. * */ flushtext(); hgoto(x); vgoto(y); fprintf(tf, "%d %d m\n", hpos, vpos); lastx = hpos; lasty = vpos; } /* End of xymove */ /*****************************************************************************/ put1(c) register int c; { register int i; register int j; register int k; int code; int ofont; /* * * Print character c. ASCII if c < ALPHABET, otherwise it's special. Look for * c in the current font, then in others starting at the first special font. * Save c in lastc so it's available when oput() runs. Restore original font * before leaving. * */ lastc = c; /* charlib() needs name not code */ if ( (c -= 32) <= 0 ) return; k = ofont = font; if ( (i = onfont(lastc, k)) == -1 && smnt > 0 ) for ( k = smnt, j = 0; j < nfonts; j++, k = k % nfonts + 1 ) { if ( (i = onfont(lastc, k)) != -1 ) { setfont(k); break; } /* End if */ } /* End for */ if ( i != -1 && (code = mount[k]->wp[i].code) != 0 ) { lastw = widthfac * (((int)mount[k]->wp[i].wid * size + unitwidth/2) / unitwidth); oput(code); } /* End if */ if ( font != ofont ) setfont(ofont); } /* End of put1 */ /*****************************************************************************/ oput(c) int c; { double llx, lly, urx, ury; /* boundingbox corners */ /* * * Arranges to print the character whose code is c in the current font. All the * actual positioning is done here, in charlib(), or in the drawing routines. * */ if ( textcount > MAXSTACK ) /* don't put too much on the stack? */ flushtext(); if ( font != lastfont || size != lastsize ) t_sf(); if ( vpos != lasty ) endline(); starttext(); if ( ABS(hpos - lastx) > slop ) endstring(); if ( isascii(c) && isprint(c) ) switch ( c ) { case '(': case ')': case '\\': addchar('\\'); default: addchar(c); } /* End switch */ else if ( c > 040 ) addoctal(c); else charlib(c); if ( dobbox == TRUE ) { llx = lastx; lly = -(vpos + 0.5 * (devres * size / 72.0)); urx = lastx + lastw; ury = -(vpos - (devres * size / 72.0)); cover(llx, lly); cover(urx, ury); } /* End if */ lastx += lastw; } /* End of oput */ /*****************************************************************************/ starttext() { /* * Called whenever we want to be sure we're ready to start collecting characters * for the next call to PostScript procedure t (ie. the one that prints them). If * textcount is positive we've already started, so there's nothing to do. The more * complicated encoding schemes save text strings in the strings[] array and need * detailed information about the strings when they're written to the output file * in flushtext(). * */ if ( textcount < 1 ) { switch ( encoding ) { case 0: case 1: putc('(', tf); break; case 2: case 3: strptr = strings; spacecount = 0; line[1].str = strptr; line[1].dx = 0; line[1].spaces = 0; line[1].start = hpos; line[1].width = 0; break; case MAXENCODING+1: /* reverse video */ if ( lastend == -1 ) lastend = hpos; putc('(', tf); break; case MAXENCODING+2: /* follow a funny baseline */ putc('(', tf); break; } /* End switch */ textcount = 1; lastx = stringstart = hpos; } /* End if */ } /* End of starttext */ /*****************************************************************************/ flushtext() { int i; /* * * Generates a call to the PostScript procedure that processes all the text we've * accumulated - provided textcount is positive. * */ if ( textcount > 0 ) { switch ( encoding ) { case 0: fprintf(tf, ")%d t\n", stringstart); break; case 1: fprintf(tf, ")%d %d t\n", stringstart, lasty); break; case 2: *strptr = '\0'; line[textcount].width = lastx - line[textcount].start; if ( spacecount != 0 || textcount != 1 ) { for ( i = textcount; i > 0; i-- ) fprintf(tf, "(%s)%d %d", line[i].str, line[i].spaces, line[i].width); fprintf(tf, " %d %d %d t\n", textcount, stringstart, lasty); } else fprintf(tf, "(%s)%d %d w\n", line[1].str, stringstart, lasty); break; case 3: *strptr = '\0'; if ( spacecount != 0 || textcount != 1 ) { for ( i = textcount; i > 0; i-- ) fprintf(tf, "(%s)%d", line[i].str, line[i].dx); fprintf(tf, " %d %d %d t\n", textcount, stringstart, lasty); } else fprintf(tf, "(%s)%d %d w\n", line[1].str, stringstart, lasty); break; case MAXENCODING+1: fprintf(tf, ")%d ", stringstart); fprintf(tf, "%d %d drawrvbox ", lastend - rvslop, (int)(lastx + .5) + rvslop); fprintf(tf, "t\n", stringstart); lastend = (lastx + .5) + 2 * rvslop; break; case MAXENCODING+2: fprintf(tf, ")%d %d t\n", stringstart, lasty); break; } /* End switch */ } /* End if */ textcount = 0; } /* End of flushtext */ /*****************************************************************************/ endstring() { int dx; /* * * Horizontal positions are out of sync. End the last open string, adjust the * printer's position, and start a new string. Assumes we've already started * accumulating text. * */ switch ( encoding ) { case 0: case 1: fprintf(tf, ")%d(", stringstart); textcount++; lastx = stringstart = hpos; break; case 2: case 3: dx = hpos - lastx; if ( spacecount++ == 0 ) line[textcount].dx = dx; if ( line[textcount].dx != dx ) { *strptr++ = '\0'; line[textcount].width = lastx - line[textcount].start; line[++textcount].str = strptr; *strptr++ = ' '; line[textcount].dx = dx; line[textcount].start = lastx; line[textcount].width = 0; line[textcount].spaces = 1; } else { *strptr++ = ' '; line[textcount].spaces++; } /* End else */ lastx += dx; break; case MAXENCODING+1: fprintf(tf, ")%d(", stringstart); textcount++; lastx = stringstart = hpos; break; case MAXENCODING+2: flushtext(); starttext(); break; } /* End switch */ } /* End of endstring */ /*****************************************************************************/ endline() { /* * * The vertical position has changed. Dump any accumulated text, then adjust * the printer's vertical position. * */ flushtext(); if ( encoding == 0 || encoding == MAXENCODING+1 ) fprintf(tf, "%d %d m\n", hpos, vpos); lastx = stringstart = lastend = hpos; lasty = vpos; } /* End of endline */ /*****************************************************************************/ addchar(c) int c; { /* * * Does whatever is needed to add character c to the current string. * */ switch ( encoding ) { case 0: case 1: putc(c, tf); break; case 2: case 3: *strptr++ = c; break; case MAXENCODING+1: case MAXENCODING+2: putc(c, tf); break; } /* End switch */ } /* End of addchar */ /*****************************************************************************/ addoctal(c) int c; { /* * * Add c to the current string as an octal escape. * */ switch ( encoding ) { case 0: case 1: fprintf(tf, "\\%o", c); break; case 2: case 3: sprintf(strptr, "\\%o", c); strptr += strlen(strptr); break; case MAXENCODING+1: case MAXENCODING+2: fprintf(tf, "\\%o", c); break; } /* End switch */ } /* End of addoctal */ /*****************************************************************************/ charlib(code) int code; /* either 1 or 2 */ { char *name; /* name of the character */ char tname[10]; /* in case it's a single ASCII character */ char temp[150]; /* * * Called from oput() for characters having codes less than 040. Special files * that define PostScript procedures for certain characters can be found in * directory *fontdir/devpost/charlib. If there's a file that has the same name as * the character we're trying to print it's copied to the output file, otherwise * nothing, except some positioning, is done. * * All character definitions are only made once. Subsequent requests to print the * character generate a call to a procedure that begins with the prefix build_ and * ends with the character's name. Special characters that are assigned codes * other than 1 are assumed to have additional data files that should be copied * to the output file immediately after the build_ call. Those data files should * end in the suffix .map, and usually will be a hex representation of a bitmap. * */ flushtext(); if ( lastc < ALPHABET ) { /* ASCII character */ sprintf(tname, "%.3o", lastc); name = tname; } else name = chname(lastc); if ( downloaded[lastc] == 0 ) { sprintf(temp, "%s/dev%s/charlib/%s", fontdir, realdev, name); if ( exportfile(temp) == TRUE ) { downloaded[lastc] = 1; t_sf(); } /* End if */ } /* End if */ if ( downloaded[lastc] == 1 ) { xymove(hpos, vpos); fprintf(tf, "%d build_%s\n", (int) lastw, name); if ( code != 1 ) { /* get the bitmap or whatever */ sprintf(temp, "%s/dev%s/charlib/%s.map", fontdir, realdev, name); if ( access(temp, 04) == 0 && tf == stdout ) cat(temp); } /* End if */ fprintf(tf, "%d %d m\n", stringstart = hpos + lastw, vpos); } /* End if */ } /* End of charlib */ /*****************************************************************************/ reset() { /* * * Reset variables that keep track of the printer's current position, size and * font. Eventually forces things back in sync before oput() prints the next * character. * */ lastx = -(slop + 1); lasty = -1; lastfont = lastsize = -1; } /* End of reset */ /*****************************************************************************/ resetpos() { /* * * Reset the position tracking variables. Forces oput() to get positions back * in sync before printing the next character. * */ lastx = -(slop + 1); lasty = -1; } /* End of resetpos */ /*****************************************************************************/ save() { /* * * Save the current PostScript environment. Initialize things that may have * disappeared after the preceeding restore. * */ fprintf(tf, "/saveobj save def\n"); fprintf(tf, "mark\n"); if ( encoding != realencoding ) fprintf(tf, "%d setdecoding\n", encoding); if ( gotcolor == TRUE ) /* prevent getcolor() recursion */ setcolor(); } /* End of save */ /*****************************************************************************/ restore() { /* * * Restore the previous PostScript environment. * */ flushtext(); fprintf(tf, "cleartomark\n"); fprintf(tf, "saveobj restore\n"); reset(); } /* End of restore */ /*****************************************************************************/ exportfile(path) char *path; { int val = FALSE; /* * * Exports the contents of file path to the global environment. Returns TRUE * if we're doing output (i.e. tf == stdout) and the copy worked. * */ if ( tf == stdout && access(path, 04) == 0 ) { restore(); fprintf(tf, "%s", BEGINGLOBAL); val = cat(path); fprintf(tf, "%s", ENDGLOBAL); save(); } /* End if */ return(val); } /* End of exportfile */ /*****************************************************************************/ exportstring(str) char *str; { /* * * Exports string str to the global environment. No return value needed yet. * */ if ( tf == stdout && str != NULL && *str != '\0' ) { restore(); fprintf(tf, "%s", BEGINGLOBAL); fprintf(tf, "%s", str); fprintf(tf, "%s", ENDGLOBAL); save(); } /* End if */ } /* End of exportstring */ /*****************************************************************************/ redirect(pg) int pg; { static FILE *fp_null = NULL; /* * * If we're not supposed to print page pg, tf will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) tf = stdout; else if ( (tf = fp_null) == NULL ) tf = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014231030451006440057030057030000010301400522627500600002700000010457post.src/dpost/dpost.h /* * * DEVNAME should be the name of a device whose font files accurately describe * what's available on the target printer. It's a string that's combined with * "/usr/lib/font/dev" to locate the final font directory. It can be changed * using the -T option, but you may end up getting garbage - the character code * field must agree with PostScript's character encoding scheme for each font and * troff's one or two character font names must be mapped into the appropriate * PostScript font names (typically in the prologue) * * */ #define DEVNAME "post" /* name of the target printer */ /* * * SLOP controls how much horizontal positioning error we'll accept and primarily * helps when we're emulating another device. It's used when we output characters * in oput() to check if troff and the printer have gotten too far out of sync. * Given in units of points and can be changed using the -S option. Converted to * machine units in t_init() after the resolution is known. * */ #define SLOP .2 /* horizontal error - in points */ /* * * Several different text line encoding schemes are supported. Print time should * decrease as the value assigned to encoding (in dpost.c) increases, although the * only encoding that's well tested is the lowest level one, which produces output * essentially identical to the original version of dpost. Setting DFLTENCODING to * 0 will give you the most stable (but slowest) encoding. The encoding scheme can * also be set on the command line using the -e option. Faster methods are based * on widthshow and may not place words exactly where troff wanted, but errors will * usually not be noticeable. * */ #define MAXENCODING 3 #ifndef DFLTENCODING #define DFLTENCODING 2 #endif /* * * The encoding scheme controls how lines of text are output. In the lower level * schemes words and horizontal positions are put on the stack as they're read and * when they're printed it's done in reverse order - the first string printed is * the one on top of the stack and it's the last one on the line. Faster methods * may be forced to reverse the order of strings on the stack, making the top one * the first string on the line. STRINGSPACE sets the size of a character array * that's used to save the strings that make up a line of text so they can be * output in reverse order or perhaps combined in groups for widthshow. * * MAXSTACK controls how far we let PostScript's operand stack grow and determines * the number of strings we'll save before printing all or part of a line of text. * The internal limit in PostScript printers built by Adobe is 500, so MAXSTACK * should never be bigger than about 240! * * Line is a structure used to keep track of the words (or rather strings) on the * current line that have been read but not printed. dx is the width troff wants * to use for a space in the current string. start is where the string began, width * is the total width of the string, and spaces is the number of space characters * in the current string. *str points to the start of the string in the strings[] * array. The Line structure is only used in the higher level encoding schemes. * */ #define MAXSTACK 50 /* most strings we'll save at once */ #define STRINGSPACE 2000 /* bytes available for string storage */ typedef struct { char *str; /* where the string is stored */ int dx; /* width of a space */ int spaces; /* number of space characters */ int start; /* horizontal starting position */ int width; /* and its total width */ } Line; /* * * Simple stuff used to map unrecognized font names into something reasonable. The * mapping array is initialized using FONTMAP and used in loadfont() whenever the * job tries to use a font that we don't recognize. Normally only needed when we're * emulating another device. * */ typedef struct { char *name; /* font name we're looking for */ char *use; /* and this is what we should use */ } Fontmap; #define FONTMAP \ \ { \ "G", "H", \ "LO", "S", \ "S2", "S", \ "GI", "HI", \ "HM", "H", \ "HK", "H", \ "HL", "H", \ "PA", "R", \ "PI", "I", \ "PB", "B", \ "PX", "BI", \ NULL, NULL, \ } /* * * Non-integer valued functions. * */ extern char *mapfont(); 0707070014231027401006400057030057030000010310030522633100300003000000005210post.src/dpost/dpost.mk MAKE=/bin/make MAKEFILE=dpost.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin FONTDIR=/usr/lib/font MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=dpost.h\ font.h\ motion.h\ ps_include.h\ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=dpost.o\ draw.o\ color.o\ font.o\ pictures.o\ ps_include.o\ $(COMMONDIR)/bbox.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o\ $(COMMONDIR)/tempnam.o all : dpost install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp dpost $(POSTBIN)/dpost @chmod 755 $(POSTBIN)/dpost @chgrp $(GROUP) $(POSTBIN)/dpost @chown $(OWNER) $(POSTBIN)/dpost cp dpost.ps $(POSTLIB)/dpost.ps @chmod 644 $(POSTLIB)/dpost.ps @chgrp $(GROUP) $(POSTLIB)/dpost.ps @chown $(OWNER) $(POSTLIB)/dpost.ps cp draw.ps $(POSTLIB)/draw.ps @chmod 644 $(POSTLIB)/draw.ps @chgrp $(GROUP) $(POSTLIB)/draw.ps @chown $(OWNER) $(POSTLIB)/draw.ps cp dpost.1 $(MAN1DIR)/dpost.1 @chmod 644 $(MAN1DIR)/dpost.1 @chgrp $(GROUP) $(MAN1DIR)/dpost.1 @chown $(OWNER) $(MAN1DIR)/dpost.1 clean : rm -f *.o clobber : clean rm -f dpost dpost : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o dpost $(OFILES) -lm dpost.o : $(HFILES) color.o : $(COMMONDIR)/ext.h $(COMMONDIR)/gen.h draw.o : motion.h $(COMMONDIR)/ext.h $(COMMONDIR)/gen.h font.o : font.h $(COMMONDIR)/gen.h pictures.o : $(COMMONDIR)/comments.h $(COMMONDIR)/gen.h ps_include.o : ps_include.h $(COMMONDIR)/bbox.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o\ $(COMMONDIR)/tempnam.o : @cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dF.*'.ds dF $(FONTDIR)'" \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ dpost.1 >XXX.1; \ mv XXX.1 dpost.1 0707070014231030471006440057030057030000010301600522627500600003000000011014post.src/dpost/dpost.ps % % Version 3.3.2 prologue for troff files. % /#copies 1 store /aspectratio 1 def /formsperpage 1 def /landscape false def /linewidth .3 def /magnification 1 def /margin 0 def /orientation 0 def /resolution 720 def /rotation 1 def /xoffset 0 def /yoffset 0 def /roundpage true def /useclippath true def /pagebbox [0 0 612 792] def /R /Times-Roman def /I /Times-Italic def /B /Times-Bold def /BI /Times-BoldItalic def /H /Helvetica def /HI /Helvetica-Oblique def /HB /Helvetica-Bold def /HX /Helvetica-BoldOblique def /CW /Courier def /CO /Courier def /CI /Courier-Oblique def /CB /Courier-Bold def /CX /Courier-BoldOblique def /PA /Palatino-Roman def /PI /Palatino-Italic def /PB /Palatino-Bold def /PX /Palatino-BoldItalic def /Hr /Helvetica-Narrow def /Hi /Helvetica-Narrow-Oblique def /Hb /Helvetica-Narrow-Bold def /Hx /Helvetica-Narrow-BoldOblique def /KR /Bookman-Light def /KI /Bookman-LightItalic def /KB /Bookman-Demi def /KX /Bookman-DemiItalic def /AR /AvantGarde-Book def /AI /AvantGarde-BookOblique def /AB /AvantGarde-Demi def /AX /AvantGarde-DemiOblique def /NR /NewCenturySchlbk-Roman def /NI /NewCenturySchlbk-Italic def /NB /NewCenturySchlbk-Bold def /NX /NewCenturySchlbk-BoldItalic def /ZD /ZapfDingbats def /ZI /ZapfChancery-MediumItalic def /S /S def /S1 /S1 def /GR /Symbol def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if /scaling 72 resolution div def linewidth setlinewidth 1 setlinecap pagedimensions xcenter ycenter translate orientation rotation mul rotate width 2 div neg height 2 div translate xoffset inch yoffset inch neg translate margin 2 div dup neg translate magnification dup aspectratio mul scale scaling scaling scale addmetrics 0 0 moveto } def /pagedimensions { useclippath userdict /gotpagebbox known not and { /pagebbox [clippath pathbbox newpath] def roundpage currentdict /roundpagebbox known and {roundpagebbox} if } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /addmetrics { /Symbol /S null Sdefs cf /Times-Roman /S1 StandardEncoding dup length array copy S1defs cf } def /pagesetup { /page exch def currentdict /pagedict known currentdict page known and { page load pagedict exch get cvx exec } if } def /decodingdefs [ {counttomark 2 idiv {y moveto show} repeat} {neg /y exch def counttomark 2 idiv {y moveto show} repeat} {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat} {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat} {counttomark 2 idiv {y moveto show} repeat} {neg setfunnytext} ] def /setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def /w {neg moveto show} bind def /m {neg dup /y exch def moveto} bind def /done {/lastpage where {pop lastpage} if} def /f { dup /font exch def findfont exch dup /ptsize exch def scaling div dup /size exch def scalefont setfont linewidth ptsize mul scaling 10 mul div setlinewidth /spacewidth ( ) stringwidth pop def } bind def /changefont { /fontheight exch def /fontslant exch def currentfont [ 1 0 fontheight ptsize div fontslant sin mul fontslant cos div fontheight ptsize div 0 0 ] makefont setfont } bind def /sf {f} bind def /cf { dup length 2 idiv /entries exch def /chtab exch def /newencoding exch def /newfont exch def findfont dup length 1 add dict /newdict exch def {1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall newencoding type /arraytype eq {newdict /Encoding newencoding put} if newdict /Metrics entries dict put newdict /Metrics get begin chtab aload pop 1 1 entries {pop def} for newfont newdict definefont pop end } bind def % % A few arrays used to adjust reference points and character widths in some % of the printer resident fonts. If square roots are too high try changing % the lines describing /radical and /radicalex to, % % /radical [0 -75 550 0] % /radicalex [-50 -75 500 0] % % Move braceleftbt a bit - default PostScript character is off a bit. % /Sdefs [ /bracketlefttp [201 500] /bracketleftbt [201 500] /bracketrighttp [-81 380] /bracketrightbt [-83 380] /braceleftbt [203 490] /bracketrightex [220 -125 500 0] /radical [0 0 550 0] /radicalex [-50 0 500 0] /parenleftex [-20 -170 0 0] /integral [100 -50 500 0] /infinity [10 -75 730 0] ] def /S1defs [ /underscore [0 80 500 0] /endash [7 90 650 0] ] def 0707070014231030501006440057030057030000010302000522627500600002600000061605post.src/dpost/draw.c /* * * Drawing routines used by dpost. Almost no real work is done here. Instead * the required calculations are done in special Postscript procedures that * include: * * * Dl * * x1 y1 x y Dl - * * Starts a new path and then draws a line from the current point * (x, y) to (x1, y1). * * De * * x y a b De - * * Starts a new path and then draws an ellipse that has its left side * at the current point (x, y) and horizontal and vertical axes lengths * given by a and b respectively. * * Da * * x y dx1 dy1 dx2 dy2 Da - * * Starts a new segment and then draws a circular arc from the current * point (x, y) to (x + dx1 + dx2, y + dy1 + dy2). The center of the * circle is at (x + dx1, y + dy1). Arcs always go counter-clockwise * from the starting point to the end point. * * DA * * x y dx1 dy1 dx2 dy2 DA - * * Draws a clockwise arc from (x, y) to (x + dx1 + dx2, y + dy1 + dy2) * with center at (x + dx1, y + dy1). Only needed when we're building * large paths that use arcs and want to control the current point. The * arguments passed to drawarc() will be whatever they would have been * for a counter-clockwise arc, so we need to map them into appropriate * arguments for PostScript's arcn operator. The mapping is, * * x = hpos + dx1' + dx2' * y = vpos + dy1' + dy2' * dx1 = -dx2' * dy1 = -dy2' * dx2 = -dx1' * dy2 = -dy1' * * where primed values represent the drawarc() arguments and (hpos, vpos) * is our current position. * * Ds * * x0 y0 x1 y1 x2 y2 Ds - * * Starts a new segment and then draws a quadratic spline connecting * point ((x0 + x1)/2, (y0 + y1)/2) to ((x1 + x2)/2, (y1 + y2)/2). * The points used in Postscript's curveto procedure are given by, * * x0' = (x0 + 5 * x1) / 6 * x1' = (x2 + 5 * x1) / 6 * x2' = (x1 + x2) / 2 * * with similar equations for the y coordinates. * * By default all the PostScript drawing procedures begin with a newpath (just to * be safe) and end with a stroke, which essentially isolates the path elements * built by the drawing procedures. In order to accommodate big paths built from * smaller pieces each of the PostScript drawing procedures can forced to retain * the path that's being built. That's what happens in beginpath() when an "x X * BeginPath" command is read. beginpath() sets the PostScript variable inpath to * true, and that essentially eliminates the newpath/stroke pair that bracket the * individual pieces. In that case the path is terminated and drawn when dpost * reads an "x X DrawPath" command. * * Early versions of dpost included the PostScript drawing procedures as part of * the prologue, and as a result they were included with every job, even if they * were never used. This version has separated the drawing procedures from the * default prologue (they're now in *drawfile) and only includes them if they're * really needed, which is yet another convenient violation of page independence. * Routine getdraw() is responsible for adding *drawfile to the output file, and * if it can't read *drawfile it continues on as if nothing happened. That means * everything should still work if you append *drawfile to *prologue and then * delete *drawfile. * */ #include <stdio.h> #include <math.h> #include "gen.h" /* general purpose definitions */ #include "ext.h" /* external variable definitions */ #include "motion.h" /* positioning macros */ int gotdraw = FALSE; /* TRUE when *drawfile has been added */ int gotbaseline = FALSE; /* TRUE after *baselinefile is added */ int inpath = FALSE; /* TRUE if we're putting pieces together */ /* * * All these should be defined in file dpost.c. * */ extern int hpos; extern int vpos; extern int encoding; extern int maxencoding; extern int realencoding; extern char *drawfile; extern char *baselinefile; extern FILE *tf; /*****************************************************************************/ getdraw() { /* * * Responsible for making sure the PostScript drawing procedures are downloaded * from *drawfile. Stuff is done at most once per job, and only if the job needs * them. For now I've decided not to quit if we can't read the drawing file. That * pretty much assumes an old version of prologue is being used that includes all * the drawing procedures. * */ if ( gotdraw == FALSE ) exportfile(drawfile); if ( tf == stdout ) gotdraw = TRUE; } /* End of getdraw */ /*****************************************************************************/ drawline(dx, dy) int dx, dy; /* endpoint is (hpos+dx, vpos+dy) */ { /* * * Draws a line from (hpos, vpos) to (hpos+dx, vpos+dy), and leaves the current * position at the endpoint. * */ if ( dx == 0 && dy == 0 ) drawcirc(1); else fprintf(tf, "%d %d %d %d Dl\n", hpos + dx, vpos + dy, hpos, vpos); if ( dobbox == TRUE ) { cover((double)hpos, (double)-vpos); cover((double)(hpos + dx), (double)-(vpos + dy)); } /* End if */ hgoto(hpos+dx); /* where troff expects to be */ vgoto(vpos+dy); resetpos(); /* not sure where the printer is */ } /* End of drawline */ /*****************************************************************************/ drawcirc(d) int d; /* diameter of the circle */ { /* * * Draws a circle of diameter d with the left 'side' of the circle at the * current point. After we're finished drawing we move the current position * to the right side. * */ drawellip(d, d); } /* End of drawcirc */ /*****************************************************************************/ drawellip(a, b) int a, b; /* axes lengths for the ellipse */ { /* * * Draws an ellipse having axes lengths horizontally and vertically of a and * b. The left side of the ellipse is at the current point. After we're done * drawing the path we move the current position to the right side. * */ if ( a == 0 && b == 0 ) return; fprintf(tf, "%d %d %d %d De\n", hpos, vpos, a, b); if ( dobbox == TRUE ) { cover((double)hpos, (double)-(vpos + b/2)); cover((double)(hpos+a), (double)-(vpos - b/2)); } /* End if */ hgoto(hpos + a); /* where troff expects to be */ vgoto(vpos); resetpos(); /* not sure where the printer is */ } /* End of drawellip */ /*****************************************************************************/ drawarc(dx1, dy1, dx2, dy2, c) int dx1, dy1; /* vector from current pos to center */ int dx2, dy2; /* from center to end of the arc */ int c; /* clockwise if c is A */ { /* * * If c isn't set to 'A' a counter-clockwise arc is drawn from the current point * (hpos, vpos) to (hpos+dx1+dx2, vpos+dy1+dy2). The center of the circle is the * point (hpos+dx1, vpos+dy1). If c is 'A' the arc goes clockwise from the point * (hpos+dx1+dx2, vpos+dy1+dy2) to (hpos, vpos). Clockwise arcs are only needed * if we're building a larger path out of pieces that include arcs, and want to * have PostScript manage the path for us. Arguments (for a clockwise arc) are * what would have been supplied if the arc was drawn in a counter-clockwise * direction, and are converted to values suitable for use with PostScript's arcn * operator. * */ if ( (dx1 != 0 || dy1 != 0) && (dx2 != 0 || dy2 != 0) ) { if ( c != 'A' ) fprintf(tf, "%d %d %d %d %d %d Da\n", hpos, vpos, dx1, dy1, dx2, dy2); else fprintf(tf, "%d %d %d %d %d %d DA\n", hpos+dx1+dx2, vpos+dy1+dy2, -dx2, -dy2, -dx1, -dy1); if ( dobbox == TRUE ) arc_extreme(dx1, dy1, dx2, dy2); } /* End if */ hgoto(hpos + dx1 + dx2); /* where troff expects to be */ vgoto(vpos + dy1 + dy2); resetpos(); /* not sure where the printer is */ } /* End of drawarc */ /*****************************************************************************/ drawspline(fp, flag) FILE *fp; /* input for point list */ int flag; /* flag!=1 connect end points */ { int x[100], y[100]; int i, N; /* * * Spline drawing routine for Postscript printers. The complicated stuff is * handled by procedure Ds, which should be defined in the library file. I've * seen wrong implementations of troff's spline drawing, so fo the record I'll * write down the parametric equations and the necessary conversions to Bezier * cubic splines (as used in Postscript). * * * Parametric equation (x coordinate only): * * * (x2 - 2 * x1 + x0) 2 (x0 + x1) * x = ------------------ * t + (x1 - x0) * t + --------- * 2 2 * * * The coefficients in the Bezier cubic are, * * * A = 0 * B = (x2 - 2 * x1 + x0) / 2 * C = x1 - x0 * * * while the current point is, * * current-point = (x0 + x1) / 2 * * Using the relationships given in the Postscript manual (page 121) it's easy to * see that the control points are given by, * * * x0' = (x0 + 5 * x1) / 6 * x1' = (x2 + 5 * x1) / 6 * x2' = (x1 + x2) / 2 * * * where the primed variables are the ones used by curveto. The calculations * shown above are done in procedure Ds using the coordinates set up in both * the x[] and y[] arrays. * * A simple test of whether your spline drawing is correct would be to use cip * to draw a spline and some tangent lines at appropriate points and then print * the file. * */ for ( N = 2; N < sizeof(x)/sizeof(x[0]); N++ ) if (fscanf(fp, "%d %d", &x[N], &y[N]) != 2) break; x[0] = x[1] = hpos; y[0] = y[1] = vpos; for (i = 1; i < N; i++) { x[i+1] += x[i]; y[i+1] += y[i]; } /* End for */ x[N] = x[N-1]; y[N] = y[N-1]; for (i = ((flag!=1)?0:1); i < ((flag!=1)?N-1:N-2); i++) { fprintf(tf, "%d %d %d %d %d %d Ds\n", x[i], y[i], x[i+1], y[i+1], x[i+2], y[i+2]); if ( dobbox == TRUE ) { /* could be better */ cover((double)(x[i] + x[i+1])/2,(double)-(y[i] + y[i+1])/2); cover((double)x[i+1], (double)-y[i+1]); cover((double)(x[i+1] + x[i+2])/2, (double)-(y[i+1] + y[i+2])/2); } /* End if */ } /* End for */ hgoto(x[N]); /* where troff expects to be */ vgoto(y[N]); resetpos(); /* not sure where the printer is */ } /* End of drawspline */ /*****************************************************************************/ arc_extreme(dx1, dy1, dx2, dy2) int dx1, dy1, dx2, dy2; { double x0, y0, x1, y1, xc, yc; /* start, end, center */ double r, xmin, ymin, xmax, ymax; int j, k; /* * * bounding box of a circular arc Eric Grosse 24 May 84 * * Conceptually, this routine generates a list consisting of the start, * end, and whichever north, east, south, and west points lie on the arc. * The bounding box is then the range of this list. * list = {start,end} * j = quadrant(start) * k = quadrant(end) * if( j==k && long way 'round ) append north,west,south,east * else * while( j != k ) * append center+radius*[j-th of north,west,south,east unit vectors] * j += 1 (mod 4) * return( bounding box of list ) * The following code implements this, with simple optimizations. * */ x0 = hpos; y0 = -vpos; x1 = hpos + dx1 + dx2; y1 = -(vpos + dy1 + dy2); xc = hpos + dx1; yc = -(vpos + dy1); x0 -= xc; y0 -= yc; /* move to center */ x1 -= xc; y1 -= yc; xmin = (x0<x1)?x0:x1; ymin = (y0<y1)?y0:y1; xmax = (x0>x1)?x0:x1; ymax = (y0>y1)?y0:y1; r = sqrt(x0*x0 + y0*y0); if (r > 0.0) { j = quadrant(x0,y0); k = quadrant(x1,y1); if (j == k && y1*x0 < x1*y0) { /* viewed as complex numbers, if Im(z1/z0)<0, arc is big */ if( xmin > -r) xmin = -r; if( ymin > -r) ymin = -r; if( xmax < r) xmax = r; if( ymax < r) ymax = r; } else { while (j != k) { switch (j) { case 1: if( ymax < r) ymax = r; break; /* north */ case 2: if( xmin > -r) xmin = -r; break; /* west */ case 3: if( ymin > -r) ymin = -r; break; /* south */ case 4: if( xmax < r) xmax = r; break; /* east */ } /* End switch */ j = j%4 + 1; } /* End while */ } /* End else */ } /* End if */ xmin += xc; ymin += yc; xmax += xc; ymax += yc; cover(xmin, ymin); cover(xmax, ymax); } /* End of arc_extreme */ /*****************************************************************************/ quadrant(x,y) double x, y; { if ( x>=0.0 && y> 0.0) return(1); else if( x< 0.0 && y>=0.0) return(2); else if( x<=0.0 && y< 0.0) return(3); else if( x> 0.0 && y<=0.0) return(4); else return 0; /* shut up lint */ } /* End of quadrant */ /*****************************************************************************/ beginpath(buf, copy) char *buf; /* whatever followed "x X BeginPath" */ int copy; /* ignore *buf if FALSE */ { /* * * Called from devcntrl() whenever an "x X BeginPath" command is read. It's used * to mark the start of a sequence of drawing commands that should be grouped * together and treated as a single path. By default the drawing procedures in * *drawfile treat each drawing command as a separate object, and usually start * with a newpath (just as a precaution) and end with a stroke. The newpath and * stroke isolate individual drawing commands and make it impossible to deal with * composite objects. "x X BeginPath" can be used to mark the start of drawing * commands that should be grouped together and treated as a single object, and * part of what's done here ensures that the PostScript drawing commands defined * in *drawfile skip the newpath and stroke, until after the next "x X DrawPath" * command. At that point the path that's been built up can be manipulated in * various ways (eg. filled and/or stroked with a different line width). * * String *buf is unnecessary and is only included for compatibility with an early * verion of that's still in use. In that version "x X BeginObject" marked the * start of a graphical object, and whatever followed it was passed along in *buf * and copied to the output file. Color selection is one of the options that's * available in parsebuf(), so if we get here we add *colorfile to the output * file before doing anything important. * */ if ( inpath == FALSE ) { flushtext(); getdraw(); getcolor(); fprintf(tf, "gsave\n"); fprintf(tf, "newpath\n"); fprintf(tf, "%d %d m\n", hpos, vpos); fprintf(tf, "/inpath true def\n"); if ( copy == TRUE ) fprintf(tf, "%s", buf); inpath = TRUE; } /* End if */ } /* End of beginpath */ /*****************************************************************************/ drawpath(buf, copy) char *buf; int copy; { /* * * Called from devcntrl() whenever an "x X DrawPath" command is read. It marks the * end of the path started by the last "x X BeginPath" command and uses whatever * has been passed along in *buf to manipulate the path (eg. fill and/or stroke * the path). Once that's been done the drawing procedures are restored to their * default behavior in which each drawing command is treated as an isolated path. * The new version (called after "x X DrawPath") has copy set to FALSE, and calls * parsebuf() to figure out what goes in the output file. It's a feeble attempt * to free users and preprocessors (like pic) from having to know PostScript. The * comments in parsebuf() describe what's handled. * * In the early version a path was started with "x X BeginObject" and ended with * "x X EndObject". In both cases *buf was just copied to the output file, and * was expected to be legitimate PostScript that manipulated the current path. * The old escape sequence will be supported for a while (for Ravi), and always * call this routine with copy set to TRUE. * * */ if ( inpath == TRUE ) { if ( copy == TRUE ) fprintf(tf, "%s", buf); else parsebuf(buf); fprintf(tf, "grestore\n"); fprintf(tf, "/inpath false def\n"); reset(); inpath = FALSE; } /* End if */ } /* End of drawpath */ /*****************************************************************************/ parsebuf(buf) char *buf; /* whatever followed "x X DrawPath" */ { char *p; /* usually the next token */ char *p1; /* for grabbing arguments */ char *pend; /* end of the original string (ie. *buf) */ int gsavelevel = 0; /* non-zero if we've done a gsave */ /* * * Simple minded attempt at parsing the string that followed an "x X DrawPath" * command. Everything not recognized here is simply ignored - there's absolutely * no error checking and what was originally in buf is clobbered by strtok(). * A typical *buf might look like, * * gray .9 fill stroke * * to fill the current path with a gray level of .9 and follow that by stroking the * outline of the path. Since unrecognized tokens are ignored the last example * could also be written as, * * with gray .9 fill then stroke * * The "with" and "then" strings aren't recognized tokens and are simply discarded. * The "stroke", "fill", and "wfill" force out appropriate PostScript code and are * followed by a grestore. In otherwords changes to the grahics state (eg. a gray * level or color) are reset to default values immediately after the stroke, fill, * or wfill tokens. For now "fill" gets invokes PostScript's eofill operator and * "wfill" calls fill (ie. the operator that uses the non-zero winding rule). * * The tokens that cause temporary changes to the graphics state are "gray" (for * setting the gray level), "color" (for selecting a known color from the colordict * dictionary defined in *colorfile), and "line" (for setting the line width). All * three tokens can be extended since strncmp() makes the comparison. For example * the strings "line" and "linewidth" accomplish the same thing. Colors are named * (eg. "red"), but must be appropriately defined in *colorfile. For now all three * tokens must be followed immediately by their single argument. The gray level * (ie. the argument that follows "gray") should be a number between 0 and 1, with * 0 for black and 1 for white. * * To pass straight PostScript through enclose the appropriate commands in double * quotes. Straight PostScript is only bracketed by the outermost gsave/grestore * pair (ie. the one from the initial "x X BeginPath") although that's probably * a mistake. Suspect I may have to change the double quote delimiters. * */ pend = buf + strlen(buf); p = strtok(buf, " \n"); while ( p != NULL ) { if ( gsavelevel == 0 ) { fprintf(tf, "gsave\n"); gsavelevel++; } /* End if */ if ( strcmp(p, "stroke") == 0 ) { fprintf(tf, "closepath stroke\ngrestore\n"); gsavelevel--; } else if ( strcmp(p, "openstroke") == 0 ) { fprintf(tf, "stroke\ngrestore\n"); gsavelevel--; } else if ( strcmp(p, "fill") == 0 ) { fprintf(tf, "eofill\ngrestore\n"); gsavelevel--; } else if ( strcmp(p, "wfill") == 0 ) { fprintf(tf, "fill\ngrestore\n"); gsavelevel--; } else if ( strcmp(p, "sfill") == 0 ) { fprintf(tf, "eofill\ngrestore\ngsave\nstroke\ngrestore\n"); gsavelevel--; } else if ( strncmp(p, "gray", strlen("gray")) == 0 ) { p1 = strtok(NULL, " \n"); fprintf(tf, "%s setgray\n", p1); } else if ( strncmp(p, "color", strlen("color")) == 0 ) { p1 = strtok(NULL, " \n"); fprintf(tf, "/%s setcolor\n", p1); } else if ( strncmp(p, "line", strlen("line")) == 0 ) { p1 = strtok(NULL, " \n"); fprintf(tf, "%s resolution mul 2 div setlinewidth\n", p1); } else if ( strncmp(p, "reverse", strlen("reverse")) == 0 ) fprintf(tf, "reversepath\n"); else if ( *p == '"' ) { for ( ; gsavelevel > 0; gsavelevel-- ) fprintf(tf, "grestore\n"); if ( (p1 = p + strlen(p)) < pend ) *p1 = ' '; p = strtok(p, "\"\n"); fprintf(tf, "%s\n", p); } /* End else */ p = strtok(NULL, " \n"); } /* End while */ for ( ; gsavelevel > 0; gsavelevel-- ) fprintf(tf, "grestore\n"); } /* End of parsebuf */ /*****************************************************************************/ getbaseline() { /* * * Responsible for making sure the PostScript procedures needed for printing text * along an arbitrary baseline are downloaded from *baselinefile. Done at most * once per job, and only if the the stuff is really used. * */ if ( gotbaseline == FALSE ) exportfile(baselinefile); if ( tf == stdout ) gotbaseline = TRUE; } /* End of getbaseline */ /*****************************************************************************/ newbaseline(buf) char *buf; /* whatever followed "x X NewBaseline" */ { char *p; /* for eliminating white space etc. */ /* * * Called from devcntrl() whenever an "x X NewBaseline" command is recognized. We * assume whatever is in *buf is a set of parametric equations that describe the * new baseline. Equations for x(t), y(t), dx/dt, and dy/dt must be written in * PostScript, bracketed by { and } characters, and supplied in exactly that order. * In particular the equation for x must come first in *buf and it ends up as the * last one on the stack, while the equation for dy/dt comes last (in *buf) and * ends up on the top of the PostScript stack. For example if *buf is given by, * * {} {180 mul 3.1416 div cos} {pop 1} {180 mul 3.1416 div sin neg} * * text will be printed along the curve y = cos(x). * * Angles given in radians must be converted to degrees for the PostScript trig * functions, and things are scaled so that 1 unit maps into 1 inch. In the last * example the cosine curve that describes the baseline has an amplitude of 1 inch. * As another example of this rather confusing syntax if *buf is, * * {} {} {pop 1} {pop 1} * * the baseline will be the 45 degree line y = x. * * When any of the four functions is used they're called with a single number on * the stack that's equal to the current value of the parameter t. The coordinate * system axes run parallel to the PostScript coordinate system that's currently * being used. * */ for ( p = buf; *p; p++ ) /* eliminate trailing '\n' */ if ( *p == '\n' ) { *p = '\0'; break; } /* End if */ for ( p = buf; *p && (*p == ' ' || *p == ':'); p++ ) ; if ( *p != '\0' ) { /* something's there */ flushtext(); getbaseline(); fprintf(tf, "mark resolution %s newbaseline\n", p); reset(); } /* End if */ } /* End of newbaseline */ /*****************************************************************************/ drawtext(buf) char *buf; /* whatever followed "x X DrawText */ { char *p; /* for eliminating white space etc. */ /* * * Called from devcntrl() whenever an "x X DrawText command is recognized. *buf * should contain three arguments in the following order. First comes the text we * want to print along the current baseline. Right now the string should be given * as a PostScript string using characters '(' and ')' as the delimiters. Next in * *buf comes a justification mode that can be the words left, right, or center. * Last comes a number that represents the starting value of the parameter t that's * given as the argument to the parametric equations that describe the current * baseline. For example if *buf is given by, * * (hello world) left .5 * * hello world will be printed along the path described by the current baseline * and left justified at whatever (x(.5), y(.5)) happens to be. Usually will be * preceeded by an "x X NewBaseline" call that defines the current baseline. The * origin of the coordinate system used by the parametric equations will be the * current point. * */ for ( p = buf; *p; p++ ) /* eliminate trailing '\n' */ if ( *p == '\n' ) { *p = '\0'; break; } /* End if */ for ( p = buf; *p && (*p == ' ' || *p == ':'); p++ ) ; if ( *p != '\0' ) { /* something's there */ flushtext(); getbaseline(); xymove(hpos, vpos); fprintf(tf, "mark %s drawfunnytext\n", p); resetpos(); } /* End if */ } /* End of drawtext */ /*****************************************************************************/ settext(buf) char *buf; { char *p; /* * * Does whatever is needed to ensure any text that follows will be set along the * curve described by the PostScript procedures listed in *buf. If *buf doesn't * contain anything useful (eg. just a newline) things are restored to whatever * they originally were. Doesn't work well if we try to start in the middle of a * line of text. * * The parametric equations needed are, * * x = f(t) * y = g(t) * dx/dt = f'(t) * dy/dt = g'(t) * * and must be given as proper PostScript procedures. The equation for x must come * first (ie. it ends up on the bottom of the stack) and the equation for dy/dt * must be given last (ie. it ends up on top of the stack). For example if *buf * is given by, * * {} {180 mul 3.1416 div cos} {pop 1} {180 mul 3.1416 div sin neg} * * text will be set along the curve y=cos(x). * */ flushtext(); getbaseline(); for ( p = buf; *p && *p == ' '; p++ ) ; if ( *p && *p != '\n' ) { encoding = maxencoding + 2; fprintf(tf, "mark resolution %s newbaseline\n", buf); } else encoding = realencoding; fprintf(tf, "%d setdecoding\n", encoding); resetpos(); } /* End of settext */ /*****************************************************************************/ 0707070014231030511006440057030057030000010277260522627500600002700000002363post.src/dpost/draw.ps % % Version 3.3.2 drawing procedures for dpost. Automatically pulled in when % needed. % /inpath false def /savematrix matrix def /Dl { inpath {pop pop neg lineto} {newpath neg moveto neg lineto stroke} ifelse } bind def /De { /y1 exch 2 div def /x1 exch 2 div def /savematrix savematrix currentmatrix def neg exch x1 add exch translate x1 y1 scale 0 0 1 0 360 inpath {1 0 moveto arc savematrix setmatrix} {newpath arc savematrix setmatrix stroke} ifelse } bind def /Da { /dy2 exch def /dx2 exch def /dy1 exch def /dx1 exch def dy1 add neg exch dx1 add exch dx1 dx1 mul dy1 dy1 mul add sqrt dy1 dx1 neg atan dy2 neg dx2 atan inpath {arc} {newpath arc stroke} ifelse } bind def /DA { /dy2 exch def /dx2 exch def /dy1 exch def /dx1 exch def dy1 add neg exch dx1 add exch dx1 dx1 mul dy1 dy1 mul add sqrt dy1 dx1 neg atan dy2 neg dx2 atan inpath {arcn} {newpath arcn stroke} ifelse } bind def /Ds { /y2 exch def /x2 exch def /y1 exch def /x1 exch def /y0 exch def /x0 exch def x0 5 x1 mul add 6 div y0 5 y1 mul add -6 div x2 5 x1 mul add 6 div y2 5 y1 mul add -6 div x1 x2 add 2 div y1 y2 add -2 div inpath {curveto} {newpath x0 x1 add 2 div y0 y1 add -2 div moveto curveto stroke} ifelse } bind def 0707070014231030521006440057030057030000010302600522627500600002600000030664post.src/dpost/font.c /* * * Typesetter font tables routines - for postprocessors. * */ #include <stdio.h> #include <ctype.h> #include "gen.h" #include "ext.h" #include "font.h" Font *mount[MAXFONTS+1]; /* mount table - pointers into fonts[] */ Font fonts[MAXFONTS+2]; /* font data - guarantee one empty slot */ int fcount; /* entries in fonts[] */ int mcount; /* fonts currently in memory */ int mlimit = MAXFONTS+1; /* and the most we'll allow */ char *chnames[MAXCH]; /* special character hash table */ int nchnames; /* number of entries in chnames[] */ extern int devres; extern int unitwidth; extern int nfonts; /*****************************************************************************/ checkdesc(path) char *path; { char buf[150]; FILE *fp; int val = 0; /* * * Return non-zero if the typesetter description file path includes, * * PDL PostScript * * before the charset table. * */ if ( (fp = fopen(path, "r")) != NULL ) { while ( fscanf(fp, "%s", buf) != EOF ) { if ( strcmp(buf, "PDL") == 0 ) { fscanf(fp, "%s", buf); val = strcmp(buf, "PostScript") == 0; break; } else if ( strcmp(buf, "charset") == 0 ) break; skipline(fp); } /* End while */ fclose(fp); } /* End if */ return(val); } /* End of checkdesc */ /*****************************************************************************/ getdesc(path) char *path; { char buf[150]; FILE *fp; int n; /* * * Read a typesetter description file. Font and size lists are discarded. Only * used to get to the start of the next command. * */ if ( (fp = fopen(path, "r")) == NULL ) return(-1); while ( fscanf(fp, "%s", buf) != EOF ) { if ( strcmp(buf, "res") == 0 ) fscanf(fp, "%d", &devres); else if ( strcmp(buf, "unitwidth") == 0 ) fscanf(fp, "%d", &unitwidth); else if ( strcmp(buf, "sizes") == 0 ) while ( fscanf(fp, "%d", &n) != EOF && n != 0 ) ; else if ( strcmp(buf, "inmemory") == 0 ) fscanf(fp, "%d", &mlimit); else if ( strcmp(buf, "Encoding") == 0 ) { fscanf(fp, "%s", buf); fontencoding = strsave(buf); } else if ( strcmp(buf, "fonts") == 0 ) { fscanf(fp, "%d", &nfonts); for ( n = 0; n < nfonts; n++ ) fscanf(fp, "%s", buf); } else if ( strcmp(buf, "charset") == 0 ) { while ( fscanf(fp, "%s", buf) != EOF ) chadd(buf); break; } /* End if */ skipline(fp); } /* End while */ fclose(fp); return(1); } /* End of getdesc */ /*****************************************************************************/ getfont(path, fpos) char *path; Font *fpos; { FILE *fin; Chwid chtemp[MAXCH]; static Chwid chinit; int i, nw, n, wid, code; char buf[300], ch[100], s1[100], s2[100], s3[100], cmd[100]; /* * * Read a width table from path into *fpos. Skip unnamed characters, spacewidth, * ligatures, ascender/descender entries, and anything else not recognized. All * calls should come through mountfont(). * */ if ( fpos->state == INMEMORY ) return(1); if ( (fin = fopen(path, "r")) == NULL ) return(-1); if ( fpos->state == NEWFONT ) { if ( ++fcount > MAXFONTS+1 ) return(-1); fpos->path = strsave(path); } /* End if */ if ( ++mcount > mlimit && mcount > nfonts+1 ) freefonts(); for ( i = 0; i < ALPHABET-32; i++ ) chtemp[i] = chinit; while ( fscanf(fin, "%s", cmd) != EOF ) { if ( strcmp(cmd, "name") == 0 ) { release(fpos->name); fscanf(fin, "%s", buf); fpos->name = strsave(buf); } else if ( strcmp(cmd, "fontname") == 0 ) { release(fpos->fontname); fscanf(fin, "%s", buf); fpos->fontname = strsave(buf); } else if ( strcmp(cmd, "special") == 0 ) fpos->specfont = 1; else if ( strcmp(cmd, "named") == 0 ) /* in prologue or somewhere else */ fpos->flags |= NAMED; else if ( strcmp(cmd, "charset") == 0 ) { skipline(fin); nw = ALPHABET-32; while ( fgets(buf, sizeof(buf), fin) != NULL ) { sscanf(buf, "%s %s %s %s", ch, s1, s2, s3); if ( s1[0] != '"' ) { /* not a synonym */ sscanf(s1, "%d", &wid); code = strtol(s3, 0, 0); /* dec/oct/hex */ } /* End if */ if ( strlen(ch) == 1 ) { /* it's ascii */ n = ch[0] - 32; /* origin omits non-graphics */ chtemp[n].num = ch[0]; chtemp[n].wid = wid; chtemp[n].code = code; } else if ( ch[0] == '\\' && ch[1] == '0' ) { n = strtol(ch+1, 0, 0) - 32; /* check against ALPHABET? */ chtemp[n].num = n + 32; chtemp[n].wid = wid; chtemp[n].code = code; } else if ( strcmp(ch, "---") != 0 ) { /* ignore unnamed chars */ if ( (n = chindex(ch)) == -1 ) /* global? */ n = chadd(ch); chtemp[nw].num = n; chtemp[nw].wid = wid; chtemp[nw].code = code; nw++; } /* End else */ } /* End while */ break; } /* End else */ skipline(fin); } /* End while */ fclose(fin); fpos->wp = (Chwid *)allocate(nw * sizeof(Chwid)); for ( i = 0; i < nw; i++ ) fpos->wp[i] = chtemp[i]; fpos->nchars = nw; fpos->state = INMEMORY; return(1); } /* End of getfont */ /*****************************************************************************/ mountfont(path, m) char *path; int m; { Font *fpos; /* * * Mount font table from file path at position m. Mounted fonts are guaranteed * to be in memory. * */ if ( m < 0 || m > MAXFONTS ) return(-1); if ( mount[m] != NULL ) { if ( mount[m]->path != NULL && strcmp(path, mount[m]->path) == 0 ) { if ( mount[m]->state == INMEMORY ) return(1); } else { mount[m]->mounted--; mount[m] = NULL; } /* End else */ } /* End if */ mount[m] = fpos = &fonts[findfont(path)]; mount[m]->mounted++; return(getfont(path, fpos)); } /* End of mountfont */ /*****************************************************************************/ freefonts() { int n; /* * * Release memory used by all unmounted fonts - except for the path string. * */ for ( n = 0; n < MAXFONTS+2; n++ ) if ( fonts[n].state == INMEMORY && fonts[n].mounted == 0 ) { release(fonts[n].wp); fonts[n].wp = NULL; fonts[n].state = RELEASED; mcount--; } /* End if */ } /* End of freefonts */ /*****************************************************************************/ findfont(path) char *path; { register n; /* * * Look for path in the fonts table. Returns the index where it was found or can * be inserted (if not found). * */ for ( n = hash(path, MAXFONTS+2); fonts[n].state != NEWFONT; n = (n+1) % (MAXFONTS+2) ) if ( strcmp(path, fonts[n].path) == 0 ) break; return(n); } /* End of findfont */ /*****************************************************************************/ mounted(m) int m; { /* * * Return 1 if a font is mounted at position m. * */ return((m >= 0 && m <= MAXFONTS && mount[m] != NULL) ? 1 : 0); } /* End of mounted */ /*****************************************************************************/ onfont(c, m) int c; int m; { register Font *fp; register Chwid *cp, *ep; /* * * Returns the position of character c in the font mounted at m, or -1 if the * character is not found. * */ if ( mounted(m) ) { fp = mount[m]; if ( c < ALPHABET ) { if ( fp->wp[c-32].num == c ) /* ascii at front */ return c - 32; else return -1; } /* End if */ cp = &fp->wp[ALPHABET-32]; ep = &fp->wp[fp->nchars]; for ( ; cp < ep; cp++ ) /* search others */ if ( cp->num == c ) return cp - &fp->wp[0]; } /* End if */ return -1; } /* End of onfont */ /*****************************************************************************/ chwidth(n, m) int n; int m; { /* * * Return width of the character at position n in the font mounted at m. Skip * bounds checks - assume it's already been done. * */ return(mount[m]->wp[n].wid); } /* End of chwidth */ /*****************************************************************************/ chcode(n, m) int n; int m; { /* * * Return typesetter code for the character at position n in the font mounted * at m. Skip bounds checks - assume it's already been done. * */ return(mount[m]->wp[n].code); } /* End of chcode */ /*****************************************************************************/ chindex(s) char *s; { register i; /* * * Look for s in global character name table. Hash table is guaranteed to have * at least one empty slot (by chadd()) so the loop terminate. * */ for ( i = hash(s, MAXCH); chnames[i] != NULL; i = (i+1) % MAXCH ) if ( strcmp(s, chnames[i]) == 0 ) return(i+ALPHABET); return(-1); } /* End of chindex */ /*****************************************************************************/ chadd(s) char *s; { register i; /* * * Add s to the global character name table. Leave one empty slot so loops * terminate. * */ if ( nchnames >= MAXCH - 1 ) error(FATAL, "out of table space adding character %s", s); for ( i = hash(s, MAXCH); chnames[i] != NULL; i = (i+1) % MAXCH ) ; nchnames++; chnames[i] = strsave(s); return(i+ALPHABET); } /* End of chadd */ /*****************************************************************************/ char *chname(n) int n; { /* * * Returns string for the character with index n. * */ return(chnames[n-ALPHABET]); } /* End of chname */ /*****************************************************************************/ hash(s, l) char *s; int l; { register i; /* * * Return the hash index for string s in a table of length l. Probably should * make i unsigned and mod once at the end. * */ for ( i = 0; *s != '\0'; s++ ) i = (i * 10 + *s) % l; return(i); } /* End of hash */ /*****************************************************************************/ char *strsave(s) char *s; { char *ptr = NULL; /* * * Make a permanent copy of string s. * */ if ( s != NULL ) { ptr = (char *)allocate(strlen(s)+1); strcpy(ptr, s); } /* End if */ return(ptr); } /* End of strsave */ /*****************************************************************************/ char *allocate(count) int count; { char *ptr; /* * * Allocates count bytes. Free unmounted fonts if the first attempt fails. To * be absolutely correct all memory allocation should be done by this routine. * */ if ( (ptr = (char *)malloc(count)) == NULL ) { freefonts(); if ( (ptr = (char *)malloc(count)) == NULL ) error(FATAL, "no memory"); } /* End if */ return(ptr); } /* End of allocate */ /*****************************************************************************/ release(ptr) char *ptr; { /* * * Free memory provided ptr isn't NULL. * */ if ( ptr != NULL ) free(ptr); } /* End of release */ /*****************************************************************************/ dumpmount(m) int m; { /* * * Dumps the font mounted at position n. * */ if ( mount[m] != NULL ) dumpfont((mount[m] - &fonts[0])); else fprintf(stderr, "no font mounted at %d\n", m); } /* End of dumpmount */ /*****************************************************************************/ dumpfont(n) int n; { int i; Font *fpos; char *str; /* * * Dump of everything known about the font saved at fonts[n]. * */ fpos = &fonts[n]; if ( fpos->state ) { fprintf(stderr, "path %s\n", fpos->path); fprintf(stderr, "state %d\n", fpos->state); fprintf(stderr, "flags %d\n", fpos->flags); fprintf(stderr, "mounted %d\n", fpos->mounted); fprintf(stderr, "nchars %d\n", fpos->nchars); fprintf(stderr, "special %d\n", fpos->specfont); fprintf(stderr, "name %s\n", fpos->name); fprintf(stderr, "fontname %s\n", fpos->fontname); if ( fpos->state == INMEMORY ) { fprintf(stderr, "charset\n"); for ( i = 0; i < fpos->nchars; i++ ) { if ( fpos->wp[i].num > 0 ) { if ( fpos->wp[i].num < ALPHABET ) fprintf(stderr, "%c\t%d\t%d\n", fpos->wp[i].num, fpos->wp[i].wid, fpos->wp[i].code); else { str = chname(fpos->wp[i].num); if ( *str == '#' && isdigit(*(str+1)) && isdigit(*(str+2)) ) str = "---"; fprintf(stderr, "%s\t%d\t%d\n", str, fpos->wp[i].wid, fpos->wp[i].code); } /* End else */ } /* End if */ } /* End for */ } else fprintf(stderr, "charset: not in memory\n"); } else fprintf(stderr, "empty font: %d\n", n); putc('\n', stderr); } /* End of dumpfont */ /*****************************************************************************/ 0707070014231030531006440057030057030000010277660522627500700002600000002616post.src/dpost/font.h /* * * Characteristics of a font - for postprocessors. Differs some from the troff * version. * */ #define ALPHABET 256 /* characters in basic alphabet */ #define MAXCH 512 #define MAXFONTS 99 /* * * State of a table entry in fonts[]. * */ #define NEWFONT 0 #define RELEASED 1 #define INMEMORY 2 /* * * Flags - for setting bits in a font's flag field. * */ #define USED 1 #define NAMED 2 #define skipline(f) while ( getc(f) != '\n' ) /* * * Data about each character on a font. Omitted the ascender/descender field. * An unsigned char is good enough for the code field on PostScript printers. * */ typedef struct { short num; /* 0 means not on this font */ unsigned char wid; /* width */ unsigned char code; /* code for actual device. */ } Chwid; /* * * Font header - one for each available position. * */ typedef struct { char *path; /* where it came from */ char *name; /* as known to troff */ char *fontname; /* real name (e.g. Times-Roman) */ char state; /* NEWFONT, RELEASED, or INMEMORY */ char flags; /* for now just USED and NAMED */ char mounted; /* mounted on this many positions */ char specfont; /* 1 == special font */ short nchars; /* number of width entries for this font */ Chwid *wp; /* widths, etc., of the real characters */ } Font; /* * * Non-integer functions. * */ extern char *chname(); extern char *strsave(); extern char *allocate(); 0707070014231030541006440057030057030000010301450522627500700003000000000272post.src/dpost/motion.h /* * * Position adjusting macros. * */ #define hgoto(n) hpos = n #define hmot(n) hpos += n #define vgoto(n) vpos = n #define vmot(n) vpos += n extern int hpos; extern int vpos; 0707070014231030551006440057030057030000010303200522627500700003200000023077post.src/dpost/pictures.c /* * * PostScript picture inclusion routines. Support for managing in-line pictures * has been added, and works in combination with the simple picpack pre-processor * that's supplied with this package. An in-line picture begins with a special * device control command that looks like, * * x X InlinPicture name size * * where name is the pathname of the original picture file and size is the number * of bytes in the picture, which begins immediately on the next line. When dpost * encounters the InlinePicture device control command inlinepic() is called and * that routine appends the string name and the integer size to a temporary file * (fp_pic) and then adds the next size bytes read from the current input file to * file fp_pic. All in-line pictures are saved in fp_pic and located later using * the name string and picture file size that separate pictures saved in fp_pic. * * When a picture request (ie. an "x X PI" command) is encountered picopen() is * called and it first looks for the picture file in fp_pic. If it's found there * the entire picture (ie. size bytes) is copied from fp_pic to a new temp file * and that temp file is used as the picture file. If there's nothing in fp_pic * or if the lookup failed the original route is taken. * * Support for in-line pictures is an attempt to address requirements, expressed * by several organizations, of being able to store a document as a single file * (usually troff input) that can then be sent through dpost and ultimately to * a PostScript printer. The mechanism may help some users, but the are obvious * disadvantages to this approach, and the original mechanism is the recommended * approach! Perhaps the most important problem is that troff output, with in-line * pictures included, doesn't fit the device independent language accepted by * important post-processors (like proff) and that means you won't be able to * reliably preview a packed file on your 5620 (or whatever). * */ #include <stdio.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* just for TEMPDIR definition */ #include "ext.h" /* external variable declarations */ FILE *fp_pic = NULL; /* in-line pictures go here */ FILE *picopen(); extern int res, hpos, vpos; extern int picflag; extern FILE *tf; /*****************************************************************************/ picture(buf) char *buf; /* stuff following 'x X PI' command */ { int poffset; /* page offset */ int indent; /* indent */ int length; /* line length */ int totrap; /* distance to next trap */ char name[100]; /* picture file and page string */ char hwo[40], *p; /* height, width and offset strings */ char flags[20]; /* miscellaneous stuff */ int page = 1; /* page number pulled from name[] */ double frame[4]; /* height, width, y, and x offsets from hwo[] */ char units; /* scale indicator for frame dimensions */ int whiteout = 0; /* white out the box? */ int outline = 0; /* draw a box around the picture? */ int scaleboth = 0; /* scale both dimensions? */ double adjx = 0.5; /* left-right adjustment */ double adjy = 0.5; /* top-bottom adjustment */ double rot = 0; /* rotation in clockwise degrees */ FILE *fp_in; /* for *name */ int i; /* loop index */ char *strchr(); /* * * Called from devcntrl() after an 'x X PI' command is found. The syntax of that * command is: * * x X PI:args * * with args separated by colons and given by: * * poffset * indent * length * totrap * file[(page)] * height[,width[,yoffset[,xoffset]]] * [flags] * * poffset, indent, length, and totrap are given in machine units. height, width, * and offset refer to the picture frame in inches, unless they're followed by * the u scale indicator. flags is a string that provides a little bit of control * over the placement of the picture in the frame. Rotation of the picture, in * clockwise degrees, is set by the a flag. If it's not followed by an angle * the current rotation angle is incremented by 90 degrees, otherwise the angle * is set by the number that immediately follows the a. * */ if ( picflag == OFF ) /* skip it */ return; flushtext(); flags[0] = '\0'; /* just to be safe */ if ( sscanf(buf, "%d:%d:%d:%d:%[^:]:%[^:]:%[^:]", &poffset, &indent, &length, &totrap, name, hwo, flags) < 6 ) { error(NON_FATAL, "too few arguments to specify picture"); return; } /* End if */ if ( sscanf(name, "%*[^(](%d", &page) == 1 ) /* grab the page number */ strtok(name, "("); /* and separate it from the name */ if ( (fp_in = picopen(name)) == NULL ) { error(NON_FATAL, "can't open picture file %s", name); return; } /* End if */ frame[0] = frame[1] = -1; /* default frame height, width */ frame[2] = frame[3] = 0; /* and y and x offsets */ for ( i = 0, p = hwo-1; i < 4 && p != NULL; i++, p = strchr(p, ',') ) if ( sscanf(++p, "%lf%c", &frame[i], &units) == 2 ) if ( units == 'i' || units == ',' || units == '\0' ) frame[i] *= res; if ( frame[0] <= 0 ) /* check what we got for height */ frame[0] = totrap; if ( frame[1] <= 0 ) /* and width - check too big?? */ frame[1] = length - indent; frame[3] += poffset + indent; /* real x offset */ for ( i = 0; flags[i]; i++ ) switch ( flags[i] ) { case 'c': adjx = adjy = 0.5; break; /* move to the center */ case 'l': adjx = 0; break; /* left */ case 'r': adjx = 1; break; /* right */ case 't': adjy = 1; break; /* top */ case 'b': adjy = 0; break; /* or bottom justify */ case 'o': outline = 1; break; /* outline the picture */ case 'w': whiteout = 1; break; /* white out the box */ case 's': scaleboth = 1; break; /* scale both dimensions */ case 'a': if ( sscanf(&flags[i+1], "%lf", &rot) != 1 ) rot += 90; } /* End switch */ restore(); ps_include(fp_in, tf, page, whiteout, outline, scaleboth, frame[3]+frame[1]/2, -vpos-frame[2]-frame[0]/2, frame[1], frame[0], adjx, adjy, -rot); save(); fclose(fp_in); } /* End of picture */ /*****************************************************************************/ FILE *picopen(path) char *path; /* picture file pathname */ { char name[100]; /* pathnames */ long pos; /* current position */ long total; /* and sizes - from *fp_pic */ char *tname; /* pathname */ FILE *fp; /* and pointer for the new temp file */ /* * * Responsible for finding and opening the next picture file. If we've accumulated * any in-line pictures fp_pic won't be NULL and we'll look there first. If *path * is found in *fp_pic we create another temp file, open it for update, unlink it, * copy in the picture, seek back to the start of the new temp file, and return * the file pointer to the caller. If fp_pic is NULL or the lookup fails we just * open file *path and return the resulting file pointer to the caller. * */ if ( fp_pic != NULL ) { fseek(fp_pic, 0L, 0); while ( fscanf(fp_pic, "%s %ld\n", name, &total) != EOF ) { pos = ftell(fp_pic); if ( strcmp(path, name) == 0 ) { if ( (tname = tempnam(TEMPDIR, "dpost")) == NULL ) error(FATAL, "can't generate temp file name"); if ( (fp = fopen(tname, "w+r")) == NULL ) error(FATAL, "can't open %s", tname); unlink(tname); free(tname); piccopy(fp_pic, fp, total); fseek(fp, 0L, 0); return(fp); } /* End if */ fseek(fp_pic, total+pos, 0); } /* End while */ } /* End if */ return(fopen(path, "r")); } /* End of picopen */ /*****************************************************************************/ inlinepic(fp, buf) FILE *fp; /* current input file */ char *buf; /* whatever followed "x X InlinePicture" */ { char *tname; /* temp file pathname - for *fp_pic */ char name[100]; /* picture file pathname */ long total; /* and size - both from *buf */ /* * * Adds an in-line picture file to the end of temporary file *fp_pic. All pictures * grabbed from the input file are saved in the same temp file. Each is preceeded * by a one line header that includes the original picture file pathname and the * size of the picture in bytes. The in-line picture file is opened for update, * left open, and unlinked so it disappears when we do. * */ if ( fp_pic == NULL ) { if ( (tname = tempnam(TEMPDIR, "dpost")) == NULL ) error(FATAL, "can't generate in-line picture file name"); if ( (fp_pic = fopen(tname, "w+r")) == NULL ) error(FATAL, "can't open in-line picture file %s", tname); unlink(tname); } /* End if */ if ( sscanf(buf, "%s %ld", name, &total) != 2 ) error(FATAL, "in-line picture error"); fseek(fp_pic, 0L, 2); fprintf(fp_pic, "%s %ld\n", name, total); getc(fp); fflush(fp_pic); piccopy(fp, fp_pic, total); ungetc('\n', fp); } /* End of inlinepic */ /*****************************************************************************/ piccopy(fp_in, fp_out, total) FILE *fp_in; /* input */ FILE *fp_out; /* and output file pointers */ long total; /* number of bytes to be copied */ { long i; /* loop index */ /* * * Copies total bytes from file fp_in to fp_out. Used to append picture files to * *fp_pic and then copy them to yet another temporary file immediately before * they're used (in picture()). * */ for ( i = 0; i < total; i++ ) if ( putc(getc(fp_in), fp_out) == EOF ) error(FATAL, "error copying in-line picture file"); fflush(fp_out); } /* End of piccopy */ /*****************************************************************************/ 0707070014231030561006440057030057030000010301650522627500700003600000000262post.src/dpost/ps_include.awk /^->/ { if(ndef) printf("\t0\n};\n\n") printf("static char *%s[] = {\n", $2) ndef++ next } /^#/ {next} $0 != "" {printf("\t\"%s\",\n", $0); next} END {printf("\t0\n};\n")} 0707070014231030571006440057030057030000010303400522627500700003400000012407post.src/dpost/ps_include.c #include <stdio.h> #include "ps_include.h" #define has(word) (strncmp(buf, word, strlen(word)) == 0) #define grab(n) ((Section *)(nglobal \ ? realloc((char *)global, n*sizeof(Section)) \ : calloc(n, sizeof(Section)))) char buf[512]; typedef struct {long start, end;} Section; extern char *calloc(), *realloc(); ps_include(fin, fout, page_no, whiteout, outline, scaleboth, cx, cy, sx, sy, ax, ay, rot) FILE *fin, *fout; /* input and output files */ int page_no; /* physical page number from *fin */ int whiteout; /* erase picture area */ int outline; /* draw a box around it and */ int scaleboth; /* scale both dimensions - if not zero */ double cx, cy; /* center of the picture and */ double sx, sy; /* its size - in current coordinates */ double ax, ay; /* left-right, up-down adjustment */ double rot; /* rotation - in clockwise degrees */ { int foundpage = 0; /* found the page when non zero */ int foundpbox = 0; /* found the page bounding box */ int nglobal = 0; /* number of global defs so far */ int maxglobal = 0; /* and the number we've got room for */ Section prolog, page, trailer; /* prologue, page, and trailer offsets */ Section *global; /* offsets for all global definitions */ double llx, lly; /* lower left and */ double urx, ury; /* upper right corners - default coords */ double w = whiteout != 0; /* mostly for the var() macro */ double o = outline != 0; double s = scaleboth != 0; int i; /* loop index */ /* * * Reads a PostScript file (*fin), and uses structuring comments to locate the * prologue, trailer, global definitions, and the requested page. After the whole * file is scanned, the special ps_include PostScript definitions are copied to * *fout, followed by the prologue, global definitions, the requested page, and * the trailer. Before returning the initial environment (saved in PS_head) is * restored. * * By default we assume the picture is 8.5 by 11 inches, but the BoundingBox * comment, if found, takes precedence. * */ llx = lly = 0; /* default BoundingBox - 8.5x11 inches */ urx = 72 * 8.5; ury = 72 * 11.0; /* section boundaries and bounding box */ prolog.start = prolog.end = 0; page.start = page.end = 0; trailer.start = 0; fseek(fin, 0L, 0); while ( fgets(buf, sizeof(buf), fin) != NULL ) if (!has("%%")) continue; else if (has("%%Page: ")) { if (!foundpage) page.start = ftell(fin); sscanf(buf, "%*s %*s %d", &i); if (i == page_no) foundpage = 1; else if (foundpage && page.end <= page.start) page.end = ftell(fin); } else if (has("%%EndPage: ")) { sscanf(buf, "%*s %*s %d", &i); if (i == page_no) { foundpage = 1; page.end = ftell(fin); } if (!foundpage) page.start = ftell(fin); } else if (has("%%PageBoundingBox: ")) { if (i == page_no) { foundpbox = 1; sscanf(buf, "%*s %lf %lf %lf %lf", &llx, &lly, &urx, &ury); } } else if (has("%%BoundingBox: ")) { if (!foundpbox) sscanf(buf,"%*s %lf %lf %lf %lf", &llx, &lly, &urx, &ury); } else if (has("%%EndProlog") || has("%%EndSetup") || has("%%EndDocumentSetup")) prolog.end = page.start = ftell(fin); else if (has("%%Trailer")) trailer.start = ftell(fin); else if (has("%%BeginGlobal")) { if (page.end <= page.start) { if (nglobal >= maxglobal) { maxglobal += 20; global = grab(maxglobal); } global[nglobal].start = ftell(fin); } } else if (has("%%EndGlobal")) if (page.end <= page.start) global[nglobal++].end = ftell(fin); fseek(fin, 0L, 2); if (trailer.start == 0) trailer.start = ftell(fin); trailer.end = ftell(fin); if (page.end <= page.start) page.end = trailer.start; /* fprintf(stderr, "prolog=(%d,%d)\n", prolog.start, prolog.end); fprintf(stderr, "page=(%d,%d)\n", page.start, page.end); for(i = 0; i < nglobal; i++) fprintf(stderr, "global[%d]=(%d,%d)\n", i, global[i].start, global[i].end); fprintf(stderr, "trailer=(%d,%d)\n", trailer.start, trailer.end); */ /* all output here */ print(fout, PS_head); /* * Unix 4.0 didn't like the var macro. * var(llx); var(lly); var(urx); var(ury); var(w); var(o); var(s); var(cx); var(cy); var(sx); var(sy); var(ax); var(ay); var(rot); * */ fprintf(fout, "/llx %g def\n", llx); fprintf(fout, "/lly %g def\n", lly); fprintf(fout, "/urx %g def\n", urx); fprintf(fout, "/ury %g def\n", ury); fprintf(fout, "/w %g def\n", w); fprintf(fout, "/o %g def\n", o); fprintf(fout, "/s %g def\n", s); fprintf(fout, "/cx %g def\n", cx); fprintf(fout, "/cy %g def\n", cy); fprintf(fout, "/sx %g def\n", sx); fprintf(fout, "/sy %g def\n", sy); fprintf(fout, "/ax %g def\n", ax); fprintf(fout, "/ay %g def\n", ay); fprintf(fout, "/rot %g def\n", rot); print(fout, PS_setup); copy(fin, fout, &prolog); for(i = 0; i < nglobal; i++) copy(fin, fout, &global[i]); copy(fin, fout, &page); copy(fin, fout, &trailer); print(fout, PS_tail); if(nglobal) free(global); } static print(fout, s) FILE *fout; char **s; { while (*s) fprintf(fout, "%s\n", *s++); } static copy(fin, fout, s) FILE *fin, *fout; Section *s; { if (s->end <= s->start) return; fseek(fin, s->start, 0); while (ftell(fin) < s->end && fgets(buf, sizeof(buf), fin) != NULL) if (buf[0] != '%') fprintf(fout, "%s", buf); } 0707070014231030601006440057030057030000010301660522627500700003400000003752post.src/dpost/ps_include.h static char *PS_head[] = { "%ps_include: begin", "save", "/ed {exch def} def", "{} /showpage ed", "{} /copypage ed", "{} /erasepage ed", "{} /letter ed", "currentdict /findfont known systemdict /findfont known and {", " /findfont systemdict /findfont get def", "} if", "36 dict dup /PS-include-dict-dw ed begin", "/context ed", "count array astore /o-stack ed", "%ps_include: variables begin", 0 }; static char *PS_setup[] = { "%ps_include: variables end", "{llx lly urx ury} /bbox ed", "{newpath 2 index exch 2 index exch dup 6 index exch", " moveto 3 {lineto} repeat closepath} /boxpath ed", "{dup mul exch dup mul add sqrt} /len ed", "{2 copy gt {exch} if pop} /min ed", "{2 copy lt {exch} if pop} /max ed", "{transform round exch round exch A itransform} /nice ed", "{6 array} /n ed", "n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed", "urx llx sub 0 A dtransform len /Sx ed", "0 ury lly sub A dtransform len /Sy ed", "llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed", "rot dup sin abs /S ed cos abs /C ed", "Sx S mul Sy C mul add /H ed", "Sx C mul Sy S mul add /W ed", "sy H div /Scaley ed", "sx W div /Scalex ed", "s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if", "sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed", "sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed", "urx llx sub 0 A dtransform exch atan rot exch sub /rot ed", "n currentmatrix initgraphics setmatrix", "cx cy translate", "Scalex Scaley scale", "rot rotate", "Cx neg Cy neg translate", "A concat", "bbox boxpath clip newpath", "w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if", "end", "gsave", "%ps_include: inclusion begin", 0 }; static char *PS_tail[] = { "%ps_include: inclusion end", "grestore", "PS-include-dict-dw begin", "o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice", " initgraphics 0.1 setlinewidth boxpath stroke grestore} if", "clear o-stack aload pop", "context end restore", "%ps_include: end", 0 }; 0707070014231030611006440057030057030000010303600522627500700003500000007004post.src/dpost/ps_include.ps -> PS_head %ps_include: begin save /ed {exch def} def # redefine dangerous operators {} /showpage ed {} /copypage ed {} /erasepage ed {} /letter ed # restore findfont from systemdict if it looks like it's be redefined currentdict /findfont known systemdict /findfont known and { /findfont systemdict /findfont get def } if # computations are done in the context of a new dictionary 36 dict dup /PS-include-dict-dw ed begin # context holds the save object created earlier /context ed # save and clear the operand stack count array astore /o-stack ed # the following variables are now expected: # llx,lly,urx,ury bounding box of picture to be included # w nonzero if space should be painted white to start # o nonzero if space should be outlined # s nonzero if both dimensions should be scaled # cx,cy center of page space in current coordinates # sx,sy size of page space in current coordinates # ax,ay left-right, up-down adjustment of picture in page space # rot rotation of picture in page space %ps_include: variables begin -> PS_setup %ps_include: variables end # some routines: # - BBOX llx lly urx ury put bounding box on stack # llx lly urx ury BOXPATH - make a path with given box corners # dx dy LEN length compute length of positionless vector # a b MIN min compute minimum of two numbers # a b MAX max compute maximum of two numbers # x y NICE x y move to pixel boundaries in default coords {llx lly urx ury} /bbox ed {newpath 2 index exch 2 index exch dup 6 index exch moveto 3 {lineto} repeat closepath} /boxpath ed {dup mul exch dup mul add sqrt} /len ed {2 copy gt {exch} if pop} /min ed {2 copy lt {exch} if pop} /max ed {transform round exch round exch A itransform} /nice ed # A is the transformation from default to current coordinates {6 array} /n ed n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed # Sx,Sy and Cx,Cy are dimensions and size of bounding box in current coordinates urx llx sub 0 A dtransform len /Sx ed 0 ury lly sub A dtransform len /Sy ed llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed # H and W are height and width of rotated box in current coordinates rot dup sin abs /S ed cos abs /C ed Sx S mul Sy C mul add /H ed Sx C mul Sy S mul add /W ed # Scalex and Scaley are the required horizontal and vertical scaling factors sy H div /Scaley ed sx W div /Scalex ed # Preserve aspect ratio if we're not scaling both dimensions (ie. s is 0) s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if # add to cx,cy the shift needed within the page space sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed # the actual rotation needed is rot less the current rotation urx llx sub 0 A dtransform exch atan rot exch sub /rot ed # set up the coordinate system n currentmatrix initgraphics setmatrix cx cy translate Scalex Scaley scale rot rotate Cx neg Cy neg translate A concat # set the clipping region, and conditionally whiteout and outline bbox boxpath clip newpath w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if # pop local dictionary from the dict stack end # now begins the actual material extracted from the file gsave %ps_include: inclusion begin -> PS_tail %ps_include: inclusion end grestore # within the context of the local dictionary ... PS-include-dict-dw begin o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice initgraphics 0.1 setlinewidth boxpath stroke grestore} if # ... restore the operand stack and the save context clear o-stack aload pop context end restore %ps_include: end 0707070014231216400407550057030057030000020630640522633076600002300000000000post.src/postprint 0707070014231216411006440057030057030000010630650522627500700003200000000175post.src/postprint/README Simple ASCII file to PostScript translator. The -e options is new and allows access to all characters in PostScript fonts. 0707070014231216421006440057030057030000010636000522627500700003700000051204post.src/postprint/postprint.c /* * * postprint - PostScript translator for ASCII files. * * A simple program that translates ASCII files into PostScript. All it really * does is expand tabs and backspaces, handle character quoting, print text lines, * and control when pages are started based on the requested number of lines per * page. * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following procedures are defined * in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how the program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects * to find the current page number on the stack. * * l * * string l - * * Prints string starting in the first column and then goes to the next * line. * * L * * mark string column string column ... L mark * * Prints each string on the stack starting at the horizontal position * selected by column. Used when tabs and spaces can be sufficiently well * compressed to make the printer overhead worthwhile. Always used when * we have to back up. * * LL * * mark string column string column ... LL mark * * Like L, but only used to prevent potential PostScript stack overflow * from too many string/column pairs. Stays on the current line. It will * not be needed often!! * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * Almost everything has been changed in this version of postprint. The program * is more intelligent, especially about tabs, spaces, and backspacing, and as a * result output files usually print faster. Output files also now conform to * Adobe's file structuring conventions, which is undoubtedly something I should * have done in the first version of the program. If the number of lines per page * is set to 0, which can be done using the -l option, pointsize will be used to * guess a reasonable value. The estimate is based on the values of LINESPP, * POINTSIZE, and pointsize, and assumes LINESPP lines would fit on a page if * we printed in size POINTSIZE. Selecting a point size using the -s option and * adding -l0 to the command line forces the guess to be made. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable declarations */ #include "postprint.h" /* a few special definitions */ char *optnames = "a:c:ef:l:m:n:o:p:r:s:t:x:y:A:C:E:J:L:P:R:DI"; char *prologue = POSTPRINT; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ int linespp = LINESPP; /* number of lines per page */ int pointsize = POINTSIZE; /* in this point size */ int tabstops = TABSTOPS; /* tabs set at these columns */ int crmode = 0; /* carriage return mode - 0, 1, or 2 */ int extended = TRUE; /* use escapes for unprintable chars */ int col = 1; /* next character goes in this column */ int line = 1; /* on this line */ int stringcount = 0; /* number of strings on the stack */ int stringstart = 1; /* column where current one starts */ Fontmap fontmap[] = FONTMAP; /* for translating font names */ char *fontname = "Courier"; /* use this PostScript font */ int page = 0; /* page we're working on */ int printed = 0; /* printed this many pages */ FILE *fp_in = stdin; /* read from this file */ FILE *fp_out = stdout; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that translates ASCII files into PostScript. If there's more * than one input file, each begins on a new page. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* really just for error messages */ init_signals(); /* sets up interrupt handling */ header(); /* PostScript header and prologue */ options(); /* handle the command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Makes sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); if ( DOROUND ) cat(ROUNDPAGE); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ /* * * Reads and processes the command line options. Added the -P option so arbitrary * PostScript code can be passed through. Expect it could be useful for changing * definitions in the prologue for which options have not been defined. * * Although any PostScript font can be used, things will only work well for * constant width fonts. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'e': /* obsolete - it's now always on */ extended = TRUE; break; case 'f': /* use this PostScript font */ fontname = get_font(optarg); fprintf(stdout, "/font /%s def\n", fontname); break; case 'l': /* lines per page */ linespp = atoi(optarg); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'r': /* carriage return mode */ crmode = atoi(optarg); break; case 's': /* point size */ pointsize = atoi(optarg); fprintf(stdout, "/pointsize %s def\n", optarg); break; case 't': /* tabstops */ tabstops = atoi(optarg); break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding */ fontencoding = optarg; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ char *get_font(name) char *name; /* name the user asked for */ { int i; /* for looking through fontmap[] */ /* * * Called from options() to map a user's font name into a legal PostScript name. * If the lookup fails *name is returned to the caller. That should let you choose * any PostScript font, although things will only work well for constant width * fonts. * */ for ( i = 0; fontmap[i].name != NULL; i++ ) if ( strcmp(name, fontmap[i].name) == 0 ) return(fontmap[i].val); return(name); } /* End of get_font */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. linespp (lines per page) can be set using the -l * option. If it's not positive we calculate a reasonable value using the * requested point size - assuming LINESPP lines fit on a page in point size * POINTSIZE. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); if ( linespp <= 0 ) linespp = LINESPP * POINTSIZE / pointsize; } /* End of setup */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll translate stdin. * */ if ( argc < 1 ) text(); else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); text(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with all the input files, so mark the end of the pages with a TRAILER * comment, make sure the last page prints, and add things like the PAGES comment * that can only be determined after all the input files have been read. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname); fprintf(stdout, "%s %d\n", PAGES, printed); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct provided it's not NULL. Accounting is * requested using the -A or -J options. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ text() { int ch; /* next input character */ /* * * Translates *fp_in into PostScript. Intercepts space, tab, backspace, newline, * return, and formfeed. Everything else goes to oput(), which handles quoting * (if needed) and escapes for nonascii characters if extended is TRUE. The * redirect(-1) call forces the initial output to go to /dev/null - so stuff * that formfeed() does at the end of each page goes to /dev/null rather than * the real output file. * */ redirect(-1); /* get ready for the first page */ formfeed(); /* force PAGE comment etc. */ while ( (ch = getc(fp_in)) != EOF ) switch ( ch ) { case '\n': newline(); break; case '\t': case '\b': case ' ': spaces(ch); break; case '\014': formfeed(); break; case '\r': if ( crmode == 1 ) spaces(ch); else if ( crmode == 2 ) newline(); break; default: oput(ch); break; } /* End switch */ formfeed(); /* next file starts on a new page? */ } /* End of text */ /*****************************************************************************/ formfeed() { /* * * Called whenever we've finished with the last page and want to get ready for the * next one. Also used at the beginning and end of each input file, so we have to * be careful about what's done. The first time through (up to the redirect() call) * output goes to /dev/null. * * Adobe now recommends that the showpage operator occur after the page level * restore so it can be easily redefined to have side-effects in the printer's VM. * Although it seems reasonable I haven't implemented it, because it makes other * things, like selectively setting manual feed or choosing an alternate paper * tray, clumsy - at least on a per page basis. * */ if ( fp_out == stdout ) /* count the last page */ printed++; endline(); /* print the last line */ fprintf(fp_out, "cleartomark\n"); fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); if ( ungetc(getc(fp_in), fp_in) == EOF ) redirect(-1); else redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "mark\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%d pagesetup\n", printed+1); line = 1; } /* End of formfeed */ /*****************************************************************************/ newline() { /* * * Called when we've read a newline character. The call to startline() ensures * that at least an empty string is on the stack. * */ startline(); endline(); /* print the current line */ if ( ++line > linespp ) /* done with this page */ formfeed(); } /* End of newline */ /*****************************************************************************/ spaces(ch) int ch; /* next input character */ { int endcol; /* ending column */ int i; /* final distance - in spaces */ /* * * Counts consecutive spaces, tabs, and backspaces and figures out where the next * string should start. Once that's been done we try to choose an efficient way * to output the required number of spaces. The choice is between using procedure * l with a single string on the stack and L with several string and column pairs. * We usually break even, in terms of the size of the output file, if we need four * consecutive spaces. More means using L decreases the size of the file. For now * if there are less than 6 consecutive spaces we just add them to the current * string, otherwise we end that string, follow it by its starting position, and * begin a new one that starts at endcol. Backspacing is always handled this way. * */ startline(); /* so col makes sense */ endcol = col; do { if ( ch == ' ' ) endcol++; else if ( ch == '\t' ) endcol += tabstops - ((endcol - 1) % tabstops); else if ( ch == '\b' ) endcol--; else if ( ch == '\r' ) endcol = 1; else break; } while ( ch = getc(fp_in) ); /* if ch is 0 we'd quit anyway */ ungetc(ch, fp_in); /* wasn't a space, tab, or backspace */ if ( endcol < 1 ) /* can't move past left edge */ endcol = 1; if ( (i = endcol - col) >= 0 && i < 6 ) for ( ; i > 0; i-- ) oput((int)' '); else { endstring(); col = stringstart = endcol; } /* End else */ } /* End of spaces */ /*****************************************************************************/ startline() { /* * * Called whenever we want to be certain we're ready to start pushing characters * into an open string on the stack. If stringcount is positive we've already * started, so there's nothing to do. The first string starts in column 1. * */ if ( stringcount < 1 ) { putc('(', fp_out); stringstart = col = 1; stringcount = 1; } /* End if */ } /* End of startline */ /*****************************************************************************/ endstring() { /* * * End the current string and start a new one. * */ if ( stringcount > 100 ) { /* don't put too much on the stack */ fprintf(fp_out, ")%d LL\n(", stringstart-1); stringcount = 2; /* kludge - don't let endline() use l */ } else { fprintf(fp_out, ")%d(", stringstart-1); stringcount++; } /* End else */ } /* End of endstring */ /*****************************************************************************/ endline() { /* * * Generates a call to the PostScript procedure that processes all the text on * the stack - provided stringcount is positive. If one string is on the stack * the fast procedure (ie. l) is used to print the line, otherwise the slower * one that processes string and column pairs is used. * */ if ( stringcount == 1 ) fprintf(fp_out, ")l\n"); else if ( stringcount > 1 ) fprintf(fp_out, ")%d L\n", stringstart-1); stringcount = 0; } /* End of endline */ /*****************************************************************************/ oput(ch) int ch; /* next output character */ { /* * * Responsible for adding all printing characters from the input file to the * open string on top of the stack. * */ if ( isascii(ch) && isprint(ch) ) { startline(); if ( ch == '(' || ch == ')' || ch == '\\' ) putc('\\', fp_out); putc(ch, fp_out); col++; } else if ( extended == TRUE ) { startline(); fprintf(fp_out, "\\%.3o", ch & 0377); col++; } /* End if */ } /* End of oput */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014231216431006440057030057030000010636260522627500700003700000002055post.src/postprint/postprint.h /* * * Default lines per page, tab stops, and point size. * */ #define LINESPP 66 #define TABSTOPS 8 #define POINTSIZE 10 /* * * An array of type Fontmap helps convert font names requested by users into * legitimate PostScript names. The array is initialized using FONTMAP, which must * end with an entry that has NULL defined as its name field. The only fonts that * are guaranteed to work well are the constant width fonts. * */ typedef struct { char *name; /* user's font name */ char *val; /* corresponding PostScript name */ } Fontmap; #define FONTMAP \ \ { \ "R", "Courier", \ "I", "Courier-Oblique", \ "B", "Courier-Bold", \ "CO", "Courier", \ "CI", "Courier-Oblique", \ "CB", "Courier-Bold", \ "CW", "Courier", \ "PO", "Courier", \ "courier", "Courier", \ "cour", "Courier", \ "co", "Courier", \ NULL, NULL \ } /* * * Some of the non-integer functions in postprint.c. * */ char *get_font(); 0707070014231215121006400057030057030000010637050522633076500004000000004020post.src/postprint/postprint.mk MAKE=/bin/make MAKEFILE=postprint.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=postprint.h\ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=postprint.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o all : postprint install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp postprint $(POSTBIN)/postprint @chmod 755 $(POSTBIN)/postprint @chgrp $(GROUP) $(POSTBIN)/postprint @chown $(OWNER) $(POSTBIN)/postprint cp postprint.ps $(POSTLIB)/postprint.ps @chmod 644 $(POSTLIB)/postprint.ps @chgrp $(GROUP) $(POSTLIB)/postprint.ps @chown $(OWNER) $(POSTLIB)/postprint.ps cp postprint.1 $(MAN1DIR)/postprint.1 @chmod 644 $(MAN1DIR)/postprint.1 @chgrp $(GROUP) $(MAN1DIR)/postprint.1 @chown $(OWNER) $(MAN1DIR)/postprint.1 clean : rm -f *.o clobber : clean rm -f postprint postprint : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postprint $(OFILES) postprint.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o : @cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ postprint.1 >XXX.1; \ mv XXX.1 postprint.1 0707070014231215061006400057030057030000010551100522633076600003700000010703post.src/postprint/postprint.1 .ds dQ /usr/lib/postscript .TH POSTPRINT 1 "DWB 3.2" .SH NAME .B postprint \- PostScript translator for text files .SH SYNOPSIS \*(mBpostprint\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B postprint translates text .I files into PostScript and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-f name Print .I files using font .IR name . Any PostScript font can be used, although the best results will only be obtained with constant width fonts. The default font is Courier. .TP .OP \-l num Set the length of a page to .I num lines. By default .I num is 66. Setting .I num to 0 is allowed, and will cause .B postprint to guess a value, based on the point size that is being used. .TP .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which is located near the upper left corner of each page. The default magnification is 1.0. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP .OP \-r num Selects carriage return behavior. Carriage returns are ignored if .I num is 0, cause a return to column 1 if .I num is 1, and generate a newline if .I num is 2. The default .I num is 0. .TP .OP \-s num Print .I files using point size .IR num . When printing in landscape mode .I num is scaled by a factor that depends on the imaging area of the device. The default size for portrait mode is 10. .TP .OP \-t num Assume tabs are set every .I num columns, starting with the first column. By default tabs are set every 8 columns. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed near the upper left corner of the page, with positive x to the right and positive y down the page. Positive .I num moves everything right. The default offset is 0.25 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves text down the page. The default offset is 0.25 inches. .TP .OP \-E name Set the character encoding for text fonts to .IR name . Requesting .I name means include file .MI \*(dQ/ name .enc \f1. A nonexistent encoding file is silently ignored. The default selects file .MR \*(dQ/Default.enc . .TP .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/postprint.ps . .PP Three options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include .I string in the output file; .I string must be legitimate PostScript. .TP .OP \-R action Requests special .I action (e.g., .MR manualfeed ) on a per page or global basis. The .I action string can be given as .IR request , .IM request : page\f1\|, or .IM request : page : file\f1\|. If .I page is omitted or given as 0, the request applies to all pages. If .I file is omitted, the request lookup is done in .MR \*(dQ/ps.requests . .PP A new logical page is started after 66 lines have been printed on the current page, or whenever an .SM ASCII form feed character is read. The number of lines per page can be changed using the .OP \-l option. Unprintable .SM ASCII characters are ignored, and lines that are too long are silently truncated by the printer. .SH EXAMPLES .PP Print .I file1 and .I file2 in landscape mode: .EX postprint -pland \f2file1 file2 .EE Print three logical pages on each physical page in portrait mode: .EX postprint -n3 \f2file .EE .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .SH FILES .MW \*(dQ/postprint.ps .br .MW \*(dQ/forms.ps .br .MW \*(dQ/ps.requests .SH SEE ALSO .BR dpost (1), .BR postdaisy(1), .BR postdmd(1), .BR postio(1), .BR postmd(1), .BR postreverse(1), .BR posttek(1), .BR psencoding (1) 0707070014231216461006440057030057030000010637200522627500700004000000047760post.src/postprint/Lpostprint.c /* * * postprint - PostScript translator for ASCII files. * * A simple program that translates ASCII files into PostScript. All it really * does is expand tabs and backspaces, handle character quoting, print text lines, * and control when pages are started based on the requested number of lines per * page. * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following procedures are defined * in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how the program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects * to find the current page number on the stack. * * l * * string l - * * Prints string starting in the first column and then goes to the next * line. * * L * * mark string column string column ... L mark * * Prints each string on the stack starting at the horizontal position * selected by column. Used when tabs and spaces can be sufficiently well * compressed to make the printer overhead worthwhile. Always used when * we have to back up. * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * Almost everything has been changed in this version of postprint. The program * is more intelligent, especially about tabs, spaces, and backspacing, and as a * result output files usually print faster. Output files also now conform to * Adobe's file structuring conventions, which is undoubtedly something I should * have done in the first version of the program. If the number of lines per page * is set to 0, which can be done using the -l option, pointsize will be used to * guess a reasonable value. The estimate is based on the values of LINESPP, * POINTSIZE, and pointsize, and assumes LINESPP lines would fit on a page if * we printed in size POINTSIZE. Selecting a point size using the -s option and * adding -l0 to the command line forces the guess to be made. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable declarations */ #include "postprint.h" /* a few special definitions */ char *optnames = "a:c:ef:l:m:n:o:p:r:s:t:x:y:A:C:E:J:L:P:R:DI"; char *prologue = POSTPRINT; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ int linespp = LINESPP; /* number of lines per page */ int pointsize = POINTSIZE; /* in this point size */ int tabstops = TABSTOPS; /* tabs set at these columns */ int crmode = 0; /* carriage return mode - 0, 1, or 2 */ int extended = TRUE; /* use escapes for unprintable chars */ int col = 1; /* next character goes in this column */ int line = 1; /* on this line */ int stringcount = 0; /* number of strings on the stack */ int stringstart = 1; /* column where current one starts */ Fontmap fontmap[] = FONTMAP; /* for translating font names */ char *fontname = "Courier"; /* use this PostScript font */ int page = 0; /* page we're working on */ int printed = 0; /* printed this many pages */ FILE *fp_in = stdin; /* read from this file */ FILE *fp_out = stdout; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that translates ASCII files into PostScript. If there's more * than one input file, each begins on a new page. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* really just for error messages */ init_signals(); /* sets up interrupt handling */ header(); /* PostScript header and prologue */ options(); /* handle the command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Makes sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); if ( DOROUND ) cat(ROUNDPAGE); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ /* * * Reads and processes the command line options. Added the -P option so arbitrary * PostScript code can be passed through. Expect it could be useful for changing * definitions in the prologue for which options have not been defined. * * Although any PostScript font can be used, things will only work well for * constant width fonts. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'e': /* obsolete - it's now always on */ extended = TRUE; break; case 'f': /* use this PostScript font */ fontname = get_font(optarg); fprintf(stdout, "/font /%s def\n", fontname); break; case 'l': /* lines per page */ linespp = atoi(optarg); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'r': /* carriage return mode */ crmode = atoi(optarg); break; case 's': /* point size */ pointsize = atoi(optarg); fprintf(stdout, "/pointsize %s def\n", optarg); break; case 't': /* tabstops */ tabstops = atoi(optarg); break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding */ fontencoding = optarg; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ char *get_font(name) char *name; /* name the user asked for */ { int i; /* for looking through fontmap[] */ /* * * Called from options() to map a user's font name into a legal PostScript name. * If the lookup fails *name is returned to the caller. That should let you choose * any PostScript font, although things will only work well for constant width * fonts. * */ for ( i = 0; fontmap[i].name != NULL; i++ ) if ( strcmp(name, fontmap[i].name) == 0 ) return(fontmap[i].val); return(name); } /* End of get_font */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. linespp (lines per page) can be set using the -l * option. If it's not positive we calculate a reasonable value using the * requested point size - assuming LINESPP lines fit on a page in point size * POINTSIZE. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); if ( linespp <= 0 ) linespp = LINESPP * POINTSIZE / pointsize; } /* End of setup */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll translate stdin. * */ if ( argc < 1 ) text(); else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); text(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with all the input files, so mark the end of the pages with a TRAILER * comment, make sure the last page prints, and add things like the PAGES comment * that can only be determined after all the input files have been read. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname); fprintf(stdout, "%s %d\n", PAGES, printed); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct provided it's not NULL. Accounting is * requested using the -A or -J options. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ text() { int ch; /* next input character */ /* * * Translates *fp_in into PostScript. Intercepts space, tab, backspace, newline, * return, and formfeed. Everything else goes to oput(), which handles quoting * (if needed) and escapes for nonascii characters if extended is TRUE. The * redirect(-1) call forces the initial output to go to /dev/null - so stuff * that formfeed() does at the end of each page goes to /dev/null rather than * the real output file. * */ redirect(-1); /* get ready for the first page */ formfeed(); /* force PAGE comment etc. */ while ( (ch = getc(fp_in)) != EOF ) switch ( ch ) { case '\n': newline(); break; case '\t': case '\b': case ' ': spaces(ch); break; case '\014': formfeed(); break; case '\r': if ( crmode == 1 ) spaces(ch); else if ( crmode == 2 ) newline(); break; default: oput(ch); break; } /* End switch */ formfeed(); /* next file starts on a new page? */ } /* End of text */ /*****************************************************************************/ formfeed() { /* * * Called whenever we've finished with the last page and want to get ready for the * next one. Also used at the beginning and end of each input file, so we have to * be careful about what's done. The first time through (up to the redirect() call) * output goes to /dev/null. * * Adobe now recommends that the showpage operator occur after the page level * restore so it can be easily redefined to have side-effects in the printer's VM. * Although it seems reasonable I haven't implemented it, because it makes other * things, like selectively setting manual feed or choosing an alternate paper * tray, clumsy - at least on a per page basis. * */ if ( fp_out == stdout ) /* count the last page */ printed++; endline(); /* print the last line */ fprintf(fp_out, "cleartomark\n"); fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); if ( ungetc(getc(fp_in), fp_in) == EOF ) redirect(-1); else redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "mark\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%d pagesetup\n", printed+1); line = 1; } /* End of formfeed */ /*****************************************************************************/ newline() { /* * * Called when we've read a newline character. The call to startline() ensures * that at least an empty string is on the stack. * */ startline(); endline(); /* print the current line */ if ( ++line > linespp ) /* done with this page */ formfeed(); } /* End of newline */ /*****************************************************************************/ spaces(ch) int ch; /* next input character */ { int endcol; /* ending column */ int i; /* final distance - in spaces */ /* * * Counts consecutive spaces, tabs, and backspaces and figures out where the next * string should start. Once that's been done we try to choose an efficient way * to output the required number of spaces. The choice is between using procedure * l with a single string on the stack and L with several string and column pairs. * We usually break even, in terms of the size of the output file, if we need four * consecutive spaces. More means using L decreases the size of the file. For now * if there are less than 6 consecutive spaces we just add them to the current * string, otherwise we end that string, follow it by its starting position, and * begin a new one that starts at endcol. Backspacing is always handled this way. * */ startline(); /* so col makes sense */ endcol = col; do { if ( ch == ' ' ) endcol++; else if ( ch == '\t' ) endcol += tabstops - ((endcol - 1) % tabstops); else if ( ch == '\b' ) endcol--; else if ( ch == '\r' ) endcol = 1; else break; } while ( ch = getc(fp_in) ); /* if ch is 0 we'd quit anyway */ ungetc(ch, fp_in); /* wasn't a space, tab, or backspace */ if ( endcol < 1 ) /* can't move past left edge */ endcol = 1; if ( (i = endcol - col) >= 0 && i < 6 ) for ( ; i > 0; i-- ) oput((int)' '); else { fprintf(fp_out, ")%d(", stringstart-1); stringcount++; col = stringstart = endcol; } /* End else */ } /* End of spaces */ /*****************************************************************************/ startline() { /* * * Called whenever we want to be certain we're ready to start pushing characters * into an open string on the stack. If stringcount is positive we've already * started, so there's nothing to do. The first string starts in column 1. * */ if ( stringcount < 1 ) { putc('(', fp_out); stringstart = col = 1; stringcount = 1; } /* End if */ } /* End of startline */ /*****************************************************************************/ endline() { /* * * Generates a call to the PostScript procedure that processes all the text on * the stack - provided stringcount is positive. If one string is on the stack * the fast procedure (ie. l) is used to print the line, otherwise the slower * one that processes string and column pairs is used. * */ if ( stringcount == 1 ) fprintf(fp_out, ")l\n"); else if ( stringcount > 1 ) fprintf(fp_out, ")%d L\n", stringstart-1); stringcount = 0; } /* End of endline */ /*****************************************************************************/ oput(ch) int ch; /* next output character */ { /* * * Responsible for adding all printing characters from the input file to the * open string on top of the stack. * */ if ( isascii(ch) && isprint(ch) ) { startline(); if ( ch == '(' || ch == ')' || ch == '\\' ) putc('\\', fp_out); putc(ch, fp_out); col++; } else if ( extended == TRUE ) { startline(); fprintf(fp_out, "\\%.3o", ch & 0377); col++; } /* End if */ } /* End of oput */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014231216471006440057030057030000010643660522630326300004000000003403post.src/postprint/postprint.ps % % Version 3.3.2 prologue for text files. % /#copies 1 store /aspectratio 1 def /font /Courier def /formsperpage 1 def /landscape false def /magnification 1 def /margin 10 def /orientation 0 def /pointsize 10 def /rotation 1 def /xoffset .25 def /yoffset .25 def /roundpage true def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /show {show} bind def % so later references don't bind /stringwidth {stringwidth} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if font findfont pointsize scalefont setfont /charwidth (M) stringwidth pop def /linespace pointsize pointsize .10 mul add neg def pagedimensions xcenter ycenter translate orientation rotation mul rotate width 2 div neg height 2 div translate xoffset inch yoffset inch neg translate margin 2 div dup neg translate magnification dup aspectratio mul scale height width div 1 min dup scale 0 linespace translate } def /pagedimensions { useclippath userdict /gotpagebbox known not and { /pagebbox [clippath pathbbox newpath] def roundpage currentdict /roundpagebbox known and {roundpagebbox} if } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /pagesetup {/page exch def 0 0 moveto 0} bind def /L { counttomark 2 idiv {charwidth mul currentpoint exch pop moveto show} repeat linespace add dup 0 exch moveto } bind def /l {show linespace add dup 0 exch moveto} bind def /LL { counttomark 2 idiv {charwidth mul currentpoint exch pop moveto show} repeat } bind def /done {/lastpage where {pop lastpage} if} def 0707070014231030621006440057030057030000010252400522633110300002700000012724post.src/postscript.mk # # Top level makefile. Instructions are included here and in the README file. # # First save a copy of this file. Then adjust the following definitions (all # come immediatedly after the initial block of comments): # # MAKE where make lives # # MAKEFILE name of this file - for recursive make calls. Must change # if you rename this file. # # SYSTEM best match for your version of Unix. Current choices for # SYSTEM are: # # SYSV - System V # V9 - Ninth Edition # BSD4_2 - Berkeley (eg. Sun) # # Controls conditional compilation in a few places. # # VERSION refers to the Version of the DWB package # # GROUP group assigned to all installed files # # OWNER owner of everything that's installed # # HOSTDIR hostresident font directory for PostScript printers. Only # used in the font download program. # # FONTDIR width table directory - for troff and dpost # # MAN1DIR command manpages. A command and its manpage are installed # together - there's no easy way to avoid it. Setting MAN1DIR # to an existing temporary directory (e.g. /tmp) means an # install will work but manpages won't go anywhere permanent. # MAN1DIR must already exist - it will not be created during # an install. # # POSTBIN where most PostScript support programs go. dpost and picpack # are the exceptions. # # POSTLIB prologues and miscellaneous PostScript files. Primarily for # the programs that live in POSTBIN. # # CFLGS common compiler options - used to build CFLAGS in the low # level makefiles. CFLGS and LDFLGS are best set on the make # command line. # # LDFLGS common link editor options - used to build LDFLAGS in the # low level makefiles. LDFLGS and CFLGS are best set on the # make command line. # # DKHOST set it to TRUE to compile the DKHOST Datakit support code # in postio. Temporarily resets SYSTEM to SYSV if DKHOST is # TRUE and SYSTEM is BSD4_2. Ignored if SYSTEM is not SYSV # or BSD4_2. # # DKSTREAMS enables streams based DKHOST support in postio when DKHOST # is TRUE and SYSTEM is SYSV or BSD4_2. Choices are TRUE, # FALSE, or a stream module name (e.g. dknetty or dkty). TRUE # selects dknetty. Newer systems may expect dkty. # # ROUNDPAGE must only be set to TRUE or FALSE. TRUE means translators # include code that maps clipping path dimensions into known # paper sizes. # # TARGETS the default list of what's built by make. Each target must # be the name of a source directory. A target that names a # non-existent source directory is ignored. Setting TARGETS # on the make command line overrides the default list. # # Source files must be updated whenever this file changes. If you change any # definitions type, # # make -f postscript.mk changes # # to update the source files, man pages, and low level makefiles. # # To build (but not install) the default package (i.e. everything named by # TARGETS) type, # # make -f postscript.mk all # # The recommended way to build and install the package is, # # make -f postscript.mk all install # # Although you'll likely have to be root for the install to work. # # After the package is installed use, # # make -f postscript.mk clobber # # to delete binary files and compiled programs from the source directories. # # Set TARGETS on the command line to select part of the package. For example, # # make -f postscript.mk TARGETS="dpost devpost" all install # # builds and installs dpsot and the PostScript font tables. Quotes hide white # space from the shell. # MAKE=/bin/make MAKEFILE=postscript.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin ROOT= FONTDIR=$(ROOT)/usr/lib/font HOSTDIR=$(ROOT)/usr/lib/font/postscript MAN1DIR=$(ROOT)/tmp POSTBIN=$(ROOT)/usr/bin/postscript POSTLIB=$(ROOT)/usr/lib/postscript TMACDIR=$(ROOT)/usr/lib/tmac COMMONDIR=common CURRENTDIR=. CFLGS=-O LDFLGS=-s DKHOST=FALSE DKSTREAMS=FALSE ROUNDPAGE=TRUE # # $(TARGETS) is the default list of things built by make. Pick dpost or # dpost.utf but not both! # TARGETS=buildtables\ common\ cropmarks\ devLatin1\ devpost\ download\ dpost.utf\ grabit\ hardcopy\ mpictures\ picpack\ postbgi\ postdaisy\ postdmd\ postgif\ postio\ postmd\ postprint\ postreverse\ posttek\ printfont\ psencoding\ psfiles\ trofftable ACTION=all all : $(TARGETS) clean clobber : @$(MAKE) -e -f $(MAKEFILE) MAKE=$(MAKE) ACTION=$@ $(TARGETS) install changes : @SYSTEM='$(SYSTEM)'; export SYSTEM; \ VERSION='$(VERSION)'; export VERSION; \ GROUP='$(GROUP)'; export GROUP; \ OWNER='$(OWNER)'; export OWNER; \ FONTDIR='$(FONTDIR)'; export FONTDIR; \ HOSTDIR='$(HOSTDIR)'; export HOSTDIR; \ MAN1DIR='$(MAN1DIR)'; export MAN1DIR; \ POSTBIN='$(POSTBIN)'; export POSTBIN; \ POSTLIB='$(POSTLIB)'; export POSTLIB; \ TMACDIR='$(TMACDIR)'; export TMACDIR; \ ROUNDPAGE='$(ROUNDPAGE)'; export ROUNDPAGE; \ $(MAKE) -e -f $(MAKEFILE) MAKE=$(MAKE) ACTION=$@ $(TARGETS) $(TARGETS) :: @TARGETS=; unset TARGETS; \ HFILES=; unset HFILES; \ OFILES=; unset OFILES; \ CFLAGS=; unset CFLAGS; \ LDFLAGS=; unset LDFLAGS; \ YFLAGS=; unset YFLAGS; \ SYSTEM='$(SYSTEM)'; export SYSTEM; \ VERSION='$(VERSION)'; export VERSION; \ CFLGS='$(CFLGS)'; export CFLGS; \ LDFLGS='$(LDFLGS)'; export LDFLGS; \ COMMONDIR='../$(COMMONDIR)'; export COMMONDIR; \ DKHOST='$(DKHOST)'; export DKHOST; \ DKSTREAMS='$(DKSTREAMS)'; export DKSTREAMS; \ if [ -d $@ -a -f $@/$@.mk ]; then \ cd $@; \ echo "---- Making $(ACTION) in directory $(CURRENTDIR)/$@ ----"; \ $(MAKE) -e -f $@.mk MAKE=$(MAKE) $(ACTION); \ echo; \ fi 0707070014231123300407550057030057030000020437670522633100000002400000000000post.src/psencoding 0707070014231123311006440057030057030000010440040522627501000003700000006703post.src/psencoding/Latin1.enc % % Encoding vector and redefinition of findfont for the ISO Latin1 standard. % The 18 characters missing from ROM based fonts on older printers are noted % below. % /ISOLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar % missing /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree % missing /plusminus % missing /twosuperior % missing /threesuperior % missing /acute /mu % missing /paragraph /periodcentered /cedilla /onesuperior % missing /ordmasculine /guillemotright /onequarter % missing /onehalf % missing /threequarters % missing /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth % missing /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply % missing /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute % missing /Thorn % missing /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth % missing /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide % missing /oslash /ugrave /uacute /ucircumflex /udieresis /yacute % missing /thorn % missing /ydieresis ] def /NewFontDirectory FontDirectory maxlength dict def % % Apparently no guarantee findfont is defined in systemdict so the obvious % % systemdict /findfont get exec % % can generate an error. So far the only exception is a VT600 (version 48.0). % userdict /@RealFindfont known not { userdict begin /@RealFindfont systemdict begin /findfont load end def end } if /findfont { dup NewFontDirectory exch known not { dup %dup systemdict /findfont get exec % not always in systemdict dup userdict /@RealFindfont get exec dup /Encoding get StandardEncoding eq { dup length dict begin {1 index /FID ne {def}{pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /DummyFontName exch definefont } if NewFontDirectory 3 1 roll put } if NewFontDirectory exch get } bind def 0707070014231123321006440057030057030000010440200522627501000004200000001523post.src/psencoding/psencoding.sh # # Trivial script for checking and setting the default PostScript font # encoding. Changing the default assumes you can write in $POSTLIB. # Available font encodings are files in $POSTLIB that end in .enc. # The default is $POSTLIB/Default.enc. # POSTLIB=/usr/lib/postscript DEFAULT=Default.enc CURRENTDEFAULT= case "$1" in Default) ;; Standard) rm -f $POSTLIB/$DEFAULT;; "") cd $POSTLIB for i in *.enc; do if [ -f "$i" -a "$i" != $DEFAULT ]; then NAME=`echo $i | sed s/\\.enc//` if cmp $i $DEFAULT >/dev/null 2>/dev/null; then CURRENTDEFAULT=$NAME fi echo $NAME fi done echo Standard echo "Default=${CURRENTDEFAULT:-Standard}";; *) if [ -f "$POSTLIB/$1.enc" ] then rm -f $POSTLIB/$DEFAULT ln $POSTLIB/$1.enc $POSTLIB/$DEFAULT else echo "unrecognized encoding name $1" >&2 fi;; esac 0707070014231122361006400057030057030000010446000522633077700004200000003265post.src/psencoding/psencoding.mk MAKE=/bin/make MAKEFILE=psencoding.mk OWNER=bin GROUP=bin MAN1DIR=/tmp MAN5DIR=/usr/man/p_man/man5 POSTLIB=/usr/lib/postscript POSTBIN=/usr/bin/postscript all : psencoding install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp psencoding $(POSTBIN)/psencoding @chmod 755 $(POSTBIN)/psencoding @chgrp $(GROUP) $(POSTBIN)/psencoding @chown $(OWNER) $(POSTBIN)/psencoding cp Latin1.enc $(POSTLIB)/Latin1.enc @chmod 644 $(POSTLIB)/Latin1.enc @chgrp $(GROUP) $(POSTLIB)/Latin1.enc @chown $(OWNER) $(POSTLIB)/Latin1.enc cp UTF.enc $(POSTLIB)/UTF.enc @chmod 644 $(POSTLIB)/UTF.enc @chgrp $(GROUP) $(POSTLIB)/UTF.enc @chown $(OWNER) $(POSTLIB)/UTF.enc cp psencoding.1 $(MAN1DIR)/psencoding.1 @chmod 644 $(MAN1DIR)/psencoding.1 @chgrp $(GROUP) $(MAN1DIR)/psencoding.1 @chown $(OWNER) $(MAN1DIR)/psencoding.1 clean : clobber : clean rm -f psencoding psencoding : psencoding.sh sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" psencoding.sh >psencoding @chmod 755 psencoding changes : @trap "" 1 2 3 15; \ sed \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ psencoding.1 >XXX.1; \ mv XXX.1 psencoding.1 0707070014231122321006400057030057030000010370160522633100000004100000001571post.src/psencoding/psencoding.1 .ds dQ /usr/lib/postscript .TH PSENCODING 1 "DWB 3.2" .SH NAME .B psencoding \- check or set the default PostScript font encoding .SH SYNOPSIS \*(mBpsencoding\f1 .OP "" encoding [] .SH DESCRIPTION .B psencoding sets the default font Encoding used by many PostScript translators to .IR encoding . No arguments means list the available choices and the current default. .PP PostScript encoding files are in directory .MR \*(dQ . Many existing PostScript translators include the encoding file .MR Default.enc , if it exists, in the output they generate. .PP Requesting .I encoding as the default means link the file .MI \*(dQ/ encoding .enc to the file .MR \*(dQ/Default.enc . Changing the default encoding assumes you can write in directory .MR \*(dQ . .SH FILES .MW \*(dQ/Default.enc .br .MW \*(dQ/*.enc .SH SEE ALSO .BR buildtables (1), .BR dpost (1), .BR postprint (1), .BR trofftable (1) 0707070014231123351006440057030057030000010440400522627501000003400000010340post.src/psencoding/UTF.enc % % Encoding vector, operator and procedure redefinitions for Plan 9 UTF % encoding. Prologues are expected to take steps to ensure operator % redefinitions given here are actually used. Current implementation % assumes UTF byte streams that represent ASCII or Latin1 text. % /UTFLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /.notdef % was space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def /NewFontDirectory FontDirectory maxlength dict def % % Apparently no guarantee findfont is defined in systemdict so the obvious % % systemdict /findfont get exec % % can generate an error. So far the only exception is a VT600 (version 48.0). % userdict /@RealFindfont known not { userdict begin /@RealFindfont systemdict begin /findfont load end def end } if /findfont { dup NewFontDirectory exch known not { dup %dup systemdict /findfont get exec % not always in systemdict dup userdict /@RealFindfont get exec dup /Encoding get StandardEncoding eq { dup length 1 add dict begin {1 index /FID ne {def}{pop pop} ifelse} forall /Encoding UTFLatin1Encoding def /Metrics 1 dict def Metrics /.notdef 0 put currentdict end /DummyFontName exch definefont } if NewFontDirectory 3 1 roll put } if NewFontDirectory exch get } bind def % % Assume A0, except for A0A0 which is replaced by 20A0, can be ignored. % Works with ASCII or Latin1 because A0 has been re-encoded as a zero % width non-printing character. % /UTFstring { dup { (\240\240) search { pop 0 16#20 put }{pop exit} ifelse } loop } bind def /ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def /awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def /show {mark exch UTFstring //show cvx exec cleartomark} bind def /stringwidth {UTFstring //stringwidth cvx exec} bind def /widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def % % kshow is harder - stack can't change because of the procedure. % /kshow dup load type /operatortype eq {{UTFstring kshow} bind} {{UTFstring //kshow cvx exec} bind} ifelse def 0707070014231216500407550057030057030000030636470522633073600002100000000000post.src/devpost 0707070014231216511006440057030057030000010637600522627501000002400000003371post.src/devpost/AB name AB fontname AvantGarde-Demi named in prologue ligatures fi fl 0 spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 60 2 35 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 hy 42 0 45 - " . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 56 2 63 @ 74 2 64 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 \ 64 2 92 bs " ] 32 3 93 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 { 34 3 123 --- 60 2 124 } 34 3 125 --- 60 0 126 !! 28 1 161 ct 56 2 162 ps 56 2 163 fr 16 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 60 2 168 --- 22 2 169 `` 48 2 170 --- 46 0 171 --- 24 0 172 --- 24 0 173 fi 52 2 174 fl 52 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 60 3 182 --- 60 0 183 --- 28 1 184 --- 48 1 185 '' 48 2 186 --- 46 0 187 --- 100 0 188 --- 128 2 189 ?? 56 1 191 ga 42 2 193 \` " aa 42 2 194 \' " ^a 54 2 195 ^ " ~a 48 2 196 ~ " -a 42 2 197 Ua 48 2 198 .a 28 2 199 :a 50 2 200 oa 36 2 202 ,a 34 1 203 "a 70 2 205 Ca 34 1 206 va 54 2 207 em 100 0 208 --- 90 2 225 --- 36 2 227 --- 48 2 232 --- 84 2 233 --- 106 2 234 --- 36 2 235 --- 108 0 241 --- 24 0 245 --- 32 2 248 --- 66 0 249 --- 108 0 250 --- 60 2 251 0707070014231216521006440057030057030000010637620522627501000002400000003400post.src/devpost/AI name AI fontname AvantGarde-BookOblique named in prologue ligatures fi fl 0 spacewidth 28 charset ! 29 2 33 " 31 2 34 dq " # 72 2 35 $ 55 2 36 % 77 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 42 2 42 + 61 0 43 , 28 0 44 hy 33 0 45 - " . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 59 2 63 @ 87 2 64 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 \ 61 2 92 bs " ] 35 3 93 --- 67 2 94 --- 50 1 95 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 42 0 122 { 35 3 123 --- 67 2 124 } 35 3 125 --- 61 0 126 !! 29 1 161 ct 55 2 162 ps 55 2 163 fr 17 2 164 yn 55 2 165 fn 55 3 166 sc 61 3 167 cr 55 0 168 --- 20 2 169 `` 50 2 170 --- 42 0 171 --- 25 0 172 --- 25 0 173 fi 49 2 174 fl 49 2 175 en 50 0 177 \- " dg 55 3 178 dd 55 3 179 --- 28 0 180 pg 56 3 182 --- 61 0 183 --- 35 0 184 --- 50 0 185 '' 48 2 186 --- 42 0 187 --- 100 0 188 --- 117 2 189 ?? 59 1 191 ga 38 2 193 \` " aa 38 2 194 \' " ^a 50 2 195 ^ " ~a 44 2 196 ~ " -a 49 2 197 Ua 45 2 198 .a 22 2 199 :a 37 2 200 oa 33 2 202 ,a 32 1 203 "a 55 2 205 Ca 30 1 206 va 50 2 207 em 100 0 208 --- 99 2 225 --- 37 2 227 --- 52 2 232 --- 87 2 233 --- 119 2 234 --- 37 2 235 --- 116 0 241 --- 20 0 245 --- 30 2 248 --- 65 0 249 --- 114 0 250 --- 55 2 251 0707070014231216531006440057030057030000010637640522627501000002400000003371post.src/devpost/AR name AR fontname AvantGarde-Book named in prologue ligatures fi fl 0 spacewidth 28 charset ! 29 2 33 " 31 2 34 dq " # 72 2 35 $ 55 2 36 % 77 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 42 2 42 + 61 0 43 , 28 0 44 hy 33 0 45 - " . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 59 2 63 @ 87 2 64 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 \ 61 2 92 bs " ] 35 3 93 --- 67 2 94 --- 50 1 95 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 42 0 122 { 35 3 123 --- 67 2 124 } 35 3 125 --- 61 0 126 !! 29 1 161 ct 55 2 162 ps 55 2 163 fr 17 2 164 yn 55 2 165 fn 55 3 166 sc 61 3 167 cr 55 0 168 --- 20 2 169 `` 50 2 170 --- 42 0 171 --- 25 0 172 --- 25 0 173 fi 49 2 174 fl 49 2 175 en 50 0 177 \- " dg 55 3 178 dd 55 3 179 --- 28 0 180 pg 56 3 182 --- 61 0 183 --- 35 0 184 --- 50 0 185 '' 48 2 186 --- 42 0 187 --- 100 0 188 --- 117 2 189 ?? 59 1 191 ga 38 2 193 \` " aa 38 2 194 \' " ^a 50 2 195 ^ " ~a 44 2 196 ~ " -a 49 2 197 Ua 45 2 198 .a 22 2 199 :a 37 2 200 oa 33 2 202 ,a 32 1 203 "a 55 2 205 Ca 30 1 206 va 50 2 207 em 100 0 208 --- 99 2 225 --- 37 2 227 --- 52 2 232 --- 87 2 233 --- 119 2 234 --- 37 2 235 --- 116 0 241 --- 20 0 245 --- 30 2 248 --- 65 0 249 --- 114 0 250 --- 55 2 251 0707070014231216541006440057030057030000010637660522627501000002400000003400post.src/devpost/AX name AX fontname AvantGarde-DemiOblique named in prologue ligatures fi fl 0 spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 60 2 35 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 hy 42 0 45 - " . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 56 2 63 @ 74 2 64 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 \ 64 2 92 bs " ] 32 3 93 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 { 34 3 123 --- 60 2 124 } 34 3 125 --- 60 0 126 !! 28 1 161 ct 56 2 162 ps 56 2 163 fr 16 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 60 2 168 --- 22 2 169 `` 48 2 170 --- 46 0 171 --- 24 0 172 --- 24 0 173 fi 52 2 174 fl 52 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 60 3 182 --- 60 0 183 --- 28 1 184 --- 48 1 185 '' 48 2 186 --- 46 0 187 --- 100 0 188 --- 128 2 189 ?? 56 1 191 ga 42 2 193 \` " aa 42 2 194 \' " ^a 54 2 195 ^ " ~a 48 2 196 ~ " -a 42 2 197 Ua 48 2 198 .a 28 2 199 :a 50 2 200 oa 36 2 202 ,a 34 1 203 "a 70 2 205 Ca 34 1 206 va 54 2 207 em 100 0 208 --- 90 2 225 --- 36 2 227 --- 48 2 232 --- 84 2 233 --- 106 2 234 --- 36 2 235 --- 108 0 241 --- 24 0 245 --- 32 2 248 --- 66 0 249 --- 108 0 250 --- 60 2 251 0707070014231216551006440057030057030000010640200522627501000002300000003364post.src/devpost/B name B fontname Times-Bold named in prologue ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 56 2 34 dq " # 50 2 35 $ 50 3 36 % 100 2 37 & 83 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 57 0 60 = 57 0 61 --- 57 0 62 ? 50 2 63 @ 93 3 64 A 72 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 72 2 82 S 56 2 83 T 67 2 84 U 72 2 85 V 72 2 86 W 100 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 58 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 56 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 33 3 106 k 56 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 50 0 111 p 56 1 112 q 56 1 113 r 44 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 39 3 123 --- 22 3 124 } 39 3 125 --- 52 0 126 !! 33 1 161 ct 50 3 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 28 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 25 0 180 pg 54 3 182 --- 35 0 183 --- 33 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 ?? 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 30 2 227 --- 67 2 232 --- 78 2 233 --- 100 2 234 --- 33 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 2 249 --- 72 0 250 --- 56 2 251 0707070014231216561006440057030057030000010640220522627501000002400000003367post.src/devpost/BI name BI fontname Times-BoldItalic named in prologue ligatures fi fl 0 spacewidth 25 charset ! 39 2 33 " 56 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 57 2 60 = 57 0 61 --- 57 2 62 ? 50 2 63 @ 83 3 64 A 67 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 67 2 69 F 67 2 70 G 72 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 67 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 89 2 87 X 67 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 57 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 2 116 u 56 0 117 v 44 0 118 w 67 0 119 x 50 0 120 y 44 1 121 z 39 0 122 { 35 3 123 --- 22 2 124 } 35 3 125 --- 57 0 126 !! 39 1 161 ct 50 3 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 28 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 56 3 174 fl 56 3 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 25 0 180 pg 50 3 182 --- 35 0 183 --- 33 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 ?? 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 94 2 225 --- 27 2 227 --- 61 2 232 --- 72 3 233 --- 94 2 234 --- 30 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 3 249 --- 72 0 250 --- 50 3 251 0707070014231216571006440057030057030000010640240522627501000002400000003272post.src/devpost/CB name CB fontname Courier-Bold named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 !! 60 1 161 ct 60 2 162 ps 60 2 163 fr 60 2 164 yn 60 2 165 fn 60 2 166 sc 60 2 167 cr 60 2 168 --- 60 2 169 `` 60 2 170 --- 60 0 171 --- 60 0 172 --- 60 0 173 en 60 0 177 \- " dg 60 2 178 dd 60 2 179 --- 60 0 180 pg 60 2 182 --- 60 0 183 --- 60 1 184 --- 60 1 185 '' 60 2 186 --- 60 0 187 --- 60 0 188 --- 60 2 189 ?? 60 1 191 ga 60 2 193 \` " aa 60 2 194 \' " ^a 60 2 195 ^ " ~a 60 2 196 ~ " -a 60 2 197 Ua 60 2 198 .a 60 2 199 :a 60 2 200 oa 60 2 202 ,a 60 1 203 "a 60 2 205 Ca 60 1 206 va 60 2 207 em 60 0 208 --- 60 2 225 --- 60 2 227 --- 60 2 232 --- 60 2 233 --- 60 2 234 --- 60 2 235 --- 60 0 241 --- 60 0 245 --- 60 2 248 --- 60 0 249 --- 60 0 250 --- 60 2 251 0707070014231216601006440057030057030000010640260522627501000002400000003275post.src/devpost/CI name CI fontname Courier-Oblique named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 !! 60 1 161 ct 60 2 162 ps 60 2 163 fr 60 2 164 yn 60 2 165 fn 60 2 166 sc 60 2 167 cr 60 2 168 --- 60 2 169 `` 60 2 170 --- 60 0 171 --- 60 0 172 --- 60 0 173 en 60 0 177 \- " dg 60 2 178 dd 60 2 179 --- 60 0 180 pg 60 2 182 --- 60 0 183 --- 60 1 184 --- 60 1 185 '' 60 2 186 --- 60 0 187 --- 60 0 188 --- 60 2 189 ?? 60 1 191 ga 60 2 193 \` " aa 60 2 194 \' " ^a 60 2 195 ^ " ~a 60 2 196 ~ " -a 60 2 197 Ua 60 2 198 .a 60 2 199 :a 60 2 200 oa 60 2 202 ,a 60 1 203 "a 60 2 205 Ca 60 1 206 va 60 2 207 em 60 0 208 --- 60 2 225 --- 60 2 227 --- 60 2 232 --- 60 2 233 --- 60 2 234 --- 60 2 235 --- 60 0 241 --- 60 0 245 --- 60 2 248 --- 60 0 249 --- 60 0 250 --- 60 2 251 0707070014231216611006440057030057030000010640400522627501000002400000003265post.src/devpost/CO name CO fontname Courier named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 !! 60 1 161 ct 60 2 162 ps 60 2 163 fr 60 2 164 yn 60 2 165 fn 60 2 166 sc 60 2 167 cr 60 2 168 --- 60 2 169 `` 60 2 170 --- 60 0 171 --- 60 0 172 --- 60 0 173 en 60 0 177 \- " dg 60 2 178 dd 60 2 179 --- 60 0 180 pg 60 2 182 --- 60 0 183 --- 60 1 184 --- 60 1 185 '' 60 2 186 --- 60 0 187 --- 60 0 188 --- 60 2 189 ?? 60 1 191 ga 60 2 193 \` " aa 60 2 194 \' " ^a 60 2 195 ^ " ~a 60 2 196 ~ " -a 60 2 197 Ua 60 2 198 .a 60 2 199 :a 60 2 200 oa 60 2 202 ,a 60 1 203 "a 60 2 205 Ca 60 1 206 va 60 2 207 em 60 0 208 --- 60 2 225 --- 60 2 227 --- 60 2 232 --- 60 2 233 --- 60 2 234 --- 60 2 235 --- 60 0 241 --- 60 0 245 --- 60 2 248 --- 60 0 249 --- 60 0 250 --- 60 2 251 0707070014231216621006440057030057030000010640420522627501100002400000003265post.src/devpost/CW name CW fontname Courier named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 !! 60 1 161 ct 60 2 162 ps 60 2 163 fr 60 2 164 yn 60 2 165 fn 60 2 166 sc 60 2 167 cr 60 2 168 --- 60 2 169 `` 60 2 170 --- 60 0 171 --- 60 0 172 --- 60 0 173 en 60 0 177 \- " dg 60 2 178 dd 60 2 179 --- 60 0 180 pg 60 2 182 --- 60 0 183 --- 60 1 184 --- 60 1 185 '' 60 2 186 --- 60 0 187 --- 60 0 188 --- 60 2 189 ?? 60 1 191 ga 60 2 193 \` " aa 60 2 194 \' " ^a 60 2 195 ^ " ~a 60 2 196 ~ " -a 60 2 197 Ua 60 2 198 .a 60 2 199 :a 60 2 200 oa 60 2 202 ,a 60 1 203 "a 60 2 205 Ca 60 1 206 va 60 2 207 em 60 0 208 --- 60 2 225 --- 60 2 227 --- 60 2 232 --- 60 2 233 --- 60 2 234 --- 60 2 235 --- 60 0 241 --- 60 0 245 --- 60 2 248 --- 60 0 249 --- 60 0 250 --- 60 2 251 0707070014231216631006440057030057030000010640440522627501100002400000003301post.src/devpost/CX name CX fontname Courier-BoldOblique named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 !! 60 1 161 ct 60 2 162 ps 60 2 163 fr 60 2 164 yn 60 2 165 fn 60 2 166 sc 60 2 167 cr 60 2 168 --- 60 2 169 `` 60 2 170 --- 60 0 171 --- 60 0 172 --- 60 0 173 en 60 0 177 \- " dg 60 2 178 dd 60 2 179 --- 60 0 180 pg 60 2 182 --- 60 0 183 --- 60 1 184 --- 60 1 185 '' 60 2 186 --- 60 0 187 --- 60 0 188 --- 60 2 189 ?? 60 1 191 ga 60 2 193 \` " aa 60 2 194 \' " ^a 60 2 195 ^ " ~a 60 2 196 ~ " -a 60 2 197 Ua 60 2 198 .a 60 2 199 :a 60 2 200 oa 60 2 202 ,a 60 1 203 "a 60 2 205 Ca 60 1 206 va 60 2 207 em 60 0 208 --- 60 2 225 --- 60 2 227 --- 60 2 232 --- 60 2 233 --- 60 2 234 --- 60 2 235 --- 60 0 241 --- 60 0 245 --- 60 2 248 --- 60 0 249 --- 60 0 250 --- 60 2 251 0707070014231216641006440057030057030000010640460522627501100002600000001740post.src/devpost/DESC #Device Description - original PostScript character set PDL PostScript fonts 10 R I B BI CW H HI HB S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res 720 hor 1 vert 1 unitwidth 10 charset dq hy bs !! ct ps fr yn fn sc cr `` fi fl en \- dg dd pg '' ?? ga \` aa \' ^a ~a -a Ua .a :a oa ,a "a Ca va em fa te st ** pl mi sl eq cg *A *B *X *D *E *F *G *Y *I *K *L *M *N *O *P *H *R *S *T *U ts *W *C *Q *Z tf pp ul rn *a *b *x *d *e *f *g *y *i *k *l *m *n *o *p *h *r *s *t *u *w *c *q *z or ap fm <= if ab <- ua -> da de +- >= mu pt pd bu di != == ~~ el av ah CR af If Rf ws Ox O+ es ca cu sp ip !b sb ib mo !m an gr rg co tm sr c. no l& l| lz b< RG CO TM LT br LX LB lc lx lf lt lk lb bv b> is RT RX RB rc rx rf rt rk rb ~= ru ff Fi Fl 14 12 34 bx ob ci sq Sl L1 LA LV LH lh rh lH rH PC DG -+ cs cy as os =. ld rd le ge 0707070014231215101006400057030057030000010554200522633073600003400000003054post.src/devpost/devpost.mk MAKE=/bin/make MAKEFILE=devpost.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin FONTDIR=/usr/lib/font FONTFILES=DESC ? ?? [A-Z]??* shell.lib all : @if [ -r LINKFILE ]; then sh LINKFILE; fi; install : all @rm -f $(FONTDIR)/devpost/*.out @if [ ! -d $(FONTDIR) ]; then \ mkdir $(FONTDIR); \ chmod 755 $(FONTDIR); \ chgrp $(GROUP) $(FONTDIR); \ chown $(OWNER) $(FONTDIR); \ fi @if [ ! -d $(FONTDIR)/devpost ]; then \ mkdir $(FONTDIR)/devpost; \ chmod 755 $(FONTDIR)/devpost; \ chgrp $(GROUP) $(FONTDIR)/devpost; \ chown $(OWNER) $(FONTDIR)/devpost; \ fi @if [ ! -d $(FONTDIR)/devpost/charlib ]; then \ mkdir $(FONTDIR)/devpost/charlib; \ chmod 755 $(FONTDIR)/devpost/charlib; \ chgrp $(GROUP) $(FONTDIR)/devpost/charlib; \ chown $(OWNER) $(FONTDIR)/devpost/charlib; \ fi cp $(FONTFILES) $(FONTDIR)/devpost @for i in $(FONTFILES); do \ chmod 644 $(FONTDIR)/devpost/$$i; \ chgrp $(GROUP) $(FONTDIR)/devpost/$$i; \ chown $(OWNER) $(FONTDIR)/devpost/$$i; \ done cp charlib/* $(FONTDIR)/devpost/charlib @for i in charlib/*; do \ chmod 644 $(FONTDIR)/devpost/$$i; \ chgrp $(GROUP) $(FONTDIR)/devpost/$$i; \ chown $(OWNER) $(FONTDIR)/devpost/$$i; \ done clean : clobber : clean changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014231216661006440057030057030000010640470522627501100002400000001145post.src/devpost/GR name GR fontname Symbol named in prologue spacewidth 25 charset *A 72 2 65 *B 67 2 66 *X 72 2 67 *D 61 2 68 *E 61 2 69 *F 76 2 70 *G 60 2 71 *Y 72 2 72 *I 33 2 73 *K 72 2 75 *L 69 2 76 *M 89 2 77 *N 72 2 78 *O 72 2 79 *P 77 2 80 *H 74 2 81 *R 56 2 82 *S 59 2 83 *T 61 2 84 *U 69 2 85 *W 77 2 87 *C 65 2 88 *Q 80 2 89 *Z 61 2 90 *a 63 0 97 *b 55 3 98 *x 55 1 99 *d 49 2 100 *e 44 0 101 *f 52 3 102 *g 41 1 103 *y 60 1 104 *i 33 0 105 *k 55 0 107 *l 55 2 108 *m 58 1 109 *n 52 0 110 *o 55 0 111 *p 55 0 112 *h 52 2 113 *r 55 1 114 *s 60 0 115 *t 44 0 116 *u 58 0 117 *w 69 0 119 *c 49 3 120 *q 69 1 121 *z 49 3 122 0707070014231216671006440057030057030000010641020522627501100002300000003362post.src/devpost/H name H fontname Helvetica named in prologue ligatures fi fl 0 spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 --- 58 0 126 !! 33 1 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 0 168 --- 19 2 169 `` 33 2 170 --- 56 0 171 --- 33 0 172 --- 33 0 173 fi 50 2 174 fl 50 2 175 en 56 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 54 3 182 --- 35 0 183 --- 22 1 184 --- 33 1 185 '' 33 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 ?? 61 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 37 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 36 2 235 --- 89 0 241 --- 28 0 245 --- 22 2 248 --- 61 0 249 --- 94 0 250 --- 61 2 251 0707070014231216701006440057030057030000010641040522627501100002400000003367post.src/devpost/HB name HB fontname Helvetica-Bold named in prologue ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 47 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 61 2 63 @ 98 3 64 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 58 2 94 --- 56 1 95 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 --- 58 0 126 !! 33 1 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 2 168 --- 24 2 169 `` 50 2 170 --- 56 0 171 --- 33 0 172 --- 33 0 173 fi 61 2 174 fl 61 2 175 en 56 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 56 3 182 --- 35 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 ?? 61 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 37 2 227 --- 61 2 232 --- 78 2 233 --- 100 2 234 --- 36 2 235 --- 89 0 241 --- 28 0 245 --- 28 2 248 --- 61 0 249 --- 94 0 250 --- 61 2 251 0707070014231216711006440057030057030000010641060522627501100002400000003373post.src/devpost/HI name HI fontname Helvetica-Oblique named in prologue ligatures fi fl 0 spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 --- 58 0 126 !! 33 1 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 0 168 --- 19 2 169 `` 33 2 170 --- 56 0 171 --- 33 0 172 --- 33 0 173 fi 50 2 174 fl 50 2 175 en 56 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 54 3 182 --- 35 0 183 --- 22 1 184 --- 33 1 185 '' 33 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 ?? 61 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 37 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 36 2 235 --- 89 0 241 --- 28 0 245 --- 22 2 248 --- 61 0 249 --- 94 0 250 --- 61 2 251 0707070014231216721006440057030057030000010641400522627501100002400000003376post.src/devpost/HX name HX fontname Helvetica-BoldOblique named in prologue ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 47 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 61 2 63 @ 98 3 64 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 58 2 94 --- 56 1 95 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 --- 58 0 126 !! 33 1 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 2 168 --- 24 2 169 `` 50 2 170 --- 56 0 171 --- 33 0 172 --- 33 0 173 fi 61 2 174 fl 61 2 175 en 56 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 56 3 182 --- 35 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 ?? 61 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 37 2 227 --- 61 2 232 --- 78 2 233 --- 100 2 234 --- 36 2 235 --- 89 0 241 --- 28 0 245 --- 28 2 248 --- 61 0 249 --- 94 0 250 --- 61 2 251 0707070014231216731006440057030057030000010641420522627501100002400000003371post.src/devpost/Hb name Hb fontname Helvetica-Narrow-Bold named in prologue ligatures fi fl 0 spacewidth 23 charset ! 27 2 33 " 39 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 50 2 63 @ 80 3 64 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 \ 23 2 92 bs " ] 27 3 93 --- 48 2 94 --- 46 1 95 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 { 32 3 123 --- 23 3 124 } 32 3 125 --- 48 0 126 !! 27 1 161 ct 46 3 162 ps 46 2 163 fr 14 2 164 yn 46 2 165 fn 46 3 166 sc 46 3 167 cr 46 2 168 --- 20 2 169 `` 41 2 170 --- 46 0 171 --- 27 0 172 --- 27 0 173 fi 50 2 174 fl 50 2 175 en 46 0 177 \- " dg 46 3 178 dd 46 3 179 --- 23 0 180 pg 46 3 182 --- 29 0 183 --- 23 1 184 --- 41 1 185 '' 41 2 186 --- 46 0 187 --- 82 0 188 --- 82 2 189 ?? 50 1 191 ga 27 2 193 \` " aa 27 2 194 \' " ^a 27 2 195 ^ " ~a 27 2 196 ~ " -a 27 2 197 Ua 27 2 198 .a 27 2 199 :a 27 2 200 oa 27 2 202 ,a 27 1 203 "a 27 2 205 Ca 27 1 206 va 27 2 207 em 82 0 208 --- 82 2 225 --- 30 2 227 --- 50 2 232 --- 64 2 233 --- 82 2 234 --- 30 2 235 --- 73 0 241 --- 23 0 245 --- 23 2 248 --- 50 0 249 --- 77 0 250 --- 50 2 251 0707070014231216741006440057030057030000010641440522627501100002400000003374post.src/devpost/Hi name Hi fontname Helvetica-Narrow-Oblique named in prologue ligatures fi fl 0 spacewidth 23 charset ! 23 2 33 " 29 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 46 2 63 @ 83 3 64 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 \ 23 2 92 bs " ] 23 3 93 --- 38 2 94 --- 46 1 95 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 { 27 3 123 --- 21 3 124 } 27 3 125 --- 48 0 126 !! 27 1 161 ct 46 3 162 ps 46 2 163 fr 14 2 164 yn 46 2 165 fn 46 3 166 sc 46 3 167 cr 46 0 168 --- 16 2 169 `` 27 2 170 --- 46 0 171 --- 27 0 172 --- 27 0 173 fi 41 2 174 fl 41 2 175 en 46 0 177 \- " dg 46 3 178 dd 46 3 179 --- 23 0 180 pg 44 3 182 --- 29 0 183 --- 18 1 184 --- 27 1 185 '' 27 2 186 --- 46 0 187 --- 82 0 188 --- 82 2 189 ?? 50 1 191 ga 27 2 193 \` " aa 27 2 194 \' " ^a 27 2 195 ^ " ~a 27 2 196 ~ " -a 27 2 197 Ua 27 2 198 .a 27 2 199 :a 27 2 200 oa 27 2 202 ,a 27 1 203 "a 27 2 205 Ca 27 1 206 va 27 2 207 em 82 0 208 --- 82 2 225 --- 30 2 227 --- 46 2 232 --- 64 2 233 --- 82 2 234 --- 30 2 235 --- 73 0 241 --- 23 0 245 --- 18 2 248 --- 50 0 249 --- 77 0 250 --- 50 2 251 0707070014231216751006440057030057030000010641460522627501100002400000003364post.src/devpost/Hr name Hr fontname Helvetica-Narrow named in prologue ligatures fi fl 0 spacewidth 23 charset ! 23 2 33 " 29 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 46 2 63 @ 83 3 64 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 \ 23 2 92 bs " ] 23 3 93 --- 38 2 94 --- 46 1 95 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 { 27 3 123 --- 21 3 124 } 27 3 125 --- 48 0 126 !! 27 1 161 ct 46 3 162 ps 46 2 163 fr 14 2 164 yn 46 2 165 fn 46 3 166 sc 46 3 167 cr 46 0 168 --- 16 2 169 `` 27 2 170 --- 46 0 171 --- 27 0 172 --- 27 0 173 fi 41 2 174 fl 41 2 175 en 46 0 177 \- " dg 46 3 178 dd 46 3 179 --- 23 0 180 pg 44 3 182 --- 29 0 183 --- 18 1 184 --- 27 1 185 '' 27 2 186 --- 46 0 187 --- 82 0 188 --- 82 2 189 ?? 50 1 191 ga 27 2 193 \` " aa 27 2 194 \' " ^a 27 2 195 ^ " ~a 27 2 196 ~ " -a 27 2 197 Ua 27 2 198 .a 27 2 199 :a 27 2 200 oa 27 2 202 ,a 27 1 203 "a 27 2 205 Ca 27 1 206 va 27 2 207 em 82 0 208 --- 82 2 225 --- 30 2 227 --- 46 2 232 --- 64 2 233 --- 82 2 234 --- 30 2 235 --- 73 0 241 --- 23 0 245 --- 18 2 248 --- 50 0 249 --- 77 0 250 --- 50 2 251 0707070014231216761006440057030057030000010641600522627501100002400000003400post.src/devpost/Hx name Hx fontname Helvetica-Narrow-BoldOblique named in prologue ligatures fi fl 0 spacewidth 23 charset ! 27 2 33 " 39 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 50 2 63 @ 80 3 64 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 \ 23 2 92 bs " ] 27 3 93 --- 48 2 94 --- 46 1 95 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 { 32 3 123 --- 23 3 124 } 32 3 125 --- 48 0 126 !! 27 1 161 ct 46 3 162 ps 46 2 163 fr 14 2 164 yn 46 2 165 fn 46 3 166 sc 46 3 167 cr 46 2 168 --- 20 2 169 `` 41 2 170 --- 46 0 171 --- 27 0 172 --- 27 0 173 fi 50 2 174 fl 50 2 175 en 46 0 177 \- " dg 46 3 178 dd 46 3 179 --- 23 0 180 pg 46 3 182 --- 29 0 183 --- 23 1 184 --- 41 1 185 '' 41 2 186 --- 46 0 187 --- 82 0 188 --- 82 2 189 ?? 50 1 191 ga 27 2 193 \` " aa 27 2 194 \' " ^a 27 2 195 ^ " ~a 27 2 196 ~ " -a 27 2 197 Ua 27 2 198 .a 27 2 199 :a 27 2 200 oa 27 2 202 ,a 27 1 203 "a 27 2 205 Ca 27 1 206 va 27 2 207 em 82 0 208 --- 82 2 225 --- 30 2 227 --- 50 2 232 --- 64 2 233 --- 82 2 234 --- 30 2 235 --- 73 0 241 --- 23 0 245 --- 23 2 248 --- 50 0 249 --- 77 0 250 --- 50 2 251 0707070014231216771006440057030057030000010641620522627501100002300000003360post.src/devpost/I name I fontname Times-Italic named in prologue ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 42 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 68 2 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 68 2 60 = 68 0 61 --- 68 2 62 ? 50 2 63 @ 92 3 64 A 61 2 65 B 61 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 61 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 44 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 67 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 83 2 87 X 61 2 88 Y 56 2 89 Z 56 2 90 [ 39 3 91 \ 28 2 92 bs " ] 39 3 93 --- 42 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 72 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 40 3 123 --- 27 3 124 } 40 3 125 --- 54 0 126 !! 39 1 161 ct 50 3 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 2 167 cr 50 2 168 --- 21 2 169 `` 56 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 50 3 174 fl 50 3 175 en 50 0 177 \- " dg 50 2 178 dd 50 2 179 --- 25 0 180 pg 52 3 182 --- 35 0 183 --- 33 1 184 --- 56 1 185 '' 56 2 186 --- 50 0 187 --- 89 0 188 --- 100 2 189 ?? 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 89 0 208 --- 89 2 225 --- 28 2 227 --- 56 2 232 --- 72 3 233 --- 94 2 234 --- 31 2 235 --- 67 0 241 --- 28 0 245 --- 28 2 248 --- 50 3 249 --- 67 0 250 --- 50 3 251 0707070014231217001006440057030057030000010641640522627501100002400000003366post.src/devpost/KB name KB fontname Bookman-Demi named in prologue ligatures fi fl 0 spacewidth 34 charset ! 36 2 33 " 42 2 34 dq " # 60 2 35 $ 66 3 36 % 94 2 37 & 80 2 38 ' 32 2 39 ( 32 3 40 ) 32 3 41 * 46 2 42 + 60 0 43 , 34 1 44 hy 36 0 45 - " . 34 0 46 / 60 3 47 0 66 2 48 1 66 2 49 2 66 2 50 3 66 2 51 4 66 2 52 5 66 2 53 6 66 2 54 7 66 2 55 8 66 2 56 9 66 2 57 : 34 0 58 ; 34 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 66 2 63 @ 82 2 64 A 72 2 65 B 72 2 66 C 74 2 67 D 78 2 68 E 72 2 69 F 68 2 70 G 78 2 71 H 82 2 72 I 40 2 73 J 64 2 74 K 80 2 75 L 64 2 76 M 94 2 77 N 74 2 78 O 80 2 79 P 66 2 80 Q 80 3 81 R 78 2 82 S 66 2 83 T 70 2 84 U 74 2 85 V 72 2 86 W 94 2 87 X 78 2 88 Y 70 2 89 Z 64 2 90 [ 30 3 91 \ 60 2 92 bs " ] 30 3 93 --- 60 2 94 --- 50 1 95 ` 32 2 96 a 58 0 97 b 60 2 98 c 58 0 99 d 64 2 100 e 58 0 101 f 38 2 102 g 58 3 103 h 68 2 104 i 36 2 105 j 34 3 106 k 66 2 107 l 34 2 108 m 100 0 109 n 68 0 110 o 62 0 111 p 64 1 112 q 62 1 113 r 46 0 114 s 52 0 115 t 46 2 116 u 66 0 117 v 60 0 118 w 80 0 119 x 60 0 120 y 62 1 121 z 56 0 122 { 32 3 123 --- 60 2 124 } 32 3 125 --- 60 0 126 !! 36 1 161 ct 66 2 162 ps 66 2 163 fr 12 2 164 yn 66 2 165 fn 66 3 166 sc 60 3 167 cr 60 2 168 --- 24 2 169 `` 54 2 170 --- 40 0 171 --- 22 0 172 --- 22 0 173 fi 74 2 174 fl 74 2 175 en 50 0 177 \- " dg 44 3 178 dd 38 3 179 --- 34 0 180 pg 80 2 182 --- 46 0 183 --- 32 1 184 --- 54 1 185 '' 54 2 186 --- 40 0 187 --- 100 0 188 --- 136 2 189 ?? 66 1 191 ga 40 2 193 \` " aa 40 2 194 \' " ^a 50 2 195 ^ " ~a 48 2 196 ~ " -a 46 2 197 Ua 50 2 198 .a 32 2 199 :a 50 2 200 oa 34 2 202 ,a 36 1 203 "a 44 2 205 Ca 32 1 206 va 50 2 207 em 100 0 208 --- 114 2 225 --- 40 2 227 --- 64 2 232 --- 80 3 233 --- 122 2 234 --- 40 2 235 --- 88 0 241 --- 36 0 245 --- 34 2 248 --- 62 0 249 --- 94 0 250 --- 66 2 251 0707070014231217011006440057030057030000010641660522627501100002400000003373post.src/devpost/KI name KI fontname Bookman-LightItalic named in prologue ligatures fi fl 0 spacewidth 30 charset ! 32 2 33 " 36 2 34 dq " # 60 2 35 $ 62 2 36 % 80 2 37 & 82 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 44 2 42 + 60 2 43 , 30 1 44 hy 32 0 45 - " . 30 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 30 0 58 ; 30 1 59 --- 60 2 60 = 60 0 61 --- 60 2 62 ? 54 2 63 @ 78 2 64 A 70 2 65 B 72 2 66 C 72 2 67 D 74 2 68 E 68 2 69 F 62 2 70 G 76 2 71 H 80 2 72 I 32 2 73 J 56 2 74 K 72 2 75 L 58 2 76 M 86 2 77 N 72 2 78 O 76 2 79 P 60 2 80 Q 78 3 81 R 70 2 82 S 64 2 83 T 60 2 84 U 72 2 85 V 68 2 86 W 96 2 87 X 70 2 88 Y 66 2 89 Z 58 2 90 [ 26 3 91 \ 60 2 92 bs " ] 26 3 93 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 62 0 97 b 60 2 98 c 48 0 99 d 64 2 100 e 54 0 101 f 34 3 102 g 56 1 103 h 62 2 104 i 28 2 105 j 28 3 106 k 60 2 107 l 28 2 108 m 88 0 109 n 62 0 110 o 54 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 54 0 115 t 34 2 116 u 62 0 117 v 54 0 118 w 88 0 119 x 54 0 120 y 60 1 121 z 52 0 122 { 36 3 123 --- 60 2 124 } 38 3 125 --- 60 0 126 !! 32 1 161 ct 62 2 162 ps 62 2 163 fr 2 2 164 yn 62 2 165 fn 62 3 166 sc 62 3 167 cr 60 2 168 --- 20 2 169 `` 44 2 170 --- 30 0 171 --- 18 0 172 --- 18 0 173 fi 64 3 174 fl 66 3 175 en 50 0 177 \- " dg 62 3 178 dd 62 3 179 --- 30 0 180 pg 62 2 182 --- 46 0 183 --- 32 1 184 --- 48 1 185 '' 44 2 186 --- 30 0 187 --- 100 0 188 --- 118 2 189 ?? 54 1 191 ga 34 2 193 \` " aa 32 2 194 \' " ^a 44 2 195 ^ " ~a 44 2 196 ~ " -a 44 2 197 Ua 44 2 198 .a 26 2 199 :a 42 2 200 oa 30 2 202 ,a 32 1 203 "a 34 2 205 Ca 26 1 206 va 44 2 207 em 100 0 208 --- 122 2 225 --- 44 2 227 --- 58 2 232 --- 76 2 233 --- 118 2 234 --- 40 2 235 --- 88 0 241 --- 28 0 245 --- 34 2 248 --- 54 0 249 --- 90 0 250 --- 62 3 251 0707070014231217021006440057030057030000010642000522627501100002400000003366post.src/devpost/KR name KR fontname Bookman-Light named in prologue ligatures fi fl 0 spacewidth 32 charset ! 30 2 33 " 38 2 34 dq " # 60 2 35 $ 62 2 36 % 90 2 37 & 80 2 38 ' 22 2 39 ( 30 3 40 ) 30 3 41 * 44 2 42 + 60 0 43 , 32 1 44 hy 40 0 45 - " . 32 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 32 0 58 ; 32 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 54 2 63 @ 82 2 64 A 68 2 65 B 74 2 66 C 74 2 67 D 80 2 68 E 72 2 69 F 64 2 70 G 80 2 71 H 80 2 72 I 34 2 73 J 60 2 74 K 72 2 75 L 60 2 76 M 92 2 77 N 74 2 78 O 80 2 79 P 62 2 80 Q 82 3 81 R 72 2 82 S 66 2 83 T 62 2 84 U 78 2 85 V 70 2 86 W 96 2 87 X 72 2 88 Y 64 2 89 Z 64 2 90 [ 30 3 91 \ 60 2 92 bs " ] 30 3 93 --- 60 2 94 --- 50 1 95 ` 22 2 96 a 58 0 97 b 62 2 98 c 52 0 99 d 62 2 100 e 52 0 101 f 32 2 102 g 54 3 103 h 66 2 104 i 30 2 105 j 30 3 106 k 62 2 107 l 30 2 108 m 94 0 109 n 66 0 110 o 56 0 111 p 62 1 112 q 58 1 113 r 44 0 114 s 52 0 115 t 38 2 116 u 68 0 117 v 52 0 118 w 78 0 119 x 56 0 120 y 54 1 121 z 48 0 122 { 28 3 123 --- 60 2 124 } 28 3 125 --- 60 0 126 !! 30 1 161 ct 62 2 162 ps 62 2 163 fr 14 2 164 yn 62 2 165 fn 62 3 166 sc 52 3 167 cr 60 2 168 --- 22 2 169 `` 40 2 170 --- 36 0 171 --- 24 0 172 --- 24 0 173 fi 62 2 174 fl 62 2 175 en 50 0 177 \- " dg 54 3 178 dd 54 3 179 --- 32 0 180 pg 60 2 182 --- 46 0 183 --- 22 0 184 --- 40 0 185 '' 40 2 186 --- 36 0 187 --- 100 0 188 --- 128 2 189 ?? 54 1 191 ga 34 2 193 \` " aa 34 2 194 \' " ^a 42 2 195 ^ " ~a 44 2 196 ~ " -a 44 2 197 Ua 46 2 198 .a 26 2 199 :a 42 2 200 oa 32 2 202 ,a 32 1 203 "a 38 2 205 Ca 32 1 206 va 42 2 207 em 100 0 208 --- 126 2 225 --- 42 2 227 --- 60 2 232 --- 80 2 233 --- 124 2 234 --- 42 2 235 --- 86 0 241 --- 30 0 245 --- 32 2 248 --- 56 0 249 --- 90 0 250 --- 66 2 251 0707070014231217031006440057030057030000010642020522627501100002400000003374post.src/devpost/KX name KX fontname Bookman-DemiItalic named in prologue ligatures fi fl 0 spacewidth 34 charset ! 32 2 33 " 38 2 34 dq " # 60 2 35 $ 68 3 36 % 88 2 37 & 98 2 38 ' 32 2 39 ( 26 3 40 ) 26 3 41 * 46 2 42 + 60 0 43 , 34 1 44 hy 28 0 45 - " . 34 0 46 / 36 2 47 0 68 2 48 1 68 2 49 2 68 2 50 3 68 2 51 4 68 2 52 5 68 2 53 6 68 2 54 7 68 2 55 8 68 2 56 9 68 2 57 : 34 0 58 ; 34 1 59 --- 62 0 60 = 60 0 61 --- 62 0 62 ? 62 2 63 @ 78 2 64 A 72 2 65 B 72 2 66 C 70 2 67 D 76 2 68 E 72 2 69 F 66 2 70 G 76 2 71 H 80 2 72 I 38 2 73 J 62 2 74 K 78 2 75 L 64 2 76 M 86 2 77 N 74 2 78 O 76 2 79 P 64 2 80 Q 76 3 81 R 74 2 82 S 70 2 83 T 70 2 84 U 74 2 85 V 66 2 86 W 100 2 87 X 74 2 88 Y 66 2 89 Z 68 2 90 [ 26 3 91 \ 58 2 92 bs " ] 26 3 93 --- 62 2 94 --- 50 1 95 ` 32 2 96 a 68 0 97 b 60 2 98 c 56 0 99 d 68 2 100 e 56 0 101 f 42 3 102 g 62 1 103 h 70 2 104 i 38 2 105 j 32 3 106 k 70 2 107 l 38 2 108 m 96 0 109 n 68 0 110 o 60 0 111 p 66 1 112 q 62 1 113 r 50 0 114 s 54 0 115 t 44 2 116 u 68 0 117 v 54 0 118 w 86 0 119 x 62 0 120 y 60 1 121 z 56 0 122 { 30 3 123 --- 62 2 124 } 30 3 125 --- 62 0 126 !! 32 1 161 ct 68 2 162 ps 68 2 163 fr 12 2 164 yn 68 2 165 fn 68 3 166 sc 62 3 167 cr 68 2 168 --- 18 2 169 `` 52 2 170 --- 38 0 171 --- 22 0 172 --- 22 0 173 fi 82 3 174 fl 82 3 175 en 50 0 177 \- " dg 42 3 178 dd 42 3 179 --- 34 0 180 pg 68 3 182 --- 36 0 183 --- 30 1 184 --- 52 1 185 '' 52 2 186 --- 38 0 187 --- 100 0 188 --- 136 2 189 ?? 62 1 191 ga 38 2 193 \` " aa 34 2 194 \' " ^a 48 2 195 ^ " ~a 48 2 196 ~ " -a 48 2 197 Ua 46 2 198 .a 38 2 199 :a 52 2 200 oa 36 2 202 ,a 36 1 203 "a 56 2 205 Ca 32 1 206 va 48 2 207 em 100 0 208 --- 114 2 225 --- 44 2 227 --- 64 2 232 --- 76 2 233 --- 118 2 234 --- 44 2 235 --- 88 0 241 --- 38 0 245 --- 38 2 248 --- 60 2 249 --- 92 0 250 --- 66 3 251 0707070014231217041006440057030057030000010642040522627501100002300000003242post.src/devpost/C name C fontname Courier spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 !! 60 1 161 ct 60 2 162 ps 60 2 163 fr 60 2 164 yn 60 2 165 fn 60 2 166 sc 60 2 167 cr 60 2 168 --- 60 2 169 `` 60 2 170 --- 60 0 171 --- 60 0 172 --- 60 0 173 en 60 0 177 \- " dg 60 2 178 dd 60 2 179 --- 60 0 180 pg 60 2 182 --- 60 0 183 --- 60 1 184 --- 60 1 185 '' 60 2 186 --- 60 0 187 --- 60 0 188 --- 60 2 189 ?? 60 1 191 ga 60 2 193 \` " aa 60 2 194 \' " ^a 60 2 195 ^ " ~a 60 2 196 ~ " -a 60 2 197 Ua 60 2 198 .a 60 2 199 :a 60 2 200 oa 60 2 202 ,a 60 1 203 "a 60 2 205 Ca 60 1 206 va 60 2 207 em 60 0 208 --- 60 2 225 --- 60 2 227 --- 60 2 232 --- 60 2 233 --- 60 2 234 --- 60 2 235 --- 60 0 241 --- 60 0 245 --- 60 2 248 --- 60 0 249 --- 60 0 250 --- 60 2 251 0707070014231217051006440057030057030000010642060522627501200002400000003375post.src/devpost/NB name NB fontname NewCenturySchlbk-Bold named in prologue ligatures fi fl 0 spacewidth 29 charset ! 30 2 33 " 33 2 34 dq " # 57 2 35 $ 57 3 36 % 83 2 37 & 85 2 38 ' 24 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 50 2 63 @ 75 2 64 A 76 2 65 B 78 2 66 C 78 2 67 D 83 2 68 E 76 2 69 F 72 2 70 G 83 2 71 H 87 2 72 I 44 2 73 J 65 2 74 K 81 2 75 L 72 2 76 M 98 2 77 N 83 2 78 O 83 2 79 P 76 2 80 Q 83 3 81 R 81 2 82 S 67 2 83 T 72 2 84 U 83 2 85 V 76 2 86 W 98 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 39 3 91 \ 61 2 92 bs " ] 39 3 93 --- 61 2 94 --- 50 1 95 ` 24 2 96 a 61 0 97 b 65 2 98 c 56 0 99 d 67 2 100 e 57 0 101 f 39 2 102 g 61 1 103 h 69 2 104 i 37 2 105 j 35 3 106 k 67 2 107 l 35 2 108 m 96 0 109 n 69 0 110 o 61 0 111 p 67 1 112 q 65 1 113 r 52 0 114 s 50 0 115 t 43 2 116 u 69 0 117 v 61 0 118 w 89 0 119 x 61 0 120 y 61 1 121 z 54 0 122 { 39 3 123 --- 61 2 124 } 39 3 125 --- 61 0 126 !! 30 1 161 ct 57 3 162 ps 57 2 163 fr 17 2 164 yn 72 2 165 fn 57 3 166 sc 50 2 167 cr 61 2 168 --- 24 2 169 `` 48 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 69 2 174 fl 69 2 175 en 50 0 177 \- " dg 50 2 178 dd 50 2 179 --- 28 0 180 pg 75 2 182 --- 61 0 183 --- 24 1 184 --- 48 1 185 '' 48 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 ?? 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 98 2 225 --- 37 2 227 --- 72 2 232 --- 83 2 233 --- 100 2 234 --- 37 2 235 --- 87 0 241 --- 37 0 245 --- 35 2 248 --- 61 3 249 --- 91 0 250 --- 61 2 251 0707070014231217061006440057030057030000010642400522627501200002400000003376post.src/devpost/NI name NI fontname NewCenturySchlbk-Italic named in prologue ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 40 2 34 dq " # 61 2 35 $ 56 3 36 % 83 2 37 & 85 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 61 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 70 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 61 2 74 K 74 2 75 L 67 2 76 M 94 2 77 N 81 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 74 2 82 S 67 2 83 T 69 2 84 U 81 2 85 V 70 2 86 W 93 2 87 X 70 2 88 Y 69 2 89 Z 67 2 90 [ 33 3 91 \ 61 2 92 bs " ] 33 3 93 --- 61 2 94 --- 50 1 95 ` 20 2 96 a 57 0 97 b 56 2 98 c 44 0 99 d 61 2 100 e 44 0 101 f 33 3 102 g 54 1 103 h 61 2 104 i 33 2 105 j 32 3 106 k 56 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 44 0 115 t 35 2 116 u 61 0 117 v 52 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 46 0 122 { 33 3 123 --- 61 2 124 } 33 3 125 --- 61 0 126 !! 33 3 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 50 3 167 cr 61 2 168 --- 28 2 169 `` 39 2 170 --- 43 0 171 --- 33 0 172 --- 33 0 173 fi 61 3 174 fl 61 3 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 28 0 180 pg 65 2 182 --- 61 2 183 --- 20 1 184 --- 39 1 185 '' 39 2 186 --- 43 0 187 --- 100 0 188 --- 100 2 189 ?? 44 3 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 87 2 225 --- 42 2 227 --- 67 2 232 --- 78 2 233 --- 98 2 234 --- 37 2 235 --- 72 0 241 --- 33 0 245 --- 33 2 248 --- 50 3 249 --- 78 0 250 --- 56 3 251 0707070014231217071006440057030057030000010642420522627501200002400000003377post.src/devpost/NR name NR fontname NewCenturySchlbk-Roman named in prologue ligatures fi fl 0 spacewidth 28 charset ! 30 2 33 " 39 2 34 dq " # 56 2 35 $ 56 3 36 % 83 2 37 & 81 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 74 2 64 A 72 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 56 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 81 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 72 2 82 S 63 2 83 T 67 2 84 U 81 2 85 V 72 2 86 W 98 2 87 X 70 2 88 Y 70 2 89 Z 61 2 90 [ 33 3 91 \ 61 2 92 bs " ] 33 3 93 --- 61 2 94 --- 50 1 95 ` 20 2 96 a 56 0 97 b 56 2 98 c 44 0 99 d 57 2 100 e 50 0 101 f 33 2 102 g 54 1 103 h 61 2 104 i 32 2 105 j 30 3 106 k 59 2 107 l 32 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 46 0 115 t 39 2 116 u 61 0 117 v 54 0 118 w 78 0 119 x 54 0 120 y 54 1 121 z 48 0 122 { 33 3 123 --- 61 2 124 } 33 3 125 --- 61 0 126 !! 30 3 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 70 2 165 fn 56 3 166 sc 50 3 167 cr 61 2 168 --- 20 2 169 `` 39 2 170 --- 43 0 171 --- 26 0 172 --- 26 0 173 fi 61 2 174 fl 61 2 175 en 56 0 177 \- " dg 50 3 178 dd 50 3 179 --- 28 0 180 pg 61 3 182 --- 61 2 183 --- 20 1 184 --- 39 1 185 '' 39 2 186 --- 43 0 187 --- 100 0 188 --- 100 2 189 ?? 44 3 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 33 2 227 --- 67 2 232 --- 78 2 233 --- 100 2 234 --- 30 2 235 --- 80 0 241 --- 32 0 245 --- 32 2 248 --- 50 2 249 --- 83 0 250 --- 57 2 251 0707070014231217101006440057030057030000010642440522627501200002400000003402post.src/devpost/NX name NX fontname NewCenturySchlbk-BoldItalic named in prologue ligatures fi fl 0 spacewidth 29 charset ! 33 2 33 " 40 2 34 dq " # 61 2 35 $ 57 3 36 % 89 2 37 & 89 2 38 ' 26 2 39 ( 41 3 40 ) 41 3 41 * 50 2 42 + 61 0 43 , 29 1 44 hy 33 0 45 - " . 29 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 29 0 58 ; 29 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 48 2 63 @ 75 2 64 A 74 2 65 B 76 2 66 C 76 2 67 D 83 2 68 E 74 2 69 F 70 2 70 G 81 2 71 H 87 2 72 I 44 2 73 J 67 2 74 K 78 2 75 L 70 2 76 M 94 2 77 N 85 2 78 O 83 2 79 P 74 2 80 Q 83 3 81 R 80 2 82 S 69 2 83 T 72 2 84 U 83 2 85 V 74 2 86 W 94 2 87 X 74 2 88 Y 70 2 89 Z 70 2 90 [ 41 3 91 \ 61 2 92 bs " ] 41 3 93 --- 61 2 94 --- 50 1 95 ` 26 2 96 a 67 0 97 b 61 2 98 c 54 0 99 d 67 2 100 e 52 0 101 f 39 3 102 g 61 1 103 h 69 2 104 i 39 2 105 j 37 3 106 k 65 2 107 l 39 2 108 m 94 0 109 n 69 0 110 o 57 0 111 p 65 1 112 q 63 1 113 r 52 0 114 s 48 0 115 t 41 2 116 u 69 0 117 v 56 0 118 w 83 0 119 x 57 0 120 y 52 1 121 z 52 0 122 { 41 3 123 --- 61 2 124 } 41 3 125 --- 61 0 126 !! 33 3 161 ct 57 3 162 ps 57 2 163 fr 17 2 164 yn 57 2 165 fn 57 3 166 sc 50 3 167 cr 57 2 168 --- 29 2 169 `` 48 2 170 --- 48 0 171 --- 28 0 172 --- 28 0 173 fi 69 3 174 fl 69 3 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 29 0 180 pg 65 2 182 --- 61 0 183 --- 26 1 184 --- 48 1 185 '' 48 2 186 --- 48 0 187 --- 100 0 188 --- 117 2 189 ?? 48 3 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 89 2 225 --- 41 2 227 --- 70 2 232 --- 83 2 233 --- 96 2 234 --- 36 2 235 --- 81 0 241 --- 39 0 245 --- 39 2 248 --- 57 3 249 --- 85 0 250 --- 57 3 251 0707070014231217111006440057030057030000010642460522627501200002400000003367post.src/devpost/PA name PA fontname Palatino-Roman named in prologue ligatures fi fl 0 spacewidth 25 charset ! 28 2 33 " 37 2 34 dq " # 50 2 35 $ 50 2 36 % 84 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 61 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 78 2 65 B 61 2 66 C 71 2 67 D 77 2 68 E 61 2 69 F 56 2 70 G 76 2 71 H 83 2 72 I 34 2 73 J 33 3 74 K 73 2 75 L 61 2 76 M 95 2 77 N 83 2 78 O 79 2 79 P 60 2 80 Q 79 3 81 R 67 2 82 S 53 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 55 2 98 c 44 0 99 d 61 2 100 e 48 0 101 f 33 2 102 g 56 1 103 h 58 2 104 i 29 2 105 j 23 3 106 k 56 2 107 l 29 2 108 m 88 0 109 n 58 0 110 o 55 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 42 0 115 t 33 2 116 u 60 0 117 v 56 0 118 w 83 0 119 x 52 0 120 y 56 1 121 z 50 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 --- 61 0 126 !! 28 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 21 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 61 2 174 fl 61 2 175 en 50 0 177 \- " dg 50 2 178 dd 50 3 179 --- 25 0 180 pg 63 3 182 --- 61 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 114 2 189 ?? 44 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 25 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 38 2 205 Ca 31 1 206 va 33 2 207 em 100 0 208 --- 94 2 225 --- 33 2 227 --- 61 2 232 --- 83 2 233 --- 100 2 234 --- 33 2 235 --- 76 0 241 --- 29 0 245 --- 29 2 248 --- 56 0 249 --- 83 0 250 --- 56 2 251 0707070014231217121006440057030057030000010643200522627501200002400000003370post.src/devpost/PB name PB fontname Palatino-Bold named in prologue ligatures fi fl 0 spacewidth 25 charset ! 28 2 33 " 40 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 30 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 78 2 65 B 67 2 66 C 72 2 67 D 83 2 68 E 61 2 69 F 56 2 70 G 83 2 71 H 83 2 72 I 39 2 73 J 39 3 74 K 78 2 75 L 61 2 76 M 100 2 77 N 83 2 78 O 83 2 79 P 61 2 80 Q 83 3 81 R 72 2 82 S 61 2 83 T 67 2 84 U 78 2 85 V 78 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 61 2 98 c 44 0 99 d 61 2 100 e 50 0 101 f 39 2 102 g 56 1 103 h 61 2 104 i 33 2 105 j 33 3 106 k 61 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 44 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 { 31 2 123 --- 61 2 124 } 31 2 125 --- 61 0 126 !! 28 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 23 2 169 `` 50 2 170 --- 50 0 171 --- 39 0 172 --- 39 0 173 fi 61 2 174 fl 61 2 175 en 50 0 177 \- " dg 50 2 178 dd 50 3 179 --- 25 0 180 pg 64 3 182 --- 61 0 183 --- 33 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 ?? 44 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 44 2 227 --- 61 2 232 --- 83 2 233 --- 100 2 234 --- 49 2 235 --- 78 0 241 --- 33 0 245 --- 33 2 248 --- 56 0 249 --- 83 0 250 --- 61 2 251 0707070014231217131006440057030057030000010643220522627501200002400000003367post.src/devpost/PI name PI fontname Palatino-Italic named in prologue ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 50 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 30 3 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 50 2 63 @ 75 2 64 A 72 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 78 2 72 I 33 2 73 J 33 3 74 K 67 2 75 L 56 2 76 M 94 2 77 N 78 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 44 0 97 b 46 2 98 c 41 0 99 d 50 2 100 e 39 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 44 0 111 p 50 1 112 q 46 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 --- 61 0 126 !! 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 33 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 53 3 174 fl 54 3 175 en 50 0 177 \- " dg 50 2 178 dd 50 3 179 --- 25 0 180 pg 50 3 182 --- 50 0 183 --- 28 0 184 --- 50 0 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 ?? 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 94 2 225 --- 33 2 227 --- 56 2 232 --- 78 2 233 --- 103 2 234 --- 33 2 235 --- 64 0 241 --- 28 0 245 --- 28 2 248 --- 44 0 249 --- 67 0 250 --- 50 3 251 0707070014231217141006440057030057030000010643240522627501200002400000003373post.src/devpost/PX name PX fontname Palatino-BoldItalic named in prologue ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 50 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 hy 39 0 45 - " . 25 0 46 / 32 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 83 2 64 A 72 2 65 B 67 2 66 C 69 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 39 3 74 K 72 2 75 L 61 2 76 M 94 2 77 N 78 2 78 O 83 2 79 P 67 2 80 Q 83 3 81 R 72 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 72 2 88 Y 61 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 56 0 97 b 54 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 33 2 105 j 33 3 106 k 56 2 107 l 33 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 54 1 113 r 39 0 114 s 44 0 115 t 39 2 116 u 56 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 --- 61 0 126 !! 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 56 3 167 cr 50 2 168 --- 25 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 61 3 174 fl 61 3 175 en 50 0 177 \- " dg 56 2 178 dd 56 3 179 --- 25 0 180 pg 56 3 182 --- 61 0 183 --- 25 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 ?? 44 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 56 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 94 2 225 --- 33 2 227 --- 61 2 232 --- 83 2 233 --- 94 2 234 --- 33 2 235 --- 74 0 241 --- 33 0 245 --- 33 2 248 --- 56 0 249 --- 78 0 250 --- 56 3 251 0707070014231217151006440057030057030000010643260522627501200002300000003361post.src/devpost/R name R fontname Times-Roman named in prologue ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 41 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 56 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 --- 56 2 60 = 56 0 61 --- 56 2 62 ? 44 2 63 @ 92 3 64 A 72 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 39 2 74 K 72 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 56 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 72 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 47 2 94 --- 50 1 95 ` 33 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 48 3 123 --- 20 2 124 } 48 3 125 --- 54 0 126 !! 33 1 161 ct 50 3 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 18 2 169 `` 44 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 25 0 180 pg 45 3 182 --- 35 0 183 --- 33 1 184 --- 44 1 185 '' 44 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 ?? 44 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 89 2 225 --- 28 2 227 --- 61 2 232 --- 72 2 233 --- 89 2 234 --- 31 2 235 --- 67 0 241 --- 28 0 245 --- 28 2 248 --- 50 2 249 --- 72 0 250 --- 50 2 251 0707070014231217161006440057030057030000010643400522627501200002300000004400post.src/devpost/S name S fontname Symbol named in prologue special charset --- 33 2 33 fa 71 2 34 --- 50 2 35 te 55 2 36 --- 83 2 37 --- 78 2 38 st 44 0 39 --- 33 3 40 --- 33 3 41 ** 50 2 42 pl 55 0 43 --- 25 1 44 mi 55 0 45 --- 25 0 46 sl 28 2 47 --- 50 2 48 --- 50 2 49 --- 50 2 50 --- 50 2 51 --- 50 2 52 --- 50 2 53 --- 50 2 54 --- 50 2 55 --- 50 2 56 --- 50 2 57 --- 28 0 58 --- 28 1 59 < 55 0 60 eq 55 0 61 > 55 0 62 --- 44 2 63 cg 55 0 64 *A 72 2 65 *B 67 2 66 *X 72 2 67 *D 61 2 68 *E 61 2 69 *F 76 2 70 *G 60 2 71 *Y 72 2 72 *I 33 2 73 --- 63 2 74 *K 72 2 75 *L 69 2 76 *M 89 2 77 *N 72 2 78 *O 72 2 79 *P 77 2 80 *H 74 2 81 *R 56 2 82 *S 59 2 83 *T 61 2 84 *U 69 2 85 ts 44 1 86 *W 77 2 87 *C 65 2 88 *Q 80 2 89 *Z 61 2 90 --- 33 3 91 tf 86 0 92 --- 33 3 93 pp 66 2 94 ul 50 1 95 _ " rn 50 2 96 *a 63 0 97 *b 55 3 98 *x 55 1 99 *d 49 2 100 *e 44 0 101 *f 52 3 102 *g 41 1 103 *y 60 1 104 *i 33 0 105 --- 60 1 106 *k 55 0 107 *l 55 2 108 *m 58 1 109 *n 52 0 110 *o 55 0 111 *p 55 0 112 *h 52 2 113 *r 55 1 114 *s 60 0 115 *t 44 0 116 *u 58 0 117 --- 71 2 118 *w 69 0 119 *c 49 3 120 *q 69 1 121 *z 49 3 122 --- 48 3 123 or 20 3 124 --- 48 3 125 ap 55 0 126 --- 62 2 161 fm 25 2 162 <= 55 2 163 --- 17 2 164 if 73 0 165 --- 50 3 166 --- 75 0 167 --- 75 2 168 --- 75 0 169 --- 75 2 170 ab 104 0 171 <- 99 0 172 ua 60 2 173 -> 99 0 174 da 60 2 175 de 40 2 176 +- 55 2 177 --- 41 2 178 >= 55 2 179 mu 55 0 180 pt 71 0 181 pd 49 2 182 bu 46 0 183 di 55 0 184 != 55 2 185 == 55 0 186 ~~ 55 0 187 el 100 0 188 av 60 3 189 ah 100 0 190 CR 66 2 191 af 82 2 192 If 69 2 193 Rf 80 2 194 ws 99 3 195 Ox 77 2 196 O+ 77 2 197 es 82 2 198 ca 77 0 199 cu 77 0 200 sp 71 0 201 ip 71 1 202 !b 71 0 203 sb 71 0 204 ib 71 1 205 mo 71 0 206 !m 71 2 207 an 77 2 208 gr 71 2 209 rg 79 2 210 co 79 2 211 tm 89 2 212 --- 82 2 213 sr 55 2 214 c. 25 0 215 no 71 0 216 l& 60 0 217 l| 60 0 218 --- 104 0 219 --- 99 0 220 --- 60 2 221 --- 99 0 222 --- 60 2 223 lz 49 2 224 b< 33 3 225 RG 79 2 226 CO 79 2 227 TM 79 2 228 --- 71 2 229 LT 38 3 230 br 0 3 231 LX " LB 38 3 232 lc 50 2 233 lx 38 2 234 lf 50 2 235 lt 49 2 236 lk 49 2 237 lb 49 2 238 bv 49 2 239 | " b> 33 3 241 is 50 3 242 --- 69 2 243 --- 69 2 244 --- 69 2 245 RT 38 3 246 RX 38 2 247 RB 38 3 248 rc 38 2 249 rx 50 3 250 rf 38 2 251 rt 49 2 252 rk 49 2 253 rb 49 2 254 ~= 55 0 1 0707070014231217171006440057030057030000010643430522627501200002400000000501post.src/devpost/S1 # Times-Roman special font name S1 fontname Times-Roman named in prologue special charset ru 50 0 95 ff 60 2 1 Fi 84 2 1 Fl 84 2 1 14 75 2 1 12 75 2 1 34 75 2 1 bx 50 2 1 ob 38 2 1 ci 75 0 1 sq 50 2 1 Sl 50 2 1 L1 110 1 1 LA 110 1 1 LV 110 3 1 LH 210 1 1 lh 100 0 1 rh 100 0 1 lH 100 0 1 rH 100 0 1 PC 220 2 1 DG 185 2 1 0707070014231217201006440057030057030000010643440522627501200002400000004134post.src/devpost/ZD name ZD fontname ZapfDingbats named in prologue charset ! 97 2 33 " 96 2 34 # 97 2 35 $ 98 3 36 % 72 2 37 & 79 3 38 ' 79 3 39 ( 79 3 40 ) 69 2 41 * 96 2 42 + 94 2 43 , 55 3 44 - 86 2 45 . 91 2 46 / 93 2 47 0 91 2 48 1 94 2 49 2 97 2 50 3 76 3 51 4 85 3 52 5 76 2 53 6 76 2 54 7 57 3 55 8 68 3 56 9 76 2 57 : 76 2 58 ; 76 2 59 < 75 3 60 = 49 2 61 > 55 2 62 ? 54 3 63 @ 58 2 64 A 69 3 65 B 79 3 66 C 79 3 67 D 79 3 68 E 79 3 69 F 79 3 70 G 79 3 71 H 82 3 72 I 82 3 73 J 79 3 74 K 84 3 75 L 82 3 76 M 83 3 77 N 82 3 78 O 83 3 79 P 92 3 80 Q 74 2 81 R 72 2 82 S 75 2 83 T 79 3 84 U 79 3 85 V 69 3 86 W 78 3 87 X 77 3 88 Y 79 3 89 Z 76 2 90 [ 71 3 91 \ 71 3 92 ] 68 3 93 ^ 70 3 94 _ 83 3 95 ` 81 3 96 a 79 3 97 b 79 3 98 c 71 3 99 d 69 2 100 e 70 2 101 f 69 2 102 g 79 3 103 h 79 3 104 i 71 3 105 j 79 3 106 k 78 3 107 l 79 3 108 m 87 3 109 n 76 2 110 o 76 2 111 p 76 2 112 q 76 3 113 r 76 3 114 s 89 2 115 t 89 3 116 u 79 3 117 v 78 3 118 w 44 3 119 x 14 2 120 y 28 2 121 z 41 2 122 { 39 2 123 | 39 2 124 } 67 2 125 ~ 67 2 126 hy 73 3 161 em 54 3 162 de 54 3 163 \- 91 2 164 en 67 3 165 ff 76 3 166 fi 76 2 167 fl 78 2 168 Fi 60 3 169 Fl 69 3 170 fm 63 3 171 ru 79 3 172 dg 79 3 173 bu 79 3 174 14 79 3 175 34 79 3 176 12 79 3 177 ct 79 3 178 rg 79 3 179 sq 79 3 180 sl 79 3 181 ul 79 3 182 or 79 3 183 no 79 3 184 -> 79 3 185 <- 79 3 186 da 79 3 187 lh 79 3 188 ua 79 3 189 ab 79 3 190 !b 79 3 191 aa 79 3 192 !m 79 3 193 ga 79 3 194 pl 79 3 195 mi 79 3 196 mu 79 3 197 di 79 3 198 eq 79 3 199 == 79 3 200 >= 79 3 201 <= 79 3 202 != 79 3 203 +- 79 3 204 -+ 79 3 205 ap 79 3 206 ~= 79 3 207 gr 79 3 208 is 79 3 209 pd 79 3 210 if 79 3 211 sr 89 2 212 rn 84 2 213 sb 102 2 214 sp 46 3 215 cu 75 2 216 ca 92 2 217 ib 75 2 218 ip 92 2 219 mo 93 2 220 es 93 2 221 sc 93 2 222 dd 83 2 223 lc 87 2 224 rc 83 2 225 lf 92 2 226 rf 92 2 227 bv 92 2 228 ** 93 2 229 br 93 2 230 ci 46 3 231 ts 88 2 232 co 84 2 233 lt 84 2 234 rt 87 2 235 lb 87 2 236 rb 70 2 237 lk 70 2 238 rk 87 2 239 rh 87 2 241 tm 76 2 242 Sl 95 2 243 ps 77 2 244 cs 86 2 245 cy 77 2 246 as 89 3 247 os 97 2 248 =. 89 3 249 ld 83 2 250 rd 87 2 251 le 93 2 252 ge 97 2 253 pp 92 2 254 0707070014231217211006440057030057030000010643600522627501200002400000003376post.src/devpost/ZI name ZI fontname ZapfChancery-MediumItalic named in prologue ligatures fi fl 0 spacewidth 22 charset ! 28 2 33 " 22 2 34 dq " # 68 2 35 $ 44 3 36 % 68 2 37 & 78 2 38 ' 24 2 39 ( 26 3 40 ) 22 3 41 * 42 2 42 + 52 0 43 , 22 0 44 hy 28 0 45 - " . 22 0 46 / 34 3 47 0 44 2 48 1 44 2 49 2 44 2 50 3 44 2 51 4 44 2 52 5 44 2 53 6 44 2 54 7 44 2 55 8 44 2 56 9 44 2 57 : 26 0 58 ; 24 0 59 --- 52 0 60 = 52 0 61 --- 52 0 62 ? 38 2 63 @ 70 2 64 A 62 2 65 B 60 2 66 C 52 2 67 D 70 2 68 E 62 2 69 F 58 2 70 G 62 3 71 H 68 2 72 I 38 2 73 J 40 2 74 K 66 3 75 L 58 2 76 M 84 2 77 N 70 3 78 O 60 2 79 P 54 2 80 Q 60 3 81 R 60 3 82 S 46 2 83 T 50 2 84 U 74 2 85 V 64 2 86 W 88 2 87 X 56 2 88 Y 56 3 89 Z 62 2 90 [ 24 3 91 \ 48 2 92 bs " ] 32 3 93 --- 52 2 94 --- 50 1 95 ` 24 2 96 a 42 0 97 b 42 2 98 c 34 0 99 d 44 2 100 e 34 0 101 f 32 3 102 g 40 1 103 h 44 2 104 i 24 2 105 j 22 3 106 k 44 3 107 l 24 2 108 m 62 0 109 n 46 0 110 o 40 0 111 p 44 1 112 q 40 3 113 r 30 0 114 s 32 0 115 t 32 2 116 u 46 0 117 v 44 0 118 w 68 0 119 x 42 1 120 y 40 1 121 z 44 0 122 { 24 3 123 --- 52 2 124 } 24 3 125 --- 52 0 126 !! 28 1 161 ct 44 2 162 ps 48 2 163 fr 6 2 164 yn 72 3 165 fn 40 3 166 sc 42 3 167 cr 60 2 168 --- 16 2 169 `` 34 2 170 --- 34 0 171 --- 24 0 172 --- 26 0 173 fi 52 3 174 fl 52 3 175 en 50 0 177 \- " dg 46 3 178 dd 48 3 179 --- 22 0 180 pg 50 3 182 --- 60 2 183 --- 18 0 184 --- 28 0 185 '' 36 2 186 --- 38 0 187 --- 100 0 188 --- 96 2 189 ?? 40 1 191 ga 22 2 193 \` " aa 30 2 194 \' " ^a 34 2 195 ^ " ~a 44 2 196 ~ " -a 44 2 197 Ua 44 2 198 .a 22 2 199 :a 36 2 200 oa 30 2 202 ,a 30 1 203 "a 40 2 205 Ca 28 1 206 va 34 2 207 em 100 0 208 --- 74 2 225 --- 26 2 227 --- 58 2 232 --- 66 3 233 --- 82 2 234 --- 26 2 235 --- 54 0 241 --- 24 0 245 --- 30 2 248 --- 44 3 249 --- 56 0 250 --- 42 3 251 0707070014230000050407550057030057030000020036570522627501400003100000000000post.src/devpost/charlib 0707070014230001611006440057030057030000010072070522627501200003400000000421post.src/devpost/charlib/12 /build_12 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (2) show optsize ofont f } def 0707070014230001731006440057030057030000010032400522627501200003400000000421post.src/devpost/charlib/14 /build_14 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 0707070014230001741006440057030057030000010032410522627501200003400000000421post.src/devpost/charlib/34 /build_34 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (3) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 0707070014230005521006440057030057030000010073200522627501300003400000014726post.src/devpost/charlib/LV % % PostScript 12 and 8 line logos - vertical configuration. Switch occurs % automatically below point size 29. Code from Matthijs Melchior. % /LOGO-dict-mm where not { 64 dict /LOGO-dict-mm exch def }{pop} ifelse LOGO-dict-mm begin % initialize dictionary /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LV { % standard ATT logo LOGO-dict-mm begin /w exch def ptsize 29 lt % select globe, # lines depends on point size { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale gsave 1.02 1 transform round exch round exch itransform translate globe fill grestore gsave %2.15 .62 translate -0.1 -1.0 translate .78 dup scale ATT fill grestore grestore end } def 0707070014230005531006440057030057030000010073270522627501300003400000000075post.src/devpost/charlib/Fi /build_Fi { pop size .05 mul neg 0 (ffi) ashow } def 0707070014230005541006440057030057030000010041550522627501300003400000000075post.src/devpost/charlib/Fl /build_Fl { pop size .05 mul neg 0 (ffl) ashow } def 0707070014230005551006440057030057030000010110620522627501300003400000012536post.src/devpost/charlib/L1 /LOGO-dict-mm dup where not { dup 64 dict def currentdict } if exch get begin /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def end /build_L1 { pop LOGO-dict-mm begin ptsize 29 lt { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale 1.02 1 transform round exch round exch itransform translate globe fill grestore end } def 0707070014230005561006440057030057030000010073400522627501300003400000014673post.src/devpost/charlib/LH % % PostScript 12 and 8 line logos - horizontal configuration. Switch occurs % automatically below point size 29. Code from Matthijs Melchior. % /LOGO-dict-mm where not { 64 dict /LOGO-dict-mm exch def }{pop} ifelse LOGO-dict-mm begin % initialize dictionary /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LH { % standard ATT logo LOGO-dict-mm begin /w exch def ptsize 29 lt % select globe, # lines depends on point size { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale gsave 1.02 1 transform round exch round exch itransform translate globe fill grestore gsave 2.15 .62 translate .78 dup scale ATT fill grestore grestore end } def 0707070014230005571006440057030057030000010041560522627501300004000000001173post.src/devpost/charlib/README Postscript definitions for special troff characters. File names are the two character troff names. Each defines a PostScript procedure that begins with build_ and ends with the character's name. The build_?? procedure is called with the character width as it's only argument. The .map files contain extra character data (e.g. image data) that dpost downloads immediately after the build_?? call, if the character's font table code field is 2 (rather than 1). The following PostScript variables are available: font current font ptsize current point size size actual font size - scaled up from ptsize Don't overuse this stuff! 0707070014230005601006440057030057030000010041760522627501300003400000002631post.src/devpost/charlib/Sl /build_Sl { pop gsave size .0022 mul dup scale currentpoint translate 14 93 moveto 14 96 lineto 29 110 lineto 44 121 lineto 54 127 lineto 55 132 lineto 57 146 lineto 59 157 lineto 62 171 lineto 66 186 lineto 70 199 lineto 75 213 lineto 81 228 lineto 88 243 lineto 96 257 lineto 106 272 lineto 118 287 lineto 133 300 lineto 148 307 lineto 163 308 lineto 178 304 lineto 191 293 lineto 197 281 lineto 198 277 lineto 198 260 lineto 194 246 lineto 187 231 lineto 179 217 lineto 168 202 lineto 155 187 lineto 141 172 lineto 126 158 lineto 111 146 lineto 96 136 lineto 94 131 lineto 93 123 lineto 92 112 lineto 91 103 lineto 90 93 lineto 89 81 lineto 89 40 lineto 92 28 lineto 97 18 lineto 108 10 lineto 122 10 lineto 134 18 lineto 145 33 lineto 152 48 lineto 158 62 lineto 168 58 lineto 168 59 lineto 163 45 lineto 157 31 lineto 148 16 lineto 133 3 lineto 118 -1 lineto 103 0 lineto 88 5 lineto 73 18 lineto 64 31 lineto 58 46 lineto 55 59 lineto 53 73 lineto 52 111 lineto 37 101 lineto 22 86 lineto 14 93 lineto 97 152 moveto 97 153 lineto 99 166 lineto 101 178 lineto 103 190 lineto 106 205 lineto 109 218 lineto 113 232 lineto 118 246 lineto 124 261 lineto 132 275 lineto 144 290 lineto 157 298 lineto 171 298 lineto 181 291 lineto 186 283 lineto 187 279 lineto 187 264 lineto 186 260 lineto 181 246 lineto 174 233 lineto 165 218 lineto 155 204 lineto 142 190 lineto 127 175 lineto 112 162 lineto 97 152 lineto eofill grestore } def 0707070014230005611006440057030057030000010073470522627501300003400000000264post.src/devpost/charlib/bx /build_bx { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath fill } def 0707070014230005621006440057030057030000010044040522627501300003400000000221post.src/devpost/charlib/ci /build_ci { pop size 3 mul 8 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 0707070014230005631006440057030057030000010044050522627501300003400000000074post.src/devpost/charlib/ff /build_ff { pop size .05 mul neg 0 (ff) ashow } def 0707070014230005641006440057030057030000010073050522627501300003400000001716post.src/devpost/charlib/lc % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch neg rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 0707070014230005651006440057030057030000010073060522627501300003400000001712post.src/devpost/charlib/lf % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 0707070014230005661006440057030057030000010073600522627501300003400000004412post.src/devpost/charlib/lh /build_lh { pop gsave size .0022 mul dup scale currentpoint translate 16 177 moveto 16 188 lineto 21 193 lineto 30 193 lineto 34 189 lineto 36 183 lineto 36 180 lineto 34 174 lineto 27 170 lineto 19 172 lineto 16 177 lineto stroke 38 194 moveto 38 196 lineto 53 199 lineto 68 201 lineto 83 202 lineto 98 203 lineto 113 204 lineto 128 204 lineto 143 205 lineto 158 205 lineto 173 205 lineto 188 204 lineto 203 203 lineto 218 202 lineto 233 200 lineto 248 198 lineto 263 196 lineto 278 194 lineto 293 190 lineto 308 186 lineto 323 181 lineto 338 176 lineto 353 168 lineto 361 162 lineto 364 153 lineto 366 138 lineto 367 126 lineto 368 106 lineto 369 80 lineto 369 74 lineto 368 60 lineto 367 54 lineto 362 43 lineto 348 34 lineto 333 28 lineto 318 25 lineto 303 26 lineto 288 29 lineto 273 31 lineto 258 32 lineto 243 32 lineto 228 30 lineto 213 27 lineto 198 24 lineto 183 23 lineto 168 23 lineto 153 27 lineto 148 34 lineto 148 47 lineto 153 54 lineto 168 58 lineto 183 58 lineto 198 58 lineto 213 59 lineto 226 60 lineto 228 62 lineto 228 67 lineto 223 71 lineto 208 71 lineto 193 70 lineto 178 70 lineto 163 70 lineto 148 70 lineto 133 71 lineto 123 76 lineto 120 84 lineto 120 91 lineto 122 98 lineto 129 104 lineto 144 106 lineto 159 107 lineto 174 107 lineto 189 107 lineto 202 108 lineto 204 110 lineto 204 117 lineto 201 119 lineto 186 119 lineto 171 119 lineto 156 119 lineto 141 119 lineto 126 119 lineto 111 121 lineto 103 128 lineto 101 137 lineto 101 142 lineto 103 150 lineto 111 158 lineto 126 161 lineto 141 161 lineto 156 162 lineto 171 163 lineto 186 163 lineto 191 165 lineto 192 167 lineto 192 171 lineto 190 174 lineto 176 175 lineto 161 175 lineto 146 175 lineto 131 174 lineto 116 174 lineto 101 174 lineto 86 173 lineto 71 172 lineto 56 171 lineto 41 171 lineto 41 174 lineto 43 178 lineto 43 187 lineto 38 194 lineto stroke 373 169 moveto 373 176 lineto 375 182 lineto 386 190 lineto 401 193 lineto 408 191 lineto 411 185 lineto 412 181 lineto 414 167 lineto 415 158 lineto 416 144 lineto 417 128 lineto 418 110 lineto 418 60 lineto 417 45 lineto 415 37 lineto 409 34 lineto 394 31 lineto 381 35 lineto 379 42 lineto 379 52 lineto 380 67 lineto 380 77 lineto 379 77 lineto 378 106 lineto 377 121 lineto 376 133 lineto 375 147 lineto 374 158 lineto 373 169 lineto stroke grestore } def 0707070014230005671006440057030057030000010073070522627501300003400000000222post.src/devpost/charlib/ob /build_ob { pop size 3 mul 16 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 0707070014230005701006440057030057030000010073630522627501300003400000001716post.src/devpost/charlib/rc % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch neg rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 0707070014230005711006440057030057030000010073640522627501300003400000001712post.src/devpost/charlib/rf % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 0707070014230005721006440057030057030000010073650522627501300003400000004171post.src/devpost/charlib/rh /build_rh { pop gsave size .0022 mul dup scale currentpoint translate 15 66 moveto 15 86 lineto 16 131 lineto 17 146 lineto 18 158 lineto 19 167 lineto 21 181 lineto 24 190 lineto 34 193 lineto 49 189 lineto 58 182 lineto 60 177 lineto 60 166 lineto 59 156 lineto 58 143 lineto 57 130 lineto 56 117 lineto 55 102 lineto 54 42 lineto 53 39 lineto 49 35 lineto 34 34 lineto 19 39 lineto 16 47 lineto 15 66 lineto stroke 65 60 moveto 65 111 lineto 66 127 lineto 67 139 lineto 69 153 lineto 72 163 lineto 83 171 lineto 98 177 lineto 113 182 lineto 128 187 lineto 143 190 lineto 158 194 lineto 173 196 lineto 188 199 lineto 203 201 lineto 218 203 lineto 233 205 lineto 248 205 lineto 263 206 lineto 278 206 lineto 293 206 lineto 308 206 lineto 323 206 lineto 338 205 lineto 353 203 lineto 368 202 lineto 383 200 lineto 394 197 lineto 389 190 lineto 389 180 lineto 391 176 lineto 391 173 lineto 380 173 lineto 365 173 lineto 350 174 lineto 335 175 lineto 320 176 lineto 305 176 lineto 290 176 lineto 275 177 lineto 260 177 lineto 245 177 lineto 240 173 lineto 240 170 lineto 245 165 lineto 260 164 lineto 275 164 lineto 290 164 lineto 305 163 lineto 320 160 lineto 327 155 lineto 330 149 lineto 330 134 lineto 328 129 lineto 323 124 lineto 309 121 lineto 294 121 lineto 279 121 lineto 264 121 lineto 249 121 lineto 234 121 lineto 228 118 lineto 228 112 lineto 234 109 lineto 249 109 lineto 264 109 lineto 279 108 lineto 294 108 lineto 306 104 lineto 311 97 lineto 312 91 lineto 312 88 lineto 311 82 lineto 305 74 lineto 290 72 lineto 275 72 lineto 260 72 lineto 245 73 lineto 230 73 lineto 215 73 lineto 205 70 lineto 205 63 lineto 217 60 lineto 232 60 lineto 247 60 lineto 262 60 lineto 277 57 lineto 283 52 lineto 285 44 lineto 285 41 lineto 284 35 lineto 280 30 lineto 268 26 lineto 253 25 lineto 238 26 lineto 223 28 lineto 208 31 lineto 193 33 lineto 178 34 lineto 163 33 lineto 148 31 lineto 133 28 lineto 118 27 lineto 103 28 lineto 88 34 lineto 73 43 lineto 67 52 lineto 65 60 lineto stroke 396 180 moveto 396 188 lineto 399 194 lineto 410 196 lineto 416 190 lineto 416 180 lineto 415 177 lineto 411 173 lineto 400 173 lineto 396 180 lineto stroke grestore } def 0707070014230005731006440057030057030000010074000522627501300003400000000320post.src/devpost/charlib/sq /build_sq { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath font B eq {fill} {stroke} ifelse } def 0707070014230005741006440057030057030000010074010522627501400003400000000130post.src/devpost/charlib/~= /build_~= { pop (\176) stringwidth pop neg size -.15 mul (\176\055) ashow } def 0707070014230005751006440057030057030000010074020522627501400003400000000327post.src/devpost/charlib/RC /build_RC { pop size 4 div /side exch def currentpoint newpath moveto 0 side 1.5 mul rmoveto 0 side rlineto side 2.5 mul 0 rlineto 0 side neg rlineto closepath fill } def 0707070014230005761006440057030057030000010074030522627501400003400000001051post.src/devpost/charlib/DG % % UMDS danger sign - needs to be cleaned up! % /build_DG { /x0 1.5 6 div 72 mul def % triangle length pop gsave currentpoint translate 1 scaling div ptsize 10 div mul dup scale 2 setlinewidth 0 setlinecap newpath 0 0 moveto x0 0 lineto x0 2 div x0 3 sqrt 2 div mul lineto closepath fill 1 setgray /Helvetica-Bold findfont 12 scalefont setfont 0 0 moveto (!) false charpath pathbbox exch 4 -1 roll add 2 div x0 2 div exch sub 0 moveto exch sub x0 3 sqrt 2 div mul exch sub 3 div 0 exch rmoveto (!) show grestore } def 0707070014230005771006440057030057030000010074040522627501400003400000000735post.src/devpost/charlib/PC % % UMDS pencil - needs to be cleaned up. % /build_PC { pop gsave currentpoint translate 1 scaling div ptsize 10 div mul dup scale newpath 0 setlinecap 1 setlinejoin 2 setlinewidth 0 1 moveto 12 0 rlineto stroke 0 5 moveto 12 0 rlineto stroke 0 9 moveto 12 0 rlineto stroke 1 setlinewidth 12 .5 moveto 21.27362 5 lineto 12 9.5 lineto stroke 21.27362 5 moveto .4 9.27362 mul neg .4 4 mul rlineto 0 .8 4 mul neg rlineto closepath fill grestore } def 0707070014230006001006440057030057030000010074050522627501400003400000004404post.src/devpost/charlib/lH /build_lH { pop gsave size .0022 mul dup scale currentpoint translate 16 177 moveto 16 188 lineto 21 193 lineto 30 193 lineto 34 189 lineto 36 183 lineto 36 180 lineto 34 174 lineto 27 170 lineto 19 172 lineto 16 177 lineto fill 38 194 moveto 38 196 lineto 53 199 lineto 68 201 lineto 83 202 lineto 98 203 lineto 113 204 lineto 128 204 lineto 143 205 lineto 158 205 lineto 173 205 lineto 188 204 lineto 203 203 lineto 218 202 lineto 233 200 lineto 248 198 lineto 263 196 lineto 278 194 lineto 293 190 lineto 308 186 lineto 323 181 lineto 338 176 lineto 353 168 lineto 361 162 lineto 364 153 lineto 366 138 lineto 367 126 lineto 368 106 lineto 369 80 lineto 369 74 lineto 368 60 lineto 367 54 lineto 362 43 lineto 348 34 lineto 333 28 lineto 318 25 lineto 303 26 lineto 288 29 lineto 273 31 lineto 258 32 lineto 243 32 lineto 228 30 lineto 213 27 lineto 198 24 lineto 183 23 lineto 168 23 lineto 153 27 lineto 148 34 lineto 148 47 lineto 153 54 lineto 168 58 lineto 183 58 lineto 198 58 lineto 213 59 lineto 226 60 lineto 228 62 lineto 228 67 lineto 223 71 lineto 208 71 lineto 193 70 lineto 178 70 lineto 163 70 lineto 148 70 lineto 133 71 lineto 123 76 lineto 120 84 lineto 120 91 lineto 122 98 lineto 129 104 lineto 144 106 lineto 159 107 lineto 174 107 lineto 189 107 lineto 202 108 lineto 204 110 lineto 204 117 lineto 201 119 lineto 186 119 lineto 171 119 lineto 156 119 lineto 141 119 lineto 126 119 lineto 111 121 lineto 103 128 lineto 101 137 lineto 101 142 lineto 103 150 lineto 111 158 lineto 126 161 lineto 141 161 lineto 156 162 lineto 171 163 lineto 186 163 lineto 191 165 lineto 192 167 lineto 192 171 lineto 190 174 lineto 176 175 lineto 161 175 lineto 146 175 lineto 131 174 lineto 116 174 lineto 101 174 lineto 86 173 lineto 71 172 lineto 56 171 lineto 41 171 lineto 41 174 lineto 43 178 lineto 43 187 lineto 38 194 lineto fill 373 169 moveto 373 176 lineto 375 182 lineto 386 190 lineto 401 193 lineto 408 191 lineto 411 185 lineto 412 181 lineto 414 167 lineto 415 158 lineto 416 144 lineto 417 128 lineto 418 110 lineto 418 60 lineto 417 45 lineto 415 37 lineto 409 34 lineto 394 31 lineto 381 35 lineto 379 42 lineto 379 52 lineto 380 67 lineto 380 77 lineto 379 77 lineto 378 106 lineto 377 121 lineto 376 133 lineto 375 147 lineto 374 158 lineto 373 169 lineto fill grestore } def 0707070014230006011006440057030057030000010074200522627501400003400000004163post.src/devpost/charlib/rH /build_rH { pop gsave size .0022 mul dup scale currentpoint translate 15 66 moveto 15 86 lineto 16 131 lineto 17 146 lineto 18 158 lineto 19 167 lineto 21 181 lineto 24 190 lineto 34 193 lineto 49 189 lineto 58 182 lineto 60 177 lineto 60 166 lineto 59 156 lineto 58 143 lineto 57 130 lineto 56 117 lineto 55 102 lineto 54 42 lineto 53 39 lineto 49 35 lineto 34 34 lineto 19 39 lineto 16 47 lineto 15 66 lineto fill 65 60 moveto 65 111 lineto 66 127 lineto 67 139 lineto 69 153 lineto 72 163 lineto 83 171 lineto 98 177 lineto 113 182 lineto 128 187 lineto 143 190 lineto 158 194 lineto 173 196 lineto 188 199 lineto 203 201 lineto 218 203 lineto 233 205 lineto 248 205 lineto 263 206 lineto 278 206 lineto 293 206 lineto 308 206 lineto 323 206 lineto 338 205 lineto 353 203 lineto 368 202 lineto 383 200 lineto 394 197 lineto 389 190 lineto 389 180 lineto 391 176 lineto 391 173 lineto 380 173 lineto 365 173 lineto 350 174 lineto 335 175 lineto 320 176 lineto 305 176 lineto 290 176 lineto 275 177 lineto 260 177 lineto 245 177 lineto 240 173 lineto 240 170 lineto 245 165 lineto 260 164 lineto 275 164 lineto 290 164 lineto 305 163 lineto 320 160 lineto 327 155 lineto 330 149 lineto 330 134 lineto 328 129 lineto 323 124 lineto 309 121 lineto 294 121 lineto 279 121 lineto 264 121 lineto 249 121 lineto 234 121 lineto 228 118 lineto 228 112 lineto 234 109 lineto 249 109 lineto 264 109 lineto 279 108 lineto 294 108 lineto 306 104 lineto 311 97 lineto 312 91 lineto 312 88 lineto 311 82 lineto 305 74 lineto 290 72 lineto 275 72 lineto 260 72 lineto 245 73 lineto 230 73 lineto 215 73 lineto 205 70 lineto 205 63 lineto 217 60 lineto 232 60 lineto 247 60 lineto 262 60 lineto 277 57 lineto 283 52 lineto 285 44 lineto 285 41 lineto 284 35 lineto 280 30 lineto 268 26 lineto 253 25 lineto 238 26 lineto 223 28 lineto 208 31 lineto 193 33 lineto 178 34 lineto 163 33 lineto 148 31 lineto 133 28 lineto 118 27 lineto 103 28 lineto 88 34 lineto 73 43 lineto 67 52 lineto 65 60 lineto fill 396 180 moveto 396 188 lineto 399 194 lineto 410 196 lineto 416 190 lineto 416 180 lineto 415 177 lineto 411 173 lineto 400 173 lineto 396 180 lineto fill grestore } def 0707070014230006021006440057030057030000010074230522627501400004400000010521post.src/devpost/charlib/LH.example % % An example logo character. Building the PostScript program that prints % your company logo is not addressed here; we assume you already have % such a program, that it's relatively simple, and that it prints the % logo by itself on a page. What you'll find here are instructions for % converting that logo program into a character that can be accessed by % troff and dpost. % % Building a new charlib character involves some PostScript programming. % We've tried to isolate parameters that you'll need to change (Xoffset, % Yoffset, and Scaling), but we can't guarantee things will work properly % with every logo program. PostScript is a complex language and subtle % interactions between your logo program and what we've done here can % cause problems. % % Tuning the new character is an iterative process. You may want to adjust % the size of the logo (via Scaling), it's position relative to adjacent % characters and the baseline (Xoffset and Yoffset), and the distance troff % moves after printing the character (width field in file ../S1). The steps % to follow are: % % 1: Create a simple troff test file for the new character. Something % like, % % .sp 1i % .ps 10 % size 10: \(LH % .sp 1i % .ps 18 % size 18: \(LH % .sp 1i % .ps 36 % size 36: \(LH % .sp 1i % .ps 10 % four logo characters: \(LH\(LH\(LH\(LH % % is sufficient. The test file can go anywhere. % % 2: Change into directory /usr/lib/font/devpost/charlib. All file % pathnames will be relative to that directory. % % 3: Save a copy of the working LH logo file. Then replace LH with % this file (i.e. LH.example). Changes described below should be % be made in the new LH file (not in LH.example). % % 4: Your PostScript logo program will eventually replace whatever % you find between the <<StartLogo>> and <<EndLogo>> comment lines % in the PostScript build_LH procedure (below). What's there now % prints an example logo that you can use until you understand the % remaining steps. % % 5: Print your troff test file using (assuming your making changes % in the devpost charlib directory), % % troff -Tpost testfile | dpost | lp ... % % 6: Adjust the logo positioning by changing the numbers assigned to % Xoffset and Yoffset (below). Both are in units of 72 per inch. % Positive offsets should move the logo to the right and up the % page. % % 7: Adjust the logo size by changing the the number assigned to % Scaling. Unitsize also controls scaling, but there's no good % reason to change both Scaling and Unitsize. % % 8: Control the horizontal distance troff moves after printing the % new LH character by changing the width (i.e. the number in the % second column) assigned to LH in file ../S1. Character width % adjustments should probably wait until you're satisfied with % the Scaling set in step 7. % % 9: Back to step 5 until your satisfied with the output. % % The remaining steps are suggested but not required: % % 10: Delete PostScript comments in your new LH charlib file - comments % start with % and go to the end of the line. % % 11: Update the width field assigned to LH in file ../shell.lib. The % new width should reflect what's currently in your S1 font file. % % 12: Make a similiar set of changes in /usr/lib/font/devLatin1/charlib. % You can use the devpost version of LH to devLatin1/charlib/LH, % but changes to files devLatin1/S1 and devLatin1/shell.lib must be % entered by hand. % /Logo_Dict 100 dict dup begin /Xoffset 0 def % 72 dpi with positive to the right /Yoffset 0 def % 72 dpi with positive up the page /Scaling 1.0 def % adjust this number to change the size /Unitsize 36 def % for point size scaling - leave it be /showpage {} def end def /build_LH { % don't bind this procedure Logo_Dict begin gsave /charwidth exch def currentpoint translate resolution 72 div dup scale Xoffset Yoffset translate Scaling Scaling scale ptsize Unitsize div dup scale %% Replace everything between the <<StartLogo>> and <<EndLogo>> %% comment lines by the PostScript program that prints your %% logo. %% <<StartLogo>> newpath .5 .5 scale 0 0 moveto 100 0 lineto 100 100 lineto closepath .5 setgray fill 0 setgray 10 10 translate 45 rotate 0 5 moveto /Helvetica findfont 18 scalefont setfont (Example Logo) show %% <<EndLogo>> grestore end } def 0707070014230006031006440057030057030000010074400522627501400003400000001725post.src/devpost/charlib/LA /LOGO-dict-mm dup where not { dup 64 dict def currentdict } if exch get begin /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LA { pop LOGO-dict-mm begin gsave currentpoint translate size 2.56 div dup scale % was size 2.75 div dup scale .02 0 translate ATT fill grestore end } def 0707070014231217221006440057030057030000010644200522627501400003300000035321post.src/devpost/shell.lib # # Shell library - for building devpost tables. Original collection was # built on a Version 47.0 PS-810. # RESOLUTION=720 UNITWIDTH=10 # # BuiltinTables returns command lines that generate PostScript programs # for building a typesetter description file and font width tables for # a relatively standard collection of fonts. Use awk to select a command # line or modify an existing command to build a width table for a new # font. # BuiltinTables() { cat <<-'//End of BuiltinTables' Proportional R Times-Roman Proportional I Times-Italic Proportional B Times-Bold Proportional BI Times-BoldItalic Proportional AB AvantGarde-Demi Proportional AI AvantGarde-BookOblique Proportional AR AvantGarde-Book Proportional AX AvantGarde-DemiOblique Proportional H Helvetica Proportional HB Helvetica-Bold Proportional HI Helvetica-Oblique Proportional HX Helvetica-BoldOblique Proportional Hb Helvetica-Narrow-Bold Proportional Hi Helvetica-Narrow-Oblique Proportional Hr Helvetica-Narrow Proportional Hx Helvetica-Narrow-BoldOblique Proportional KB Bookman-Demi Proportional KI Bookman-LightItalic Proportional KR Bookman-Light Proportional KX Bookman-DemiItalic Proportional NB NewCenturySchlbk-Bold Proportional NI NewCenturySchlbk-Italic Proportional NR NewCenturySchlbk-Roman Proportional NX NewCenturySchlbk-BoldItalic Proportional PA Palatino-Roman Proportional PB Palatino-Bold Proportional PI Palatino-Italic Proportional PX Palatino-BoldItalic Proportional ZI ZapfChancery-MediumItalic FixedWidth C Courier FixedWidth CB Courier-Bold FixedWidth CI Courier-Oblique FixedWidth CO Courier FixedWidth CW Courier FixedWidth CX Courier-BoldOblique Dingbats ZD ZapfDingbats Greek GR Symbol Symbol S Symbol Special S1 Times-Roman Description DESC --- //End of BuiltinTables } # # AllTables prints the complete list of builtin font names. # AllTables() { BuiltinTables | awk '{print $2}' } # # Charset functions generate keyword/value pairs (as PostScript objects) # that describe the character set available in a font. The keyword is a # PostScript string that represents troff's name for the character. The # value is usually the literal name (i.e. begins with a /) assigned to # the character in the PostScript font. The value can also be an integer # or a PostScript string. An integer value is used as an index in the # current font's Encoding array. A string value is returned to the host # unchanged when the entry for the character is constructed. Entries that # have (") as their value are synonyms for the preceeding character. # StandardCharset() { cat <<-'//End of StandardCharset' (!) /exclam (") /quotedbl (dq) (") (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (hy) /hyphen (-) (") % synonym (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (bs) (") (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (!!) /exclamdown (ct) /cent (ps) /sterling (fr) /fraction (yn) /yen (fn) /florin (sc) /section (cr) /currency (---) /quotesingle (``) /quotedblleft (---) /guillemotleft (---) /guilsinglleft (---) /guilsinglright (fi) /fi (fl) /fl (en) /endash (\\-) (") (dg) /dagger (dd) /daggerdbl (---) /periodcentered (pg) /paragraph (---) /bullet (---) /quotesinglbase (---) /quotedblbase ('') /quotedblright (---) /guillemotright (---) /ellipsis (---) /perthousand (??) /questiondown (ga) /grave (\\`) (") (aa) /acute (\\') (") (^a) /circumflex (~a) /tilde (-a) /macron (Ua) /breve (.a) /dotaccent (:a) /dieresis (oa) /ring (,a) /cedilla ("a) /hungarumlaut (Ca) /ogonek (va) /caron (em) /emdash (---) /AE (---) /ordfeminine (---) /Lslash (---) /Oslash (---) /OE (---) /ordmasculine (---) /ae (---) /dotlessi (---) /lslash (---) /oslash (---) /oe (---) /germandbls //End of StandardCharset } SymbolCharset() { cat <<-'//End of SymbolCharset' (---) /exclam (fa) /universal (---) /numbersign (te) /existential (---) /percent (---) /ampersand (st) /suchthat (---) /parenleft (---) /parenright (**) /asteriskmath (pl) /plus (---) /comma (mi) /minus (---) /period (sl) /slash (---) /zero (---) /one (---) /two (---) /three (---) /four (---) /five (---) /six (---) /seven (---) /eight (---) /nine (---) /colon (---) /semicolon (<) /less (eq) /equal (>) /greater (---) /question (cg) /congruent (*A) /Alpha (*B) /Beta (*X) /Chi (*D) /Delta (*E) /Epsilon (*F) /Phi (*G) /Gamma (*Y) /Eta (*I) /Iota (---) /theta1 (*K) /Kappa (*L) /Lambda (*M) /Mu (*N) /Nu (*O) /Omicron (*P) /Pi (*H) /Theta (*R) /Rho (*S) /Sigma (*T) /Tau (*U) /Upsilon (ts) /sigma1 (*W) /Omega (*C) /Xi (*Q) /Psi (*Z) /Zeta (---) /bracketleft (tf) /therefore (---) /bracketright (pp) /perpendicular (ul) /underscore (_) (") % synonym (rn) /radicalex (*a) /alpha (*b) /beta (*x) /chi (*d) /delta (*e) /epsilon (*f) /phi (*g) /gamma (*y) /eta (*i) /iota (---) /phi1 (*k) /kappa (*l) /lambda (*m) /mu (*n) /nu (*o) /omicron (*p) /pi (*h) /theta (*r) /rho (*s) /sigma (*t) /tau (*u) /upsilon (---) /omega1 (*w) /omega (*c) /xi (*q) /psi (*z) /zeta (---) /braceleft (or) /bar (---) /braceright (ap) /similar (---) /Upsilon1 (fm) /minute (<=) /lessequal (---) /fraction (if) /infinity (---) /florin (---) /club (---) /diamond (---) /heart (---) /spade (ab) /arrowboth (<-) /arrowleft (ua) /arrowup (->) /arrowright (da) /arrowdown (de) /degree (+-) /plusminus (---) /second (>=) /greaterequal (mu) /multiply (pt) /proportional (pd) /partialdiff (bu) /bullet (di) /divide (!=) /notequal (==) /equivalence (~~) /approxequal (el) /ellipsis (av) /arrowvertex (ah) /arrowhorizex (CR) /carriagereturn (af) /aleph (If) /Ifraktur (Rf) /Rfraktur (ws) /weierstrass (Ox) /circlemultiply (O+) /circleplus (es) /emptyset (ca) /intersection (cu) /union (sp) /propersuperset (ip) /reflexsuperset (!b) /notsubset (sb) /propersubset (ib) /reflexsubset (mo) /element (!m) /notelement (an) /angle (gr) /gradient (rg) /registerserif (co) /copyrightserif (tm) /trademarkserif (---) /product (sr) /radical (c.) /dotmath (no) /logicalnot (l&) /logicaland (l|) /logicalor (---) /arrowdblboth (---) /arrowdblleft (---) /arrowdblup (---) /arrowdblright (---) /arrowdbldown (lz) /lozenge (b<) /angleleft (RG) /registersans (CO) /copyrightsans (TM) /trademarksans (---) /summation (LT) /parenlefttp (br) /parenleftex (LX) (") % synonym (LB) /parenleftbt (lc) /bracketlefttp (lx) /bracketleftex (lf) /bracketleftbt (lt) /bracelefttp (lk) /braceleftmid (lb) /braceleftbt (bv) /braceex (|) (") % synonym (b>) /angleright (is) /integral (---) /integraltp (---) /integralex (---) /integralbt (RT) /parenrighttp (RX) /parenrightex (RB) /parenrightbt (rc) /bracketrighttp (rx) /bracketrightex (rf) /bracketrightbt (rt) /bracerighttp (rk) /bracerightmid (rb) /bracerightbt (~=) (55 0 1) % charlib //End of SymbolCharset } SpecialCharset() { cat <<-'//End of SpecialCharset' (ru) /underscore (ff) (60 2 1) % charlib (Fi) (84 2 1) % charlib (Fl) (84 2 1) % charlib (14) (75 2 1) % charlib (12) (75 2 1) % charlib (34) (75 2 1) % charlib (bx) (50 2 1) % charlib (ob) (38 2 1) % charlib (ci) (75 0 1) % charlib (sq) (50 2 1) % charlib (Sl) (50 2 1) % charlib (L1) (110 1 1) % charlib (LA) (110 1 1) % charlib (LV) (110 3 1) % charlib (LH) (210 1 1) % charlib (lh) (100 0 1) % charlib (rh) (100 0 1) % charlib (lH) (100 0 1) % charlib (rH) (100 0 1) % charlib (PC) (220 2 1) % charlib (DG) (185 2 1) % charlib //End of SpecialCharset } DingbatsCharset() { cat <<-'//End of DingbatsCharset' (!) 33 (") 34 (#) 35 ($) 36 (%) 37 (&) 38 (') 39 (\() 40 (\)) 41 (*) 42 (+) 43 (,) 44 (-) 45 (.) 46 (/) 47 (0) 48 (1) 49 (2) 50 (3) 51 (4) 52 (5) 53 (6) 54 (7) 55 (8) 56 (9) 57 (:) 58 (;) 59 (<) 60 (=) 61 (>) 62 (?) 63 (@) 64 (A) 65 (B) 66 (C) 67 (D) 68 (E) 69 (F) 70 (G) 71 (H) 72 (I) 73 (J) 74 (K) 75 (L) 76 (M) 77 (N) 78 (O) 79 (P) 80 (Q) 81 (R) 82 (S) 83 (T) 84 (U) 85 (V) 86 (W) 87 (X) 88 (Y) 89 (Z) 90 ([) 91 (\\) 92 (]) 93 (^) 94 (_) 95 (`) 96 (a) 97 (b) 98 (c) 99 (d) 100 (e) 101 (f) 102 (g) 103 (h) 104 (i) 105 (j) 106 (k) 107 (l) 108 (m) 109 (n) 110 (o) 111 (p) 112 (q) 113 (r) 114 (s) 115 (t) 116 (u) 117 (v) 118 (w) 119 (x) 120 (y) 121 (z) 122 ({) 123 (|) 124 (}) 125 (~) 126 (hy) 161 (em) 162 (de) 163 (\\-) 164 (en) 165 (ff) 166 (fi) 167 (fl) 168 (Fi) 169 (Fl) 170 (fm) 171 (ru) 172 (dg) 173 (bu) 174 (14) 175 (34) 176 (12) 177 (ct) 178 (rg) 179 (sq) 180 (sl) 181 (ul) 182 (or) 183 (no) 184 (->) 185 (<-) 186 (da) 187 (lh) 188 (ua) 189 (ab) 190 (!b) 191 (aa) 192 (!m) 193 (ga) 194 (pl) 195 (mi) 196 (mu) 197 (di) 198 (eq) 199 (==) 200 (>=) 201 (<=) 202 (!=) 203 (+-) 204 (-+) 205 (ap) 206 (~=) 207 (gr) 208 (is) 209 (pd) 210 (if) 211 (sr) 212 (rn) 213 (sb) 214 (sp) 215 (cu) 216 (ca) 217 (ib) 218 (ip) 219 (mo) 220 (es) 221 (sc) 222 (dd) 223 (lc) 224 (rc) 225 (lf) 226 (rf) 227 (bv) 228 (**) 229 (br) 230 (ci) 231 (ts) 232 (co) 233 (lt) 234 (rt) 235 (lb) 236 (rb) 237 (lk) 238 (rk) 239 (rh) 241 (tm) 242 (Sl) 243 (ps) 244 (cs) 245 (cy) 246 (as) 247 (os) 248 (=.) 249 (ld) 250 (rd) 251 (le) 252 (ge) 253 (pp) 254 //End of DingbatsCharset } # # Generating functions output PostScript programs that build font width # tables or a typesetter description file. Send the program to a printer # and the complete table will come back on the serial port. All write on # stdout and assume the prologue and other required PostScript files are # all available. # Proportional() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" # Get <>_ and | from S. Use accents for ascii ^ and ~. StandardCharset | awk ' $1 == "(<)" && $2 == "/less" {$1 = "(---)"} $1 == "(>)" && $2 == "/greater" {$1 = "(---)"} $1 == "(_)" && $2 == "/underscore" {$1 = "(---)"} $1 == "(|)" && $2 == "/bar" {$1 = "(---)"} $1 == "(^)" && $2 == "/asciicircum" {$1 = "(---)"} $1 == "(~)" && $2 == "/asciitilde" {$1 = "(---)"} {printf "%s\t%s\n", $1, $2} $2 == "/circumflex" {printf "(^)\t(\")\n"} $2 == "/tilde" {printf "(~)\t(\")\n"} ' echo "] def" echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(ligatures fi fl 0\\\\n) Print" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } FixedWidth() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" # awk is not important - it's only here for compatibility StandardCharset | awk ' $1 == "(fi)" || $1 == "(fl)" {next} {printf "%s\t%s\n", $1, $2} $2 == "/circumflex" {printf "(^)\t(\")\n"} $2 == "/tilde" {printf "(~)\t(\")\n"} ' echo "] def" echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Dingbats() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" DingbatsCharset echo "] def" echo "/$2 SelectFont" echo "( ) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Greek() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/' echo "] def" echo "/$2 SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Symbol() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset echo "] def" echo "ChangeMetrics" echo "/S SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Special() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SpecialCharset echo "] def" echo "ChangeMetrics" echo "/S1 SelectFont" echo "(# Times-Roman special font\\\\n) Print" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } # # The DESC file doesn't have to be built on a printer. It's only here for # consistency. # Description() { echo "/charset [" # awk - so the stack doesn't overflow StandardCharset | awk '$1 != "(---)" {print $1}' SymbolCharset | awk '$1 != "(---)" {print $1}' SpecialCharset | awk '$1 != "(---)" {print $1}' DingbatsCharset | awk '$1 != "(---)" {print $1}' echo "] def" cat <<-//DESC (#Device Description - original PostScript character set PDL PostScript fonts 10 R I B BI CW H HI HB S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res $RESOLUTION hor 1 vert 1 unitwidth $UNITWIDTH ) Print //DESC echo "(charset\\\\n) Print" echo "BuildDescCharset" echo "(\\\\n) Print" } 0707070014231217231006440057030057030000010643620522627501400002400000003355post.src/devpost/HK name HK fontname Helvetica-LightOblique ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 56 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 2 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 2 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 2 124 } 33 3 125 --- 66 0 126 !! 33 1 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 0 168 --- 22 2 169 `` 39 2 170 --- 56 0 171 --- 39 0 172 --- 39 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 65 3 182 --- 50 0 183 --- 22 1 184 --- 39 1 185 '' 39 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 ?? 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 33 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 33 2 235 --- 89 0 241 --- 22 0 245 --- 22 2 248 --- 56 0 249 --- 94 0 250 --- 50 2 251 0707070014231217241006440057030057030000010643640522627501400002400000003346post.src/devpost/HL name HL fontname Helvetica-Light ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 56 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 2 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 2 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 2 124 } 33 3 125 --- 66 0 126 !! 33 1 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 0 168 --- 22 2 169 `` 39 2 170 --- 56 0 171 --- 39 0 172 --- 39 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 65 3 182 --- 50 0 183 --- 22 1 184 --- 39 1 185 '' 39 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 ?? 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 33 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 33 2 235 --- 89 0 241 --- 22 0 245 --- 22 2 248 --- 56 0 249 --- 94 0 250 --- 50 2 251 0707070014231215111006400057030057030000010554220522632552300002400000003362post.src/devpost/HM name H fontname Helvetica named in prologue ligatures fi fl 0 spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 --- 58 0 126 !! 33 1 161 ct 56 3 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 0 168 --- 19 2 169 `` 33 2 170 --- 56 0 171 --- 33 0 172 --- 33 0 173 fi 50 2 174 fl 50 2 175 en 56 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 54 3 182 --- 35 0 183 --- 22 1 184 --- 33 1 185 '' 33 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 ?? 61 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 37 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 36 2 235 --- 89 0 241 --- 28 0 245 --- 22 2 248 --- 61 0 249 --- 94 0 250 --- 61 2 251 0707070014231217261006440057030057030000010644600522627501400003700000035275post.src/devpost/shell.lib.bak # # Shell library - for building devpost tables. Original collection was # built on a Version 47.0 PS-810. # RESOLUTION=720 UNITWIDTH=10 # # BuiltinTables returns command lines that generate PostScript programs # for building a typesetter description file and font width tables for # a relatively standard collection of fonts. Use awk to select a command # line or modify an existing command to build a width table for a new # font. # BuiltinTables() { cat <<-'//End of BuiltinTables' Proportional R Times-Roman Proportional I Times-Italic Proportional B Times-Bold Proportional BI Times-BoldItalic Proportional AB AvantGarde-Demi Proportional AI AvantGarde-BookOblique Proportional AR AvantGarde-Book Proportional AX AvantGarde-DemiOblique Proportional H Helvetica Proportional HB Helvetica-Bold Proportional HI Helvetica-Oblique Proportional HX Helvetica-BoldOblique Proportional Hb Helvetica-Narrow-Bold Proportional Hi Helvetica-Narrow-Oblique Proportional Hr Helvetica-Narrow Proportional Hx Helvetica-Narrow-BoldOblique Proportional KB Bookman-Demi Proportional KI Bookman-LightItalic Proportional KR Bookman-Light Proportional KX Bookman-DemiItalic Proportional NB NewCenturySchlbk-Bold Proportional NI NewCenturySchlbk-Italic Proportional NR NewCenturySchlbk-Roman Proportional NX NewCenturySchlbk-BoldItalic Proportional PA Palatino-Roman Proportional PB Palatino-Bold Proportional PI Palatino-Italic Proportional PX Palatino-BoldItalic Proportional ZI ZapfChancery-MediumItalic FixedWidth C Courier FixedWidth CB Courier-Bold FixedWidth CI Courier-Oblique FixedWidth CO Courier FixedWidth CW Courier FixedWidth CX Courier-BoldOblique Dingbats ZD ZapfDingbats Greek GR Symbol Symbol S Symbol Special S1 Times-Roman Description DESC --- //End of BuiltinTables } # # AllTables prints the complete list of builtin font names. # AllTables() { BuiltinTables | awk '{print $2}' } # # Charset functions generate keyword/value pairs (as PostScript objects) # that describe the character set available in a font. The keyword is a # PostScript string that represents troff's name for the character. The # value is usually the literal name (i.e. begins with a /) assigned to # the character in the PostScript font. The value can also be an integer # or a PostScript string. An integer value is used as an index in the # current font's Encoding array. A string value is returned to the host # unchanged when the entry for the character is constructed. Entries that # have (") as their value are synonyms for the preceeding character. # StandardCharset() { cat <<-'//End of StandardCharset' (!) /exclam (") /quotedbl (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (hy) /hyphen (-) (") % synonym (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (---) /exclamdown (ct) /cent (ps) /sterling (fr) /fraction (yn) /yen (fn) /florin (sc) /section (cr) /currency (---) /quotesingle (``) /quotedblleft (---) /guillemotleft (---) /guilsinglleft (---) /guilsinglright (fi) /fi (fl) /fl (en) /endash (\\-) (") (dg) /dagger (dd) /daggerdbl (---) /periodcentered (pg) /paragraph (---) /bullet (---) /quotesinglbase (---) /quotedblbase ('') /quotedblright (---) /guillemotright (---) /ellipsis (---) /perthousand (---) /questiondown (ga) /grave (\\`) (") (aa) /acute (\\') (") (^a) /circumflex (~a) /tilde (-a) /macron (Ua) /breve (.a) /dotaccent (:a) /dieresis (oa) /ring (,a) /cedilla ("a) /hungarumlaut (Ca) /ogonek (va) /caron (em) /emdash (---) /AE (---) /ordfeminine (---) /Lslash (---) /Oslash (---) /OE (---) /ordmasculine (---) /ae (---) /dotlessi (---) /lslash (---) /oslash (---) /oe (---) /germandbls //End of StandardCharset } SymbolCharset() { cat <<-'//End of SymbolCharset' (---) /exclam (fa) /universal (---) /numbersign (te) /existential (---) /percent (---) /ampersand (st) /suchthat (---) /parenleft (---) /parenright (**) /asteriskmath (pl) /plus (---) /comma (mi) /minus (---) /period (sl) /slash (---) /zero (---) /one (---) /two (---) /three (---) /four (---) /five (---) /six (---) /seven (---) /eight (---) /nine (---) /colon (---) /semicolon (<) /less (eq) /equal (>) /greater (---) /question (cg) /congruent (*A) /Alpha (*B) /Beta (*X) /Chi (*D) /Delta (*E) /Epsilon (*F) /Phi (*G) /Gamma (*Y) /Eta (*I) /Iota (---) /theta1 (*K) /Kappa (*L) /Lambda (*M) /Mu (*N) /Nu (*O) /Omicron (*P) /Pi (*H) /Theta (*R) /Rho (*S) /Sigma (*T) /Tau (*U) /Upsilon (ts) /sigma1 (*W) /Omega (*C) /Xi (*Q) /Psi (*Z) /Zeta (---) /bracketleft (tf) /therefore (---) /bracketright (pp) /perpendicular (ul) /underscore (_) (") % synonym (rn) /radicalex (*a) /alpha (*b) /beta (*x) /chi (*d) /delta (*e) /epsilon (*f) /phi (*g) /gamma (*y) /eta (*i) /iota (---) /phi1 (*k) /kappa (*l) /lambda (*m) /mu (*n) /nu (*o) /omicron (*p) /pi (*h) /theta (*r) /rho (*s) /sigma (*t) /tau (*u) /upsilon (---) /omega1 (*w) /omega (*c) /xi (*q) /psi (*z) /zeta (---) /braceleft (or) /bar (---) /braceright (ap) /similar (---) /Upsilon1 (fm) /minute (<=) /lessequal (---) /fraction (if) /infinity (---) /florin (---) /club (---) /diamond (---) /heart (---) /spade (ab) /arrowboth (<-) /arrowleft (ua) /arrowup (->) /arrowright (da) /arrowdown (de) /degree (+-) /plusminus (---) /second (>=) /greaterequal (mu) /multiply (pt) /proportional (pd) /partialdiff (bu) /bullet (di) /divide (!=) /notequal (==) /equivalence (~~) /approxequal (el) /ellipsis (av) /arrowvertex (ah) /arrowhorizex (CR) /carriagereturn (af) /aleph (If) /Ifraktur (Rf) /Rfraktur (ws) /weierstrass (Ox) /circlemultiply (O+) /circleplus (es) /emptyset (ca) /intersection (cu) /union (sp) /propersuperset (ip) /reflexsuperset (!b) /notsubset (sb) /propersubset (ib) /reflexsubset (mo) /element (!m) /notelement (an) /angle (gr) /gradient (rg) /registerserif (co) /copyrightserif (tm) /trademarkserif (---) /product (sr) /radical (c.) /dotmath (no) /logicalnot (l&) /logicaland (l|) /logicalor (---) /arrowdblboth (---) /arrowdblleft (---) /arrowdblup (---) /arrowdblright (---) /arrowdbldown (lz) /lozenge (b<) /angleleft (RG) /registersans (CO) /copyrightsans (TM) /trademarksans (---) /summation (LT) /parenlefttp (br) /parenleftex (LX) (") % synonym (LB) /parenleftbt (lc) /bracketlefttp (lx) /bracketleftex (lf) /bracketleftbt (lt) /bracelefttp (lk) /braceleftmid (lb) /braceleftbt (bv) /braceex (|) (") % synonym (b>) /angleright (is) /integral (---) /integraltp (---) /integralex (---) /integralbt (RT) /parenrighttp (RX) /parenrightex (RB) /parenrightbt (rc) /bracketrighttp (rx) /bracketrightex (rf) /bracketrightbt (rt) /bracerighttp (rk) /bracerightmid (rb) /bracerightbt (~=) (55 0 1) % charlib //End of SymbolCharset } SpecialCharset() { cat <<-'//End of SpecialCharset' (ru) /underscore (ff) (60 2 1) % charlib (Fi) (84 2 1) % charlib (Fl) (84 2 1) % charlib (14) (75 2 1) % charlib (12) (75 2 1) % charlib (34) (75 2 1) % charlib (bx) (50 2 1) % charlib (ob) (38 2 1) % charlib (ci) (75 0 1) % charlib (sq) (50 2 1) % charlib (Sl) (50 2 1) % charlib (L1) (110 1 2) % charlib (LA) (110 1 2) % charlib (LV) (110 3 1) % charlib (LH) (210 1 1) % charlib (lh) (100 0 1) % charlib (rh) (100 0 1) % charlib (lH) (100 0 1) % charlib (rH) (100 0 1) % charlib (PC) (220 2 1) % charlib (DG) (185 2 1) % charlib //End of SpecialCharset } DingbatsCharset() { cat <<-'//End of DingbatsCharset' (!) 33 (") 34 (#) 35 ($) 36 (%) 37 (&) 38 (') 39 (\() 40 (\)) 41 (*) 42 (+) 43 (,) 44 (-) 45 (.) 46 (/) 47 (0) 48 (1) 49 (2) 50 (3) 51 (4) 52 (5) 53 (6) 54 (7) 55 (8) 56 (9) 57 (:) 58 (;) 59 (<) 60 (=) 61 (>) 62 (?) 63 (@) 64 (A) 65 (B) 66 (C) 67 (D) 68 (E) 69 (F) 70 (G) 71 (H) 72 (I) 73 (J) 74 (K) 75 (L) 76 (M) 77 (N) 78 (O) 79 (P) 80 (Q) 81 (R) 82 (S) 83 (T) 84 (U) 85 (V) 86 (W) 87 (X) 88 (Y) 89 (Z) 90 ([) 91 (\\) 92 (]) 93 (^) 94 (_) 95 (`) 96 (a) 97 (b) 98 (c) 99 (d) 100 (e) 101 (f) 102 (g) 103 (h) 104 (i) 105 (j) 106 (k) 107 (l) 108 (m) 109 (n) 110 (o) 111 (p) 112 (q) 113 (r) 114 (s) 115 (t) 116 (u) 117 (v) 118 (w) 119 (x) 120 (y) 121 (z) 122 ({) 123 (|) 124 (}) 125 (~) 126 (hy) 161 (em) 162 (de) 163 (\\-) 164 (en) 165 (ff) 166 (fi) 167 (fl) 168 (Fi) 169 (Fl) 170 (fm) 171 (ru) 172 (dg) 173 (bu) 174 (14) 175 (34) 176 (12) 177 (ct) 178 (rg) 179 (sq) 180 (sl) 181 (ul) 182 (or) 183 (no) 184 (->) 185 (<-) 186 (da) 187 (lh) 188 (ua) 189 (ab) 190 (!b) 191 (aa) 192 (!m) 193 (ga) 194 (pl) 195 (mi) 196 (mu) 197 (di) 198 (eq) 199 (==) 200 (>=) 201 (<=) 202 (!=) 203 (+-) 204 (-+) 205 (ap) 206 (~=) 207 (gr) 208 (is) 209 (pd) 210 (if) 211 (sr) 212 (rn) 213 (sb) 214 (sp) 215 (cu) 216 (ca) 217 (ib) 218 (ip) 219 (mo) 220 (es) 221 (sc) 222 (dd) 223 (lc) 224 (rc) 225 (lf) 226 (rf) 227 (bv) 228 (**) 229 (br) 230 (ci) 231 (ts) 232 (co) 233 (lt) 234 (rt) 235 (lb) 236 (rb) 237 (lk) 238 (rk) 239 (rh) 241 (tm) 242 (Sl) 243 (ps) 244 (cs) 245 (cy) 246 (as) 247 (os) 248 (=.) 249 (ld) 250 (rd) 251 (le) 252 (ge) 253 (pp) 254 //End of DingbatsCharset } # # Generating functions output PostScript programs that build font width # tables or a typesetter description file. Send the program to a printer # and the complete table will come back on the serial port. All write on # stdout and assume the prologue and other required PostScript files are # all available. # Proportional() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" # Get <>_ and | from S. Use accents for ascii ^ and ~. StandardCharset | awk ' $1 == "(<)" && $2 == "/less" {$1 = "(---)"} $1 == "(>)" && $2 == "/greater" {$1 = "(---)"} $1 == "(_)" && $2 == "/underscore" {$1 = "(---)"} $1 == "(|)" && $2 == "/bar" {$1 = "(---)"} $1 == "(^)" && $2 == "/asciicircum" {$1 = "(---)"} $1 == "(~)" && $2 == "/asciitilde" {$1 = "(---)"} {printf "%s\t%s\n", $1, $2} $2 == "/circumflex" {printf "(^)\t(\")\n"} $2 == "/tilde" {printf "(~)\t(\")\n"} ' echo "] def" echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(ligatures fi fl 0\\\\n) Print" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } FixedWidth() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" # awk is not important - it's only here for compatibility StandardCharset | awk ' $1 == "(fi)" || $1 == "(fl)" {next} {printf "%s\t%s\n", $1, $2} $2 == "/circumflex" {printf "(^)\t(\")\n"} $2 == "/tilde" {printf "(~)\t(\")\n"} ' echo "] def" echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Dingbats() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" DingbatsCharset echo "] def" echo "/$2 SelectFont" echo "( ) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Greek() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/' echo "] def" echo "/$2 SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Symbol() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset echo "] def" echo "ChangeMetrics" echo "/S SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Special() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SpecialCharset echo "] def" echo "ChangeMetrics" echo "/S1 SelectFont" echo "(# Times-Roman special font\\\\n) Print" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } # # The DESC file doesn't have to be built on a printer. It's only here for # consistency. # Description() { echo "/charset [" # awk - so the stack doesn't overflow StandardCharset | awk '$1 != "(---)" {print $1}' SymbolCharset | awk '$1 != "(---)" {print $1}' SpecialCharset | awk '$1 != "(---)" {print $1}' DingbatsCharset | awk '$1 != "(---)" {print $1}' echo "] def" cat <<-//DESC (#Device Description - original PostScript character set PDL PostScript fonts 10 R I B BI CW H HI HB S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res $RESOLUTION hor 1 vert 1 unitwidth $UNITWIDTH ) Print //DESC echo "(charset\\\\n) Print" echo "BuildDescCharset" echo "(\\\\n) Print" } 0707070014231217271006440057030057030000010643470522627501400003200000000111post.src/devpost/LINKFILE # # Creates missing width tables from existing ones. # rm -f HM cp H HM 0707070014231123360407550057030057030000030440450522633073400002300000000000post.src/devLatin1 0707070014231123371006440057030057030000010440600522627501500003500000053076post.src/devLatin1/shell.lib # # Shell library - for building devLatin1 tables. # # The full ISO Latin1 alphabet appeared in Adobe's interpreter sometime # around Version 50.0. Prior to that ROM resident Type 1 text fonts were # missing 18 characters that are now part of the Latin1 standard. Width # tables will not build on printers that lack full Latin1 support. Error # message will likely reflect a missing ISOLatin1Encoding array. # RESOLUTION=720 UNITWIDTH=10 OCTALESCAPES=${OCTALESCAPES:-160} # <= code means add \0ddd names DOWNLOADVECTOR=FALSE # TRUE can mean incomplete tables # # BuiltinTables returns command lines that generate PostScript programs # for building a typesetter description file and font width tables for # a relatively standard collection of fonts. Use awk to select a command # line or modify an existing command to build a width table for a new # font. # BuiltinTables() { cat <<-'//End of BuiltinTables' Proportional R Times-Roman Proportional I Times-Italic Proportional B Times-Bold Proportional BI Times-BoldItalic Proportional AB AvantGarde-Demi Proportional AI AvantGarde-BookOblique Proportional AR AvantGarde-Book Proportional AX AvantGarde-DemiOblique Proportional H Helvetica Proportional HB Helvetica-Bold Proportional HI Helvetica-Oblique Proportional HX Helvetica-BoldOblique Proportional Hb Helvetica-Narrow-Bold Proportional Hi Helvetica-Narrow-Oblique Proportional Hr Helvetica-Narrow Proportional Hx Helvetica-Narrow-BoldOblique Proportional KB Bookman-Demi Proportional KI Bookman-LightItalic Proportional KR Bookman-Light Proportional KX Bookman-DemiItalic Proportional NB NewCenturySchlbk-Bold Proportional NI NewCenturySchlbk-Italic Proportional NR NewCenturySchlbk-Roman Proportional NX NewCenturySchlbk-BoldItalic Proportional PA Palatino-Roman Proportional PB Palatino-Bold Proportional PI Palatino-Italic Proportional PX Palatino-BoldItalic Proportional ZI ZapfChancery-MediumItalic FixedWidth C Courier FixedWidth CB Courier-Bold FixedWidth CI Courier-Oblique FixedWidth CO Courier FixedWidth CW Courier FixedWidth CX Courier-BoldOblique Dingbats ZD ZapfDingbats Greek GR Symbol Symbol S Symbol Special S1 Times-Roman Description DESC --- //End of BuiltinTables } # # AllTables prints the complete list of builtin font names. # AllTables() { BuiltinTables | awk '{print $2}' } # # Charset functions generate keyword/value pairs (as PostScript objects) # that describe the character set available in a font. The keyword is a # PostScript string that represents troff's name for the character. The # value is usually the literal name (i.e. begins with a /) assigned to # the character in the PostScript font. The value can also be an integer # or a PostScript string. An integer value is used as an index in the # current font's Encoding array. A string value is returned to the host # unchanged when the entry for the character is constructed. Entries that # have (") as their value are synonyms for the preceeding character. # # The 18 characters missing from ROM resident fonts on older printers are # flagged with the PostScript comment "% missing". # StandardCharset() { cat <<-'//End of StandardCharset' (!) /exclam (") /quotedbl (dq) (") % synonym (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (-) /hyphen % changed from minus by request (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (bs) (") % synonym (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (\\`) /grave % devpost character (ga) (") % synonym (!!) /exclamdown (c|) /cent (ct) (") % devpost synonym (L-) /sterling (ps) (") % devpost synonym (xo) /currency (cr) (") % devpost synonym (Y-) /yen (yn) (") % devpost synonym (||) /brokenbar % missing (so) /section (sc) (") % devpost synonym ("") /dieresis (:a) (") % devpost synonym (co) /copyright (a_) /ordfeminine (<<) /guillemotleft (-,) /logicalnot (hy) /hyphen (--) /minus (ro) /registered (rg) (") % devpost synonym (-^) /macron (-a) (") % devpost synonym (0^) /degree % missing (+-) /plusminus % missing (2^) /twosuperior % missing (3^) /threesuperior % missing (\\') /acute (aa) (") % devpost synonym (/u) /mu % missing (P!) /paragraph (pg) (") % devpost synonym (.^) /periodcentered (,,) /cedilla (,a) (") % devpost synonym (1^) /onesuperior % missing (o_) /ordmasculine (>>) /guillemotright (14) /onequarter % missing (12) /onehalf % missing (34) /threequarters % missing (??) /questiondown (A`) /Agrave (A') /Aacute (A^) /Acircumflex (A~) /Atilde (A") /Adieresis (A*) /Aring (AE) /AE (C,) /Ccedilla (E`) /Egrave (E') /Eacute (E^) /Ecircumflex (E") /Edieresis (I`) /Igrave (I') /Iacute (I^) /Icircumflex (I") /Idieresis (D-) /Eth % missing (N~) /Ntilde (O`) /Ograve (O') /Oacute (O^) /Ocircumflex (O~) /Otilde (O") /Odieresis (xx) /multiply % missing (O/) /Oslash (U`) /Ugrave (U') /Uacute (U^) /Ucircumflex (U") /Udieresis (Y') /Yacute % missing (TH) /Thorn % missing (ss) /germandbls (a`) /agrave (a') /aacute (a^) /acircumflex (a~) /atilde (a") /adieresis (a*) /aring (ae) /ae (c,) /ccedilla (e`) /egrave (e') /eacute (e^) /ecircumflex (e") /edieresis (i`) /igrave (i') /iacute (i^) /icircumflex (i") /idieresis (d-) /eth % missing (n~) /ntilde (o`) /ograve (o') /oacute (o^) /ocircumflex (o~) /otilde (o") /odieresis (-:) /divide % missing (o/) /oslash (u`) /ugrave (u') /uacute (u^) /ucircumflex (u") /udieresis (y') /yacute % missing (th) /thorn % missing (y") /ydieresis (^a) /circumflex % devpost accent (~a) /tilde % devpost accent (Ua) /breve % devpost accent (.a) /dotaccent % devpost accent (oa) /ring % devpost accent ("a) /hungarumlaut % devpost accent (Ca) /ogonek % devpost accent (va) /caron % devpost accent //End of StandardCharset } # # DingbatsCharset guarantees changes in StandardCharset don't show up in ZD. # DingbatsCharset() { cat <<-'//End of DingbatsCharset' (!) /exclam (") /quotedbl (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (-) /minus % also hyphen in devpost (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (\\`) /grave % devpost character (!!) /exclamdown (c|) /cent (L-) /sterling (xo) /currency (Y-) /yen (||) /brokenbar % missing (so) /section ("") /dieresis (co) /copyright (a_) /ordfeminine (<<) /guillemotleft (-,) /logicalnot (hy) /hyphen (ro) /registered (-^) /macron (0^) /degree % missing (+-) /plusminus % missing (2^) /twosuperior % missing (3^) /threesuperior % missing (\\') /acute (/u) /mu % missing (P!) /paragraph (.^) /periodcentered (,,) /cedilla (1^) /onesuperior % missing (o_) /ordmasculine (>>) /guillemotright (14) /onequarter % missing (12) /onehalf % missing (34) /threequarters % missing (??) /questiondown (A`) /Agrave (A') /Aacute (A^) /Acircumflex (A~) /Atilde (A") /Adieresis (A*) /Aring (AE) /AE (C,) /Ccedilla (E`) /Egrave (E') /Eacute (E^) /Ecircumflex (E") /Edieresis (I`) /Igrave (I') /Iacute (I^) /Icircumflex (I") /Idieresis (D-) /Eth % missing (N~) /Ntilde (O`) /Ograve (O') /Oacute (O^) /Ocircumflex (O~) /Otilde (O") /Odieresis (xx) /multiply % missing (O/) /Oslash (U`) /Ugrave (U') /Uacute (U^) /Ucircumflex (U") /Udieresis (Y') /Yacute % missing (TH) /Thorn % missing (ss) /germandbls (a`) /agrave (a') /aacute (a^) /acircumflex (a~) /atilde (a") /adieresis (a*) /aring (ae) /ae (c,) /ccedilla (e`) /egrave (e') /eacute (e^) /ecircumflex (e") /edieresis (i`) /igrave (i') /iacute (i^) /icircumflex (i") /idieresis (d-) /eth % missing (n~) /ntilde (o`) /ograve (o') /oacute (o^) /ocircumflex (o~) /otilde (o") /odieresis (-:) /divide % missing (o/) /oslash (u`) /ugrave (u') /uacute (u^) /ucircumflex (u") /udieresis (y') /yacute % missing (th) /thorn % missing (y") /ydieresis //End of DingbatsCharset } SymbolCharset() { cat <<-'//End of SymbolCharset' (---) /exclam (fa) /universal (---) /numbersign (te) /existential (---) /percent (---) /ampersand (st) /suchthat (---) /parenleft (---) /parenright (**) /asteriskmath (pl) /plus (---) /comma (mi) /minus (---) /period (sl) /slash (---) /zero (---) /one (---) /two (---) /three (---) /four (---) /five (---) /six (---) /seven (---) /eight (---) /nine (---) /colon (---) /semicolon (<) /less (eq) /equal (>) /greater (---) /question (cg) /congruent (*A) /Alpha (*B) /Beta (*X) /Chi (*D) /Delta (*E) /Epsilon (*F) /Phi (*G) /Gamma (*Y) /Eta (*I) /Iota (---) /theta1 (*K) /Kappa (*L) /Lambda (*M) /Mu (*N) /Nu (*O) /Omicron (*P) /Pi (*H) /Theta (*R) /Rho (*S) /Sigma (*T) /Tau (*U) /Upsilon (ts) /sigma1 (*W) /Omega (*C) /Xi (*Q) /Psi (*Z) /Zeta (---) /bracketleft (tf) /therefore (---) /bracketright (pp) /perpendicular (ul) /underscore (_) (") % synonym (rn) /radicalex (*a) /alpha (*b) /beta (*x) /chi (*d) /delta (*e) /epsilon (*f) /phi (*g) /gamma (*y) /eta (*i) /iota (---) /phi1 (*k) /kappa (*l) /lambda (*m) /mu (*n) /nu (*o) /omicron (*p) /pi (*h) /theta (*r) /rho (*s) /sigma (*t) /tau (*u) /upsilon (---) /omega1 (*w) /omega (*c) /xi (*q) /psi (*z) /zeta (---) /braceleft (or) /bar (---) /braceright (ap) /similar (---) /Upsilon1 (fm) /minute (<=) /lessequal (fr) /fraction % devpost character (if) /infinity (fn) /florin % devpost character (---) /club (---) /diamond (---) /heart (---) /spade (ab) /arrowboth (<-) /arrowleft (ua) /arrowup (->) /arrowright (da) /arrowdown (de) /degree (+-) /plusminus (---) /second (>=) /greaterequal (mu) /multiply (pt) /proportional (pd) /partialdiff (bu) /bullet (di) /divide (!=) /notequal (==) /equivalence (~~) /approxequal (el) /ellipsis (av) /arrowvertex (ah) /arrowhorizex (CR) /carriagereturn (af) /aleph (If) /Ifraktur (Rf) /Rfraktur (ws) /weierstrass (Ox) /circlemultiply (O+) /circleplus (es) /emptyset (ca) /intersection (cu) /union (sp) /propersuperset (ip) /reflexsuperset (!b) /notsubset (sb) /propersubset (ib) /reflexsubset (mo) /element (!m) /notelement (an) /angle (gr) /gradient (rg) /registerserif (co) /copyrightserif (tm) /trademarkserif (---) /product (sr) /radical (c.) /dotmath (no) /logicalnot (l&) /logicaland (l|) /logicalor (---) /arrowdblboth (---) /arrowdblleft (---) /arrowdblup (---) /arrowdblright (---) /arrowdbldown (lz) /lozenge (b<) /angleleft (RG) /registersans (CO) /copyrightsans (TM) /trademarksans (---) /summation (LT) /parenlefttp (br) /parenleftex (LX) (") % synonym (LB) /parenleftbt (lc) /bracketlefttp (lx) /bracketleftex (lf) /bracketleftbt (lt) /bracelefttp (lk) /braceleftmid (lb) /braceleftbt (bv) /braceex (|) (") % synonym (b>) /angleright (is) /integral (---) /integraltp (---) /integralex (---) /integralbt (RT) /parenrighttp (RX) /parenrightex (RB) /parenrightbt (rc) /bracketrighttp (rx) /bracketrightex (rf) /bracketrightbt (rt) /bracerighttp (rk) /bracerightmid (rb) /bracerightbt (~=) (55 0 1) % charlib //End of SymbolCharset } SpecialCharset() { cat <<-'//End of SpecialCharset' (ru) /underscore ('') /quotedblright % devpost character (``) /quotedblleft % devpost character (dg) /dagger % devpost character (dd) /daggerdbl % devpost character (en) /endash % devpost character (\\-) (") % synonym (em) /emdash % (ff) (60 2 1) % charlib % (Fi) (84 2 1) % charlib % (Fl) (84 2 1) % charlib (14) (75 2 1) % charlib (12) (75 2 1) % charlib (34) (75 2 1) % charlib (bx) (50 2 1) % charlib (ob) (38 2 1) % charlib (ci) (75 0 1) % charlib (sq) (50 2 1) % charlib (Sl) (50 2 1) % charlib (L1) (110 1 1) % charlib (LA) (110 1 1) % charlib (LV) (110 3 1) % charlib (LH) (210 1 1) % charlib (lh) (100 0 1) % charlib (rh) (100 0 1) % charlib (lH) (100 0 1) % charlib (rH) (100 0 1) % charlib (PC) (220 2 1) % charlib (DG) (185 2 1) % charlib //End of SpecialCharset } # # Latin1 ensures a font uses the ISOLatin1Encoding vector, although only # text fonts should be re-encoded. Downloading the Encoding vector doesn't # often make sense. No ISOLatin1Encoding array likely means ROM based fonts # on your printer are incomplete. Type 1 fonts with a full Latin1 character # set appeared sometime after Version 50.0. # Latin1() { if [ "$DOWNLOADVECTOR" = TRUE ]; then cat <<-'//End of ISOLatin1Encoding' /ISOLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def //End of ISOLatin1Encoding fi echo "ISOLatin1Encoding /$1 ReEncode" } # # Generating functions output PostScript programs that build font width # tables or a typesetter description file. Send the program to a printer # and the complete table will come back on the serial port. All write on # stdout and assume the prologue and other required PostScript files are # all available. # Proportional() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" # Get <>_ and | from S. Use accents for ascii ^ and ~. StandardCharset | awk ' $1 == "(<)" && $2 == "/less" {$1 = "(---)"} $1 == "(>)" && $2 == "/greater" {$1 = "(---)"} $1 == "(_)" && $2 == "/underscore" {$1 = "(---)"} $1 == "(|)" && $2 == "/bar" {$1 = "(---)"} $1 == "(^)" && $2 == "/asciicircum" { printf "(^)\t/circumflex\n" $1 = "(---)" } $1 == "(~)" && $2 == "/asciitilde" { printf "(~)\t/tilde\n" $1 = "(---)" } {printf "%s\t%s\n", $1, $2} ' echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } FixedWidth() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" StandardCharset echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Dingbats() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" DingbatsCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ { printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2 }' echo "] def" echo "/$2 SelectFont" echo "( ) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Greek() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/' echo "] def" echo "/$2 SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Symbol() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset echo "] def" echo "ChangeMetrics" echo "/S SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Special() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SpecialCharset echo "] def" echo "ChangeMetrics" echo "/S1 SelectFont" echo "(# Times-Roman special font\\\\n) Print" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } # # The DESC file doesn't have to be built on a printer. It's only here for # consistency. # Description() { echo "/charset [" # awk - so the stack doesn't overflow StandardCharset | awk '{print $1}' SymbolCharset | awk '{print $1}' SpecialCharset | awk '{print $1}' echo "] def" cat <<-//DESC (#Device Description - Latin1 character set PDL PostScript Encoding Latin1 fonts 10 R I B BI CW H HI HB S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res $RESOLUTION hor 1 vert 1 unitwidth $UNITWIDTH ) Print //DESC echo "(charset\\\\n) Print" echo "BuildDescCharset" echo "(\\\\n) Print" } 0707070014231123401006440057030057030000010440460522627501500003400000000111post.src/devLatin1/LINKFILE # # Creates missing width tables from existing ones. # rm -f HM cp H HM 0707070014231123411006440057030057030000010440240522627501500002500000006137post.src/devLatin1/R name R fontname Times-Roman named in prologue spacewidth 25 charset ! 33 2 33 " 41 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 56 0 43 , 25 1 44 - 33 0 173 \0255 " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 --- 56 2 60 = 56 0 61 --- 56 2 62 ? 44 2 63 @ 92 3 64 A 72 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 39 2 74 K 72 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 56 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 72 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 47 2 94 --- 50 1 95 ` 33 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 48 3 123 --- 20 2 124 } 48 3 125 ~ 33 2 148 --- 54 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 50 3 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 20 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 76 2 169 \0251 " a_ 28 2 170 \0252 " << 50 0 171 \0253 " -, 56 0 172 \0254 " hy 33 0 173 \0255 " -- 56 0 45 ro 76 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 56 2 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 50 1 181 \0265 " P! 45 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 31 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 44 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 89 2 198 \0306 " C, 67 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 33 2 204 \0314 " I' 33 2 205 \0315 " I^ 33 2 206 \0316 " I" 33 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 72 2 210 \0322 " O' 72 2 211 \0323 " O^ 72 2 212 \0324 " O~ 72 2 213 \0325 " O" 72 2 214 \0326 " xx 56 0 215 \0327 " O/ 72 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 72 2 221 \0335 " TH 56 2 222 \0336 " ss 50 2 223 \0337 " a` 44 2 224 \0340 " a' 44 2 225 \0341 " a^ 44 2 226 \0342 " a~ 44 2 227 \0343 " a" 44 2 228 \0344 " a* 44 2 229 \0345 " ae 67 0 230 \0346 " c, 44 1 231 \0347 " e` 44 2 232 \0350 " e' 44 2 233 \0351 " e^ 44 2 234 \0352 " e" 44 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 50 2 240 \0360 " n~ 50 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 56 0 247 \0367 " o/ 50 2 248 \0370 " u` 50 2 249 \0371 " u' 50 2 250 \0372 " u^ 50 2 251 \0373 " u" 50 2 252 \0374 " y' 50 3 253 \0375 " th 50 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123421006440057030057030000010441400522627501500002500000006140post.src/devLatin1/I name I fontname Times-Italic named in prologue spacewidth 25 charset ! 33 2 33 " 42 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 68 2 43 , 25 1 44 - 33 0 173 \0255 " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 68 2 60 = 68 0 61 --- 68 2 62 ? 50 2 63 @ 92 3 64 A 61 2 65 B 61 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 61 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 44 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 67 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 83 2 87 X 61 2 88 Y 56 2 89 Z 56 2 90 [ 39 3 91 \ 28 2 92 bs " ] 39 3 93 ^ 33 2 147 --- 42 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 72 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 40 3 123 --- 28 3 124 } 40 3 125 ~ 33 2 148 --- 54 0 126 \` 33 2 145 ga " !! 39 1 161 \0241 " c| 50 3 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 28 3 166 \0246 " so 50 2 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 76 2 169 \0251 " a_ 28 2 170 \0252 " << 50 0 171 \0253 " -, 68 0 172 \0254 " hy 33 0 173 \0255 " -- 68 0 45 ro 76 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 68 2 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 50 1 181 \0265 " P! 52 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 31 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 50 1 191 \0277 " A` 61 2 192 \0300 " A' 61 2 193 \0301 " A^ 61 2 194 \0302 " A~ 61 2 195 \0303 " A" 61 2 196 \0304 " A* 61 2 197 \0305 " AE 89 2 198 \0306 " C, 67 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 33 2 204 \0314 " I' 33 2 205 \0315 " I^ 33 2 206 \0316 " I" 33 2 207 \0317 " D- 72 2 208 \0320 " N~ 67 2 209 \0321 " O` 72 2 210 \0322 " O' 72 2 211 \0323 " O^ 72 2 212 \0324 " O~ 72 2 213 \0325 " O" 72 2 214 \0326 " xx 68 0 215 \0327 " O/ 72 3 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 56 2 221 \0335 " TH 61 2 222 \0336 " ss 50 3 223 \0337 " a` 50 2 224 \0340 " a' 50 2 225 \0341 " a^ 50 2 226 \0342 " a~ 50 2 227 \0343 " a" 50 2 228 \0344 " a* 50 2 229 \0345 " ae 67 0 230 \0346 " c, 44 1 231 \0347 " e` 44 2 232 \0350 " e' 44 2 233 \0351 " e^ 44 2 234 \0352 " e" 44 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 50 2 240 \0360 " n~ 50 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 68 2 247 \0367 " o/ 50 3 248 \0370 " u` 50 2 249 \0371 " u' 50 2 250 \0372 " u^ 50 2 251 \0373 " u" 50 2 252 \0374 " y' 44 3 253 \0375 " th 50 3 254 \0376 " y" 44 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123431006440057030057030000010441440522627501500002500000006141post.src/devLatin1/B name B fontname Times-Bold named in prologue spacewidth 25 charset ! 33 2 33 " 56 2 34 dq " # 50 2 35 $ 50 3 36 % 100 2 37 & 83 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 - 33 0 173 \0255 " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 57 0 60 = 57 0 61 --- 57 0 62 ? 50 2 63 @ 93 3 64 A 72 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 72 2 82 S 56 2 83 T 67 2 84 U 72 2 85 V 72 2 86 W 100 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 58 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 56 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 33 3 106 k 56 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 50 0 111 p 56 1 112 q 56 1 113 r 44 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 39 3 123 --- 22 3 124 } 39 3 125 ~ 33 2 148 --- 52 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 50 3 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 22 3 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 30 2 170 \0252 " << 50 0 171 \0253 " -, 57 0 172 \0254 " hy 33 0 173 \0255 " -- 57 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 57 2 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 54 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 33 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 50 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 67 2 200 \0310 " E' 67 2 201 \0311 " E^ 67 2 202 \0312 " E" 67 2 203 \0313 " I` 39 2 204 \0314 " I' 39 2 205 \0315 " I^ 39 2 206 \0316 " I" 39 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 57 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 72 2 221 \0335 " TH 61 2 222 \0336 " ss 56 2 223 \0337 " a` 50 2 224 \0340 " a' 50 2 225 \0341 " a^ 50 2 226 \0342 " a~ 50 2 227 \0343 " a" 50 2 228 \0344 " a* 50 2 229 \0345 " ae 72 0 230 \0346 " c, 44 1 231 \0347 " e` 44 2 232 \0350 " e' 44 2 233 \0351 " e^ 44 2 234 \0352 " e" 44 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 50 2 240 \0360 " n~ 56 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 57 0 247 \0367 " o/ 50 2 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 50 3 253 \0375 " th 56 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123441006440057030057030000010441600522627501500002600000006145post.src/devLatin1/BI name BI fontname Times-BoldItalic named in prologue spacewidth 25 charset ! 39 2 33 " 56 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 - 33 0 173 \0255 " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 57 2 60 = 57 0 61 --- 57 2 62 ? 50 2 63 @ 83 3 64 A 67 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 67 2 69 F 67 2 70 G 72 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 67 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 89 2 87 X 67 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 57 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 2 116 u 56 0 117 v 44 0 118 w 67 0 119 x 50 0 120 y 44 1 121 z 39 0 122 { 35 3 123 --- 22 2 124 } 35 3 125 ~ 33 2 148 --- 57 0 126 \` 33 2 145 ga " !! 39 1 161 \0241 " c| 50 3 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 22 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 27 2 170 \0252 " << 50 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 57 2 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 58 1 181 \0265 " P! 50 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 30 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 50 1 191 \0277 " A` 67 2 192 \0300 " A' 67 2 193 \0301 " A^ 67 2 194 \0302 " A~ 67 2 195 \0303 " A" 67 2 196 \0304 " A* 67 2 197 \0305 " AE 94 2 198 \0306 " C, 67 3 199 \0307 " E` 67 2 200 \0310 " E' 67 2 201 \0311 " E^ 67 2 202 \0312 " E" 67 2 203 \0313 " I` 39 2 204 \0314 " I' 39 2 205 \0315 " I^ 39 2 206 \0316 " I" 39 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 72 2 210 \0322 " O' 72 2 211 \0323 " O^ 72 2 212 \0324 " O~ 72 2 213 \0325 " O" 72 2 214 \0326 " xx 57 0 215 \0327 " O/ 72 3 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 61 2 221 \0335 " TH 61 2 222 \0336 " ss 50 3 223 \0337 " a` 50 2 224 \0340 " a' 50 2 225 \0341 " a^ 50 2 226 \0342 " a~ 50 2 227 \0343 " a" 50 2 228 \0344 " a* 50 2 229 \0345 " ae 72 0 230 \0346 " c, 44 1 231 \0347 " e` 44 2 232 \0350 " e' 44 2 233 \0351 " e^ 44 2 234 \0352 " e" 44 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 50 2 240 \0360 " n~ 56 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 57 0 247 \0367 " o/ 50 3 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 44 3 253 \0375 " th 50 3 254 \0376 " y" 44 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123451006440057030057030000010441640522627501500002600000006145post.src/devLatin1/AB name AB fontname AvantGarde-Demi named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 - 42 0 173 \0255 " . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 56 2 63 @ 74 2 64 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 \ 64 2 92 bs " ] 32 3 93 ^ 54 2 147 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 { 34 3 123 --- 60 2 124 } 34 3 125 ~ 48 2 148 --- 60 0 126 \` 42 2 145 ga " !! 28 1 161 \0241 " c| 56 2 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 2 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 60 2 166 \0246 " so 56 3 167 \0247 " sc " "" 50 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 36 2 170 \0252 " << 46 0 171 \0253 " -, 60 0 172 \0254 " hy 42 0 173 \0255 " -- 60 0 45 ro 74 2 174 \0256 " rg " -^ 42 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 60 0 177 \0261 " 2^ 34 2 178 \0262 " 3^ 34 2 179 \0263 " \' 42 2 180 \0264 " aa " /u 58 1 181 \0265 " P! 60 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 34 1 184 \0270 " ,a " 1^ 34 2 185 \0271 " o_ 36 2 186 \0272 " >> 46 0 187 \0273 " 14 84 2 188 \0274 " 12 84 2 189 \0275 " 34 84 2 190 \0276 " ?? 56 1 191 \0277 " A` 74 2 192 \0300 " A' 74 2 193 \0301 " A^ 74 2 194 \0302 " A~ 74 2 195 \0303 " A" 74 2 196 \0304 " A* 74 2 197 \0305 " AE 90 2 198 \0306 " C, 78 3 199 \0307 " E` 52 2 200 \0310 " E' 52 2 201 \0311 " E^ 52 2 202 \0312 " E" 52 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 74 2 208 \0320 " N~ 74 2 209 \0321 " O` 84 2 210 \0322 " O' 84 2 211 \0323 " O^ 84 2 212 \0324 " O~ 84 2 213 \0325 " O" 84 2 214 \0326 " xx 60 0 215 \0327 " O/ 84 2 216 \0330 " U` 64 2 217 \0331 " U' 64 2 218 \0332 " U^ 64 2 219 \0333 " U" 64 2 220 \0334 " Y' 62 2 221 \0335 " TH 56 2 222 \0336 " ss 60 2 223 \0337 " a` 66 2 224 \0340 " a' 66 2 225 \0341 " a^ 66 2 226 \0342 " a~ 66 2 227 \0343 " a" 66 2 228 \0344 " a* 66 2 229 \0345 " ae 108 0 230 \0346 " c, 64 1 231 \0347 " e` 64 2 232 \0350 " e' 64 2 233 \0351 " e^ 64 2 234 \0352 " e" 64 2 235 \0353 " i` 24 2 236 \0354 " i' 24 2 237 \0355 " i^ 24 2 238 \0356 " i" 24 2 239 \0357 " d- 64 2 240 \0360 " n~ 60 2 241 \0361 " o` 64 2 242 \0362 " o' 64 2 243 \0363 " o^ 64 2 244 \0364 " o~ 64 2 245 \0365 " o" 64 2 246 \0366 " -: 60 0 247 \0367 " o/ 66 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 58 3 253 \0375 " th 66 3 254 \0376 " y" 58 3 255 \0377 " ^a 54 2 147 ~a 48 2 148 Ua 48 2 150 .a 28 2 151 oa 36 2 154 "a 70 2 157 Ca 34 1 158 va 54 2 159 0707070014231123461006440057030057030000010442000522627501500002600000006154post.src/devLatin1/AI name AI fontname AvantGarde-BookOblique named in prologue spacewidth 28 charset ! 29 2 33 " 31 2 34 dq " # 55 2 35 $ 55 2 36 % 78 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 43 2 42 + 61 0 43 , 28 0 44 - 33 0 173 \0255 " . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 59 2 63 @ 87 2 64 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 \ 61 2 92 bs " ] 35 3 93 ^ 50 2 147 --- 61 2 94 --- 50 1 95 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 43 0 122 { 35 3 123 --- 67 2 124 } 35 3 125 ~ 44 2 148 --- 61 0 126 \` 38 2 145 ga " !! 29 1 161 \0241 " c| 55 2 162 \0242 " ct " L- 55 2 163 \0243 " ps " xo 55 0 164 \0244 " cr " Y- 55 2 165 \0245 " yn " || 67 2 166 \0246 " so 62 3 167 \0247 " sc " "" 37 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 37 2 170 \0252 " << 43 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 49 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 38 2 180 \0264 " aa " /u 61 1 181 \0265 " P! 56 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 32 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 43 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 59 1 191 \0277 " A` 74 2 192 \0300 " A' 74 2 193 \0301 " A^ 74 2 194 \0302 " A~ 74 2 195 \0303 " A" 74 2 196 \0304 " A* 74 2 197 \0305 " AE 99 2 198 \0306 " C, 81 3 199 \0307 " E` 54 2 200 \0310 " E' 54 2 201 \0311 " E^ 54 2 202 \0312 " E" 54 2 203 \0313 " I` 23 2 204 \0314 " I' 23 2 205 \0315 " I^ 23 2 206 \0316 " I" 23 2 207 \0317 " D- 79 2 208 \0320 " N~ 74 2 209 \0321 " O` 87 2 210 \0322 " O' 87 2 211 \0323 " O^ 87 2 212 \0324 " O~ 87 2 213 \0325 " O" 87 2 214 \0326 " xx 61 0 215 \0327 " O/ 87 2 216 \0330 " U` 66 2 217 \0331 " U' 66 2 218 \0332 " U^ 66 2 219 \0333 " U" 66 2 220 \0334 " Y' 59 2 221 \0335 " TH 59 2 222 \0336 " ss 55 2 223 \0337 " a` 68 2 224 \0340 " a' 68 2 225 \0341 " a^ 68 2 226 \0342 " a~ 68 2 227 \0343 " a" 68 2 228 \0344 " a* 68 2 229 \0345 " ae 116 0 230 \0346 " c, 65 1 231 \0347 " e` 65 2 232 \0350 " e' 65 2 233 \0351 " e^ 65 2 234 \0352 " e" 65 2 235 \0353 " i` 20 2 236 \0354 " i' 20 2 237 \0355 " i^ 20 2 238 \0356 " i" 20 2 239 \0357 " d- 66 2 240 \0360 " n~ 61 2 241 \0361 " o` 66 2 242 \0362 " o' 66 2 243 \0363 " o^ 66 2 244 \0364 " o~ 66 2 245 \0365 " o" 66 2 246 \0366 " -: 61 0 247 \0367 " o/ 65 0 248 \0370 " u` 61 2 249 \0371 " u' 61 2 250 \0372 " u^ 61 2 251 \0373 " u" 61 2 252 \0374 " y' 54 3 253 \0375 " th 68 3 254 \0376 " y" 54 3 255 \0377 " ^a 50 2 147 ~a 44 2 148 Ua 45 2 150 .a 22 2 151 oa 33 2 154 "a 55 2 157 Ca 30 1 158 va 50 2 159 0707070014231123471006440057030057030000010442040522627501500002600000006145post.src/devLatin1/AR name AR fontname AvantGarde-Book named in prologue spacewidth 28 charset ! 29 2 33 " 31 2 34 dq " # 55 2 35 $ 55 2 36 % 78 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 43 2 42 + 61 0 43 , 28 0 44 - 33 0 173 \0255 " . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 59 2 63 @ 87 2 64 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 \ 61 2 92 bs " ] 35 3 93 ^ 50 2 147 --- 61 2 94 --- 50 1 95 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 43 0 122 { 35 3 123 --- 67 2 124 } 35 3 125 ~ 44 2 148 --- 61 0 126 \` 38 2 145 ga " !! 29 1 161 \0241 " c| 55 2 162 \0242 " ct " L- 55 2 163 \0243 " ps " xo 55 0 164 \0244 " cr " Y- 55 2 165 \0245 " yn " || 67 2 166 \0246 " so 62 3 167 \0247 " sc " "" 37 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 37 2 170 \0252 " << 43 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 49 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 38 2 180 \0264 " aa " /u 61 1 181 \0265 " P! 56 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 32 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 43 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 59 1 191 \0277 " A` 74 2 192 \0300 " A' 74 2 193 \0301 " A^ 74 2 194 \0302 " A~ 74 2 195 \0303 " A" 74 2 196 \0304 " A* 74 2 197 \0305 " AE 99 2 198 \0306 " C, 81 3 199 \0307 " E` 54 2 200 \0310 " E' 54 2 201 \0311 " E^ 54 2 202 \0312 " E" 54 2 203 \0313 " I` 23 2 204 \0314 " I' 23 2 205 \0315 " I^ 23 2 206 \0316 " I" 23 2 207 \0317 " D- 79 2 208 \0320 " N~ 74 2 209 \0321 " O` 87 2 210 \0322 " O' 87 2 211 \0323 " O^ 87 2 212 \0324 " O~ 87 2 213 \0325 " O" 87 2 214 \0326 " xx 61 0 215 \0327 " O/ 87 2 216 \0330 " U` 66 2 217 \0331 " U' 66 2 218 \0332 " U^ 66 2 219 \0333 " U" 66 2 220 \0334 " Y' 59 2 221 \0335 " TH 59 2 222 \0336 " ss 55 2 223 \0337 " a` 68 2 224 \0340 " a' 68 2 225 \0341 " a^ 68 2 226 \0342 " a~ 68 2 227 \0343 " a" 68 2 228 \0344 " a* 68 2 229 \0345 " ae 116 0 230 \0346 " c, 65 1 231 \0347 " e` 65 2 232 \0350 " e' 65 2 233 \0351 " e^ 65 2 234 \0352 " e" 65 2 235 \0353 " i` 20 2 236 \0354 " i' 20 2 237 \0355 " i^ 20 2 238 \0356 " i" 20 2 239 \0357 " d- 66 2 240 \0360 " n~ 61 2 241 \0361 " o` 66 2 242 \0362 " o' 66 2 243 \0363 " o^ 66 2 244 \0364 " o~ 66 2 245 \0365 " o" 66 2 246 \0366 " -: 61 0 247 \0367 " o/ 65 0 248 \0370 " u` 61 2 249 \0371 " u' 61 2 250 \0372 " u^ 61 2 251 \0373 " u" 61 2 252 \0374 " y' 54 3 253 \0375 " th 68 3 254 \0376 " y" 54 3 255 \0377 " ^a 50 2 147 ~a 44 2 148 Ua 45 2 150 .a 22 2 151 oa 33 2 154 "a 55 2 157 Ca 30 1 158 va 50 2 159 0707070014231123501006440057030057030000010442200522627501500002600000006154post.src/devLatin1/AX name AX fontname AvantGarde-DemiOblique named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 - 42 0 173 \0255 " . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 56 2 63 @ 74 2 64 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 \ 64 2 92 bs " ] 32 3 93 ^ 54 2 147 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 { 34 3 123 --- 60 2 124 } 34 3 125 ~ 48 2 148 --- 60 0 126 \` 42 2 145 ga " !! 28 1 161 \0241 " c| 56 2 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 2 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 60 2 166 \0246 " so 56 3 167 \0247 " sc " "" 50 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 36 2 170 \0252 " << 46 0 171 \0253 " -, 60 0 172 \0254 " hy 42 0 173 \0255 " -- 60 0 45 ro 74 2 174 \0256 " rg " -^ 42 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 60 0 177 \0261 " 2^ 34 2 178 \0262 " 3^ 34 2 179 \0263 " \' 42 2 180 \0264 " aa " /u 58 1 181 \0265 " P! 60 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 34 1 184 \0270 " ,a " 1^ 34 2 185 \0271 " o_ 36 2 186 \0272 " >> 46 0 187 \0273 " 14 84 2 188 \0274 " 12 84 2 189 \0275 " 34 84 2 190 \0276 " ?? 56 1 191 \0277 " A` 74 2 192 \0300 " A' 74 2 193 \0301 " A^ 74 2 194 \0302 " A~ 74 2 195 \0303 " A" 74 2 196 \0304 " A* 74 2 197 \0305 " AE 90 2 198 \0306 " C, 78 3 199 \0307 " E` 52 2 200 \0310 " E' 52 2 201 \0311 " E^ 52 2 202 \0312 " E" 52 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 74 2 208 \0320 " N~ 74 2 209 \0321 " O` 84 2 210 \0322 " O' 84 2 211 \0323 " O^ 84 2 212 \0324 " O~ 84 2 213 \0325 " O" 84 2 214 \0326 " xx 60 0 215 \0327 " O/ 84 2 216 \0330 " U` 64 2 217 \0331 " U' 64 2 218 \0332 " U^ 64 2 219 \0333 " U" 64 2 220 \0334 " Y' 62 2 221 \0335 " TH 56 2 222 \0336 " ss 60 2 223 \0337 " a` 66 2 224 \0340 " a' 66 2 225 \0341 " a^ 66 2 226 \0342 " a~ 66 2 227 \0343 " a" 66 2 228 \0344 " a* 66 2 229 \0345 " ae 108 0 230 \0346 " c, 64 1 231 \0347 " e` 64 2 232 \0350 " e' 64 2 233 \0351 " e^ 64 2 234 \0352 " e" 64 2 235 \0353 " i` 24 2 236 \0354 " i' 24 2 237 \0355 " i^ 24 2 238 \0356 " i" 24 2 239 \0357 " d- 64 2 240 \0360 " n~ 60 2 241 \0361 " o` 64 2 242 \0362 " o' 64 2 243 \0363 " o^ 64 2 244 \0364 " o~ 64 2 245 \0365 " o" 64 2 246 \0366 " -: 60 0 247 \0367 " o/ 66 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 58 3 253 \0375 " th 66 3 254 \0376 " y" 58 3 255 \0377 " ^a 54 2 147 ~a 48 2 148 Ua 48 2 150 .a 28 2 151 oa 36 2 154 "a 70 2 157 Ca 34 1 158 va 54 2 159 0707070014231123511006440057030057030000010442240522627501500002500000006137post.src/devLatin1/H name H fontname Helvetica named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 ^ 33 2 147 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 0 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 26 3 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 37 2 170 \0252 " << 56 0 171 \0253 " -, 58 0 172 \0254 " hy 33 0 173 \0255 " -- 58 0 45 ro 74 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 58 2 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 54 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 56 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 61 1 191 \0277 " A` 67 2 192 \0300 " A' 67 2 193 \0301 " A^ 67 2 194 \0302 " A~ 67 2 195 \0303 " A" 67 2 196 \0304 " A* 67 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 67 2 200 \0310 " E' 67 2 201 \0311 " E^ 67 2 202 \0312 " E" 67 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 58 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 67 2 221 \0335 " TH 67 2 222 \0336 " ss 61 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 89 0 230 \0346 " c, 50 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 56 2 240 \0360 " n~ 56 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 58 0 247 \0367 " o/ 61 0 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 50 3 253 \0375 " th 56 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123521006440057030057030000010442400522627501500002600000006144post.src/devLatin1/HB name HB fontname Helvetica-Bold named in prologue spacewidth 28 charset ! 33 2 33 " 47 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 61 2 63 @ 98 3 64 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 58 2 94 --- 56 1 95 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 2 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 28 3 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 37 2 170 \0252 " << 56 0 171 \0253 " -, 58 0 172 \0254 " hy 33 0 173 \0255 " -- 58 0 45 ro 74 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 58 2 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 61 1 181 \0265 " P! 56 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 56 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 61 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 67 2 200 \0310 " E' 67 2 201 \0311 " E^ 67 2 202 \0312 " E" 67 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 58 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 67 2 221 \0335 " TH 67 2 222 \0336 " ss 61 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 89 0 230 \0346 " c, 56 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 61 2 240 \0360 " n~ 61 2 241 \0361 " o` 61 2 242 \0362 " o' 61 2 243 \0363 " o^ 61 2 244 \0364 " o~ 61 2 245 \0365 " o" 61 2 246 \0366 " -: 58 0 247 \0367 " o/ 61 0 248 \0370 " u` 61 2 249 \0371 " u' 61 2 250 \0372 " u^ 61 2 251 \0373 " u" 61 2 252 \0374 " y' 56 3 253 \0375 " th 61 3 254 \0376 " y" 56 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123531006440057030057030000010442440522627501500002600000006150post.src/devLatin1/HI name HI fontname Helvetica-Oblique named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 ^ 33 2 147 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 0 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 26 3 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 37 2 170 \0252 " << 56 0 171 \0253 " -, 58 0 172 \0254 " hy 33 0 173 \0255 " -- 58 0 45 ro 74 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 58 2 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 54 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 56 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 61 1 191 \0277 " A` 67 2 192 \0300 " A' 67 2 193 \0301 " A^ 67 2 194 \0302 " A~ 67 2 195 \0303 " A" 67 2 196 \0304 " A* 67 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 67 2 200 \0310 " E' 67 2 201 \0311 " E^ 67 2 202 \0312 " E" 67 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 58 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 67 2 221 \0335 " TH 67 2 222 \0336 " ss 61 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 89 0 230 \0346 " c, 50 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 56 2 240 \0360 " n~ 56 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 58 0 247 \0367 " o/ 61 0 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 50 3 253 \0375 " th 56 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123541006440057030057030000010442600522627501500002600000006153post.src/devLatin1/HX name HX fontname Helvetica-BoldOblique named in prologue spacewidth 28 charset ! 33 2 33 " 47 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 61 2 63 @ 98 3 64 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 58 2 94 --- 56 1 95 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 2 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 28 3 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 37 2 170 \0252 " << 56 0 171 \0253 " -, 58 0 172 \0254 " hy 33 0 173 \0255 " -- 58 0 45 ro 74 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 58 2 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 61 1 181 \0265 " P! 56 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 56 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 61 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 67 2 200 \0310 " E' 67 2 201 \0311 " E^ 67 2 202 \0312 " E" 67 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 58 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 67 2 221 \0335 " TH 67 2 222 \0336 " ss 61 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 89 0 230 \0346 " c, 56 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 61 2 240 \0360 " n~ 61 2 241 \0361 " o` 61 2 242 \0362 " o' 61 2 243 \0363 " o^ 61 2 244 \0364 " o~ 61 2 245 \0365 " o" 61 2 246 \0366 " -: 58 0 247 \0367 " o/ 61 0 248 \0370 " u` 61 2 249 \0371 " u' 61 2 250 \0372 " u^ 61 2 251 \0373 " u" 61 2 252 \0374 " y' 56 3 253 \0375 " th 61 3 254 \0376 " y" 56 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123551006440057030057030000010442640522627501600002600000006152post.src/devLatin1/Hb name Hb fontname Helvetica-Narrow-Bold named in prologue spacewidth 23 charset ! 27 2 33 " 39 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 \0255 " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 50 2 63 @ 80 3 64 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 \ 23 2 92 bs " ] 27 3 93 ^ 27 2 147 --- 48 2 94 --- 46 1 95 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 { 32 3 123 --- 23 3 124 } 32 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 \0241 " c| 46 3 162 \0242 " ct " L- 46 2 163 \0243 " ps " xo 46 2 164 \0244 " cr " Y- 46 2 165 \0245 " yn " || 23 3 166 \0246 " so 46 3 167 \0247 " sc " "" 27 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 30 2 170 \0252 " << 46 0 171 \0253 " -, 48 0 172 \0254 " hy 27 0 173 \0255 " -- 48 0 45 ro 60 2 174 \0256 " rg " -^ 27 2 175 \0257 " -a " 0^ 33 2 176 \0260 " +- 48 2 177 \0261 " 2^ 27 2 178 \0262 " 3^ 27 2 179 \0263 " \' 27 2 180 \0264 " aa " /u 50 1 181 \0265 " P! 46 3 182 \0266 " pg " .^ 23 0 183 \0267 " ,, 27 1 184 \0270 " ,a " 1^ 27 2 185 \0271 " o_ 30 2 186 \0272 " >> 46 0 187 \0273 " 14 68 2 188 \0274 " 12 68 2 189 \0275 " 34 68 2 190 \0276 " ?? 50 1 191 \0277 " A` 59 2 192 \0300 " A' 59 2 193 \0301 " A^ 59 2 194 \0302 " A~ 59 2 195 \0303 " A" 59 2 196 \0304 " A* 59 2 197 \0305 " AE 82 2 198 \0306 " C, 59 3 199 \0307 " E` 55 2 200 \0310 " E' 55 2 201 \0311 " E^ 55 2 202 \0312 " E" 55 2 203 \0313 " I` 23 2 204 \0314 " I' 23 2 205 \0315 " I^ 23 2 206 \0316 " I" 23 2 207 \0317 " D- 59 2 208 \0320 " N~ 59 2 209 \0321 " O` 64 2 210 \0322 " O' 64 2 211 \0323 " O^ 64 2 212 \0324 " O~ 64 2 213 \0325 " O" 64 2 214 \0326 " xx 48 0 215 \0327 " O/ 64 2 216 \0330 " U` 59 2 217 \0331 " U' 59 2 218 \0332 " U^ 59 2 219 \0333 " U" 59 2 220 \0334 " Y' 55 2 221 \0335 " TH 55 2 222 \0336 " ss 50 2 223 \0337 " a` 46 2 224 \0340 " a' 46 2 225 \0341 " a^ 46 2 226 \0342 " a~ 46 2 227 \0343 " a" 46 2 228 \0344 " a* 46 2 229 \0345 " ae 73 0 230 \0346 " c, 46 1 231 \0347 " e` 46 2 232 \0350 " e' 46 2 233 \0351 " e^ 46 2 234 \0352 " e" 46 2 235 \0353 " i` 23 2 236 \0354 " i' 23 2 237 \0355 " i^ 23 2 238 \0356 " i" 23 2 239 \0357 " d- 50 2 240 \0360 " n~ 50 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 48 0 247 \0367 " o/ 50 0 248 \0370 " u` 50 2 249 \0371 " u' 50 2 250 \0372 " u^ 50 2 251 \0373 " u" 50 2 252 \0374 " y' 46 3 253 \0375 " th 50 3 254 \0376 " y" 46 3 255 \0377 " ^a 27 2 147 ~a 27 2 148 Ua 27 2 150 .a 27 2 151 oa 27 2 154 "a 27 2 157 Ca 27 1 158 va 27 2 159 0707070014231123561006440057030057030000010443000522627501600002600000006155post.src/devLatin1/Hi name Hi fontname Helvetica-Narrow-Oblique named in prologue spacewidth 23 charset ! 23 2 33 " 29 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 \0255 " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 46 2 63 @ 83 3 64 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 \ 23 2 92 bs " ] 23 3 93 ^ 27 2 147 --- 38 2 94 --- 46 1 95 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 { 27 3 123 --- 21 3 124 } 27 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 \0241 " c| 46 3 162 \0242 " ct " L- 46 2 163 \0243 " ps " xo 46 0 164 \0244 " cr " Y- 46 2 165 \0245 " yn " || 21 3 166 \0246 " so 46 3 167 \0247 " sc " "" 27 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 30 2 170 \0252 " << 46 0 171 \0253 " -, 48 0 172 \0254 " hy 27 0 173 \0255 " -- 48 0 45 ro 60 2 174 \0256 " rg " -^ 27 2 175 \0257 " -a " 0^ 33 2 176 \0260 " +- 48 2 177 \0261 " 2^ 27 2 178 \0262 " 3^ 27 2 179 \0263 " \' 27 2 180 \0264 " aa " /u 46 1 181 \0265 " P! 44 3 182 \0266 " pg " .^ 23 0 183 \0267 " ,, 27 1 184 \0270 " ,a " 1^ 27 2 185 \0271 " o_ 30 2 186 \0272 " >> 46 0 187 \0273 " 14 68 2 188 \0274 " 12 68 2 189 \0275 " 34 68 2 190 \0276 " ?? 50 1 191 \0277 " A` 55 2 192 \0300 " A' 55 2 193 \0301 " A^ 55 2 194 \0302 " A~ 55 2 195 \0303 " A" 55 2 196 \0304 " A* 55 2 197 \0305 " AE 82 2 198 \0306 " C, 59 3 199 \0307 " E` 55 2 200 \0310 " E' 55 2 201 \0311 " E^ 55 2 202 \0312 " E" 55 2 203 \0313 " I` 23 2 204 \0314 " I' 23 2 205 \0315 " I^ 23 2 206 \0316 " I" 23 2 207 \0317 " D- 59 2 208 \0320 " N~ 59 2 209 \0321 " O` 64 2 210 \0322 " O' 64 2 211 \0323 " O^ 64 2 212 \0324 " O~ 64 2 213 \0325 " O" 64 2 214 \0326 " xx 48 0 215 \0327 " O/ 64 2 216 \0330 " U` 59 2 217 \0331 " U' 59 2 218 \0332 " U^ 59 2 219 \0333 " U" 59 2 220 \0334 " Y' 55 2 221 \0335 " TH 55 2 222 \0336 " ss 50 2 223 \0337 " a` 46 2 224 \0340 " a' 46 2 225 \0341 " a^ 46 2 226 \0342 " a~ 46 2 227 \0343 " a" 46 2 228 \0344 " a* 46 2 229 \0345 " ae 73 0 230 \0346 " c, 41 1 231 \0347 " e` 46 2 232 \0350 " e' 46 2 233 \0351 " e^ 46 2 234 \0352 " e" 46 2 235 \0353 " i` 23 2 236 \0354 " i' 23 2 237 \0355 " i^ 23 2 238 \0356 " i" 23 2 239 \0357 " d- 46 2 240 \0360 " n~ 46 2 241 \0361 " o` 46 2 242 \0362 " o' 46 2 243 \0363 " o^ 46 2 244 \0364 " o~ 46 2 245 \0365 " o" 46 2 246 \0366 " -: 48 0 247 \0367 " o/ 50 0 248 \0370 " u` 46 2 249 \0371 " u' 46 2 250 \0372 " u^ 46 2 251 \0373 " u" 46 2 252 \0374 " y' 41 3 253 \0375 " th 46 3 254 \0376 " y" 41 3 255 \0377 " ^a 27 2 147 ~a 27 2 148 Ua 27 2 150 .a 27 2 151 oa 27 2 154 "a 27 2 157 Ca 27 1 158 va 27 2 159 0707070014231123571006440057030057030000010443040522627501600002600000006145post.src/devLatin1/Hr name Hr fontname Helvetica-Narrow named in prologue spacewidth 23 charset ! 23 2 33 " 29 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 \0255 " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 46 2 63 @ 83 3 64 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 \ 23 2 92 bs " ] 23 3 93 ^ 27 2 147 --- 38 2 94 --- 46 1 95 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 { 27 3 123 --- 21 3 124 } 27 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 \0241 " c| 46 3 162 \0242 " ct " L- 46 2 163 \0243 " ps " xo 46 0 164 \0244 " cr " Y- 46 2 165 \0245 " yn " || 21 3 166 \0246 " so 46 3 167 \0247 " sc " "" 27 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 30 2 170 \0252 " << 46 0 171 \0253 " -, 48 0 172 \0254 " hy 27 0 173 \0255 " -- 48 0 45 ro 60 2 174 \0256 " rg " -^ 27 2 175 \0257 " -a " 0^ 33 2 176 \0260 " +- 48 2 177 \0261 " 2^ 27 2 178 \0262 " 3^ 27 2 179 \0263 " \' 27 2 180 \0264 " aa " /u 46 1 181 \0265 " P! 44 3 182 \0266 " pg " .^ 23 0 183 \0267 " ,, 27 1 184 \0270 " ,a " 1^ 27 2 185 \0271 " o_ 30 2 186 \0272 " >> 46 0 187 \0273 " 14 68 2 188 \0274 " 12 68 2 189 \0275 " 34 68 2 190 \0276 " ?? 50 1 191 \0277 " A` 55 2 192 \0300 " A' 55 2 193 \0301 " A^ 55 2 194 \0302 " A~ 55 2 195 \0303 " A" 55 2 196 \0304 " A* 55 2 197 \0305 " AE 82 2 198 \0306 " C, 59 3 199 \0307 " E` 55 2 200 \0310 " E' 55 2 201 \0311 " E^ 55 2 202 \0312 " E" 55 2 203 \0313 " I` 23 2 204 \0314 " I' 23 2 205 \0315 " I^ 23 2 206 \0316 " I" 23 2 207 \0317 " D- 59 2 208 \0320 " N~ 59 2 209 \0321 " O` 64 2 210 \0322 " O' 64 2 211 \0323 " O^ 64 2 212 \0324 " O~ 64 2 213 \0325 " O" 64 2 214 \0326 " xx 48 0 215 \0327 " O/ 64 2 216 \0330 " U` 59 2 217 \0331 " U' 59 2 218 \0332 " U^ 59 2 219 \0333 " U" 59 2 220 \0334 " Y' 55 2 221 \0335 " TH 55 2 222 \0336 " ss 50 2 223 \0337 " a` 46 2 224 \0340 " a' 46 2 225 \0341 " a^ 46 2 226 \0342 " a~ 46 2 227 \0343 " a" 46 2 228 \0344 " a* 46 2 229 \0345 " ae 73 0 230 \0346 " c, 41 1 231 \0347 " e` 46 2 232 \0350 " e' 46 2 233 \0351 " e^ 46 2 234 \0352 " e" 46 2 235 \0353 " i` 23 2 236 \0354 " i' 23 2 237 \0355 " i^ 23 2 238 \0356 " i" 23 2 239 \0357 " d- 46 2 240 \0360 " n~ 46 2 241 \0361 " o` 46 2 242 \0362 " o' 46 2 243 \0363 " o^ 46 2 244 \0364 " o~ 46 2 245 \0365 " o" 46 2 246 \0366 " -: 48 0 247 \0367 " o/ 50 0 248 \0370 " u` 46 2 249 \0371 " u' 46 2 250 \0372 " u^ 46 2 251 \0373 " u" 46 2 252 \0374 " y' 41 3 253 \0375 " th 46 3 254 \0376 " y" 41 3 255 \0377 " ^a 27 2 147 ~a 27 2 148 Ua 27 2 150 .a 27 2 151 oa 27 2 154 "a 27 2 157 Ca 27 1 158 va 27 2 159 0707070014231123601006440057030057030000010443200522627501600002600000006161post.src/devLatin1/Hx name Hx fontname Helvetica-Narrow-BoldOblique named in prologue spacewidth 23 charset ! 27 2 33 " 39 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 \0255 " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 50 2 63 @ 80 3 64 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 \ 23 2 92 bs " ] 27 3 93 ^ 27 2 147 --- 48 2 94 --- 46 1 95 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 { 32 3 123 --- 23 3 124 } 32 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 \0241 " c| 46 3 162 \0242 " ct " L- 46 2 163 \0243 " ps " xo 46 2 164 \0244 " cr " Y- 46 2 165 \0245 " yn " || 23 3 166 \0246 " so 46 3 167 \0247 " sc " "" 27 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 30 2 170 \0252 " << 46 0 171 \0253 " -, 48 0 172 \0254 " hy 27 0 173 \0255 " -- 48 0 45 ro 60 2 174 \0256 " rg " -^ 27 2 175 \0257 " -a " 0^ 33 2 176 \0260 " +- 48 2 177 \0261 " 2^ 27 2 178 \0262 " 3^ 27 2 179 \0263 " \' 27 2 180 \0264 " aa " /u 50 1 181 \0265 " P! 46 3 182 \0266 " pg " .^ 23 0 183 \0267 " ,, 27 1 184 \0270 " ,a " 1^ 27 2 185 \0271 " o_ 30 2 186 \0272 " >> 46 0 187 \0273 " 14 68 2 188 \0274 " 12 68 2 189 \0275 " 34 68 2 190 \0276 " ?? 50 1 191 \0277 " A` 59 2 192 \0300 " A' 59 2 193 \0301 " A^ 59 2 194 \0302 " A~ 59 2 195 \0303 " A" 59 2 196 \0304 " A* 59 2 197 \0305 " AE 82 2 198 \0306 " C, 59 3 199 \0307 " E` 55 2 200 \0310 " E' 55 2 201 \0311 " E^ 55 2 202 \0312 " E" 55 2 203 \0313 " I` 23 2 204 \0314 " I' 23 2 205 \0315 " I^ 23 2 206 \0316 " I" 23 2 207 \0317 " D- 59 2 208 \0320 " N~ 59 2 209 \0321 " O` 64 2 210 \0322 " O' 64 2 211 \0323 " O^ 64 2 212 \0324 " O~ 64 2 213 \0325 " O" 64 2 214 \0326 " xx 48 0 215 \0327 " O/ 64 2 216 \0330 " U` 59 2 217 \0331 " U' 59 2 218 \0332 " U^ 59 2 219 \0333 " U" 59 2 220 \0334 " Y' 55 2 221 \0335 " TH 55 2 222 \0336 " ss 50 2 223 \0337 " a` 46 2 224 \0340 " a' 46 2 225 \0341 " a^ 46 2 226 \0342 " a~ 46 2 227 \0343 " a" 46 2 228 \0344 " a* 46 2 229 \0345 " ae 73 0 230 \0346 " c, 46 1 231 \0347 " e` 46 2 232 \0350 " e' 46 2 233 \0351 " e^ 46 2 234 \0352 " e" 46 2 235 \0353 " i` 23 2 236 \0354 " i' 23 2 237 \0355 " i^ 23 2 238 \0356 " i" 23 2 239 \0357 " d- 50 2 240 \0360 " n~ 50 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 48 0 247 \0367 " o/ 50 0 248 \0370 " u` 50 2 249 \0371 " u' 50 2 250 \0372 " u^ 50 2 251 \0373 " u" 50 2 252 \0374 " y' 46 3 253 \0375 " th 50 3 254 \0376 " y" 46 3 255 \0377 " ^a 27 2 147 ~a 27 2 148 Ua 27 2 150 .a 27 2 151 oa 27 2 154 "a 27 2 157 Ca 27 1 158 va 27 2 159 0707070014231123611006440057030057030000010443240522627501600002600000006143post.src/devLatin1/KB name KB fontname Bookman-Demi named in prologue spacewidth 34 charset ! 36 2 33 " 42 2 34 dq " # 60 2 35 $ 66 3 36 % 94 2 37 & 80 2 38 ' 32 2 39 ( 32 3 40 ) 32 3 41 * 46 2 42 + 60 0 43 , 34 1 44 - 36 0 173 \0255 " . 34 0 46 / 60 3 47 0 66 2 48 1 66 2 49 2 66 2 50 3 66 2 51 4 66 2 52 5 66 2 53 6 66 2 54 7 66 2 55 8 66 2 56 9 66 2 57 : 34 0 58 ; 34 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 66 2 63 @ 82 2 64 A 72 2 65 B 72 2 66 C 74 2 67 D 78 2 68 E 72 2 69 F 68 2 70 G 78 2 71 H 82 2 72 I 40 2 73 J 64 2 74 K 80 2 75 L 64 2 76 M 94 2 77 N 74 2 78 O 80 2 79 P 66 2 80 Q 80 3 81 R 78 2 82 S 66 2 83 T 70 2 84 U 74 2 85 V 72 2 86 W 94 2 87 X 78 2 88 Y 70 2 89 Z 64 2 90 [ 30 3 91 \ 60 2 92 bs " ] 30 3 93 ^ 50 2 147 --- 60 2 94 --- 50 1 95 ` 32 2 96 a 58 0 97 b 60 2 98 c 58 0 99 d 64 2 100 e 58 0 101 f 38 2 102 g 58 3 103 h 68 2 104 i 36 2 105 j 34 3 106 k 66 2 107 l 34 2 108 m 100 0 109 n 68 0 110 o 62 0 111 p 64 1 112 q 62 1 113 r 46 0 114 s 52 0 115 t 46 2 116 u 66 0 117 v 60 0 118 w 80 0 119 x 60 0 120 y 62 1 121 z 56 0 122 { 32 3 123 --- 60 2 124 } 32 3 125 ~ 48 2 148 --- 60 0 126 \` 40 2 145 ga " !! 36 1 161 \0241 " c| 66 2 162 \0242 " ct " L- 66 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 66 2 165 \0245 " yn " || 60 2 166 \0246 " so 60 3 167 \0247 " sc " "" 50 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 40 2 170 \0252 " << 40 0 171 \0253 " -, 60 0 172 \0254 " hy 36 0 173 \0255 " -- 60 0 45 ro 74 2 174 \0256 " rg " -^ 46 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 60 0 177 \0261 " 2^ 40 2 178 \0262 " 3^ 40 2 179 \0263 " \' 40 2 180 \0264 " aa " /u 66 1 181 \0265 " P! 80 2 182 \0266 " pg " .^ 34 0 183 \0267 " ,, 36 1 184 \0270 " ,a " 1^ 40 2 185 \0271 " o_ 40 2 186 \0272 " >> 40 0 187 \0273 " 14 99 2 188 \0274 " 12 99 2 189 \0275 " 34 99 2 190 \0276 " ?? 66 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 114 2 198 \0306 " C, 74 3 199 \0307 " E` 72 2 200 \0310 " E' 72 2 201 \0311 " E^ 72 2 202 \0312 " E" 72 2 203 \0313 " I` 40 2 204 \0314 " I' 40 2 205 \0315 " I^ 40 2 206 \0316 " I" 40 2 207 \0317 " D- 78 2 208 \0320 " N~ 74 2 209 \0321 " O` 80 2 210 \0322 " O' 80 2 211 \0323 " O^ 80 2 212 \0324 " O~ 80 2 213 \0325 " O" 80 2 214 \0326 " xx 60 0 215 \0327 " O/ 80 3 216 \0330 " U` 74 2 217 \0331 " U' 74 2 218 \0332 " U^ 74 2 219 \0333 " U" 74 2 220 \0334 " Y' 70 2 221 \0335 " TH 66 2 222 \0336 " ss 66 2 223 \0337 " a` 58 2 224 \0340 " a' 58 2 225 \0341 " a^ 58 2 226 \0342 " a~ 58 2 227 \0343 " a" 58 2 228 \0344 " a* 58 2 229 \0345 " ae 88 0 230 \0346 " c, 58 1 231 \0347 " e` 58 2 232 \0350 " e' 58 2 233 \0351 " e^ 58 2 234 \0352 " e" 58 2 235 \0353 " i` 36 2 236 \0354 " i' 36 2 237 \0355 " i^ 36 2 238 \0356 " i" 36 2 239 \0357 " d- 62 2 240 \0360 " n~ 68 2 241 \0361 " o` 62 2 242 \0362 " o' 62 2 243 \0363 " o^ 62 2 244 \0364 " o~ 62 2 245 \0365 " o" 62 2 246 \0366 " -: 60 0 247 \0367 " o/ 62 0 248 \0370 " u` 66 2 249 \0371 " u' 66 2 250 \0372 " u^ 66 2 251 \0373 " u" 66 2 252 \0374 " y' 62 3 253 \0375 " th 64 3 254 \0376 " y" 62 3 255 \0377 " ^a 50 2 147 ~a 48 2 148 Ua 50 2 150 .a 32 2 151 oa 34 2 154 "a 44 2 157 Ca 32 1 158 va 50 2 159 0707070014231123621006440057030057030000010443400522627501600002600000006151post.src/devLatin1/KI name KI fontname Bookman-LightItalic named in prologue spacewidth 30 charset ! 32 2 33 " 36 2 34 dq " # 60 2 35 $ 62 2 36 % 80 2 37 & 82 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 44 2 42 + 60 2 43 , 30 1 44 - 32 0 173 \0255 " . 30 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 30 0 58 ; 30 1 59 --- 60 2 60 = 60 0 61 --- 60 2 62 ? 54 2 63 @ 78 2 64 A 70 2 65 B 72 2 66 C 72 2 67 D 74 2 68 E 68 2 69 F 62 2 70 G 76 2 71 H 80 2 72 I 32 2 73 J 56 2 74 K 72 2 75 L 58 2 76 M 86 2 77 N 72 2 78 O 76 2 79 P 60 2 80 Q 78 3 81 R 70 2 82 S 64 2 83 T 60 2 84 U 72 2 85 V 68 2 86 W 96 2 87 X 70 2 88 Y 66 2 89 Z 58 2 90 [ 26 3 91 \ 60 2 92 bs " ] 26 3 93 ^ 44 2 147 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 62 0 97 b 60 2 98 c 48 0 99 d 64 2 100 e 54 0 101 f 34 3 102 g 56 1 103 h 62 2 104 i 28 2 105 j 28 3 106 k 60 2 107 l 28 2 108 m 88 0 109 n 62 0 110 o 54 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 54 0 115 t 34 2 116 u 62 0 117 v 54 0 118 w 88 0 119 x 54 0 120 y 60 1 121 z 52 0 122 { 36 3 123 --- 60 2 124 } 38 3 125 ~ 44 2 148 --- 60 0 126 \` 34 2 145 ga " !! 32 1 161 \0241 " c| 62 2 162 \0242 " ct " L- 62 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 62 2 165 \0245 " yn " || 60 2 166 \0246 " so 62 3 167 \0247 " sc " "" 42 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 44 2 170 \0252 " << 30 0 171 \0253 " -, 60 0 172 \0254 " hy 32 0 173 \0255 " -- 60 0 45 ro 74 2 174 \0256 " rg " -^ 44 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 60 2 177 \0261 " 2^ 37 2 178 \0262 " 3^ 37 2 179 \0263 " \' 32 2 180 \0264 " aa " /u 62 1 181 \0265 " P! 62 2 182 \0266 " pg " .^ 30 0 183 \0267 " ,, 32 1 184 \0270 " ,a " 1^ 37 2 185 \0271 " o_ 40 2 186 \0272 " >> 30 0 187 \0273 " 14 93 2 188 \0274 " 12 93 2 189 \0275 " 34 93 2 190 \0276 " ?? 54 1 191 \0277 " A` 70 2 192 \0300 " A' 70 2 193 \0301 " A^ 70 2 194 \0302 " A~ 70 2 195 \0303 " A" 70 2 196 \0304 " A* 70 2 197 \0305 " AE 122 2 198 \0306 " C, 72 3 199 \0307 " E` 68 2 200 \0310 " E' 68 2 201 \0311 " E^ 68 2 202 \0312 " E" 68 2 203 \0313 " I` 32 2 204 \0314 " I' 32 2 205 \0315 " I^ 32 2 206 \0316 " I" 32 2 207 \0317 " D- 74 2 208 \0320 " N~ 72 2 209 \0321 " O` 76 2 210 \0322 " O' 76 2 211 \0323 " O^ 76 2 212 \0324 " O~ 76 2 213 \0325 " O" 76 2 214 \0326 " xx 60 2 215 \0327 " O/ 76 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 66 2 221 \0335 " TH 60 2 222 \0336 " ss 62 3 223 \0337 " a` 62 2 224 \0340 " a' 62 2 225 \0341 " a^ 62 2 226 \0342 " a~ 62 2 227 \0343 " a" 62 2 228 \0344 " a* 62 2 229 \0345 " ae 88 0 230 \0346 " c, 48 1 231 \0347 " e` 54 2 232 \0350 " e' 54 2 233 \0351 " e^ 54 2 234 \0352 " e" 54 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 54 2 240 \0360 " n~ 62 2 241 \0361 " o` 54 2 242 \0362 " o' 54 2 243 \0363 " o^ 54 2 244 \0364 " o~ 54 2 245 \0365 " o" 54 2 246 \0366 " -: 60 2 247 \0367 " o/ 54 0 248 \0370 " u` 62 2 249 \0371 " u' 62 2 250 \0372 " u^ 62 2 251 \0373 " u" 62 2 252 \0374 " y' 60 3 253 \0375 " th 60 3 254 \0376 " y" 60 3 255 \0377 " ^a 44 2 147 ~a 44 2 148 Ua 44 2 150 .a 26 2 151 oa 30 2 154 "a 34 2 157 Ca 26 1 158 va 44 2 159 0707070014231123631006440057030057030000010443440522627501600002600000006143post.src/devLatin1/KR name KR fontname Bookman-Light named in prologue spacewidth 32 charset ! 30 2 33 " 38 2 34 dq " # 60 2 35 $ 62 2 36 % 90 2 37 & 80 2 38 ' 22 2 39 ( 30 3 40 ) 30 3 41 * 44 2 42 + 60 0 43 , 32 1 44 - 40 0 173 \0255 " . 32 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 32 0 58 ; 32 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 54 2 63 @ 82 2 64 A 68 2 65 B 74 2 66 C 74 2 67 D 80 2 68 E 72 2 69 F 64 2 70 G 80 2 71 H 80 2 72 I 34 2 73 J 60 2 74 K 72 2 75 L 60 2 76 M 92 2 77 N 74 2 78 O 80 2 79 P 62 2 80 Q 82 3 81 R 72 2 82 S 66 2 83 T 62 2 84 U 78 2 85 V 70 2 86 W 96 2 87 X 72 2 88 Y 64 2 89 Z 64 2 90 [ 30 3 91 \ 60 2 92 bs " ] 30 3 93 ^ 42 2 147 --- 60 2 94 --- 50 1 95 ` 22 2 96 a 58 0 97 b 62 2 98 c 52 0 99 d 62 2 100 e 52 0 101 f 32 2 102 g 54 3 103 h 66 2 104 i 30 2 105 j 30 3 106 k 62 2 107 l 30 2 108 m 94 0 109 n 66 0 110 o 56 0 111 p 62 1 112 q 58 1 113 r 44 0 114 s 52 0 115 t 38 2 116 u 68 0 117 v 52 0 118 w 78 0 119 x 56 0 120 y 54 1 121 z 48 0 122 { 28 3 123 --- 60 2 124 } 28 3 125 ~ 44 2 148 --- 60 0 126 \` 34 2 145 ga " !! 30 1 161 \0241 " c| 62 2 162 \0242 " ct " L- 62 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 62 2 165 \0245 " yn " || 60 2 166 \0246 " so 52 3 167 \0247 " sc " "" 42 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 42 2 170 \0252 " << 36 0 171 \0253 " -, 60 0 172 \0254 " hy 40 0 173 \0255 " -- 60 0 45 ro 74 2 174 \0256 " rg " -^ 44 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 60 0 177 \0261 " 2^ 37 2 178 \0262 " 3^ 37 2 179 \0263 " \' 34 2 180 \0264 " aa " /u 68 1 181 \0265 " P! 60 2 182 \0266 " pg " .^ 32 0 183 \0267 " ,, 32 1 184 \0270 " ,a " 1^ 37 2 185 \0271 " o_ 42 2 186 \0272 " >> 36 0 187 \0273 " 14 93 2 188 \0274 " 12 93 2 189 \0275 " 34 93 2 190 \0276 " ?? 54 1 191 \0277 " A` 68 2 192 \0300 " A' 68 2 193 \0301 " A^ 68 2 194 \0302 " A~ 68 2 195 \0303 " A" 68 2 196 \0304 " A* 68 2 197 \0305 " AE 126 2 198 \0306 " C, 74 3 199 \0307 " E` 72 2 200 \0310 " E' 72 2 201 \0311 " E^ 72 2 202 \0312 " E" 72 2 203 \0313 " I` 34 2 204 \0314 " I' 34 2 205 \0315 " I^ 34 2 206 \0316 " I" 34 2 207 \0317 " D- 80 2 208 \0320 " N~ 74 2 209 \0321 " O` 80 2 210 \0322 " O' 80 2 211 \0323 " O^ 80 2 212 \0324 " O~ 80 2 213 \0325 " O" 80 2 214 \0326 " xx 60 0 215 \0327 " O/ 80 2 216 \0330 " U` 78 2 217 \0331 " U' 78 2 218 \0332 " U^ 78 2 219 \0333 " U" 78 2 220 \0334 " Y' 64 2 221 \0335 " TH 62 2 222 \0336 " ss 66 2 223 \0337 " a` 58 2 224 \0340 " a' 58 2 225 \0341 " a^ 58 2 226 \0342 " a~ 58 2 227 \0343 " a" 58 2 228 \0344 " a* 58 2 229 \0345 " ae 86 0 230 \0346 " c, 52 1 231 \0347 " e` 52 2 232 \0350 " e' 52 2 233 \0351 " e^ 52 2 234 \0352 " e" 52 2 235 \0353 " i` 30 2 236 \0354 " i' 30 2 237 \0355 " i^ 30 2 238 \0356 " i" 30 2 239 \0357 " d- 56 2 240 \0360 " n~ 66 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 60 0 247 \0367 " o/ 56 0 248 \0370 " u` 68 2 249 \0371 " u' 68 2 250 \0372 " u^ 68 2 251 \0373 " u" 68 2 252 \0374 " y' 54 3 253 \0375 " th 62 3 254 \0376 " y" 54 3 255 \0377 " ^a 42 2 147 ~a 44 2 148 Ua 46 2 150 .a 26 2 151 oa 32 2 154 "a 38 2 157 Ca 32 1 158 va 42 2 159 0707070014231123641006440057030057030000010443600522627501600002600000006154post.src/devLatin1/KX name KX fontname Bookman-DemiItalic named in prologue spacewidth 34 charset ! 32 2 33 " 38 2 34 dq " # 60 2 35 $ 68 3 36 % 88 2 37 & 98 2 38 ' 32 2 39 ( 26 3 40 ) 26 3 41 * 46 2 42 + 60 0 43 , 34 1 44 - 28 0 173 \0255 " . 34 0 46 / 36 2 47 0 68 2 48 1 68 2 49 2 68 2 50 3 68 2 51 4 68 2 52 5 68 2 53 6 68 2 54 7 68 2 55 8 68 2 56 9 68 2 57 : 34 0 58 ; 34 1 59 --- 62 0 60 = 60 0 61 --- 62 0 62 ? 62 2 63 @ 78 2 64 A 72 2 65 B 72 2 66 C 70 2 67 D 76 2 68 E 72 2 69 F 66 2 70 G 76 2 71 H 80 2 72 I 38 2 73 J 62 2 74 K 78 2 75 L 64 2 76 M 86 2 77 N 74 2 78 O 76 2 79 P 64 2 80 Q 76 3 81 R 74 2 82 S 70 2 83 T 70 2 84 U 74 2 85 V 66 2 86 W 100 2 87 X 74 2 88 Y 66 2 89 Z 68 2 90 [ 26 3 91 \ 58 2 92 bs " ] 26 3 93 ^ 48 2 147 --- 62 2 94 --- 50 1 95 ` 32 2 96 a 68 0 97 b 60 2 98 c 56 0 99 d 68 2 100 e 56 0 101 f 42 3 102 g 62 1 103 h 70 2 104 i 38 2 105 j 32 3 106 k 70 2 107 l 38 2 108 m 96 0 109 n 68 0 110 o 60 0 111 p 66 1 112 q 62 1 113 r 50 0 114 s 54 0 115 t 44 2 116 u 68 0 117 v 54 0 118 w 86 0 119 x 62 0 120 y 60 1 121 z 56 0 122 { 30 3 123 --- 62 2 124 } 30 3 125 ~ 48 2 148 --- 62 0 126 \` 38 2 145 ga " !! 32 1 161 \0241 " c| 68 2 162 \0242 " ct " L- 68 2 163 \0243 " ps " xo 68 2 164 \0244 " cr " Y- 68 2 165 \0245 " yn " || 62 2 166 \0246 " so 62 3 167 \0247 " sc " "" 52 2 168 \0250 " :a " co 78 2 169 \0251 " a_ 44 2 170 \0252 " << 38 0 171 \0253 " -, 62 0 172 \0254 " hy 28 0 173 \0255 " -- 60 0 45 ro 78 2 174 \0256 " rg " -^ 48 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 60 0 177 \0261 " 2^ 41 2 178 \0262 " 3^ 41 2 179 \0263 " \' 34 2 180 \0264 " aa " /u 68 1 181 \0265 " P! 68 3 182 \0266 " pg " .^ 34 0 183 \0267 " ,, 36 1 184 \0270 " ,a " 1^ 41 2 185 \0271 " o_ 44 2 186 \0272 " >> 38 0 187 \0273 " 14 102 2 188 \0274 " 12 102 2 189 \0275 " 34 102 2 190 \0276 " ?? 62 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 114 2 198 \0306 " C, 70 3 199 \0307 " E` 72 2 200 \0310 " E' 72 2 201 \0311 " E^ 72 2 202 \0312 " E" 72 2 203 \0313 " I` 38 2 204 \0314 " I' 38 2 205 \0315 " I^ 38 2 206 \0316 " I" 38 2 207 \0317 " D- 76 2 208 \0320 " N~ 74 2 209 \0321 " O` 76 2 210 \0322 " O' 76 2 211 \0323 " O^ 76 2 212 \0324 " O~ 76 2 213 \0325 " O" 76 2 214 \0326 " xx 60 0 215 \0327 " O/ 76 2 216 \0330 " U` 74 2 217 \0331 " U' 74 2 218 \0332 " U^ 74 2 219 \0333 " U" 74 2 220 \0334 " Y' 66 2 221 \0335 " TH 64 2 222 \0336 " ss 66 3 223 \0337 " a` 68 2 224 \0340 " a' 68 2 225 \0341 " a^ 68 2 226 \0342 " a~ 68 2 227 \0343 " a" 68 2 228 \0344 " a* 68 2 229 \0345 " ae 88 0 230 \0346 " c, 56 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 38 2 236 \0354 " i' 38 2 237 \0355 " i^ 38 2 238 \0356 " i" 38 2 239 \0357 " d- 60 2 240 \0360 " n~ 68 2 241 \0361 " o` 60 2 242 \0362 " o' 60 2 243 \0363 " o^ 60 2 244 \0364 " o~ 60 2 245 \0365 " o" 60 2 246 \0366 " -: 60 0 247 \0367 " o/ 60 2 248 \0370 " u` 68 2 249 \0371 " u' 68 2 250 \0372 " u^ 68 2 251 \0373 " u" 68 2 252 \0374 " y' 60 3 253 \0375 " th 66 3 254 \0376 " y" 60 3 255 \0377 " ^a 48 2 147 ~a 48 2 148 Ua 46 2 150 .a 38 2 151 oa 36 2 154 "a 56 2 157 Ca 32 1 158 va 48 2 159 0707070014231123651006440057030057030000010443640522627501600002600000006152post.src/devLatin1/NB name NB fontname NewCenturySchlbk-Bold named in prologue spacewidth 29 charset ! 30 2 33 " 33 2 34 dq " # 57 2 35 $ 57 3 36 % 83 2 37 & 85 2 38 ' 24 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 50 2 63 @ 75 2 64 A 76 2 65 B 78 2 66 C 78 2 67 D 83 2 68 E 76 2 69 F 72 2 70 G 83 2 71 H 87 2 72 I 44 2 73 J 65 2 74 K 82 2 75 L 72 2 76 M 98 2 77 N 83 2 78 O 83 2 79 P 76 2 80 Q 83 3 81 R 82 2 82 S 67 2 83 T 72 2 84 U 83 2 85 V 76 2 86 W 98 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 39 3 91 \ 61 2 92 bs " ] 39 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 24 2 96 a 61 0 97 b 65 2 98 c 56 0 99 d 67 2 100 e 57 0 101 f 39 2 102 g 61 1 103 h 69 2 104 i 37 2 105 j 35 3 106 k 67 2 107 l 35 2 108 m 96 0 109 n 69 0 110 o 61 0 111 p 67 1 112 q 65 1 113 r 52 0 114 s 50 0 115 t 43 2 116 u 69 0 117 v 61 0 118 w 89 0 119 x 61 0 120 y 61 1 121 z 54 0 122 { 39 3 123 --- 61 2 124 } 39 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 30 1 161 \0241 " c| 57 3 162 \0242 " ct " L- 57 2 163 \0243 " ps " xo 57 2 164 \0244 " cr " Y- 57 2 165 \0245 " yn " || 61 2 166 \0246 " so 50 2 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 37 2 170 \0252 " << 50 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 34 2 178 \0262 " 3^ 34 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 69 1 181 \0265 " P! 75 2 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 34 2 185 \0271 " o_ 37 2 186 \0272 " >> 50 0 187 \0273 " 14 86 2 188 \0274 " 12 86 2 189 \0275 " 34 86 2 190 \0276 " ?? 50 1 191 \0277 " A` 76 2 192 \0300 " A' 76 2 193 \0301 " A^ 76 2 194 \0302 " A~ 76 2 195 \0303 " A" 76 2 196 \0304 " A* 76 2 197 \0305 " AE 98 2 198 \0306 " C, 78 3 199 \0307 " E` 76 2 200 \0310 " E' 76 2 201 \0311 " E^ 76 2 202 \0312 " E" 76 2 203 \0313 " I` 44 2 204 \0314 " I' 44 2 205 \0315 " I^ 44 2 206 \0316 " I" 44 2 207 \0317 " D- 83 2 208 \0320 " N~ 83 2 209 \0321 " O` 83 2 210 \0322 " O' 83 2 211 \0323 " O^ 83 2 212 \0324 " O~ 83 2 213 \0325 " O" 83 2 214 \0326 " xx 61 0 215 \0327 " O/ 83 2 216 \0330 " U` 83 2 217 \0331 " U' 83 2 218 \0332 " U^ 83 2 219 \0333 " U" 83 2 220 \0334 " Y' 72 2 221 \0335 " TH 76 2 222 \0336 " ss 61 2 223 \0337 " a` 61 2 224 \0340 " a' 61 2 225 \0341 " a^ 61 2 226 \0342 " a~ 61 2 227 \0343 " a" 61 2 228 \0344 " a* 61 2 229 \0345 " ae 87 0 230 \0346 " c, 56 1 231 \0347 " e` 57 2 232 \0350 " e' 57 2 233 \0351 " e^ 57 2 234 \0352 " e" 57 2 235 \0353 " i` 37 2 236 \0354 " i' 37 2 237 \0355 " i^ 37 2 238 \0356 " i" 37 2 239 \0357 " d- 61 2 240 \0360 " n~ 69 2 241 \0361 " o` 61 2 242 \0362 " o' 61 2 243 \0363 " o^ 61 2 244 \0364 " o~ 61 2 245 \0365 " o" 61 2 246 \0366 " -: 61 0 247 \0367 " o/ 61 3 248 \0370 " u` 69 2 249 \0371 " u' 69 2 250 \0372 " u^ 69 2 251 \0373 " u" 69 2 252 \0374 " y' 61 3 253 \0375 " th 67 3 254 \0376 " y" 61 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123661006440057030057030000010444000522627501600002600000006154post.src/devLatin1/NI name NI fontname NewCenturySchlbk-Italic named in prologue spacewidth 28 charset ! 33 2 33 " 40 2 34 dq " # 56 2 35 $ 56 3 36 % 83 2 37 & 85 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 61 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 70 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 61 2 74 K 74 2 75 L 67 2 76 M 94 2 77 N 82 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 74 2 82 S 67 2 83 T 69 2 84 U 82 2 85 V 70 2 86 W 93 2 87 X 70 2 88 Y 69 2 89 Z 67 2 90 [ 33 3 91 \ 61 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 20 2 96 a 57 0 97 b 56 2 98 c 44 0 99 d 61 2 100 e 44 0 101 f 33 3 102 g 54 1 103 h 61 2 104 i 33 2 105 j 32 3 106 k 56 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 44 0 115 t 35 2 116 u 61 0 117 v 52 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 46 0 122 { 33 3 123 --- 61 2 124 } 33 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 3 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 2 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 61 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 42 2 170 \0252 " << 43 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 61 1 181 \0265 " P! 65 2 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 43 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 44 3 191 \0277 " A` 70 2 192 \0300 " A' 70 2 193 \0301 " A^ 70 2 194 \0302 " A~ 70 2 195 \0303 " A" 70 2 196 \0304 " A* 70 2 197 \0305 " AE 87 2 198 \0306 " C, 72 3 199 \0307 " E` 72 2 200 \0310 " E' 72 2 201 \0311 " E^ 72 2 202 \0312 " E" 72 2 203 \0313 " I` 41 2 204 \0314 " I' 41 2 205 \0315 " I^ 41 2 206 \0316 " I" 41 2 207 \0317 " D- 78 2 208 \0320 " N~ 82 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 61 0 215 \0327 " O/ 78 2 216 \0330 " U` 82 2 217 \0331 " U' 82 2 218 \0332 " U^ 82 2 219 \0333 " U" 82 2 220 \0334 " Y' 69 2 221 \0335 " TH 67 2 222 \0336 " ss 56 3 223 \0337 " a` 57 2 224 \0340 " a' 57 2 225 \0341 " a^ 57 2 226 \0342 " a~ 57 2 227 \0343 " a" 57 2 228 \0344 " a* 57 2 229 \0345 " ae 72 0 230 \0346 " c, 44 1 231 \0347 " e` 44 2 232 \0350 " e' 44 2 233 \0351 " e^ 44 2 234 \0352 " e" 44 2 235 \0353 " i` 33 2 236 \0354 " i' 33 2 237 \0355 " i^ 33 2 238 \0356 " i" 33 2 239 \0357 " d- 50 2 240 \0360 " n~ 61 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 61 0 247 \0367 " o/ 50 3 248 \0370 " u` 61 2 249 \0371 " u' 61 2 250 \0372 " u^ 61 2 251 \0373 " u" 61 2 252 \0374 " y' 50 3 253 \0375 " th 57 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123671006440057030057030000010444040522627501600002600000006154post.src/devLatin1/NR name NR fontname NewCenturySchlbk-Roman named in prologue spacewidth 28 charset ! 30 2 33 " 39 2 34 dq " # 56 2 35 $ 56 3 36 % 83 2 37 & 82 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 74 2 64 A 72 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 56 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 82 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 72 2 82 S 63 2 83 T 67 2 84 U 82 2 85 V 72 2 86 W 98 2 87 X 70 2 88 Y 70 2 89 Z 61 2 90 [ 33 3 91 \ 61 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 20 2 96 a 56 0 97 b 56 2 98 c 44 0 99 d 57 2 100 e 50 0 101 f 33 2 102 g 54 1 103 h 61 2 104 i 32 2 105 j 30 3 106 k 59 2 107 l 32 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 46 0 115 t 39 2 116 u 61 0 117 v 54 0 118 w 78 0 119 x 54 0 120 y 54 1 121 z 48 0 122 { 33 3 123 --- 61 2 124 } 33 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 30 3 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 2 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 61 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 33 2 170 \0252 " << 43 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 74 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 61 1 181 \0265 " P! 61 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 30 2 186 \0272 " >> 43 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 44 3 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 72 2 200 \0310 " E' 72 2 201 \0311 " E^ 72 2 202 \0312 " E" 72 2 203 \0313 " I` 41 2 204 \0314 " I' 41 2 205 \0315 " I^ 41 2 206 \0316 " I" 41 2 207 \0317 " D- 78 2 208 \0320 " N~ 82 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 61 0 215 \0327 " O/ 78 2 216 \0330 " U` 82 2 217 \0331 " U' 82 2 218 \0332 " U^ 82 2 219 \0333 " U" 82 2 220 \0334 " Y' 70 2 221 \0335 " TH 67 2 222 \0336 " ss 57 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 80 0 230 \0346 " c, 44 1 231 \0347 " e` 50 2 232 \0350 " e' 50 2 233 \0351 " e^ 50 2 234 \0352 " e" 50 2 235 \0353 " i` 32 2 236 \0354 " i' 32 2 237 \0355 " i^ 32 2 238 \0356 " i" 32 2 239 \0357 " d- 50 2 240 \0360 " n~ 61 2 241 \0361 " o` 50 2 242 \0362 " o' 50 2 243 \0363 " o^ 50 2 244 \0364 " o~ 50 2 245 \0365 " o" 50 2 246 \0366 " -: 61 0 247 \0367 " o/ 50 2 248 \0370 " u` 61 2 249 \0371 " u' 61 2 250 \0372 " u^ 61 2 251 \0373 " u" 61 2 252 \0374 " y' 54 3 253 \0375 " th 57 3 254 \0376 " y" 54 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123701006440057030057030000010444200522627501600002600000006160post.src/devLatin1/NX name NX fontname NewCenturySchlbk-BoldItalic named in prologue spacewidth 29 charset ! 33 2 33 " 40 2 34 dq " # 57 2 35 $ 57 3 36 % 89 2 37 & 89 2 38 ' 26 2 39 ( 41 3 40 ) 41 3 41 * 50 2 42 + 61 0 43 , 29 1 44 - 33 0 173 \0255 " . 29 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 29 0 58 ; 29 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 48 2 63 @ 75 2 64 A 74 2 65 B 76 2 66 C 76 2 67 D 83 2 68 E 74 2 69 F 70 2 70 G 82 2 71 H 87 2 72 I 44 2 73 J 67 2 74 K 78 2 75 L 70 2 76 M 94 2 77 N 85 2 78 O 83 2 79 P 74 2 80 Q 83 3 81 R 80 2 82 S 69 2 83 T 72 2 84 U 83 2 85 V 74 2 86 W 94 2 87 X 74 2 88 Y 70 2 89 Z 70 2 90 [ 41 3 91 \ 61 2 92 bs " ] 41 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 26 2 96 a 67 0 97 b 61 2 98 c 54 0 99 d 67 2 100 e 52 0 101 f 39 3 102 g 61 1 103 h 69 2 104 i 39 2 105 j 37 3 106 k 65 2 107 l 39 2 108 m 94 0 109 n 69 0 110 o 57 0 111 p 65 1 112 q 63 1 113 r 52 0 114 s 48 0 115 t 41 2 116 u 69 0 117 v 56 0 118 w 83 0 119 x 57 0 120 y 52 1 121 z 52 0 122 { 41 3 123 --- 61 2 124 } 41 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 3 161 \0241 " c| 57 3 162 \0242 " ct " L- 57 2 163 \0243 " ps " xo 57 2 164 \0244 " cr " Y- 57 2 165 \0245 " yn " || 61 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 41 2 170 \0252 " << 48 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 34 2 178 \0262 " 3^ 34 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 69 1 181 \0265 " P! 65 2 182 \0266 " pg " .^ 29 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 34 2 185 \0271 " o_ 36 2 186 \0272 " >> 48 0 187 \0273 " 14 86 2 188 \0274 " 12 86 2 189 \0275 " 34 86 2 190 \0276 " ?? 48 3 191 \0277 " A` 74 2 192 \0300 " A' 74 2 193 \0301 " A^ 74 2 194 \0302 " A~ 74 2 195 \0303 " A" 74 2 196 \0304 " A* 74 2 197 \0305 " AE 89 2 198 \0306 " C, 76 3 199 \0307 " E` 74 2 200 \0310 " E' 74 2 201 \0311 " E^ 74 2 202 \0312 " E" 74 2 203 \0313 " I` 44 2 204 \0314 " I' 44 2 205 \0315 " I^ 44 2 206 \0316 " I" 44 2 207 \0317 " D- 83 2 208 \0320 " N~ 85 2 209 \0321 " O` 83 2 210 \0322 " O' 83 2 211 \0323 " O^ 83 2 212 \0324 " O~ 83 2 213 \0325 " O" 83 2 214 \0326 " xx 61 0 215 \0327 " O/ 83 2 216 \0330 " U` 83 2 217 \0331 " U' 83 2 218 \0332 " U^ 83 2 219 \0333 " U" 83 2 220 \0334 " Y' 70 2 221 \0335 " TH 74 2 222 \0336 " ss 57 3 223 \0337 " a` 67 2 224 \0340 " a' 67 2 225 \0341 " a^ 67 2 226 \0342 " a~ 67 2 227 \0343 " a" 67 2 228 \0344 " a* 67 2 229 \0345 " ae 82 0 230 \0346 " c, 54 1 231 \0347 " e` 52 2 232 \0350 " e' 52 2 233 \0351 " e^ 52 2 234 \0352 " e" 52 2 235 \0353 " i` 39 2 236 \0354 " i' 39 2 237 \0355 " i^ 39 2 238 \0356 " i" 39 2 239 \0357 " d- 57 2 240 \0360 " n~ 69 2 241 \0361 " o` 57 2 242 \0362 " o' 57 2 243 \0363 " o^ 57 2 244 \0364 " o~ 57 2 245 \0365 " o" 57 2 246 \0366 " -: 61 0 247 \0367 " o/ 57 3 248 \0370 " u` 69 2 249 \0371 " u' 69 2 250 \0372 " u^ 69 2 251 \0373 " u" 69 2 252 \0374 " y' 52 3 253 \0375 " th 65 3 254 \0376 " y" 52 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123711006440057030057030000010444240522627501600002600000006144post.src/devLatin1/PA name PA fontname Palatino-Roman named in prologue spacewidth 25 charset ! 28 2 33 " 37 2 34 dq " # 50 2 35 $ 50 2 36 % 84 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 - 33 0 173 \0255 " . 25 0 46 / 61 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 78 2 65 B 61 2 66 C 71 2 67 D 77 2 68 E 61 2 69 F 56 2 70 G 76 2 71 H 83 2 72 I 34 2 73 J 33 3 74 K 73 2 75 L 61 2 76 M 95 2 77 N 83 2 78 O 79 2 79 P 60 2 80 Q 79 3 81 R 67 2 82 S 53 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 55 2 98 c 44 0 99 d 61 2 100 e 48 0 101 f 33 2 102 g 56 1 103 h 58 2 104 i 29 2 105 j 23 3 106 k 56 2 107 l 29 2 108 m 88 0 109 n 58 0 110 o 55 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 42 0 115 t 33 2 116 u 60 0 117 v 57 0 118 w 83 0 119 x 52 0 120 y 56 1 121 z 50 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 28 1 161 \0241 " c| 50 2 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 61 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 33 2 170 \0252 " << 50 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 60 1 181 \0265 " P! 63 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 33 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 44 1 191 \0277 " A` 78 2 192 \0300 " A' 78 2 193 \0301 " A^ 78 2 194 \0302 " A~ 78 2 195 \0303 " A" 78 2 196 \0304 " A* 78 2 197 \0305 " AE 94 2 198 \0306 " C, 71 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 34 2 204 \0314 " I' 34 2 205 \0315 " I^ 34 2 206 \0316 " I" 34 2 207 \0317 " D- 77 2 208 \0320 " N~ 83 2 209 \0321 " O` 79 2 210 \0322 " O' 79 2 211 \0323 " O^ 79 2 212 \0324 " O~ 79 2 213 \0325 " O" 79 2 214 \0326 " xx 61 0 215 \0327 " O/ 83 2 216 \0330 " U` 78 2 217 \0331 " U' 78 2 218 \0332 " U^ 78 2 219 \0333 " U" 78 2 220 \0334 " Y' 67 2 221 \0335 " TH 60 2 222 \0336 " ss 56 2 223 \0337 " a` 50 2 224 \0340 " a' 50 2 225 \0341 " a^ 50 2 226 \0342 " a~ 50 2 227 \0343 " a" 50 2 228 \0344 " a* 50 2 229 \0345 " ae 76 0 230 \0346 " c, 44 1 231 \0347 " e` 48 2 232 \0350 " e' 48 2 233 \0351 " e^ 48 2 234 \0352 " e" 48 2 235 \0353 " i` 29 2 236 \0354 " i' 29 2 237 \0355 " i^ 29 2 238 \0356 " i" 29 2 239 \0357 " d- 55 2 240 \0360 " n~ 58 2 241 \0361 " o` 55 2 242 \0362 " o' 55 2 243 \0363 " o^ 55 2 244 \0364 " o~ 55 2 245 \0365 " o" 55 2 246 \0366 " -: 61 0 247 \0367 " o/ 56 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 56 3 253 \0375 " th 60 3 254 \0376 " y" 56 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 25 2 151 oa 33 2 154 "a 38 2 157 Ca 31 1 158 va 33 2 159 0707070014231123721006440057030057030000010444400522627501600002600000006145post.src/devLatin1/PB name PB fontname Palatino-Bold named in prologue spacewidth 25 charset ! 28 2 33 " 40 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 - 33 0 173 \0255 " . 25 0 46 / 30 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 78 2 65 B 67 2 66 C 72 2 67 D 83 2 68 E 61 2 69 F 56 2 70 G 83 2 71 H 83 2 72 I 39 2 73 J 39 3 74 K 78 2 75 L 61 2 76 M 100 2 77 N 83 2 78 O 83 2 79 P 61 2 80 Q 83 3 81 R 72 2 82 S 61 2 83 T 67 2 84 U 78 2 85 V 78 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 61 2 98 c 44 0 99 d 61 2 100 e 50 0 101 f 39 2 102 g 56 1 103 h 61 2 104 i 33 2 105 j 33 3 106 k 61 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 44 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 { 31 2 123 --- 61 2 124 } 31 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 28 1 161 \0241 " c| 50 2 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 61 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 44 2 170 \0252 " << 50 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 61 1 181 \0265 " P! 64 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 49 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 44 1 191 \0277 " A` 78 2 192 \0300 " A' 78 2 193 \0301 " A^ 78 2 194 \0302 " A~ 78 2 195 \0303 " A" 78 2 196 \0304 " A* 78 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 39 2 204 \0314 " I' 39 2 205 \0315 " I^ 39 2 206 \0316 " I" 39 2 207 \0317 " D- 83 2 208 \0320 " N~ 83 2 209 \0321 " O` 83 2 210 \0322 " O' 83 2 211 \0323 " O^ 83 2 212 \0324 " O~ 83 2 213 \0325 " O" 83 2 214 \0326 " xx 61 0 215 \0327 " O/ 83 2 216 \0330 " U` 78 2 217 \0331 " U' 78 2 218 \0332 " U^ 78 2 219 \0333 " U" 78 2 220 \0334 " Y' 67 2 221 \0335 " TH 61 2 222 \0336 " ss 61 2 223 \0337 " a` 50 2 224 \0340 " a' 50 2 225 \0341 " a^ 50 2 226 \0342 " a~ 50 2 227 \0343 " a" 50 2 228 \0344 " a* 50 2 229 \0345 " ae 78 0 230 \0346 " c, 44 1 231 \0347 " e` 50 2 232 \0350 " e' 50 2 233 \0351 " e^ 50 2 234 \0352 " e" 50 2 235 \0353 " i` 33 2 236 \0354 " i' 33 2 237 \0355 " i^ 33 2 238 \0356 " i" 33 2 239 \0357 " d- 56 2 240 \0360 " n~ 61 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 61 0 247 \0367 " o/ 56 0 248 \0370 " u` 61 2 249 \0371 " u' 61 2 250 \0372 " u^ 61 2 251 \0373 " u" 61 2 252 \0374 " y' 56 3 253 \0375 " th 61 3 254 \0376 " y" 56 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123731006440057030057030000010444440522627501600002600000006144post.src/devLatin1/PI name PI fontname Palatino-Italic named in prologue spacewidth 25 charset ! 33 2 33 " 50 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 - 33 0 173 \0255 " . 25 0 46 / 30 3 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 50 2 63 @ 75 2 64 A 72 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 78 2 72 I 33 2 73 J 33 3 74 K 67 2 75 L 56 2 76 M 94 2 77 N 78 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 44 0 97 b 46 2 98 c 41 0 99 d 50 2 100 e 39 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 44 0 111 p 50 1 112 q 46 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 50 2 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 61 2 166 \0246 " so 50 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 33 2 170 \0252 " << 50 0 171 \0253 " -, 61 0 172 \0254 " hy 33 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 50 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 33 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 50 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 94 2 198 \0306 " C, 67 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 33 2 204 \0314 " I' 33 2 205 \0315 " I^ 33 2 206 \0316 " I" 33 2 207 \0317 " D- 78 2 208 \0320 " N~ 78 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 61 0 215 \0327 " O/ 78 2 216 \0330 " U` 78 2 217 \0331 " U' 78 2 218 \0332 " U^ 78 2 219 \0333 " U" 78 2 220 \0334 " Y' 67 2 221 \0335 " TH 61 2 222 \0336 " ss 50 3 223 \0337 " a` 44 2 224 \0340 " a' 44 2 225 \0341 " a^ 44 2 226 \0342 " a~ 44 2 227 \0343 " a" 44 2 228 \0344 " a* 44 2 229 \0345 " ae 64 0 230 \0346 " c, 41 1 231 \0347 " e` 39 2 232 \0350 " e' 39 2 233 \0351 " e^ 39 2 234 \0352 " e" 39 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 44 2 240 \0360 " n~ 56 2 241 \0361 " o` 44 2 242 \0362 " o' 44 2 243 \0363 " o^ 44 2 244 \0364 " o~ 44 2 245 \0365 " o" 44 2 246 \0366 " -: 61 0 247 \0367 " o/ 44 0 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 50 3 253 \0375 " th 50 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123741006440057030057030000010444600522627501700002600000006151post.src/devLatin1/PX name PX fontname Palatino-BoldItalic named in prologue spacewidth 25 charset ! 33 2 33 " 50 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 - 39 0 173 \0255 " . 25 0 46 / 32 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 83 2 64 A 72 2 65 B 67 2 66 C 69 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 39 3 74 K 72 2 75 L 61 2 76 M 94 2 77 N 78 2 78 O 83 2 79 P 67 2 80 Q 83 3 81 R 72 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 72 2 88 Y 61 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 56 0 97 b 54 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 33 2 105 j 33 3 106 k 56 2 107 l 33 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 54 1 113 r 39 0 114 s 44 0 115 t 39 2 116 u 56 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 50 2 162 \0242 " ct " L- 50 2 163 \0243 " ps " xo 50 2 164 \0244 " cr " Y- 50 2 165 \0245 " yn " || 61 2 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 75 2 169 \0251 " a_ 33 2 170 \0252 " << 50 0 171 \0253 " -, 61 0 172 \0254 " hy 39 0 173 \0255 " -- 61 0 45 ro 75 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 61 0 177 \0261 " 2^ 30 2 178 \0262 " 3^ 30 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 56 3 182 \0266 " pg " .^ 25 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 30 2 185 \0271 " o_ 33 2 186 \0272 " >> 50 0 187 \0273 " 14 75 2 188 \0274 " 12 75 2 189 \0275 " 34 75 2 190 \0276 " ?? 44 1 191 \0277 " A` 72 2 192 \0300 " A' 72 2 193 \0301 " A^ 72 2 194 \0302 " A~ 72 2 195 \0303 " A" 72 2 196 \0304 " A* 72 2 197 \0305 " AE 94 2 198 \0306 " C, 69 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 39 2 204 \0314 " I' 39 2 205 \0315 " I^ 39 2 206 \0316 " I" 39 2 207 \0317 " D- 78 2 208 \0320 " N~ 78 2 209 \0321 " O` 83 2 210 \0322 " O' 83 2 211 \0323 " O^ 83 2 212 \0324 " O~ 83 2 213 \0325 " O" 83 2 214 \0326 " xx 61 0 215 \0327 " O/ 83 2 216 \0330 " U` 78 2 217 \0331 " U' 78 2 218 \0332 " U^ 78 2 219 \0333 " U" 78 2 220 \0334 " Y' 61 2 221 \0335 " TH 67 2 222 \0336 " ss 56 3 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 74 0 230 \0346 " c, 44 1 231 \0347 " e` 44 2 232 \0350 " e' 44 2 233 \0351 " e^ 44 2 234 \0352 " e" 44 2 235 \0353 " i` 33 2 236 \0354 " i' 33 2 237 \0355 " i^ 33 2 238 \0356 " i" 33 2 239 \0357 " d- 56 2 240 \0360 " n~ 56 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 61 0 247 \0367 " o/ 56 0 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 56 3 253 \0375 " th 56 3 254 \0376 " y" 56 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 56 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231123751006440057030057030000010444640522627501700002600000006156post.src/devLatin1/ZI name ZI fontname ZapfChancery-MediumItalic named in prologue spacewidth 22 charset ! 28 2 33 " 22 2 34 dq " # 44 2 35 $ 44 3 36 % 68 2 37 & 78 2 38 ' 24 2 39 ( 26 3 40 ) 22 3 41 * 42 2 42 + 52 0 43 , 22 0 44 - 28 0 173 \0255 " . 22 0 46 / 34 3 47 0 44 2 48 1 44 2 49 2 44 2 50 3 44 2 51 4 44 2 52 5 44 2 53 6 44 2 54 7 44 2 55 8 44 2 56 9 44 2 57 : 26 0 58 ; 24 0 59 --- 52 0 60 = 52 0 61 --- 52 0 62 ? 38 2 63 @ 70 2 64 A 62 2 65 B 60 2 66 C 52 2 67 D 70 2 68 E 62 2 69 F 58 2 70 G 62 3 71 H 68 2 72 I 38 2 73 J 40 2 74 K 66 3 75 L 58 2 76 M 84 2 77 N 70 3 78 O 60 2 79 P 54 2 80 Q 60 3 81 R 60 3 82 S 46 2 83 T 50 2 84 U 74 2 85 V 64 2 86 W 88 2 87 X 56 2 88 Y 56 3 89 Z 62 2 90 [ 24 3 91 \ 48 2 92 bs " ] 32 3 93 ^ 34 2 147 --- 52 2 94 --- 50 1 95 ` 24 2 96 a 42 0 97 b 42 2 98 c 34 0 99 d 44 2 100 e 34 0 101 f 32 3 102 g 40 1 103 h 44 2 104 i 24 2 105 j 22 3 106 k 44 3 107 l 24 2 108 m 62 0 109 n 46 0 110 o 40 0 111 p 44 1 112 q 40 3 113 r 30 0 114 s 32 0 115 t 32 2 116 u 46 0 117 v 44 0 118 w 68 0 119 x 42 1 120 y 40 1 121 z 44 0 122 { 24 3 123 --- 52 2 124 } 24 3 125 ~ 44 2 148 --- 52 0 126 \` 22 2 145 ga " !! 28 1 161 \0241 " c| 44 2 162 \0242 " ct " L- 44 2 163 \0243 " ps " xo 44 2 164 \0244 " cr " Y- 44 2 165 \0245 " yn " || 52 2 166 \0246 " so 42 3 167 \0247 " sc " "" 36 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 26 2 170 \0252 " << 34 0 171 \0253 " -, 52 0 172 \0254 " hy 28 0 173 \0255 " -- 52 0 45 ro 74 2 174 \0256 " rg " -^ 44 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 52 0 177 \0261 " 2^ 26 2 178 \0262 " 3^ 26 2 179 \0263 " \' 30 2 180 \0264 " aa " /u 46 1 181 \0265 " P! 50 3 182 \0266 " pg " .^ 22 0 183 \0267 " ,, 30 1 184 \0270 " ,a " 1^ 26 2 185 \0271 " o_ 26 2 186 \0272 " >> 38 0 187 \0273 " 14 66 2 188 \0274 " 12 66 2 189 \0275 " 34 66 2 190 \0276 " ?? 40 1 191 \0277 " A` 62 2 192 \0300 " A' 62 2 193 \0301 " A^ 62 2 194 \0302 " A~ 62 2 195 \0303 " A" 62 2 196 \0304 " A* 62 2 197 \0305 " AE 74 2 198 \0306 " C, 52 3 199 \0307 " E` 62 2 200 \0310 " E' 62 2 201 \0311 " E^ 62 2 202 \0312 " E" 62 2 203 \0313 " I` 38 2 204 \0314 " I' 38 2 205 \0315 " I^ 38 2 206 \0316 " I" 38 2 207 \0317 " D- 70 2 208 \0320 " N~ 70 3 209 \0321 " O` 60 2 210 \0322 " O' 60 2 211 \0323 " O^ 60 2 212 \0324 " O~ 60 2 213 \0325 " O" 60 2 214 \0326 " xx 52 0 215 \0327 " O/ 66 3 216 \0330 " U` 74 2 217 \0331 " U' 74 2 218 \0332 " U^ 74 2 219 \0333 " U" 74 2 220 \0334 " Y' 56 3 221 \0335 " TH 54 2 222 \0336 " ss 42 3 223 \0337 " a` 42 2 224 \0340 " a' 42 2 225 \0341 " a^ 42 2 226 \0342 " a~ 42 2 227 \0343 " a" 42 2 228 \0344 " a* 42 2 229 \0345 " ae 54 0 230 \0346 " c, 34 1 231 \0347 " e` 34 2 232 \0350 " e' 34 2 233 \0351 " e^ 34 2 234 \0352 " e" 34 2 235 \0353 " i` 24 2 236 \0354 " i' 24 2 237 \0355 " i^ 24 2 238 \0356 " i" 24 2 239 \0357 " d- 40 2 240 \0360 " n~ 46 2 241 \0361 " o` 40 2 242 \0362 " o' 40 2 243 \0363 " o^ 40 2 244 \0364 " o~ 40 2 245 \0365 " o" 40 2 246 \0366 " -: 52 0 247 \0367 " o/ 44 3 248 \0370 " u` 46 2 249 \0371 " u' 46 2 250 \0372 " u^ 46 2 251 \0373 " u" 46 2 252 \0374 " y' 40 3 253 \0375 " th 44 3 254 \0376 " y" 40 3 255 \0377 " ^a 34 2 147 ~a 44 2 148 Ua 44 2 150 .a 22 2 151 oa 30 2 154 "a 40 2 157 Ca 28 1 158 va 34 2 159 0707070014231123761006440057030057030000010445000522627501700002500000006047post.src/devLatin1/C name C fontname Courier spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 \0255 " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 \0241 " c| 60 2 162 \0242 " ct " L- 60 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 60 2 165 \0245 " yn " || 60 3 166 \0246 " so 60 2 167 \0247 " sc " "" 60 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 60 2 170 \0252 " << 60 0 171 \0253 " -, 60 0 172 \0254 " hy 60 0 173 \0255 " -- 60 0 45 ro 60 2 174 \0256 " rg " -^ 60 2 175 \0257 " -a " 0^ 60 2 176 \0260 " +- 60 2 177 \0261 " 2^ 60 2 178 \0262 " 3^ 60 2 179 \0263 " \' 60 2 180 \0264 " aa " /u 60 1 181 \0265 " P! 60 2 182 \0266 " pg " .^ 60 0 183 \0267 " ,, 60 1 184 \0270 " ,a " 1^ 60 2 185 \0271 " o_ 60 2 186 \0272 " >> 60 0 187 \0273 " 14 60 2 188 \0274 " 12 60 2 189 \0275 " 34 60 2 190 \0276 " ?? 60 1 191 \0277 " A` 60 2 192 \0300 " A' 60 2 193 \0301 " A^ 60 2 194 \0302 " A~ 60 2 195 \0303 " A" 60 2 196 \0304 " A* 60 2 197 \0305 " AE 60 2 198 \0306 " C, 60 3 199 \0307 " E` 60 2 200 \0310 " E' 60 2 201 \0311 " E^ 60 2 202 \0312 " E" 60 2 203 \0313 " I` 60 2 204 \0314 " I' 60 2 205 \0315 " I^ 60 2 206 \0316 " I" 60 2 207 \0317 " D- 60 2 208 \0320 " N~ 60 2 209 \0321 " O` 60 2 210 \0322 " O' 60 2 211 \0323 " O^ 60 2 212 \0324 " O~ 60 2 213 \0325 " O" 60 2 214 \0326 " xx 60 0 215 \0327 " O/ 60 2 216 \0330 " U` 60 2 217 \0331 " U' 60 2 218 \0332 " U^ 60 2 219 \0333 " U" 60 2 220 \0334 " Y' 60 2 221 \0335 " TH 60 2 222 \0336 " ss 60 2 223 \0337 " a` 60 2 224 \0340 " a' 60 2 225 \0341 " a^ 60 2 226 \0342 " a~ 60 2 227 \0343 " a" 60 2 228 \0344 " a* 60 2 229 \0345 " ae 60 0 230 \0346 " c, 60 1 231 \0347 " e` 60 2 232 \0350 " e' 60 2 233 \0351 " e^ 60 2 234 \0352 " e" 60 2 235 \0353 " i` 60 2 236 \0354 " i' 60 2 237 \0355 " i^ 60 2 238 \0356 " i" 60 2 239 \0357 " d- 60 2 240 \0360 " n~ 60 2 241 \0361 " o` 60 2 242 \0362 " o' 60 2 243 \0363 " o^ 60 2 244 \0364 " o~ 60 2 245 \0365 " o" 60 2 246 \0366 " -: 60 2 247 \0367 " o/ 60 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 60 3 253 \0375 " th 60 3 254 \0376 " y" 60 3 255 \0377 " ^a 60 2 147 ~a 60 2 148 Ua 60 2 150 .a 60 2 151 oa 60 2 154 "a 60 2 157 Ca 60 1 158 va 60 2 159 0707070014231123771006440057030057030000010445040522627501700002600000006077post.src/devLatin1/CB name CB fontname Courier-Bold named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 \0255 " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 \0241 " c| 60 2 162 \0242 " ct " L- 60 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 60 2 165 \0245 " yn " || 60 3 166 \0246 " so 60 2 167 \0247 " sc " "" 60 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 60 2 170 \0252 " << 60 0 171 \0253 " -, 60 0 172 \0254 " hy 60 0 173 \0255 " -- 60 0 45 ro 60 2 174 \0256 " rg " -^ 60 2 175 \0257 " -a " 0^ 60 2 176 \0260 " +- 60 2 177 \0261 " 2^ 60 2 178 \0262 " 3^ 60 2 179 \0263 " \' 60 2 180 \0264 " aa " /u 60 1 181 \0265 " P! 60 2 182 \0266 " pg " .^ 60 0 183 \0267 " ,, 60 1 184 \0270 " ,a " 1^ 60 2 185 \0271 " o_ 60 2 186 \0272 " >> 60 0 187 \0273 " 14 60 2 188 \0274 " 12 60 2 189 \0275 " 34 60 2 190 \0276 " ?? 60 1 191 \0277 " A` 60 2 192 \0300 " A' 60 2 193 \0301 " A^ 60 2 194 \0302 " A~ 60 2 195 \0303 " A" 60 2 196 \0304 " A* 60 2 197 \0305 " AE 60 2 198 \0306 " C, 60 3 199 \0307 " E` 60 2 200 \0310 " E' 60 2 201 \0311 " E^ 60 2 202 \0312 " E" 60 2 203 \0313 " I` 60 2 204 \0314 " I' 60 2 205 \0315 " I^ 60 2 206 \0316 " I" 60 2 207 \0317 " D- 60 2 208 \0320 " N~ 60 2 209 \0321 " O` 60 2 210 \0322 " O' 60 2 211 \0323 " O^ 60 2 212 \0324 " O~ 60 2 213 \0325 " O" 60 2 214 \0326 " xx 60 0 215 \0327 " O/ 60 2 216 \0330 " U` 60 2 217 \0331 " U' 60 2 218 \0332 " U^ 60 2 219 \0333 " U" 60 2 220 \0334 " Y' 60 2 221 \0335 " TH 60 2 222 \0336 " ss 60 2 223 \0337 " a` 60 2 224 \0340 " a' 60 2 225 \0341 " a^ 60 2 226 \0342 " a~ 60 2 227 \0343 " a" 60 2 228 \0344 " a* 60 2 229 \0345 " ae 60 0 230 \0346 " c, 60 1 231 \0347 " e` 60 2 232 \0350 " e' 60 2 233 \0351 " e^ 60 2 234 \0352 " e" 60 2 235 \0353 " i` 60 2 236 \0354 " i' 60 2 237 \0355 " i^ 60 2 238 \0356 " i" 60 2 239 \0357 " d- 60 2 240 \0360 " n~ 60 2 241 \0361 " o` 60 2 242 \0362 " o' 60 2 243 \0363 " o^ 60 2 244 \0364 " o~ 60 2 245 \0365 " o" 60 2 246 \0366 " -: 60 2 247 \0367 " o/ 60 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 60 3 253 \0375 " th 60 3 254 \0376 " y" 60 3 255 \0377 " ^a 60 2 147 ~a 60 2 148 Ua 60 2 150 .a 60 2 151 oa 60 2 154 "a 60 2 157 Ca 60 1 158 va 60 2 159 0707070014231124001006440057030057030000010445200522627501700002600000006102post.src/devLatin1/CI name CI fontname Courier-Oblique named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 \0255 " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 \0241 " c| 60 2 162 \0242 " ct " L- 60 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 60 2 165 \0245 " yn " || 60 3 166 \0246 " so 60 2 167 \0247 " sc " "" 60 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 60 2 170 \0252 " << 60 0 171 \0253 " -, 60 0 172 \0254 " hy 60 0 173 \0255 " -- 60 0 45 ro 60 2 174 \0256 " rg " -^ 60 2 175 \0257 " -a " 0^ 60 2 176 \0260 " +- 60 2 177 \0261 " 2^ 60 2 178 \0262 " 3^ 60 2 179 \0263 " \' 60 2 180 \0264 " aa " /u 60 1 181 \0265 " P! 60 2 182 \0266 " pg " .^ 60 0 183 \0267 " ,, 60 1 184 \0270 " ,a " 1^ 60 2 185 \0271 " o_ 60 2 186 \0272 " >> 60 0 187 \0273 " 14 60 2 188 \0274 " 12 60 2 189 \0275 " 34 60 2 190 \0276 " ?? 60 1 191 \0277 " A` 60 2 192 \0300 " A' 60 2 193 \0301 " A^ 60 2 194 \0302 " A~ 60 2 195 \0303 " A" 60 2 196 \0304 " A* 60 2 197 \0305 " AE 60 2 198 \0306 " C, 60 3 199 \0307 " E` 60 2 200 \0310 " E' 60 2 201 \0311 " E^ 60 2 202 \0312 " E" 60 2 203 \0313 " I` 60 2 204 \0314 " I' 60 2 205 \0315 " I^ 60 2 206 \0316 " I" 60 2 207 \0317 " D- 60 2 208 \0320 " N~ 60 2 209 \0321 " O` 60 2 210 \0322 " O' 60 2 211 \0323 " O^ 60 2 212 \0324 " O~ 60 2 213 \0325 " O" 60 2 214 \0326 " xx 60 0 215 \0327 " O/ 60 2 216 \0330 " U` 60 2 217 \0331 " U' 60 2 218 \0332 " U^ 60 2 219 \0333 " U" 60 2 220 \0334 " Y' 60 2 221 \0335 " TH 60 2 222 \0336 " ss 60 2 223 \0337 " a` 60 2 224 \0340 " a' 60 2 225 \0341 " a^ 60 2 226 \0342 " a~ 60 2 227 \0343 " a" 60 2 228 \0344 " a* 60 2 229 \0345 " ae 60 0 230 \0346 " c, 60 1 231 \0347 " e` 60 2 232 \0350 " e' 60 2 233 \0351 " e^ 60 2 234 \0352 " e" 60 2 235 \0353 " i` 60 2 236 \0354 " i' 60 2 237 \0355 " i^ 60 2 238 \0356 " i" 60 2 239 \0357 " d- 60 2 240 \0360 " n~ 60 2 241 \0361 " o` 60 2 242 \0362 " o' 60 2 243 \0363 " o^ 60 2 244 \0364 " o~ 60 2 245 \0365 " o" 60 2 246 \0366 " -: 60 2 247 \0367 " o/ 60 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 60 3 253 \0375 " th 60 3 254 \0376 " y" 60 3 255 \0377 " ^a 60 2 147 ~a 60 2 148 Ua 60 2 150 .a 60 2 151 oa 60 2 154 "a 60 2 157 Ca 60 1 158 va 60 2 159 0707070014231124011006440057030057030000010445240522627501700002600000006072post.src/devLatin1/CO name CO fontname Courier named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 \0255 " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 \0241 " c| 60 2 162 \0242 " ct " L- 60 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 60 2 165 \0245 " yn " || 60 3 166 \0246 " so 60 2 167 \0247 " sc " "" 60 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 60 2 170 \0252 " << 60 0 171 \0253 " -, 60 0 172 \0254 " hy 60 0 173 \0255 " -- 60 0 45 ro 60 2 174 \0256 " rg " -^ 60 2 175 \0257 " -a " 0^ 60 2 176 \0260 " +- 60 2 177 \0261 " 2^ 60 2 178 \0262 " 3^ 60 2 179 \0263 " \' 60 2 180 \0264 " aa " /u 60 1 181 \0265 " P! 60 2 182 \0266 " pg " .^ 60 0 183 \0267 " ,, 60 1 184 \0270 " ,a " 1^ 60 2 185 \0271 " o_ 60 2 186 \0272 " >> 60 0 187 \0273 " 14 60 2 188 \0274 " 12 60 2 189 \0275 " 34 60 2 190 \0276 " ?? 60 1 191 \0277 " A` 60 2 192 \0300 " A' 60 2 193 \0301 " A^ 60 2 194 \0302 " A~ 60 2 195 \0303 " A" 60 2 196 \0304 " A* 60 2 197 \0305 " AE 60 2 198 \0306 " C, 60 3 199 \0307 " E` 60 2 200 \0310 " E' 60 2 201 \0311 " E^ 60 2 202 \0312 " E" 60 2 203 \0313 " I` 60 2 204 \0314 " I' 60 2 205 \0315 " I^ 60 2 206 \0316 " I" 60 2 207 \0317 " D- 60 2 208 \0320 " N~ 60 2 209 \0321 " O` 60 2 210 \0322 " O' 60 2 211 \0323 " O^ 60 2 212 \0324 " O~ 60 2 213 \0325 " O" 60 2 214 \0326 " xx 60 0 215 \0327 " O/ 60 2 216 \0330 " U` 60 2 217 \0331 " U' 60 2 218 \0332 " U^ 60 2 219 \0333 " U" 60 2 220 \0334 " Y' 60 2 221 \0335 " TH 60 2 222 \0336 " ss 60 2 223 \0337 " a` 60 2 224 \0340 " a' 60 2 225 \0341 " a^ 60 2 226 \0342 " a~ 60 2 227 \0343 " a" 60 2 228 \0344 " a* 60 2 229 \0345 " ae 60 0 230 \0346 " c, 60 1 231 \0347 " e` 60 2 232 \0350 " e' 60 2 233 \0351 " e^ 60 2 234 \0352 " e" 60 2 235 \0353 " i` 60 2 236 \0354 " i' 60 2 237 \0355 " i^ 60 2 238 \0356 " i" 60 2 239 \0357 " d- 60 2 240 \0360 " n~ 60 2 241 \0361 " o` 60 2 242 \0362 " o' 60 2 243 \0363 " o^ 60 2 244 \0364 " o~ 60 2 245 \0365 " o" 60 2 246 \0366 " -: 60 2 247 \0367 " o/ 60 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 60 3 253 \0375 " th 60 3 254 \0376 " y" 60 3 255 \0377 " ^a 60 2 147 ~a 60 2 148 Ua 60 2 150 .a 60 2 151 oa 60 2 154 "a 60 2 157 Ca 60 1 158 va 60 2 159 0707070014231124021006440057030057030000010445400522627501700002600000006072post.src/devLatin1/CW name CW fontname Courier named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 \0255 " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 \0241 " c| 60 2 162 \0242 " ct " L- 60 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 60 2 165 \0245 " yn " || 60 3 166 \0246 " so 60 2 167 \0247 " sc " "" 60 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 60 2 170 \0252 " << 60 0 171 \0253 " -, 60 0 172 \0254 " hy 60 0 173 \0255 " -- 60 0 45 ro 60 2 174 \0256 " rg " -^ 60 2 175 \0257 " -a " 0^ 60 2 176 \0260 " +- 60 2 177 \0261 " 2^ 60 2 178 \0262 " 3^ 60 2 179 \0263 " \' 60 2 180 \0264 " aa " /u 60 1 181 \0265 " P! 60 2 182 \0266 " pg " .^ 60 0 183 \0267 " ,, 60 1 184 \0270 " ,a " 1^ 60 2 185 \0271 " o_ 60 2 186 \0272 " >> 60 0 187 \0273 " 14 60 2 188 \0274 " 12 60 2 189 \0275 " 34 60 2 190 \0276 " ?? 60 1 191 \0277 " A` 60 2 192 \0300 " A' 60 2 193 \0301 " A^ 60 2 194 \0302 " A~ 60 2 195 \0303 " A" 60 2 196 \0304 " A* 60 2 197 \0305 " AE 60 2 198 \0306 " C, 60 3 199 \0307 " E` 60 2 200 \0310 " E' 60 2 201 \0311 " E^ 60 2 202 \0312 " E" 60 2 203 \0313 " I` 60 2 204 \0314 " I' 60 2 205 \0315 " I^ 60 2 206 \0316 " I" 60 2 207 \0317 " D- 60 2 208 \0320 " N~ 60 2 209 \0321 " O` 60 2 210 \0322 " O' 60 2 211 \0323 " O^ 60 2 212 \0324 " O~ 60 2 213 \0325 " O" 60 2 214 \0326 " xx 60 0 215 \0327 " O/ 60 2 216 \0330 " U` 60 2 217 \0331 " U' 60 2 218 \0332 " U^ 60 2 219 \0333 " U" 60 2 220 \0334 " Y' 60 2 221 \0335 " TH 60 2 222 \0336 " ss 60 2 223 \0337 " a` 60 2 224 \0340 " a' 60 2 225 \0341 " a^ 60 2 226 \0342 " a~ 60 2 227 \0343 " a" 60 2 228 \0344 " a* 60 2 229 \0345 " ae 60 0 230 \0346 " c, 60 1 231 \0347 " e` 60 2 232 \0350 " e' 60 2 233 \0351 " e^ 60 2 234 \0352 " e" 60 2 235 \0353 " i` 60 2 236 \0354 " i' 60 2 237 \0355 " i^ 60 2 238 \0356 " i" 60 2 239 \0357 " d- 60 2 240 \0360 " n~ 60 2 241 \0361 " o` 60 2 242 \0362 " o' 60 2 243 \0363 " o^ 60 2 244 \0364 " o~ 60 2 245 \0365 " o" 60 2 246 \0366 " -: 60 2 247 \0367 " o/ 60 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 60 3 253 \0375 " th 60 3 254 \0376 " y" 60 3 255 \0377 " ^a 60 2 147 ~a 60 2 148 Ua 60 2 150 .a 60 2 151 oa 60 2 154 "a 60 2 157 Ca 60 1 158 va 60 2 159 0707070014231124031006440057030057030000010445440522627501700002600000006106post.src/devLatin1/CX name CX fontname Courier-BoldOblique named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 \0255 " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 \0241 " c| 60 2 162 \0242 " ct " L- 60 2 163 \0243 " ps " xo 60 2 164 \0244 " cr " Y- 60 2 165 \0245 " yn " || 60 3 166 \0246 " so 60 2 167 \0247 " sc " "" 60 2 168 \0250 " :a " co 60 2 169 \0251 " a_ 60 2 170 \0252 " << 60 0 171 \0253 " -, 60 0 172 \0254 " hy 60 0 173 \0255 " -- 60 0 45 ro 60 2 174 \0256 " rg " -^ 60 2 175 \0257 " -a " 0^ 60 2 176 \0260 " +- 60 2 177 \0261 " 2^ 60 2 178 \0262 " 3^ 60 2 179 \0263 " \' 60 2 180 \0264 " aa " /u 60 1 181 \0265 " P! 60 2 182 \0266 " pg " .^ 60 0 183 \0267 " ,, 60 1 184 \0270 " ,a " 1^ 60 2 185 \0271 " o_ 60 2 186 \0272 " >> 60 0 187 \0273 " 14 60 2 188 \0274 " 12 60 2 189 \0275 " 34 60 2 190 \0276 " ?? 60 1 191 \0277 " A` 60 2 192 \0300 " A' 60 2 193 \0301 " A^ 60 2 194 \0302 " A~ 60 2 195 \0303 " A" 60 2 196 \0304 " A* 60 2 197 \0305 " AE 60 2 198 \0306 " C, 60 3 199 \0307 " E` 60 2 200 \0310 " E' 60 2 201 \0311 " E^ 60 2 202 \0312 " E" 60 2 203 \0313 " I` 60 2 204 \0314 " I' 60 2 205 \0315 " I^ 60 2 206 \0316 " I" 60 2 207 \0317 " D- 60 2 208 \0320 " N~ 60 2 209 \0321 " O` 60 2 210 \0322 " O' 60 2 211 \0323 " O^ 60 2 212 \0324 " O~ 60 2 213 \0325 " O" 60 2 214 \0326 " xx 60 0 215 \0327 " O/ 60 2 216 \0330 " U` 60 2 217 \0331 " U' 60 2 218 \0332 " U^ 60 2 219 \0333 " U" 60 2 220 \0334 " Y' 60 2 221 \0335 " TH 60 2 222 \0336 " ss 60 2 223 \0337 " a` 60 2 224 \0340 " a' 60 2 225 \0341 " a^ 60 2 226 \0342 " a~ 60 2 227 \0343 " a" 60 2 228 \0344 " a* 60 2 229 \0345 " ae 60 0 230 \0346 " c, 60 1 231 \0347 " e` 60 2 232 \0350 " e' 60 2 233 \0351 " e^ 60 2 234 \0352 " e" 60 2 235 \0353 " i` 60 2 236 \0354 " i' 60 2 237 \0355 " i^ 60 2 238 \0356 " i" 60 2 239 \0357 " d- 60 2 240 \0360 " n~ 60 2 241 \0361 " o` 60 2 242 \0362 " o' 60 2 243 \0363 " o^ 60 2 244 \0364 " o~ 60 2 245 \0365 " o" 60 2 246 \0366 " -: 60 2 247 \0367 " o/ 60 0 248 \0370 " u` 60 2 249 \0371 " u' 60 2 250 \0372 " u^ 60 2 251 \0373 " u" 60 2 252 \0374 " y' 60 3 253 \0375 " th 60 3 254 \0376 " y" 60 3 255 \0377 " ^a 60 2 147 ~a 60 2 148 Ua 60 2 150 .a 60 2 151 oa 60 2 154 "a 60 2 157 Ca 60 1 158 va 60 2 159 0707070014231124041006440057030057030000010445600522627501700002600000005570post.src/devLatin1/ZD name ZD fontname ZapfDingbats named in prologue charset ! 97 2 33 " 96 2 34 # 97 2 35 $ 98 3 36 % 72 2 37 & 79 3 38 ' 79 3 39 ( 79 3 40 ) 69 2 41 * 96 2 42 + 94 2 43 , 55 3 44 - 86 2 45 . 91 2 46 / 93 2 47 0 91 2 48 1 95 2 49 2 97 2 50 3 76 3 51 4 85 3 52 5 76 2 53 6 76 2 54 7 57 3 55 8 68 3 56 9 76 2 57 : 76 2 58 ; 76 2 59 < 75 3 60 = 49 2 61 > 55 2 62 ? 54 3 63 @ 58 2 64 A 69 3 65 B 79 3 66 C 79 3 67 D 79 3 68 E 79 3 69 F 79 3 70 G 79 3 71 H 82 3 72 I 82 3 73 J 79 3 74 K 84 3 75 L 82 3 76 M 83 3 77 N 82 3 78 O 83 3 79 P 92 3 80 Q 74 2 81 R 72 2 82 S 75 2 83 T 79 3 84 U 79 3 85 V 70 3 86 W 78 3 87 X 77 3 88 Y 79 3 89 Z 76 2 90 [ 71 3 91 \ 71 3 92 ] 68 3 93 ^ 70 3 94 _ 83 3 95 ` 82 3 96 a 79 3 97 b 79 3 98 c 71 3 99 d 69 2 100 e 70 2 101 f 69 2 102 g 79 3 103 h 79 3 104 i 71 3 105 j 79 3 106 k 79 3 107 l 79 3 108 m 87 3 109 n 76 2 110 o 76 2 111 p 76 2 112 q 76 3 113 r 76 3 114 s 89 2 115 t 89 3 116 u 79 3 117 v 78 3 118 w 44 3 119 x 14 2 120 y 28 2 121 z 42 2 122 { 39 2 123 | 39 2 124 } 67 2 125 ~ 67 2 126 \` 28 0 145 !! 73 3 161 \0241 " c| 54 3 162 \0242 " L- 54 3 163 \0243 " xo 91 2 164 \0244 " Y- 67 3 165 \0245 " || 76 3 166 \0246 " so 76 2 167 \0247 " "" 78 2 168 \0250 " co 60 3 169 \0251 " a_ 69 3 170 \0252 " << 63 3 171 \0253 " -, 79 3 172 \0254 " hy 79 3 173 \0255 " ro 79 3 174 \0256 " -^ 79 3 175 \0257 " 0^ 79 3 176 \0260 " +- 79 3 177 \0261 " 2^ 79 3 178 \0262 " 3^ 79 3 179 \0263 " \' 79 3 180 \0264 " /u 79 3 181 \0265 " P! 79 3 182 \0266 " .^ 79 3 183 \0267 " ,, 79 3 184 \0270 " 1^ 79 3 185 \0271 " o_ 79 3 186 \0272 " >> 79 3 187 \0273 " 14 79 3 188 \0274 " 12 79 3 189 \0275 " 34 79 3 190 \0276 " ?? 79 3 191 \0277 " A` 79 3 192 \0300 " A' 79 3 193 \0301 " A^ 79 3 194 \0302 " A~ 79 3 195 \0303 " A" 79 3 196 \0304 " A* 79 3 197 \0305 " AE 79 3 198 \0306 " C, 79 3 199 \0307 " E` 79 3 200 \0310 " E' 79 3 201 \0311 " E^ 79 3 202 \0312 " E" 79 3 203 \0313 " I` 79 3 204 \0314 " I' 79 3 205 \0315 " I^ 79 3 206 \0316 " I" 79 3 207 \0317 " D- 79 3 208 \0320 " N~ 79 3 209 \0321 " O` 79 3 210 \0322 " O' 79 3 211 \0323 " O^ 89 2 212 \0324 " O~ 84 2 213 \0325 " O" 102 2 214 \0326 " xx 46 3 215 \0327 " O/ 75 2 216 \0330 " U` 92 2 217 \0331 " U' 75 2 218 \0332 " U^ 92 2 219 \0333 " U" 93 2 220 \0334 " Y' 93 2 221 \0335 " TH 93 2 222 \0336 " ss 83 2 223 \0337 " a` 87 2 224 \0340 " a' 83 2 225 \0341 " a^ 92 2 226 \0342 " a~ 92 2 227 \0343 " a" 92 2 228 \0344 " a* 93 2 229 \0345 " ae 93 2 230 \0346 " c, 46 3 231 \0347 " e` 88 2 232 \0350 " e' 84 2 233 \0351 " e^ 84 2 234 \0352 " e" 87 2 235 \0353 " i` 87 2 236 \0354 " i' 70 2 237 \0355 " i^ 70 2 238 \0356 " i" 87 2 239 \0357 " d- 28 0 240 \0360 " n~ 87 2 241 \0361 " o` 76 2 242 \0362 " o' 95 2 243 \0363 " o^ 77 2 244 \0364 " o~ 87 2 245 \0365 " o" 77 2 246 \0366 " -: 89 3 247 \0367 " o/ 97 2 248 \0370 " u` 89 3 249 \0371 " u' 83 2 250 \0372 " u^ 87 2 251 \0373 " u" 93 2 252 \0374 " y' 97 2 253 \0375 " th 92 2 254 \0376 " y" 28 0 255 \0377 " 0707070014231124051006440057030057030000010440470522627501700002600000001145post.src/devLatin1/GR name GR fontname Symbol named in prologue spacewidth 25 charset *A 72 2 65 *B 67 2 66 *X 72 2 67 *D 61 2 68 *E 61 2 69 *F 76 2 70 *G 60 2 71 *Y 72 2 72 *I 33 2 73 *K 72 2 75 *L 69 2 76 *M 89 2 77 *N 72 2 78 *O 72 2 79 *P 77 2 80 *H 74 2 81 *R 56 2 82 *S 59 2 83 *T 61 2 84 *U 69 2 85 *W 77 2 87 *C 65 2 88 *Q 80 2 89 *Z 61 2 90 *a 63 0 97 *b 55 3 98 *x 55 1 99 *d 49 2 100 *e 44 0 101 *f 52 3 102 *g 41 1 103 *y 60 1 104 *i 33 0 105 *k 55 0 107 *l 55 2 108 *m 58 1 109 *n 52 0 110 *o 55 0 111 *p 55 0 112 *h 52 2 113 *r 55 1 114 *s 60 0 115 *t 44 0 116 *u 58 0 117 *w 69 0 119 *c 49 3 120 *q 69 1 121 *z 49 3 122 0707070014231124061006440057030057030000010445630522627501700002500000004376post.src/devLatin1/S name S fontname Symbol named in prologue special charset --- 33 2 33 fa 71 2 34 --- 50 2 35 te 55 2 36 --- 83 2 37 --- 78 2 38 st 44 0 39 --- 33 3 40 --- 33 3 41 ** 50 2 42 pl 55 0 43 --- 25 1 44 mi 55 0 45 --- 25 0 46 sl 28 2 47 --- 50 2 48 --- 50 2 49 --- 50 2 50 --- 50 2 51 --- 50 2 52 --- 50 2 53 --- 50 2 54 --- 50 2 55 --- 50 2 56 --- 50 2 57 --- 28 0 58 --- 28 1 59 < 55 0 60 eq 55 0 61 > 55 0 62 --- 44 2 63 cg 55 0 64 *A 72 2 65 *B 67 2 66 *X 72 2 67 *D 61 2 68 *E 61 2 69 *F 76 2 70 *G 60 2 71 *Y 72 2 72 *I 33 2 73 --- 63 2 74 *K 72 2 75 *L 69 2 76 *M 89 2 77 *N 72 2 78 *O 72 2 79 *P 77 2 80 *H 74 2 81 *R 56 2 82 *S 59 2 83 *T 61 2 84 *U 69 2 85 ts 44 1 86 *W 77 2 87 *C 65 2 88 *Q 80 2 89 *Z 61 2 90 --- 33 3 91 tf 86 0 92 --- 33 3 93 pp 66 2 94 ul 50 1 95 _ " rn 50 2 96 *a 63 0 97 *b 55 3 98 *x 55 1 99 *d 49 2 100 *e 44 0 101 *f 52 3 102 *g 41 1 103 *y 60 1 104 *i 33 0 105 --- 60 1 106 *k 55 0 107 *l 55 2 108 *m 58 1 109 *n 52 0 110 *o 55 0 111 *p 55 0 112 *h 52 2 113 *r 55 1 114 *s 60 0 115 *t 44 0 116 *u 58 0 117 --- 71 2 118 *w 69 0 119 *c 49 3 120 *q 69 1 121 *z 49 3 122 --- 48 3 123 or 20 3 124 --- 48 3 125 ap 55 0 126 --- 62 2 161 fm 25 2 162 <= 55 2 163 fr 17 2 164 if 73 0 165 fn 50 3 166 --- 75 0 167 --- 75 2 168 --- 75 0 169 --- 75 2 170 ab 104 0 171 <- 99 0 172 ua 60 2 173 -> 99 0 174 da 60 2 175 de 40 2 176 +- 55 2 177 --- 41 2 178 >= 55 2 179 mu 55 0 180 pt 71 0 181 pd 49 2 182 bu 46 0 183 di 55 0 184 != 55 2 185 == 55 0 186 ~~ 55 0 187 el 100 0 188 av 60 3 189 ah 100 0 190 CR 66 2 191 af 82 2 192 If 69 2 193 Rf 80 2 194 ws 99 3 195 Ox 77 2 196 O+ 77 2 197 es 82 2 198 ca 77 0 199 cu 77 0 200 sp 71 0 201 ip 71 1 202 !b 71 0 203 sb 71 0 204 ib 71 1 205 mo 71 0 206 !m 71 2 207 an 77 2 208 gr 71 2 209 rg 79 2 210 co 79 2 211 tm 89 2 212 --- 82 2 213 sr 55 2 214 c. 25 0 215 no 71 0 216 l& 60 0 217 l| 60 0 218 --- 104 0 219 --- 99 0 220 --- 60 2 221 --- 99 0 222 --- 60 2 223 lz 49 2 224 b< 33 3 225 RG 79 2 226 CO 79 2 227 TM 79 2 228 --- 71 2 229 LT 38 3 230 br 0 3 231 LX " LB 38 3 232 lc 50 2 233 lx 38 2 234 lf 50 2 235 lt 49 2 236 lk 49 2 237 lb 49 2 238 bv 49 2 239 | " b> 33 3 241 is 50 3 242 --- 69 2 243 --- 69 2 244 --- 69 2 245 RT 38 3 246 RX 38 2 247 RB 38 3 248 rc 38 2 249 rx 50 3 250 rf 38 2 251 rt 49 2 252 rk 49 2 253 rb 49 2 254 ~= 55 0 1 0707070014231124071006440057030057030000010441260522627501700002600000000561post.src/devLatin1/S1 # Times-Roman special font name S1 fontname Times-Roman named in prologue special charset ru 50 0 95 '' 44 0 186 `` 44 0 170 dg 50 0 178 dd 50 0 179 en 65 0 177 \- " em 100 0 208 14 75 2 1 12 75 2 1 34 75 2 1 bx 50 2 1 ob 38 2 1 ci 75 0 1 sq 50 2 1 Sl 50 2 1 L1 110 1 1 LA 110 1 1 LV 110 3 1 LH 210 1 1 lh 100 0 1 rh 100 0 1 lH 100 0 1 rH 100 0 1 PC 220 2 1 DG 185 2 1 0707070014231124101006440057030057030000010445660522627501700003000000002272post.src/devLatin1/DESC #Device Description - Latin1 character set PDL PostScript Encoding Latin1 fonts 10 R I B BI CW H HI HB S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res 720 hor 1 vert 1 unitwidth 10 charset dq bs \` ga !! c| ct L- ps xo cr Y- yn || so sc "" :a co a_ << -, hy -- ro rg -^ -a 0^ +- 2^ 3^ \' aa /u P! pg .^ ,, ,a 1^ o_ >> 14 12 34 ?? A` A' A^ A~ A" A* AE C, E` E' E^ E" I` I' I^ I" D- N~ O` O' O^ O~ O" xx O/ U` U' U^ U" Y' TH ss a` a' a^ a~ a" a* ae c, e` e' e^ e" i` i' i^ i" d- n~ o` o' o^ o~ o" -: o/ u` u' u^ u" y' th y" ^a ~a Ua .a oa "a Ca va fa te st ** pl mi sl eq cg *A *B *X *D *E *F *G *Y *I *K *L *M *N *O *P *H *R *S *T *U ts *W *C *Q *Z tf pp ul rn *a *b *x *d *e *f *g *y *i *k *l *m *n *o *p *h *r *s *t *u *w *c *q *z or ap fm <= fr if fn ab <- ua -> da de >= mu pt pd bu di != == ~~ el av ah CR af If Rf ws Ox O+ es ca cu sp ip !b sb ib mo !m an gr tm sr c. no l& l| lz b< RG CO TM LT br LX LB lc lx lf lt lk lb bv b> is RT RX RB rc rx rf rt rk rb ~= ru '' `` dg dd en \- em bx ob ci sq Sl L1 LA LV LH lh rh lH rH PC DG 0707070014231122341006400057030057030000010446060522633073400004000000003061post.src/devLatin1/devLatin1.mk MAKE=/bin/make MAKEFILE=devLatin1.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin FONTDIR=/usr/lib/font FONTFILES=DESC ? ?? [A-Z]??* shell.lib all : @if [ -r LINKFILE ]; then sh LINKFILE; fi; install : all @if [ ! -d $(FONTDIR) ]; then \ mkdir $(FONTDIR); \ chmod 755 $(FONTDIR); \ chgrp $(GROUP) $(FONTDIR); \ chown $(OWNER) $(FONTDIR); \ fi @if [ ! -d $(FONTDIR)/devLatin1 ]; then \ mkdir $(FONTDIR)/devLatin1; \ chmod 755 $(FONTDIR)/devLatin1; \ chgrp $(GROUP) $(FONTDIR)/devLatin1; \ chown $(OWNER) $(FONTDIR)/devLatin1; \ fi @if [ ! -d $(FONTDIR)/devLatin1/charlib ]; then \ mkdir $(FONTDIR)/devLatin1/charlib; \ chmod 755 $(FONTDIR)/devLatin1/charlib; \ chgrp $(GROUP) $(FONTDIR)/devLatin1/charlib; \ chown $(OWNER) $(FONTDIR)/devLatin1/charlib; \ fi cp $(FONTFILES) $(FONTDIR)/devLatin1 @for i in $(FONTFILES); do \ chmod 644 $(FONTDIR)/devLatin1/$$i; \ chgrp $(GROUP) $(FONTDIR)/devLatin1/$$i; \ chown $(OWNER) $(FONTDIR)/devLatin1/$$i; \ done cp charlib/* $(FONTDIR)/devLatin1/charlib @for i in charlib/*; do \ chmod 644 $(FONTDIR)/devLatin1/$$i; \ chgrp $(GROUP) $(FONTDIR)/devLatin1/$$i; \ chown $(OWNER) $(FONTDIR)/devLatin1/$$i; \ done clean : clobber : clean changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014230454610407550057030057030000021337270522627502100003300000000000post.src/devLatin1/charlib 0707070014230454621006440057030057030000011340060522627501700003600000000421post.src/devLatin1/charlib/12 /build_12 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (2) show optsize ofont f } def 0707070014230454631006440057030057030000011340070522627502000003600000000421post.src/devLatin1/charlib/14 /build_14 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 0707070014230454641006440057030057030000011347160522627502000003600000000421post.src/devLatin1/charlib/34 /build_34 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (3) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 0707070014230454651006440057030057030000011347300522627502000003600000012536post.src/devLatin1/charlib/L1 /LOGO-dict-mm dup where not { dup 64 dict def currentdict } if exch get begin /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def end /build_L1 { pop LOGO-dict-mm begin ptsize 29 lt { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale 1.02 1 transform round exch round exch itransform translate globe fill grestore end } def 0707070014230454661006440057030057030000011347170522627502000003600000000075post.src/devLatin1/charlib/Fi /build_Fi { pop size .05 mul neg 0 (ffi) ashow } def 0707070014230454671006440057030057030000011347360522627502000003600000000075post.src/devLatin1/charlib/Fl /build_Fl { pop size .05 mul neg 0 (ffl) ashow } def 0707070014230454701006440057030057030000011347370522627502000003600000001725post.src/devLatin1/charlib/LA /LOGO-dict-mm dup where not { dup 64 dict def currentdict } if exch get begin /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LA { pop LOGO-dict-mm begin gsave currentpoint translate size 2.56 div dup scale % was size 2.75 div dup scale .02 0 translate ATT fill grestore end } def 0707070014230454711006440057030057030000011347500522627502000003600000014673post.src/devLatin1/charlib/LH % % PostScript 12 and 8 line logos - horizontal configuration. Switch occurs % automatically below point size 29. Code from Matthijs Melchior. % /LOGO-dict-mm where not { 64 dict /LOGO-dict-mm exch def }{pop} ifelse LOGO-dict-mm begin % initialize dictionary /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LH { % standard ATT logo LOGO-dict-mm begin /w exch def ptsize 29 lt % select globe, # lines depends on point size { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale gsave 1.02 1 transform round exch round exch itransform translate globe fill grestore gsave 2.15 .62 translate .78 dup scale ATT fill grestore grestore end } def 0707070014230454721006440057030057030000011347700522627502000003600000014726post.src/devLatin1/charlib/LV % % PostScript 12 and 8 line logos - vertical configuration. Switch occurs % automatically below point size 29. Code from Matthijs Melchior. % /LOGO-dict-mm where not { 64 dict /LOGO-dict-mm exch def }{pop} ifelse LOGO-dict-mm begin % initialize dictionary /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LV { % standard ATT logo LOGO-dict-mm begin /w exch def ptsize 29 lt % select globe, # lines depends on point size { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale gsave 1.02 1 transform round exch round exch itransform translate globe fill grestore gsave %2.15 .62 translate -0.1 -1.0 translate .78 dup scale ATT fill grestore grestore end } def 0707070014230454731006440057030057030000011347570522627502000004200000001173post.src/devLatin1/charlib/README Postscript definitions for special troff characters. File names are the two character troff names. Each defines a PostScript procedure that begins with build_ and ends with the character's name. The build_?? procedure is called with the character width as it's only argument. The .map files contain extra character data (e.g. image data) that dpost downloads immediately after the build_?? call, if the character's font table code field is 2 (rather than 1). The following PostScript variables are available: font current font ptsize current point size size actual font size - scaled up from ptsize Don't overuse this stuff! 0707070014230454741006440057030057030000011261550522627502000003600000002631post.src/devLatin1/charlib/Sl /build_Sl { pop gsave size .0022 mul dup scale currentpoint translate 14 93 moveto 14 96 lineto 29 110 lineto 44 121 lineto 54 127 lineto 55 132 lineto 57 146 lineto 59 157 lineto 62 171 lineto 66 186 lineto 70 199 lineto 75 213 lineto 81 228 lineto 88 243 lineto 96 257 lineto 106 272 lineto 118 287 lineto 133 300 lineto 148 307 lineto 163 308 lineto 178 304 lineto 191 293 lineto 197 281 lineto 198 277 lineto 198 260 lineto 194 246 lineto 187 231 lineto 179 217 lineto 168 202 lineto 155 187 lineto 141 172 lineto 126 158 lineto 111 146 lineto 96 136 lineto 94 131 lineto 93 123 lineto 92 112 lineto 91 103 lineto 90 93 lineto 89 81 lineto 89 40 lineto 92 28 lineto 97 18 lineto 108 10 lineto 122 10 lineto 134 18 lineto 145 33 lineto 152 48 lineto 158 62 lineto 168 58 lineto 168 59 lineto 163 45 lineto 157 31 lineto 148 16 lineto 133 3 lineto 118 -1 lineto 103 0 lineto 88 5 lineto 73 18 lineto 64 31 lineto 58 46 lineto 55 59 lineto 53 73 lineto 52 111 lineto 37 101 lineto 22 86 lineto 14 93 lineto 97 152 moveto 97 153 lineto 99 166 lineto 101 178 lineto 103 190 lineto 106 205 lineto 109 218 lineto 113 232 lineto 118 246 lineto 124 261 lineto 132 275 lineto 144 290 lineto 157 298 lineto 171 298 lineto 181 291 lineto 186 283 lineto 187 279 lineto 187 264 lineto 186 260 lineto 181 246 lineto 174 233 lineto 165 218 lineto 155 204 lineto 142 190 lineto 127 175 lineto 112 162 lineto 97 152 lineto eofill grestore } def 0707070014230454751006440057030057030000011261570522627502000003600000000264post.src/devLatin1/charlib/bx /build_bx { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath fill } def 0707070014230454761006440057030057030000011347770522627502000003600000000221post.src/devLatin1/charlib/ci /build_ci { pop size 3 mul 8 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 0707070014230454771006440057030057030000011261650522627502000003600000000074post.src/devLatin1/charlib/ff /build_ff { pop size .05 mul neg 0 (ff) ashow } def 0707070014230455001006440057030057030000011261660522627502000003600000001716post.src/devLatin1/charlib/lc % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch neg rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 0707070014230455011006440057030057030000011261670522627502000003600000001712post.src/devLatin1/charlib/lf % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 0707070014230455021006440057030057030000011262000522627502000003600000004412post.src/devLatin1/charlib/lh /build_lh { pop gsave size .0022 mul dup scale currentpoint translate 16 177 moveto 16 188 lineto 21 193 lineto 30 193 lineto 34 189 lineto 36 183 lineto 36 180 lineto 34 174 lineto 27 170 lineto 19 172 lineto 16 177 lineto stroke 38 194 moveto 38 196 lineto 53 199 lineto 68 201 lineto 83 202 lineto 98 203 lineto 113 204 lineto 128 204 lineto 143 205 lineto 158 205 lineto 173 205 lineto 188 204 lineto 203 203 lineto 218 202 lineto 233 200 lineto 248 198 lineto 263 196 lineto 278 194 lineto 293 190 lineto 308 186 lineto 323 181 lineto 338 176 lineto 353 168 lineto 361 162 lineto 364 153 lineto 366 138 lineto 367 126 lineto 368 106 lineto 369 80 lineto 369 74 lineto 368 60 lineto 367 54 lineto 362 43 lineto 348 34 lineto 333 28 lineto 318 25 lineto 303 26 lineto 288 29 lineto 273 31 lineto 258 32 lineto 243 32 lineto 228 30 lineto 213 27 lineto 198 24 lineto 183 23 lineto 168 23 lineto 153 27 lineto 148 34 lineto 148 47 lineto 153 54 lineto 168 58 lineto 183 58 lineto 198 58 lineto 213 59 lineto 226 60 lineto 228 62 lineto 228 67 lineto 223 71 lineto 208 71 lineto 193 70 lineto 178 70 lineto 163 70 lineto 148 70 lineto 133 71 lineto 123 76 lineto 120 84 lineto 120 91 lineto 122 98 lineto 129 104 lineto 144 106 lineto 159 107 lineto 174 107 lineto 189 107 lineto 202 108 lineto 204 110 lineto 204 117 lineto 201 119 lineto 186 119 lineto 171 119 lineto 156 119 lineto 141 119 lineto 126 119 lineto 111 121 lineto 103 128 lineto 101 137 lineto 101 142 lineto 103 150 lineto 111 158 lineto 126 161 lineto 141 161 lineto 156 162 lineto 171 163 lineto 186 163 lineto 191 165 lineto 192 167 lineto 192 171 lineto 190 174 lineto 176 175 lineto 161 175 lineto 146 175 lineto 131 174 lineto 116 174 lineto 101 174 lineto 86 173 lineto 71 172 lineto 56 171 lineto 41 171 lineto 41 174 lineto 43 178 lineto 43 187 lineto 38 194 lineto stroke 373 169 moveto 373 176 lineto 375 182 lineto 386 190 lineto 401 193 lineto 408 191 lineto 411 185 lineto 412 181 lineto 414 167 lineto 415 158 lineto 416 144 lineto 417 128 lineto 418 110 lineto 418 60 lineto 417 45 lineto 415 37 lineto 409 34 lineto 394 31 lineto 381 35 lineto 379 42 lineto 379 52 lineto 380 67 lineto 380 77 lineto 379 77 lineto 378 106 lineto 377 121 lineto 376 133 lineto 375 147 lineto 374 158 lineto 373 169 lineto stroke grestore } def 0707070014230455031006440057030057030000011263050522627502000003600000000222post.src/devLatin1/charlib/ob /build_ob { pop size 3 mul 16 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 0707070014230455041006440057030057030000011263060522627502100003600000001716post.src/devLatin1/charlib/rc % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch neg rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 0707070014230455051006440057030057030000011263070522627502100003600000001712post.src/devLatin1/charlib/rf % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 0707070014230455061006440057030057030000011327350522627502100003600000004171post.src/devLatin1/charlib/rh /build_rh { pop gsave size .0022 mul dup scale currentpoint translate 15 66 moveto 15 86 lineto 16 131 lineto 17 146 lineto 18 158 lineto 19 167 lineto 21 181 lineto 24 190 lineto 34 193 lineto 49 189 lineto 58 182 lineto 60 177 lineto 60 166 lineto 59 156 lineto 58 143 lineto 57 130 lineto 56 117 lineto 55 102 lineto 54 42 lineto 53 39 lineto 49 35 lineto 34 34 lineto 19 39 lineto 16 47 lineto 15 66 lineto stroke 65 60 moveto 65 111 lineto 66 127 lineto 67 139 lineto 69 153 lineto 72 163 lineto 83 171 lineto 98 177 lineto 113 182 lineto 128 187 lineto 143 190 lineto 158 194 lineto 173 196 lineto 188 199 lineto 203 201 lineto 218 203 lineto 233 205 lineto 248 205 lineto 263 206 lineto 278 206 lineto 293 206 lineto 308 206 lineto 323 206 lineto 338 205 lineto 353 203 lineto 368 202 lineto 383 200 lineto 394 197 lineto 389 190 lineto 389 180 lineto 391 176 lineto 391 173 lineto 380 173 lineto 365 173 lineto 350 174 lineto 335 175 lineto 320 176 lineto 305 176 lineto 290 176 lineto 275 177 lineto 260 177 lineto 245 177 lineto 240 173 lineto 240 170 lineto 245 165 lineto 260 164 lineto 275 164 lineto 290 164 lineto 305 163 lineto 320 160 lineto 327 155 lineto 330 149 lineto 330 134 lineto 328 129 lineto 323 124 lineto 309 121 lineto 294 121 lineto 279 121 lineto 264 121 lineto 249 121 lineto 234 121 lineto 228 118 lineto 228 112 lineto 234 109 lineto 249 109 lineto 264 109 lineto 279 108 lineto 294 108 lineto 306 104 lineto 311 97 lineto 312 91 lineto 312 88 lineto 311 82 lineto 305 74 lineto 290 72 lineto 275 72 lineto 260 72 lineto 245 73 lineto 230 73 lineto 215 73 lineto 205 70 lineto 205 63 lineto 217 60 lineto 232 60 lineto 247 60 lineto 262 60 lineto 277 57 lineto 283 52 lineto 285 44 lineto 285 41 lineto 284 35 lineto 280 30 lineto 268 26 lineto 253 25 lineto 238 26 lineto 223 28 lineto 208 31 lineto 193 33 lineto 178 34 lineto 163 33 lineto 148 31 lineto 133 28 lineto 118 27 lineto 103 28 lineto 88 34 lineto 73 43 lineto 67 52 lineto 65 60 lineto stroke 396 180 moveto 396 188 lineto 399 194 lineto 410 196 lineto 416 190 lineto 416 180 lineto 415 177 lineto 411 173 lineto 400 173 lineto 396 180 lineto stroke grestore } def 0707070014230455071006440057030057030000011331250522627502100003600000000320post.src/devLatin1/charlib/sq /build_sq { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath font B eq {fill} {stroke} ifelse } def 0707070014230455101006440057030057030000011331260522627502100003600000000130post.src/devLatin1/charlib/~= /build_~= { pop (\176) stringwidth pop neg size -.15 mul (\176\055) ashow } def 0707070014230455111006440057030057030000011331270522627502100003600000000327post.src/devLatin1/charlib/RC /build_RC { pop size 4 div /side exch def currentpoint newpath moveto 0 side 1.5 mul rmoveto 0 side rlineto side 2.5 mul 0 rlineto 0 side neg rlineto closepath fill } def 0707070014230455121006440057030057030000011331750522627502100003600000001051post.src/devLatin1/charlib/DG % % UMDS danger sign - needs to be cleaned up! % /build_DG { /x0 1.5 6 div 72 mul def % triangle length pop gsave currentpoint translate 1 scaling div ptsize 10 div mul dup scale 2 setlinewidth 0 setlinecap newpath 0 0 moveto x0 0 lineto x0 2 div x0 3 sqrt 2 div mul lineto closepath fill 1 setgray /Helvetica-Bold findfont 12 scalefont setfont 0 0 moveto (!) false charpath pathbbox exch 4 -1 roll add 2 div x0 2 div exch sub 0 moveto exch sub x0 3 sqrt 2 div mul exch sub 3 div 0 exch rmoveto (!) show grestore } def 0707070014230455131006440057030057030000011331760522627502100003600000000735post.src/devLatin1/charlib/PC % % UMDS pencil - needs to be cleaned up. % /build_PC { pop gsave currentpoint translate 1 scaling div ptsize 10 div mul dup scale newpath 0 setlinecap 1 setlinejoin 2 setlinewidth 0 1 moveto 12 0 rlineto stroke 0 5 moveto 12 0 rlineto stroke 0 9 moveto 12 0 rlineto stroke 1 setlinewidth 12 .5 moveto 21.27362 5 lineto 12 9.5 lineto stroke 21.27362 5 moveto .4 9.27362 mul neg .4 4 mul rlineto 0 .8 4 mul neg rlineto closepath fill grestore } def 0707070014230455141006440057030057030000011333450522627502100003600000004404post.src/devLatin1/charlib/lH /build_lH { pop gsave size .0022 mul dup scale currentpoint translate 16 177 moveto 16 188 lineto 21 193 lineto 30 193 lineto 34 189 lineto 36 183 lineto 36 180 lineto 34 174 lineto 27 170 lineto 19 172 lineto 16 177 lineto fill 38 194 moveto 38 196 lineto 53 199 lineto 68 201 lineto 83 202 lineto 98 203 lineto 113 204 lineto 128 204 lineto 143 205 lineto 158 205 lineto 173 205 lineto 188 204 lineto 203 203 lineto 218 202 lineto 233 200 lineto 248 198 lineto 263 196 lineto 278 194 lineto 293 190 lineto 308 186 lineto 323 181 lineto 338 176 lineto 353 168 lineto 361 162 lineto 364 153 lineto 366 138 lineto 367 126 lineto 368 106 lineto 369 80 lineto 369 74 lineto 368 60 lineto 367 54 lineto 362 43 lineto 348 34 lineto 333 28 lineto 318 25 lineto 303 26 lineto 288 29 lineto 273 31 lineto 258 32 lineto 243 32 lineto 228 30 lineto 213 27 lineto 198 24 lineto 183 23 lineto 168 23 lineto 153 27 lineto 148 34 lineto 148 47 lineto 153 54 lineto 168 58 lineto 183 58 lineto 198 58 lineto 213 59 lineto 226 60 lineto 228 62 lineto 228 67 lineto 223 71 lineto 208 71 lineto 193 70 lineto 178 70 lineto 163 70 lineto 148 70 lineto 133 71 lineto 123 76 lineto 120 84 lineto 120 91 lineto 122 98 lineto 129 104 lineto 144 106 lineto 159 107 lineto 174 107 lineto 189 107 lineto 202 108 lineto 204 110 lineto 204 117 lineto 201 119 lineto 186 119 lineto 171 119 lineto 156 119 lineto 141 119 lineto 126 119 lineto 111 121 lineto 103 128 lineto 101 137 lineto 101 142 lineto 103 150 lineto 111 158 lineto 126 161 lineto 141 161 lineto 156 162 lineto 171 163 lineto 186 163 lineto 191 165 lineto 192 167 lineto 192 171 lineto 190 174 lineto 176 175 lineto 161 175 lineto 146 175 lineto 131 174 lineto 116 174 lineto 101 174 lineto 86 173 lineto 71 172 lineto 56 171 lineto 41 171 lineto 41 174 lineto 43 178 lineto 43 187 lineto 38 194 lineto fill 373 169 moveto 373 176 lineto 375 182 lineto 386 190 lineto 401 193 lineto 408 191 lineto 411 185 lineto 412 181 lineto 414 167 lineto 415 158 lineto 416 144 lineto 417 128 lineto 418 110 lineto 418 60 lineto 417 45 lineto 415 37 lineto 409 34 lineto 394 31 lineto 381 35 lineto 379 42 lineto 379 52 lineto 380 67 lineto 380 77 lineto 379 77 lineto 378 106 lineto 377 121 lineto 376 133 lineto 375 147 lineto 374 158 lineto 373 169 lineto fill grestore } def 0707070014230455151006440057030057030000011336450522627502100003600000004163post.src/devLatin1/charlib/rH /build_rH { pop gsave size .0022 mul dup scale currentpoint translate 15 66 moveto 15 86 lineto 16 131 lineto 17 146 lineto 18 158 lineto 19 167 lineto 21 181 lineto 24 190 lineto 34 193 lineto 49 189 lineto 58 182 lineto 60 177 lineto 60 166 lineto 59 156 lineto 58 143 lineto 57 130 lineto 56 117 lineto 55 102 lineto 54 42 lineto 53 39 lineto 49 35 lineto 34 34 lineto 19 39 lineto 16 47 lineto 15 66 lineto fill 65 60 moveto 65 111 lineto 66 127 lineto 67 139 lineto 69 153 lineto 72 163 lineto 83 171 lineto 98 177 lineto 113 182 lineto 128 187 lineto 143 190 lineto 158 194 lineto 173 196 lineto 188 199 lineto 203 201 lineto 218 203 lineto 233 205 lineto 248 205 lineto 263 206 lineto 278 206 lineto 293 206 lineto 308 206 lineto 323 206 lineto 338 205 lineto 353 203 lineto 368 202 lineto 383 200 lineto 394 197 lineto 389 190 lineto 389 180 lineto 391 176 lineto 391 173 lineto 380 173 lineto 365 173 lineto 350 174 lineto 335 175 lineto 320 176 lineto 305 176 lineto 290 176 lineto 275 177 lineto 260 177 lineto 245 177 lineto 240 173 lineto 240 170 lineto 245 165 lineto 260 164 lineto 275 164 lineto 290 164 lineto 305 163 lineto 320 160 lineto 327 155 lineto 330 149 lineto 330 134 lineto 328 129 lineto 323 124 lineto 309 121 lineto 294 121 lineto 279 121 lineto 264 121 lineto 249 121 lineto 234 121 lineto 228 118 lineto 228 112 lineto 234 109 lineto 249 109 lineto 264 109 lineto 279 108 lineto 294 108 lineto 306 104 lineto 311 97 lineto 312 91 lineto 312 88 lineto 311 82 lineto 305 74 lineto 290 72 lineto 275 72 lineto 260 72 lineto 245 73 lineto 230 73 lineto 215 73 lineto 205 70 lineto 205 63 lineto 217 60 lineto 232 60 lineto 247 60 lineto 262 60 lineto 277 57 lineto 283 52 lineto 285 44 lineto 285 41 lineto 284 35 lineto 280 30 lineto 268 26 lineto 253 25 lineto 238 26 lineto 223 28 lineto 208 31 lineto 193 33 lineto 178 34 lineto 163 33 lineto 148 31 lineto 133 28 lineto 118 27 lineto 103 28 lineto 88 34 lineto 73 43 lineto 67 52 lineto 65 60 lineto fill 396 180 moveto 396 188 lineto 399 194 lineto 410 196 lineto 416 190 lineto 416 180 lineto 415 177 lineto 411 173 lineto 400 173 lineto 396 180 lineto fill grestore } def 0707070014230455161006440057030057030000011263100522627502100004600000010521post.src/devLatin1/charlib/LH.example % % An example logo character. Building the PostScript program that prints % your company logo is not addressed here; we assume you already have % such a program, that it's relatively simple, and that it prints the % logo by itself on a page. What you'll find here are instructions for % converting that logo program into a character that can be accessed by % troff and dpost. % % Building a new charlib character involves some PostScript programming. % We've tried to isolate parameters that you'll need to change (Xoffset, % Yoffset, and Scaling), but we can't guarantee things will work properly % with every logo program. PostScript is a complex language and subtle % interactions between your logo program and what we've done here can % cause problems. % % Tuning the new character is an iterative process. You may want to adjust % the size of the logo (via Scaling), it's position relative to adjacent % characters and the baseline (Xoffset and Yoffset), and the distance troff % moves after printing the character (width field in file ../S1). The steps % to follow are: % % 1: Create a simple troff test file for the new character. Something % like, % % .sp 1i % .ps 10 % size 10: \(LH % .sp 1i % .ps 18 % size 18: \(LH % .sp 1i % .ps 36 % size 36: \(LH % .sp 1i % .ps 10 % four logo characters: \(LH\(LH\(LH\(LH % % is sufficient. The test file can go anywhere. % % 2: Change into directory /usr/lib/font/devpost/charlib. All file % pathnames will be relative to that directory. % % 3: Save a copy of the working LH logo file. Then replace LH with % this file (i.e. LH.example). Changes described below should be % be made in the new LH file (not in LH.example). % % 4: Your PostScript logo program will eventually replace whatever % you find between the <<StartLogo>> and <<EndLogo>> comment lines % in the PostScript build_LH procedure (below). What's there now % prints an example logo that you can use until you understand the % remaining steps. % % 5: Print your troff test file using (assuming your making changes % in the devpost charlib directory), % % troff -Tpost testfile | dpost | lp ... % % 6: Adjust the logo positioning by changing the numbers assigned to % Xoffset and Yoffset (below). Both are in units of 72 per inch. % Positive offsets should move the logo to the right and up the % page. % % 7: Adjust the logo size by changing the the number assigned to % Scaling. Unitsize also controls scaling, but there's no good % reason to change both Scaling and Unitsize. % % 8: Control the horizontal distance troff moves after printing the % new LH character by changing the width (i.e. the number in the % second column) assigned to LH in file ../S1. Character width % adjustments should probably wait until you're satisfied with % the Scaling set in step 7. % % 9: Back to step 5 until your satisfied with the output. % % The remaining steps are suggested but not required: % % 10: Delete PostScript comments in your new LH charlib file - comments % start with % and go to the end of the line. % % 11: Update the width field assigned to LH in file ../shell.lib. The % new width should reflect what's currently in your S1 font file. % % 12: Make a similiar set of changes in /usr/lib/font/devLatin1/charlib. % You can use the devpost version of LH to devLatin1/charlib/LH, % but changes to files devLatin1/S1 and devLatin1/shell.lib must be % entered by hand. % /Logo_Dict 100 dict dup begin /Xoffset 0 def % 72 dpi with positive to the right /Yoffset 0 def % 72 dpi with positive up the page /Scaling 1.0 def % adjust this number to change the size /Unitsize 36 def % for point size scaling - leave it be /showpage {} def end def /build_LH { % don't bind this procedure Logo_Dict begin gsave /charwidth exch def currentpoint translate resolution 72 div dup scale Xoffset Yoffset translate Scaling Scaling scale ptsize Unitsize div dup scale %% Replace everything between the <<StartLogo>> and <<EndLogo>> %% comment lines by the PostScript program that prints your %% logo. %% <<StartLogo>> newpath .5 .5 scale 0 0 moveto 100 0 lineto 100 100 lineto closepath .5 setgray fill 0 setgray 10 10 translate 45 rotate 0 5 moveto /Helvetica findfont 18 scalefont setfont (Example Logo) show %% <<EndLogo>> grestore end } def 0707070014231124121006440057030057030000010446020522627502100002600000006132post.src/devLatin1/HK name HK fontname Helvetica-LightOblique spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 56 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 2 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 2 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 2 124 } 33 3 125 ~ 33 2 148 --- 66 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 0 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 22 2 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 80 2 169 \0251 " a_ 33 2 170 \0252 " << 56 0 171 \0253 " -, 66 0 172 \0254 " hy 33 0 173 \0255 " -- 66 0 45 ro 80 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 66 0 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 65 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 33 2 186 \0272 " >> 56 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 50 1 191 \0277 " A` 67 2 192 \0300 " A' 67 2 193 \0301 " A^ 67 2 194 \0302 " A~ 67 2 195 \0303 " A" 67 2 196 \0304 " A* 67 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 66 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 61 2 221 \0335 " TH 61 2 222 \0336 " ss 50 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 89 0 230 \0346 " c, 56 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 22 2 236 \0354 " i' 22 2 237 \0355 " i^ 22 2 238 \0356 " i" 22 2 239 \0357 " d- 56 2 240 \0360 " n~ 56 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 66 0 247 \0367 " o/ 56 0 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 50 3 253 \0375 " th 61 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231124131006440057030057030000010446200522627502100002600000006123post.src/devLatin1/HL name HL fontname Helvetica-Light spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 56 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 2 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 2 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 2 124 } 33 3 125 ~ 33 2 148 --- 66 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 0 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 22 2 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 80 2 169 \0251 " a_ 33 2 170 \0252 " << 56 0 171 \0253 " -, 66 0 172 \0254 " hy 33 0 173 \0255 " -- 66 0 45 ro 80 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 66 0 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 65 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 33 2 186 \0272 " >> 56 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 50 1 191 \0277 " A` 67 2 192 \0300 " A' 67 2 193 \0301 " A^ 67 2 194 \0302 " A~ 67 2 195 \0303 " A" 67 2 196 \0304 " A* 67 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 61 2 200 \0310 " E' 61 2 201 \0311 " E^ 61 2 202 \0312 " E" 61 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 66 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 61 2 221 \0335 " TH 61 2 222 \0336 " ss 50 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 89 0 230 \0346 " c, 56 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 22 2 236 \0354 " i' 22 2 237 \0355 " i^ 22 2 238 \0356 " i" 22 2 239 \0357 " d- 56 2 240 \0360 " n~ 56 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 66 0 247 \0367 " o/ 56 0 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 50 3 253 \0375 " th 61 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014231124141006440057030057030000010446400522627502100004200000053476post.src/devLatin1/shell.lib.last # # Shell library - for building devLatin1 tables. # # The full ISO Latin1 alphabet appeared in Adobe's interpreter sometime # around Version 50.0. Prior to that ROM resident Type 1 text fonts were # missing 18 characters that are now part of the Latin1 standard. Width # tables will not build on printers that lack full Latin1 support. Error # message will likely reflect a missing ISOLatin1Encoding array. # RESOLUTION=720 UNITWIDTH=10 OCTALESCAPES=${OCTALESCAPES:-160} # <= code means add \0ddd names DOWNLOADVECTOR=FALSE # TRUE can mean incomplete tables # # BuiltinTables returns command lines that generate PostScript programs # for building a typesetter description file and font width tables for # a relatively standard collection of fonts. Use awk to select a command # line or modify an existing command to build a width table for a new # font. # BuiltinTables() { cat <<-'//End of BuiltinTables' Proportional R Times-Roman Proportional I Times-Italic Proportional B Times-Bold Proportional BI Times-BoldItalic Proportional AB AvantGarde-Demi Proportional AI AvantGarde-BookOblique Proportional AR AvantGarde-Book Proportional AX AvantGarde-DemiOblique Proportional H Helvetica Proportional HB Helvetica-Bold Proportional HI Helvetica-Oblique Proportional HX Helvetica-BoldOblique Proportional Hb Helvetica-Narrow-Bold Proportional Hi Helvetica-Narrow-Oblique Proportional Hr Helvetica-Narrow Proportional Hx Helvetica-Narrow-BoldOblique Proportional KB Bookman-Demi Proportional KI Bookman-LightItalic Proportional KR Bookman-Light Proportional KX Bookman-DemiItalic Proportional NB NewCenturySchlbk-Bold Proportional NI NewCenturySchlbk-Italic Proportional NR NewCenturySchlbk-Roman Proportional NX NewCenturySchlbk-BoldItalic Proportional PA Palatino-Roman Proportional PB Palatino-Bold Proportional PI Palatino-Italic Proportional PX Palatino-BoldItalic Proportional ZI ZapfChancery-MediumItalic FixedWidth C Courier FixedWidth CB Courier-Bold FixedWidth CI Courier-Oblique FixedWidth CO Courier FixedWidth CW Courier FixedWidth CX Courier-BoldOblique Dingbats ZD ZapfDingbats Greek GR Symbol Symbol S Symbol Special S1 Times-Roman Description DESC --- //End of BuiltinTables } # # AllTables prints the complete list of builtin font names. # AllTables() { BuiltinTables | awk '{print $2}' } # # Charset functions generate keyword/value pairs (as PostScript objects) # that describe the character set available in a font. The keyword is a # PostScript string that represents troff's name for the character. The # value is usually the literal name (i.e. begins with a /) assigned to # the character in the PostScript font. The value can also be an integer # or a PostScript string. An integer value is used as an index in the # current font's Encoding array. A string value is returned to the host # unchanged when the entry for the character is constructed. Entries that # have (") as their value are synonyms for the preceeding character. # # The 18 characters missing from ROM resident fonts on older printers are # flagged with the PostScript comment "% missing". # StandardCharset() { cat <<-'//End of StandardCharset' (!) /exclam (") /quotedbl (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (-) /hyphen % changed from minus by request (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (\\`) /grave % devpost character (ga) (") % synonym (!!) /exclamdown (c|) /cent (ct) (") % devpost synonym (L-) /sterling (ps) (") % devpost synonym (xo) /currency (cr) (") % devpost synonym (Y-) /yen (yn) (") % devpost synonym (||) /brokenbar % missing (so) /section (sc) (") % devpost synonym ("") /dieresis (:a) (") % devpost synonym (co) /copyright (a_) /ordfeminine (<<) /guillemotleft (-,) /logicalnot (hy) /hyphen (--) (") % synonym (ro) /registered (rg) (") % devpost synonym (-^) /macron (-a) (") % devpost synonym (0^) /degree % missing (+-) /plusminus % missing (2^) /twosuperior % missing (3^) /threesuperior % missing (\\') /acute (aa) (") % devpost synonym (/u) /mu % missing (P!) /paragraph (pg) (") % devpost synonym (.^) /periodcentered (,,) /cedilla (,a) (") % devpost synonym (1^) /onesuperior % missing (o_) /ordmasculine (>>) /guillemotright (14) /onequarter % missing (12) /onehalf % missing (34) /threequarters % missing (??) /questiondown (A`) /Agrave (A') /Aacute (A^) /Acircumflex (A~) /Atilde (A") /Adieresis (A*) /Aring (AE) /AE (C,) /Ccedilla (E`) /Egrave (E') /Eacute (E^) /Ecircumflex (E") /Edieresis (I`) /Igrave (I') /Iacute (I^) /Icircumflex (I") /Idieresis (D-) /Eth % missing (N~) /Ntilde (O`) /Ograve (O') /Oacute (O^) /Ocircumflex (O~) /Otilde (O") /Odieresis (xx) /multiply % missing (O/) /Oslash (U`) /Ugrave (U') /Uacute (U^) /Ucircumflex (U") /Udieresis (Y') /Yacute % missing (TH) /Thorn % missing (ss) /germandbls (a`) /agrave (a') /aacute (a^) /acircumflex (a~) /atilde (a") /adieresis (a*) /aring (ae) /ae (c,) /ccedilla (e`) /egrave (e') /eacute (e^) /ecircumflex (e") /edieresis (i`) /igrave (i') /iacute (i^) /icircumflex (i") /idieresis (d-) /eth % missing (n~) /ntilde (o`) /ograve (o') /oacute (o^) /ocircumflex (o~) /otilde (o") /odieresis (-:) /divide % missing (o/) /oslash (u`) /ugrave (u') /uacute (u^) /ucircumflex (u") /udieresis (y') /yacute % missing (th) /thorn % missing (y") /ydieresis (^a) /circumflex % devpost accent (~a) /tilde % devpost accent (Ua) /breve % devpost accent (.a) /dotaccent % devpost accent (oa) /ring % devpost accent ("a) /hungarumlaut % devpost accent (Ca) /ogonek % devpost accent (va) /caron % devpost accent //End of StandardCharset } # # DingbatsCharset guarantees changes in StandardCharset don't show up in ZD. # DingbatsCharset() { cat <<-'//End of DingbatsCharset' (!) /exclam (") /quotedbl (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (-) /minus % also hyphen in devpost (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (\\`) /grave % devpost character (ga) (") % synonym (!!) /exclamdown (c|) /cent (ct) (") % devpost synonym (L-) /sterling (ps) (") % devpost synonym (xo) /currency (cr) (") % devpost synonym (Y-) /yen (yn) (") % devpost synonym (||) /brokenbar % missing (so) /section (sc) (") % devpost synonym ("") /dieresis (co) /copyright (a_) /ordfeminine (<<) /guillemotleft (-,) /logicalnot (hy) /hyphen (--) (") % synonym (ro) /registered (rg) (") % devpost synonym (-^) /macron (0^) /degree % missing (+-) /plusminus % missing (2^) /twosuperior % missing (3^) /threesuperior % missing (\\') /acute (aa) (") % devpost synonym (/u) /mu % missing (P!) /paragraph (pg) (") % devpost synonym (.^) /periodcentered (,,) /cedilla (1^) /onesuperior % missing (o_) /ordmasculine (>>) /guillemotright (14) /onequarter % missing (12) /onehalf % missing (34) /threequarters % missing (??) /questiondown (A`) /Agrave (A') /Aacute (A^) /Acircumflex (A~) /Atilde (A") /Adieresis (A*) /Aring (AE) /AE (C,) /Ccedilla (E`) /Egrave (E') /Eacute (E^) /Ecircumflex (E") /Edieresis (I`) /Igrave (I') /Iacute (I^) /Icircumflex (I") /Idieresis (D-) /Eth % missing (N~) /Ntilde (O`) /Ograve (O') /Oacute (O^) /Ocircumflex (O~) /Otilde (O") /Odieresis (xx) /multiply % missing (O/) /Oslash (U`) /Ugrave (U') /Uacute (U^) /Ucircumflex (U") /Udieresis (Y') /Yacute % missing (TH) /Thorn % missing (ss) /germandbls (a`) /agrave (a') /aacute (a^) /acircumflex (a~) /atilde (a") /adieresis (a*) /aring (ae) /ae (c,) /ccedilla (e`) /egrave (e') /eacute (e^) /ecircumflex (e") /edieresis (i`) /igrave (i') /iacute (i^) /icircumflex (i") /idieresis (d-) /eth % missing (n~) /ntilde (o`) /ograve (o') /oacute (o^) /ocircumflex (o~) /otilde (o") /odieresis (-:) /divide % missing (o/) /oslash (u`) /ugrave (u') /uacute (u^) /ucircumflex (u") /udieresis (y') /yacute % missing (th) /thorn % missing (y") /ydieresis //End of DingbatsCharset } SymbolCharset() { cat <<-'//End of SymbolCharset' (---) /exclam (fa) /universal (---) /numbersign (te) /existential (---) /percent (---) /ampersand (st) /suchthat (---) /parenleft (---) /parenright (**) /asteriskmath (pl) /plus (---) /comma (mi) /minus (---) /period (sl) /slash (---) /zero (---) /one (---) /two (---) /three (---) /four (---) /five (---) /six (---) /seven (---) /eight (---) /nine (---) /colon (---) /semicolon (<) /less (eq) /equal (>) /greater (---) /question (cg) /congruent (*A) /Alpha (*B) /Beta (*X) /Chi (*D) /Delta (*E) /Epsilon (*F) /Phi (*G) /Gamma (*Y) /Eta (*I) /Iota (---) /theta1 (*K) /Kappa (*L) /Lambda (*M) /Mu (*N) /Nu (*O) /Omicron (*P) /Pi (*H) /Theta (*R) /Rho (*S) /Sigma (*T) /Tau (*U) /Upsilon (ts) /sigma1 (*W) /Omega (*C) /Xi (*Q) /Psi (*Z) /Zeta (---) /bracketleft (tf) /therefore (---) /bracketright (pp) /perpendicular (ul) /underscore (_) (") % synonym (rn) /radicalex (*a) /alpha (*b) /beta (*x) /chi (*d) /delta (*e) /epsilon (*f) /phi (*g) /gamma (*y) /eta (*i) /iota (---) /phi1 (*k) /kappa (*l) /lambda (*m) /mu (*n) /nu (*o) /omicron (*p) /pi (*h) /theta (*r) /rho (*s) /sigma (*t) /tau (*u) /upsilon (---) /omega1 (*w) /omega (*c) /xi (*q) /psi (*z) /zeta (---) /braceleft (or) /bar (---) /braceright (ap) /similar (---) /Upsilon1 (fm) /minute (<=) /lessequal (fr) /fraction % devpost character (if) /infinity (fn) /florin % devpost character (---) /club (---) /diamond (---) /heart (---) /spade (ab) /arrowboth (<-) /arrowleft (ua) /arrowup (->) /arrowright (da) /arrowdown (de) /degree (+-) /plusminus (---) /second (>=) /greaterequal (mu) /multiply (pt) /proportional (pd) /partialdiff (bu) /bullet (di) /divide (!=) /notequal (==) /equivalence (~~) /approxequal (el) /ellipsis (av) /arrowvertex (ah) /arrowhorizex (CR) /carriagereturn (af) /aleph (If) /Ifraktur (Rf) /Rfraktur (ws) /weierstrass (Ox) /circlemultiply (O+) /circleplus (es) /emptyset (ca) /intersection (cu) /union (sp) /propersuperset (ip) /reflexsuperset (!b) /notsubset (sb) /propersubset (ib) /reflexsubset (mo) /element (!m) /notelement (an) /angle (gr) /gradient (rg) /registerserif (co) /copyrightserif (tm) /trademarkserif (---) /product (sr) /radical (c.) /dotmath (no) /logicalnot (l&) /logicaland (l|) /logicalor (---) /arrowdblboth (---) /arrowdblleft (---) /arrowdblup (---) /arrowdblright (---) /arrowdbldown (lz) /lozenge (b<) /angleleft (RG) /registersans (CO) /copyrightsans (TM) /trademarksans (---) /summation (LT) /parenlefttp (br) /parenleftex (LX) (") % synonym (LB) /parenleftbt (lc) /bracketlefttp (lx) /bracketleftex (lf) /bracketleftbt (lt) /bracelefttp (lk) /braceleftmid (lb) /braceleftbt (bv) /braceex (|) (") % synonym (b>) /angleright (is) /integral (---) /integraltp (---) /integralex (---) /integralbt (RT) /parenrighttp (RX) /parenrightex (RB) /parenrightbt (rc) /bracketrighttp (rx) /bracketrightex (rf) /bracketrightbt (rt) /bracerighttp (rk) /bracerightmid (rb) /bracerightbt (~=) (55 0 1) % charlib //End of SymbolCharset } SpecialCharset() { cat <<-'//End of SpecialCharset' (ru) /underscore ('') /quotedblright % devpost character (``) /quotedblleft % devpost character (dg) /dagger % devpost character (dd) /daggerdbl % devpost character (en) /endash % devpost character (\\-) (") % synonym (em) /emdash % (ff) (60 2 1) % charlib % (Fi) (84 2 1) % charlib % (Fl) (84 2 1) % charlib (14) (75 2 1) % charlib (12) (75 2 1) % charlib (34) (75 2 1) % charlib (bx) (50 2 1) % charlib (ob) (38 2 1) % charlib (ci) (75 0 1) % charlib (sq) (50 2 1) % charlib (Sl) (50 2 1) % charlib (L1) (110 1 2) % charlib (LA) (110 1 2) % charlib (LV) (110 3 1) % charlib (LH) (210 1 1) % charlib (lh) (100 0 1) % charlib (rh) (100 0 1) % charlib (lH) (100 0 1) % charlib (rH) (100 0 1) % charlib (PC) (220 2 1) % charlib (DG) (185 2 1) % charlib //End of SpecialCharset } # # Latin1 ensures a font uses the ISOLatin1Encoding vector, although only # text fonts should be re-encoded. Downloading the Encoding vector doesn't # often make sense. No ISOLatin1Encoding array likely means ROM based fonts # on your printer are incomplete. Type 1 fonts with a full Latin1 character # set appeared sometime after Version 50.0. # Latin1() { if [ "$DOWNLOADVECTOR" = TRUE ]; then cat <<-'//End of ISOLatin1Encoding' /ISOLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def //End of ISOLatin1Encoding fi echo "ISOLatin1Encoding /$1 ReEncode" } # # Generating functions output PostScript programs that build font width # tables or a typesetter description file. Send the program to a printer # and the complete table will come back on the serial port. All write on # stdout and assume the prologue and other required PostScript files are # all available. # Proportional() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" # Get <>_ and | from S. Use accents for ascii ^ and ~. StandardCharset | awk ' $1 == "(<)" && $2 == "/less" {$1 = "(---)"} $1 == "(>)" && $2 == "/greater" {$1 = "(---)"} $1 == "(_)" && $2 == "/underscore" {$1 = "(---)"} $1 == "(|)" && $2 == "/bar" {$1 = "(---)"} $1 == "(^)" && $2 == "/asciicircum" { printf "(^)\t/circumflex\n" $1 = "(---)" } $1 == "(~)" && $2 == "/asciitilde" { printf "(~)\t/tilde\n" $1 = "(---)" } {printf "%s\t%s\n", $1, $2} ' echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } FixedWidth() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" StandardCharset echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Dingbats() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" DingbatsCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ { printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2 }' echo "] def" echo "/$2 SelectFont" echo "( ) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Greek() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/' echo "] def" echo "/$2 SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Symbol() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset echo "] def" echo "ChangeMetrics" echo "/S SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Special() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SpecialCharset echo "] def" echo "ChangeMetrics" echo "/S1 SelectFont" echo "(# Times-Roman special font\\\\n) Print" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } # # The DESC file doesn't have to be built on a printer. It's only here for # consistency. # Description() { echo "/charset [" # awk - so the stack doesn't overflow StandardCharset | awk '{print $1}' SymbolCharset | awk '{print $1}' SpecialCharset | awk '{print $1}' echo "] def" cat <<-//DESC (#Device Description - Latin1 character set PDL PostScript Encoding Latin1 fonts 10 R I B BI CW H HI HB S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res $RESOLUTION hor 1 vert 1 unitwidth $UNITWIDTH ) Print //DESC echo "(charset\\\\n) Print" echo "BuildDescCharset" echo "(\\\\n) Print" } 0707070014231124151006440057030057030000010447200522627502100004100000044161post.src/devLatin1/shell.lib.old # # Shell library - for building devLatin1 tables. # # The full ISO Latin1 alphabet appeared in Adobe's interpreter sometime # around Version 50.0. Prior to that ROM resident Type 1 text fonts were # missing 18 characters that are now part of the Latin1 standard. Width # tables will not build on printers that lack full Latin1 support. Error # message will likely reflect a missing ISOLatin1Encoding array. # RESOLUTION=720 UNITWIDTH=10 OCTALESCAPES=${OCTALESCAPES:-160} # <= code means add \0ddd names DOWNLOADVECTOR=FALSE # TRUE can mean incomplete tables # # BuiltinTables returns command lines that generate PostScript programs # for building a typesetter description file and font width tables for # a relatively standard collection of fonts. Use awk to select a command # line or modify an existing command to build a width table for a new # font. # BuiltinTables() { cat <<-'//End of BuiltinTables' Proportional R Times-Roman Proportional I Times-Italic Proportional B Times-Bold Proportional BI Times-BoldItalic Proportional AB AvantGarde-Demi Proportional AI AvantGarde-BookOblique Proportional AR AvantGarde-Book Proportional AX AvantGarde-DemiOblique Proportional H Helvetica Proportional HB Helvetica-Bold Proportional HI Helvetica-Oblique Proportional HX Helvetica-BoldOblique Proportional Hb Helvetica-Narrow-Bold Proportional Hi Helvetica-Narrow-Oblique Proportional Hr Helvetica-Narrow Proportional Hx Helvetica-Narrow-BoldOblique Proportional KB Bookman-Demi Proportional KI Bookman-LightItalic Proportional KR Bookman-Light Proportional KX Bookman-DemiItalic Proportional NB NewCenturySchlbk-Bold Proportional NI NewCenturySchlbk-Italic Proportional NR NewCenturySchlbk-Roman Proportional NX NewCenturySchlbk-BoldItalic Proportional PA Palatino-Roman Proportional PB Palatino-Bold Proportional PI Palatino-Italic Proportional PX Palatino-BoldItalic Proportional ZI ZapfChancery-MediumItalic FixedWidth C Courier FixedWidth CB Courier-Bold FixedWidth CI Courier-Oblique FixedWidth CO Courier FixedWidth CW Courier FixedWidth CX Courier-BoldOblique Dingbats ZD ZapfDingbats Greek GR Symbol Symbol S Symbol Special S1 Times-Roman Description DESC --- //End of BuiltinTables } # # AllTables prints the complete list of builtin font names. # AllTables() { BuiltinTables | awk '{print $2}' } # # Charset functions generate keyword/value pairs (as PostScript objects) # that describe the character set available in a font. The keyword is a # PostScript string that represents troff's name for the character. The # value is usually the literal name (i.e. begins with a /) assigned to # the character in the PostScript font. The value can also be an integer # or a PostScript string. An integer value is used as an index in the # current font's Encoding array. A string value is returned to the host # unchanged when the entry for the character is constructed. Entries that # have (") as their value are synonyms for the preceeding character. # # The 18 characters missing from ROM resident fonts on older printers are # flagged with the PostScript comment "% missing". # StandardCharset() { cat <<-'//End of StandardCharset' (!) /exclam (") /quotedbl (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (-) /minus % also hyphen in devpost (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (\\`) /grave % devpost character (ga) (") % synonym (!!) /exclamdown (c|) /cent (ct) (") % devpost synonym (L-) /sterling (ps) (") % devpost synonym (xo) /currency (cr) (") % devpost synonym (Y-) /yen (yn) (") % devpost synonym (||) /brokenbar % missing (so) /section (sc) (") % devpost synonym ("") /dieresis (co) /copyright (a_) /ordfeminine (<<) /guillemotleft (-,) /logicalnot (hy) /hyphen (--) (") % synonym (ro) /registered (rg) (") % devpost synonym (-^) /macron (0^) /degree % missing (+-) /plusminus % missing (2^) /twosuperior % missing (3^) /threesuperior % missing (\\') /acute (aa) (") % devpost synonym (/u) /mu % missing (P!) /paragraph (pg) (") % devpost synonym (.^) /periodcentered (,,) /cedilla (1^) /onesuperior % missing (o_) /ordmasculine (>>) /guillemotright (14) /onequarter % missing (12) /onehalf % missing (34) /threequarters % missing (??) /questiondown (A`) /Agrave (A') /Aacute (A^) /Acircumflex (A~) /Atilde (A") /Adieresis (A*) /Aring (AE) /AE (C,) /Ccedilla (E`) /Egrave (E') /Eacute (E^) /Ecircumflex (E") /Edieresis (I`) /Igrave (I') /Iacute (I^) /Icircumflex (I") /Idieresis (D-) /Eth % missing (N~) /Ntilde (O`) /Ograve (O') /Oacute (O^) /Ocircumflex (O~) /Otilde (O") /Odieresis (xx) /multiply % missing (O/) /Oslash (U`) /Ugrave (U') /Uacute (U^) /Ucircumflex (U") /Udieresis (Y') /Yacute % missing (TH) /Thorn % missing (ss) /germandbls (a`) /agrave (a') /aacute (a^) /acircumflex (a~) /atilde (a") /adieresis (a*) /aring (ae) /ae (c,) /ccedilla (e`) /egrave (e') /eacute (e^) /ecircumflex (e") /edieresis (i`) /igrave (i') /iacute (i^) /icircumflex (i") /idieresis (d-) /eth % missing (n~) /ntilde (o`) /ograve (o') /oacute (o^) /ocircumflex (o~) /otilde (o") /odieresis (-:) /divide % missing (o/) /oslash (u`) /ugrave (u') /uacute (u^) /ucircumflex (u") /udieresis (y') /yacute % missing (th) /thorn % missing (y") /ydieresis //End of StandardCharset } SymbolCharset() { cat <<-'//End of SymbolCharset' (---) /exclam (fa) /universal (---) /numbersign (te) /existential (---) /percent (---) /ampersand (st) /suchthat (---) /parenleft (---) /parenright (**) /asteriskmath (pl) /plus (---) /comma (mi) /minus (---) /period (sl) /slash (---) /zero (---) /one (---) /two (---) /three (---) /four (---) /five (---) /six (---) /seven (---) /eight (---) /nine (---) /colon (---) /semicolon (<) /less (eq) /equal (>) /greater (---) /question (cg) /congruent (*A) /Alpha (*B) /Beta (*X) /Chi (*D) /Delta (*E) /Epsilon (*F) /Phi (*G) /Gamma (*Y) /Eta (*I) /Iota (---) /theta1 (*K) /Kappa (*L) /Lambda (*M) /Mu (*N) /Nu (*O) /Omicron (*P) /Pi (*H) /Theta (*R) /Rho (*S) /Sigma (*T) /Tau (*U) /Upsilon (ts) /sigma1 (*W) /Omega (*C) /Xi (*Q) /Psi (*Z) /Zeta (---) /bracketleft (tf) /therefore (---) /bracketright (pp) /perpendicular (ul) /underscore (_) (") % synonym (rn) /radicalex (*a) /alpha (*b) /beta (*x) /chi (*d) /delta (*e) /epsilon (*f) /phi (*g) /gamma (*y) /eta (*i) /iota (---) /phi1 (*k) /kappa (*l) /lambda (*m) /mu (*n) /nu (*o) /omicron (*p) /pi (*h) /theta (*r) /rho (*s) /sigma (*t) /tau (*u) /upsilon (---) /omega1 (*w) /omega (*c) /xi (*q) /psi (*z) /zeta (---) /braceleft (or) /bar (---) /braceright (ap) /similar (---) /Upsilon1 (fm) /minute (<=) /lessequal (fr) /fraction % devpost character (if) /infinity (fn) /florin % devpost character (---) /club (---) /diamond (---) /heart (---) /spade (ab) /arrowboth (<-) /arrowleft (ua) /arrowup (->) /arrowright (da) /arrowdown (de) /degree (+-) /plusminus (---) /second (>=) /greaterequal (mu) /multiply (pt) /proportional (pd) /partialdiff (bu) /bullet (di) /divide (!=) /notequal (==) /equivalence (~~) /approxequal (el) /ellipsis (av) /arrowvertex (ah) /arrowhorizex (CR) /carriagereturn (af) /aleph (If) /Ifraktur (Rf) /Rfraktur (ws) /weierstrass (Ox) /circlemultiply (O+) /circleplus (es) /emptyset (ca) /intersection (cu) /union (sp) /propersuperset (ip) /reflexsuperset (!b) /notsubset (sb) /propersubset (ib) /reflexsubset (mo) /element (!m) /notelement (an) /angle (gr) /gradient (rg) /registerserif (co) /copyrightserif (tm) /trademarkserif (---) /product (sr) /radical (c.) /dotmath (no) /logicalnot (l&) /logicaland (l|) /logicalor (---) /arrowdblboth (---) /arrowdblleft (---) /arrowdblup (---) /arrowdblright (---) /arrowdbldown (lz) /lozenge (b<) /angleleft (RG) /registersans (CO) /copyrightsans (TM) /trademarksans (---) /summation (LT) /parenlefttp (br) /parenleftex (LX) (") % synonym (LB) /parenleftbt (lc) /bracketlefttp (lx) /bracketleftex (lf) /bracketleftbt (lt) /bracelefttp (lk) /braceleftmid (lb) /braceleftbt (bv) /braceex (|) (") % synonym (b>) /angleright (is) /integral (---) /integraltp (---) /integralex (---) /integralbt (RT) /parenrighttp (RX) /parenrightex (RB) /parenrightbt (rc) /bracketrighttp (rx) /bracketrightex (rf) /bracketrightbt (rt) /bracerighttp (rk) /bracerightmid (rb) /bracerightbt (~=) (55 0 1) % charlib //End of SymbolCharset } SpecialCharset() { cat <<-'//End of SpecialCharset' (ru) /underscore ('') /quotedblright % devpost character (``) /quotedblleft % devpost character (dg) /dagger % devpost character (dd) /daggerdbl % devpost character (en) /endash % devpost character (\\-) (") % synonym (em) /emdash % (ff) (60 2 1) % charlib % (Fi) (84 2 1) % charlib % (Fl) (84 2 1) % charlib (14) (75 2 1) % charlib (12) (75 2 1) % charlib (34) (75 2 1) % charlib (bx) (50 2 1) % charlib (ob) (38 2 1) % charlib (ci) (75 0 1) % charlib (sq) (50 2 1) % charlib (Sl) (50 2 1) % charlib (L1) (110 1 2) % charlib (LA) (110 1 2) % charlib (LV) (110 3 1) % charlib (LH) (210 1 1) % charlib (lh) (100 0 1) % charlib (rh) (100 0 1) % charlib (lH) (100 0 1) % charlib (rH) (100 0 1) % charlib (PC) (220 2 1) % charlib (DG) (185 2 1) % charlib //End of SpecialCharset } # # Latin1 ensures a font uses the ISOLatin1Encoding vector, although only # text fonts should be re-encoded. Downloading the Encoding vector doesn't # often make sense. No ISOLatin1Encoding array likely means ROM based fonts # on your printer are incomplete. Type 1 fonts with a full Latin1 character # set appeared sometime after Version 50.0. # Latin1() { if [ "$DOWNLOADVECTOR" = TRUE ]; then cat <<-'//End of ISOLatin1Encoding' /ISOLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def //End of ISOLatin1Encoding fi echo "ISOLatin1Encoding /$1 ReEncode" } # # Generating functions output PostScript programs that build font width # tables or a typesetter description file. Send the program to a printer # and the complete table will come back on the serial port. All write on # stdout and assume the prologue and other required PostScript files are # all available. # Proportional() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" # Get <>_ and | from S. Use accents for ascii ^ and ~. StandardCharset | awk ' $1 == "(<)" && $2 == "/less" {$1 = "(---)"} $1 == "(>)" && $2 == "/greater" {$1 = "(---)"} $1 == "(_)" && $2 == "/underscore" {$1 = "(---)"} $1 == "(|)" && $2 == "/bar" {$1 = "(---)"} $1 == "(^)" && $2 == "/asciicircum" { printf "(^)\t/circumflex\n" $1 = "(---)" } $1 == "(~)" && $2 == "/asciitilde" { printf "(~)\t/tilde\n" $1 = "(---)" } {printf "%s\t%s\n", $1, $2} ' echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } FixedWidth() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" StandardCharset echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Dingbats() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" StandardCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ { printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2 }' echo "] def" echo "/$2 SelectFont" echo "( ) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Greek() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/' echo "] def" echo "/$2 SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Symbol() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset echo "] def" echo "ChangeMetrics" echo "/S SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Special() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SpecialCharset echo "] def" echo "ChangeMetrics" echo "/S1 SelectFont" echo "(# Times-Roman special font\\\\n) Print" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } # # The DESC file doesn't have to be built on a printer. It's only here for # consistency. # Description() { echo "/charset [" # awk - so the stack doesn't overflow StandardCharset | awk '{print $1}' SymbolCharset | awk '{print $1}' SpecialCharset | awk '{print $1}' echo "] def" cat <<-//DESC (#Device Description - Latin1 character set PDL PostScript Encoding Latin1 fonts 10 R I B BI CW H HI HB S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res $RESOLUTION hor 1 vert 1 unitwidth $UNITWIDTH ) Print //DESC echo "(charset\\\\n) Print" echo "BuildDescCharset" echo "(\\\\n) Print" } 0707070014231122351006400057030057030000010447600522632546000002600000006137post.src/devLatin1/HM name H fontname Helvetica named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 \0255 " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 ^ 33 2 147 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 \0241 " c| 56 3 162 \0242 " ct " L- 56 2 163 \0243 " ps " xo 56 0 164 \0244 " cr " Y- 56 2 165 \0245 " yn " || 26 3 166 \0246 " so 56 3 167 \0247 " sc " "" 33 2 168 \0250 " :a " co 74 2 169 \0251 " a_ 37 2 170 \0252 " << 56 0 171 \0253 " -, 58 0 172 \0254 " hy 33 0 173 \0255 " -- 58 0 45 ro 74 2 174 \0256 " rg " -^ 33 2 175 \0257 " -a " 0^ 40 2 176 \0260 " +- 58 2 177 \0261 " 2^ 33 2 178 \0262 " 3^ 33 2 179 \0263 " \' 33 2 180 \0264 " aa " /u 56 1 181 \0265 " P! 54 3 182 \0266 " pg " .^ 28 0 183 \0267 " ,, 33 1 184 \0270 " ,a " 1^ 33 2 185 \0271 " o_ 37 2 186 \0272 " >> 56 0 187 \0273 " 14 83 2 188 \0274 " 12 83 2 189 \0275 " 34 83 2 190 \0276 " ?? 61 1 191 \0277 " A` 67 2 192 \0300 " A' 67 2 193 \0301 " A^ 67 2 194 \0302 " A~ 67 2 195 \0303 " A" 67 2 196 \0304 " A* 67 2 197 \0305 " AE 100 2 198 \0306 " C, 72 3 199 \0307 " E` 67 2 200 \0310 " E' 67 2 201 \0311 " E^ 67 2 202 \0312 " E" 67 2 203 \0313 " I` 28 2 204 \0314 " I' 28 2 205 \0315 " I^ 28 2 206 \0316 " I" 28 2 207 \0317 " D- 72 2 208 \0320 " N~ 72 2 209 \0321 " O` 78 2 210 \0322 " O' 78 2 211 \0323 " O^ 78 2 212 \0324 " O~ 78 2 213 \0325 " O" 78 2 214 \0326 " xx 58 0 215 \0327 " O/ 78 2 216 \0330 " U` 72 2 217 \0331 " U' 72 2 218 \0332 " U^ 72 2 219 \0333 " U" 72 2 220 \0334 " Y' 67 2 221 \0335 " TH 67 2 222 \0336 " ss 61 2 223 \0337 " a` 56 2 224 \0340 " a' 56 2 225 \0341 " a^ 56 2 226 \0342 " a~ 56 2 227 \0343 " a" 56 2 228 \0344 " a* 56 2 229 \0345 " ae 89 0 230 \0346 " c, 50 1 231 \0347 " e` 56 2 232 \0350 " e' 56 2 233 \0351 " e^ 56 2 234 \0352 " e" 56 2 235 \0353 " i` 28 2 236 \0354 " i' 28 2 237 \0355 " i^ 28 2 238 \0356 " i" 28 2 239 \0357 " d- 56 2 240 \0360 " n~ 56 2 241 \0361 " o` 56 2 242 \0362 " o' 56 2 243 \0363 " o^ 56 2 244 \0364 " o~ 56 2 245 \0365 " o" 56 2 246 \0366 " -: 58 0 247 \0367 " o/ 61 0 248 \0370 " u` 56 2 249 \0371 " u' 56 2 250 \0372 " u^ 56 2 251 \0373 " u" 56 2 252 \0374 " y' 50 3 253 \0375 " th 56 3 254 \0376 " y" 50 3 255 \0377 " ^a 33 2 147 ~a 33 2 148 Ua 33 2 150 .a 33 2 151 oa 33 2 154 "a 33 2 157 Ca 33 1 158 va 33 2 159 0707070014230547600407550057030057030000021525670522633100200002100000000000post.src/psfiles 0707070014230550011006400057030057030000011527600522633100200003400000001421post.src/psfiles/psfiles.mk MAKE=/bin/make MAKEFILE=psfiles.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin POSTLIB=/usr/lib/postscript all : install : @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp *.ps ps.* $(POSTLIB) @for i in *.ps ps.*; do \ chmod 644 $(POSTLIB)/$$i; \ chgrp $(GROUP) $(POSTLIB)/$$i; \ chown $(OWNER) $(POSTLIB)/$$i; \ done clean : clobber : clean changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014230547621006440057030057030000011527060522627502200003500000000540post.src/psfiles/ps.requests % % Keywords begin with an @ in the first column. The value follows on the next % line and includes everything up to next keyword line, except for comments % which are lines that begin with % in the first column. % @manualfeed statusdict begin /manualfeedtimeout 300 def /manualfeed true def end @ledgertray statusdict begin ledgertray end 0707070014230547631006440057030057030000011527100522627502200003200000013654post.src/psfiles/forms.ps % % Procedures that let you print any number of pages on each sheet of paper. It's % far from perfect and won't handle everything (eg. it's not recursive), but should % be good enough for now. Assumes the default page coordinate system has been set % up before setupforms is called. lastpage makes certain the last page is printed, % and should be called immediately after the %%Trailer comment. % % Three lines of code needed for page image clipping have been commented out for % now. It works, but can really slow things down on some versions of PostScript. % Uncomment them if you want to clip pages. % /setupforms { /formsperpage exch def /currentform 0 def /slop 5 def /min {2 copy gt {exch} if pop} def % % Save the current environment so the real showpage can be restored when we're all % done. Occasionally helps when a banner page is included with the job. % /saveobj save def % % Number of rows and columns we'll need - may exchange them later. % /columns formsperpage sqrt ceiling cvi def /rows formsperpage columns div ceiling cvi def % % Slop leaves a little room around the edge so page images can be outlined and have % the borders show up. Distance is in default coordinates, so we need to figure out % how it maps into user coordinates. % 6 array defaultmatrix 6 array currentmatrix 6 array invertmatrix 6 array concatmatrix /tempmatrix exch def 0 slop tempmatrix dtransform dup mul exch dup mul add sqrt /slop exch def % % Determine how big the image area is, using the clipping path bounding box minus % a little and leave the coordinates of the lower left corner of the clipping path % on the stack. Also temporarily set the size of each page (ie. formheight and % formwidth) from the clipping path - just in case old software uses this stuff. % Only works for coordinate systems that have been rotated by a multiple of 90 % degrees. % newpath clippath pathbbox 2 index sub dup /formheight exch def slop 2 mul sub /pageheight exch def 2 index sub dup /formwidth exch def slop 2 mul sub /pagewidth exch def % % New translators all store the size of each page in default coordinates in the % pagebbox array and it can be different than the size determined by the clipping % path. If we can find pagebbox use it to set the real dimensions of each page. % Leaves the coordinates of the lower left corner on the stack, (either from % pagebbox or clippath) so four numbers are there when we're done. % userdict /gotpagebbox known userdict /pagebbox known and { newpath pagebbox 0 get pagebbox 1 get tempmatrix transform moveto pagebbox 0 get pagebbox 3 get tempmatrix transform lineto pagebbox 2 get pagebbox 3 get tempmatrix transform lineto pagebbox 2 get pagebbox 1 get tempmatrix transform lineto closepath pathbbox 2 index sub /formheight exch def 2 index sub /formwidth exch def } {2 copy} ifelse % % Top two numbers are the displacement from the job's origin to the lower left % corner of each page image when we finish setting up the new coordinate system. % /ycorner exch def /xcorner exch def % % The two numbers left on the stack are the coordinates of the lower left corner % of the clipping path. Go there and then up a bit so page images can be outlined. % translate slop slop translate % % If the page is wider than high we may be able to do better if we exchange rows % and columns. Won't make a difference in the current orientation or if rows and % columns are the same. % pagewidth pageheight gt { rows columns /rows exch def /columns exch def } if % % Find the orientation and scaling that makes things as large as possible. More % than what's really needed. First calculation essentially finds the minimum of % 1/rows and 1/columns. % pagewidth formwidth columns mul div pageheight formheight rows mul div min pageheight formwidth columns mul div pagewidth formheight rows mul div min 2 copy lt { rotation 1 eq { landscape { 0 pageheight translate -90 rotate }{ pagewidth 0 translate 90 rotate } ifelse }{ landscape { pagewidth 0 translate 90 rotate }{ 0 pageheight translate -90 rotate } ifelse } ifelse pagewidth pageheight /pagewidth exch def /pageheight exch def exch } if % % Second number from the top is the best choice. Scale so everything will fit on % the current page, go back to the original origin, and then get ready for the % first page - which goes in the upper left corner. % pop dup dup scale xcorner neg ycorner neg translate 0 rows 1 sub formheight mul translate % % Try to center everything on the page - scaling we used is on top of the stack. % dup pagewidth exch div formwidth columns mul sub 2 div exch pageheight exch div formheight rows mul sub 2 div translate % % Redefine showpage. % /!PreForms~showpage~ /showpage load def % save current showpage /showpage { saveobj restore % initclip formsperpage 1 gt { gsave .1 setlinewidth outlineform stroke grestore } if formwidth 0 translate /currentform currentform 1 add def currentform columns mod 0 eq { columns formwidth mul neg formheight neg translate } if currentform formsperpage mod 0 eq { gsave !PreForms~showpage~ grestore currentform columns mod formwidth mul neg formsperpage columns idiv formheight mul translate /currentform 0 def } if % outlineform clip newpath /saveobj save def } bind def /outlineform { newpath xcorner ycorner moveto formwidth 0 rlineto 0 formheight rlineto formwidth neg 0 rlineto closepath } bind def /lastpage { formsperpage 1 gt { currentform 0 ne { /saveobj save def 0 1 formsperpage currentform sub formsperpage mod { pop showpage } for saveobj restore } if saveobj restore saveobj restore } if } def % % Clip the first page image and save the environment we just set up, including % the redefined showpage. % % outlineform clip newpath /saveobj save def } def 0707070014230547641006440057030057030000011527200522627502200003500000005107post.src/psfiles/baseline.ps % % Stuff used to draw or set text along a baseline specified by parametric equations % for x and y. % /left -1 def /center 0 def /right 1 def /baselinedict 50 dict def /newbaseline { baselinedict begin /g' exch bind def /f' exch bind def /g exch bind def /f exch bind def counttomark 2 eq {/hoffset exch def} if /res exch def /t 0 def /s 0 def /voffset false def cleartomark end } bind def /drawfunnytext { baselinedict begin /t exch def /mode exch def /str exch def mode left eq { /leftstring emptystring def /rightstring str def } if mode right eq { /leftstring str reversestring def /rightstring emptystring def } if mode center eq { str splitstring /rightstring exch def /leftstring exch reversestring def } if gsave currentpoint translate leftstring left t baselineshow grestore gsave currentpoint translate rightstring right t baselineshow grestore /t 0 def /s 0 def /voffset false def cleartomark end } bind def /setfunnytext { baselinedict begin /vpos exch def /hpos exch def /str exch def voffset vpos ne { /voffset vpos def /t 0 def /s hoffset def } if gsave hoffset voffset translate 0 0 moveto /ds hpos s sub def /dt ds t f' dup mul t g' dup mul add sqrt res mul div def /s s ds add def /t t dt add def str right t baselineshow grestore end } bind def baselinedict begin /f {} bind def /g {pop 0} bind def /f' {pop 1} bind def /g' {pop 0} bind def /s 0 def /t 0 def /res 72 def /onecharstring ( ) def /emptystring () def /baselineshow { /t exch def /mode exch def /str exch def gsave t f res mul t g res mul translate 0 0 moveto t g' t f' atan rotate { mode right eq {pop} if grestore gsave onecharstring 0 3 -1 roll put onecharstring stringwidth pop /ds exch mode mul def /dt ds t f' dup mul t g' dup mul add sqrt res mul div def /t t dt add def /s s ds add def t f res mul t g res mul translate 0 0 moveto t g' t f' atan rotate mode left eq {pop} if } str kshow grestore } bind def /reversestring { /str1 exch def /str2 str1 length string def /i 0 def /n str1 length 1 sub def { str1 n get str2 exch i exch put /i i 1 add def /n n 1 sub def n 0 lt {exit} if } loop str2 } bind def /splitstring { /str1 exch def /len str1 stringwidth pop def /s 0 def /n 0 def str1 length { str1 n get onecharstring exch 0 exch put /s onecharstring stringwidth pop s add def s len 2 div ge {exit} if /n n 1 add def } repeat str1 0 n 1 add getinterval str1 n str1 length n sub getinterval } bind def end 0707070014230547651006440057030057030000011527160522627502200003200000002540post.src/psfiles/color.ps % % Color and reverse video support for dpost. A call made to setcolor with two % arguments implies reverse video printing. % /rgb {setrgbcolor} bind def /hsb {sethsbcolor} bind def /colordict 50 dict dup begin /red { 1 0 0 } def /green { 0 1 0 } def /blue { 0 0 1 } def /cyan { 0 1 1 } def /magenta { 1 0 1 } def /yellow { 1 1 0 } def /white { 1 1 1 } def /black { 0 0 0 } def end def /setcolor { counttomark 1 eq { dup colordict exch known not {pop /black} if colordict exch get exec setrgbcolor } if counttomark 2 eq { /backcolor exch def /textcolor exch def colordict backcolor known not colordict textcolor known not or { /backcolor colordict /black get def /textcolor colordict /white get def } if /backcolor colordict backcolor get def /textcolor colordict textcolor get def /dY1 0 def /dY2 0 def textcolor exec setrgbcolor } if } bind def /drawrvbox { /x2 exch def /x1 exch def currentpoint dup /y1 exch def /y2 exch def pop dY1 0 eq dY2 0 eq and { currentfont /FontBBox get aload pop currentfont /FontMatrix get dtransform /dY2 exch def pop currentfont /FontMatrix get dtransform /dY1 exch def pop } if /y1 y1 dY1 add def /y2 y2 dY2 add def backcolor exec setrgbcolor newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath fill textcolor exec setrgbcolor } bind def 0707070014230547661006440057030057030000011527070522627502200003200000001611post.src/psfiles/shade.ps % % Shading support - primarily for ASCII file translators. % /grays [0.98 0.9 0.75 0.6] def /setshade { /level exch def level 0 le { /textgray 0 def /backgray 1 def }{ /backgray level grays length gt {/textgray 1 def 0} {/textgray 0 def grays level 1 sub get} ifelse def } ifelse textgray setgray /dY1 0 def /dY2 0 def } bind def /drawrvbox { /x2 exch charwidth mul def /x1 exch charwidth mul def x1 x2 lt { dup % expects y on top /y1 exch linespace mul def /y2 y1 def dY1 0 eq dY2 0 eq and { currentfont /FontBBox get aload pop 160 sub currentfont /FontMatrix get dtransform /dY2 exch def pop 100 add currentfont /FontMatrix get dtransform /dY1 exch def pop } if /y1 y1 dY1 add def /y2 y2 dY2 add def backgray setgray newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath fill } if textgray setgray } bind def 0707070014230547671006440057030057030000011527230522627502200003600000001267post.src/psfiles/roundpage.ps % % Tries to round clipping path dimensions, as stored in array pagebbox, so they % match one of the known sizes in the papersizes array. Lower left coordinates % are always set to 0. % /roundpagebbox { 7 dict begin /papersizes [8.5 inch 11 inch 14 inch 17 inch] def /mappapersize { /val exch def /slop .5 inch def /diff slop def /j 0 def 0 1 papersizes length 1 sub { /i exch def papersizes i get val sub abs dup diff le {/diff exch def /j i def} {pop} ifelse } for diff slop lt {papersizes j get} {val} ifelse } def pagebbox 0 0 put pagebbox 1 0 put pagebbox dup 2 get mappapersize 2 exch put pagebbox dup 3 get mappapersize 3 exch put end } bind def 0707070014230547701006440057030057030000011527240522627502200003700000001356post.src/psfiles/fatcourier.ps % % Fat versions of the stroked Courier and Courier-Oblique - from Johnathan Shopiro. % Can be selectively pulled in using the -C option that's available with all the % PostScript translators or permanently added to any of the prologues. Helps on % Linotronic typesetters, where Courier and Courier-Oblique are too light! % /newdict /Courier findfont length 1 add dict def /Courier findfont { 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall newdict /StrokeWidth 60 put /Courier newdict definefont pop /newdict /Courier-Oblique findfont length 1 add dict def /Courier-Oblique findfont { 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall newdict /StrokeWidth 60 put /Courier-Oblique newdict definefont pop 0707070014230547711006440057030057030000011527300522627502200003000000006066post.src/psfiles/aps.ps % % Tune things up so Linotronic output looks more like the APS-5. Pull this file % into dpost output using the -C option. To get the best looking output run dpost % with the -e2 option and use special font files that look like the APS tables but % have character codes (ie. the fourth column in the width tables) appropriate for % PostScript fonts. Widths in these tables must be for APS fonts! % % Start with fat versions of the stroked Courier and Courier-Oblique fonts - from % Johnathan Shopiro. % /newdict /Courier findfont length dict def /Courier findfont { 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall newdict /StrokeWidth 65 put /Courier newdict definefont pop /newdict /Courier-Oblique findfont length dict def /Courier-Oblique findfont { 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall newdict /StrokeWidth 65 put /Courier-Oblique newdict definefont pop % % Scaled down versions of the Helvetica font family. % /newdict /Helvetica findfont length dict def /Helvetica findfont { 1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Helvetica newdict definefont pop /newdict /Helvetica-Oblique findfont length dict def /Helvetica-Oblique findfont { 1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Helvetica-Oblique newdict definefont pop /newdict /Helvetica-Bold findfont length dict def /Helvetica-Bold findfont { 1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Helvetica-Bold newdict definefont pop /newdict /Helvetica-BoldOblique findfont length dict def /Helvetica-BoldOblique findfont { 1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Helvetica-BoldOblique newdict definefont pop % % Scaled up versions of the Times font family. % /newdict /Times-Roman findfont length dict def /Times-Roman findfont { 1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Times-Roman newdict definefont pop /newdict /Times-Italic findfont length dict def /Times-Italic findfont { 1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Times-Italic newdict definefont pop /newdict /Times-Bold findfont length dict def /Times-Bold findfont { 1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Times-Bold newdict definefont pop /newdict /Times-BoldItalic findfont length dict def /Times-BoldItalic findfont { 1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if 1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse } forall /Times-BoldItalic newdict definefont pop 0707070014230547721006440057030057030000011527250522627502200003300000001715post.src/psfiles/banner.ps % % Simple program to print a banner page % /banner { /saveobj save def erasepage initgraphics /#copies 1 def /inch {72 mul} bind def /pagebbox [clippath pathbbox newpath] def /font /Helvetica def /size 20 def /height pagebbox 3 get def /width pagebbox 2 get .09 mul def .92 setgray pagebbox 0 get pagebbox 1 get moveto width 0 rlineto 0 height rlineto width neg 0 rlineto closepath eofill pagebbox 2 get pagebbox 1 get moveto width neg 0 rlineto 0 height rlineto width 0 rlineto closepath eofill 0 setgray font findfont size scalefont setfont /linesp size size .15 mul add neg def /tab (Destination) stringwidth pop 1.5 mul def /nextline {0 0 moveto show tab 0 moveto show 0 linesp translate} def pagebbox 0 get 1.5 width mul add pagebbox 3 get 2.0 width mul sub translate (Bin) nextline (Name) nextline (Owner) nextline (File) nextline (Account) nextline (Destination) nextline (Spooldate) nextline showpage saveobj restore } bind def 0707070014230547731006440057030057030000011527260522627502200003000000001156post.src/psfiles/README PostScript files that go in $(POSTLIB). Several, like forms.ps, are used by most translators supplied in this package. Most PostScript files only used by a single translator (e.g. the prologue) have been been moved into the appropriate source directory. Files that end in .enc support alternate character sets (e.g. ISO Latin 1 alphabet). The implementation is left open, but typically redefines findfont. That approach works because findfont is a procedure rather than an operator, so it's not affected by bind. Also can't depend on having a systemdict definition for findfont. It's in userdict on Version 48.0 VT600s. 0707070014230547741006440057030057030000011527270522627502200003300000001016post.src/psfiles/unbind.ps % % Unbind the operators in an executable array or packedarray. Leaves the % unbound array or the original object on the stack. % /unbind { 0 index xcheck 1 index type /arraytype eq 2 index type /packedarraytype eq or and { dup length array copy cvx dup 0 exch { dup type /operatortype eq { ( ) cvs cvn cvx } if 0 index xcheck 1 index type /arraytype eq 2 index type /packedarraytype eq or and { unbind } if 3 copy put pop 1 add } forall pop } if } def 0707070014230547751006440057030057030000011527340522627502200003700000000437post.src/psfiles/Nroundpage.ps % % A version of roundpage.ps that assumes a symmetric clipping path. Thanks % to Matthijs Melchior for the suggestion. % /roundpagebbox { pagebbox dup 0 get pagebbox 2 get add 2 exch put pagebbox dup 1 get pagebbox 3 get add 3 exch put pagebbox 0 0 put pagebbox 1 0 put } bind def 0707070014230361610407550057030057030000021040770522633073000002500000000000post.src/buildtables 0707070014230361621006440057030057030000011041300522627502300003400000000353post.src/buildtables/README Programs for building troff width tables on a PostScript printer. Assumes you have direct access to the printer's serial port. Also needs a special table dependent shell library file to build the tables (e.g. ../devLatin1/shell.lib). 0707070014230357571006400057030057030000011040340522633072700004400000003013post.src/buildtables/buildtables.mk MAKE=/bin/make MAKEFILE=buildtables.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin FONTDIR=/usr/lib/font POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript MAN1DIR=/tmp all : buildtables install : all @if [ ! -d $(POSTBIN) ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi cp buildtables $(POSTBIN)/buildtables @chmod 755 $(POSTBIN)/buildtables @chgrp $(GROUP) $(POSTBIN)/buildtables @chown $(OWNER) $(POSTBIN)/buildtables cp buildtables.1 $(MAN1DIR)/buildtables.1 @chmod 644 $(MAN1DIR)/buildtables.1 @chgrp $(GROUP) $(MAN1DIR)/buildtables.1 @chown $(OWNER) $(MAN1DIR)/buildtables.1 clean : clobber : clean rm -f buildtables buildtables : buildtables.sh sed \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ buildtables.sh >buildtables @chmod 755 buildtables changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dF.*'.ds dF $(FONTDIR)'" \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ buildtables.1 >XXX.1; \ mv XXX.1 buildtables.1 0707070014230361641006440057030057030000011041330522627502300004400000003771post.src/buildtables/buildtables.sh # # Builds one or more font width tables or the typesetter description # file on a PostScript printer. Assumes you have direct access to the # printer's serial port. No arguments means build a standard collection # of tables - usually the LaserWriter Plus set. See trofftable and the # shell library files /usr/lib/font/dev*/shell.lib for more details. # set -e POSTBIN=/usr/lbin/postscript POSTLIB=/usr/lib/postscript FONTDIR=/usr/lib/font POSTIO=$POSTBIN/postio TROFFTABLE=$POSTBIN/trofftable BAUDRATE= DEVICE= LIBRARY= while [ -n "$1" ]; do case $1 in -C) shift; OPTIONS="$OPTIONS -C$1";; -C*) OPTIONS="$OPTIONS $1";; -F) shift; FONTDIR=$1;; -F*) FONTDIR=`echo $1 | sed s/-F//`;; -H) shift; OPTIONS="$OPTIONS -H$1";; -H*) OPTIONS="$OPTIONS $1";; -S) shift; LIBRARY=$1;; -S*) LIBRARY=`echo $1 | sed s/-S//`;; -T) shift; DEVICE=$1;; -T*) DEVICE=`echo $1 | sed s/-T//`;; -b) shift; BAUDRATE=$1;; -b*) BAUDRATE=`echo $1 | sed s/-b//`;; -c) shift; OPTIONS="$OPTIONS -c$1";; -c*) OPTIONS="$OPTIONS $1";; -l) shift; LINE=$1;; -l*) LINE=`echo $1 | sed s/-l//`;; -s) shift; OPTIONS="$OPTIONS -s$1";; -s*) OPTIONS="$OPTIONS $1";; -t) shift; OPTIONS="$OPTIONS -t$1";; -t*) OPTIONS="$OPTIONS $1";; -?) OPTIONS="$OPTIONS $1$2"; shift;; -?*) OPTIONS="$OPTIONS $1";; *) break;; esac shift done if [ ! "$DEVICE" -a ! "$LIBRARY" ]; then echo "$0: no device or shell library" >&2 exit 1 fi LIBRARY=${LIBRARY:-${FONTDIR}/dev${DEVICE}/shell.lib} # # No arguments means build everything return by the AllTables function. # if [ $# -eq 0 ]; then . $LIBRARY set -- `AllTables` fi for i do SHORT=`echo $i | awk '{print $1}'` LONG=`echo $i | awk '{print $2}'` if [ "$LINE" ] then echo "==== Building table $SHORT ====" else echo "==== Creating table program $SHORT.ps ====" fi $TROFFTABLE -S$LIBRARY $OPTIONS $SHORT $LONG >$SHORT.ps if [ "$LINE" ]; then $POSTIO -t -l$LINE ${BAUDRATE:+-b${BAUDRATE}} $SHORT.ps >$SHORT rm -f $SHORT.ps fi done 0707070014230357601006400057030057030000011024300522633073000004300000010314post.src/buildtables/buildtables.1 .ds dF /usr/lib/font .ds dQ /usr/lib/postscript .TH BUILDTABLES 1 "DWB 3.2" .SH NAME .B buildtables \- build .B troff tables on a PostScript printer .SH SYNOPSIS \*(mBbuildtables\f1 .OP "" options [] .OP "" "name \(el" [] .SH DESCRIPTION .B buildtables builds font width tables or the typesetter description file on a PostScript printer. No arguments means build a default set of tables; usually a superset of the LaserWriter Plus collection. The following .I options are understood: .TP 1.0i .OP \-b speed Transmit data over .I line at baud rate .I speed. Recognized baud rates are 1200, 2400, 4800, 9600, and 19200. The default .I speed is 9600 baud. .TP 1.0i .OP \-l line Build the tables on the PostScript printer attached to .I line. There is no default. .TP 1.0i .OP \-t name Use .I name as the template for fonts not in the default set. Choose .MW R for proportionally spaced fonts and .MW CW for fixed width fonts. Try .MW ZD (ZapfDingbats) if the font has a non-standard character set. The default is .MR R . .TP 1.0i .OP \-C file Copy .I file into each PostScript table program; .I file must contain legitimate PostScript. .TP 1.0i .OP \-H hostdir Use .I hostdir as the host-resident font directory. A file in .I hostdir that matches the name of the .B troff font is assumed to be a host-resident font program and is included in the PostScript width table program. There is no default. .TP 1.0i .OP \-S file Use .I file as the shell library file. Overrides the choice made with the .OP \-T option. .TP 1.0i .OP \-T name Set the target device to .I name. .br Device .I name means .ft 2 .MI \*(dF/dev name /shell.lib .ft 1 is the shell library file. There is no default. .PP If .OP \-l is omitted output files are the PostScript programs that build the tables, rather than the tables themselves. One of .OP \-T or .OP \-S is required. If both are given .OP \-S wins. Although .OP \-H is the preferred mechanism for including host-resident font files, .OP \-C makes sense when only one width table is built. .PP The shell library file defines a collection of functions used to build .BR troff (1) tables. The default set of tables is the list of names returned by the .MW AllTables function. Changes to the default list can be made by updating the .MW BuiltinTables function. .PP Each .B buildtables argument must be a default table name, or a pair of names enclosed in quotes. If the argument is a pair, the first name is the .B troff font and the second is the full PostScript font name. Tables are created in the current directory. Each is assigned a name that matches the .B troff table name. .PP The PostScript table programs created by .BR trofftable (1) are written to files that have .MW .ps appended to the .B troff table name. The .MW .ps file is deleted after the table is built. Options not listed above are passed to .B trofftable. The PostScript table programs return data to the host computer using PostScript's .MW print operator. See .BR hardcopy (1) if you do not have access to the printer's serial port. .SH EXAMPLES .PP Build the default collection of devpost tables on the printer connected to .MW /dev/tty00 (no font name arguments): .EX buildtables -l/dev/tty00 -Tpost .EE To do the same and to restrict the tables that are built, Add .B troff font names (or .MR DESC ) to restrict the tables built on the printer connected to .MR /dev/tty00 : .EX buildtables -l/dev/tty00 -Tpost R I B BI DESC S .EE Enclose the .B troff and PostScript font names in quotes to build the width table for a font not in the default set (also on the printer connected to .MR /dev/tty00 ): .EX buildtables -l/dev/tty00 -TLatin1 "GL Garamond-Light" .EE A font must be available on the printer when the table is built. Use .OP \-H or .OP \-C to include host-resident fonts. .SH WARNINGS .PP A width table will not build properly if the printer cannot access the PostScript font. .PP The .OP \-TLatin1 option only works on PostScript printers that support the full .SM ISO Latin-1 character set. The error message from older printers will likely indicate a missing .MW ISOLatin1Encoding array. .SH FILES .MW \*(dF/dev*/shell.lib .br .MW \*(dQ/dpost.ps .br .MW \*(dQ/trofftable.ps .br .SH SEE ALSO .BR dpost (1), .BR hardcopy (1), .BR postio (1), .BR troff (1), .BR trofftable (1), .BR font (5) 0707070014231030650407550057030057030000020303460522633073300002300000000000post.src/cropmarks 0707070014231030661006440057030057030000010303050522627502300004000000005727post.src/cropmarks/cropmarks.ps % % Center pages, based on pageheight and pagewidth, and redefine showpage % to put cropmarks at each corner. Device dependent code to expand the % paper size goes in procedure expandpagesize. Currently only supports % a Linotronic 200P typesetter using 12 inch wide paper. You'll have to % add code to expandpagesize to support different typesetters or even a % 200P that's running differently. % /CropmarkDict 40 dict dup begin /expandpage true def /magnification 1 def /pageheight 11.0 def /pagewidth 8.5 def /scaletofit false def /scaling 1 def /marklength .3 def % inches /markstart .125 def % inches /markend .04 def % inches /marklinewidth .25 def % points /inch {72 mul} def /min {2 copy gt {exch} if pop} def /max {2 copy lt {exch} if pop} def /setup { /markspace markstart marklength add markend add inch marklinewidth add def /totalheight pageheight inch markspace 2 mul add def /totalwidth pagewidth inch markspace 2 mul add def pagedimensions checkpagesize /scaling getscaling def xcenter ycenter translate scaling scaling scale pagewidth inch 2 div neg pageheight inch 2 div neg translate clippage } def /pagedimensions { clippath pathbbox newpath 4 -1 roll exch 4 1 roll 4 copy sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def } def /checkpagesize { height totalheight lt width totalwidth lt or expandpage and { expandpagesize pagedimensions } if } def /expandpagesize { % device dependent code /Product statusdict begin /product where {pop product}{()} ifelse end def Product (Linotype) eq { % Linotronic 200P and other models? statusdict /setpageparams known { /maxwidth 12.0 inch def % 12 inch wide paper? totalheight maxwidth le { totalheight totalwidth maxwidth totalheight sub 2 div 0 }{ totalwidth maxwidth min totalheight maxwidth totalwidth maxwidth min sub 2 div 1 } ifelse statusdict /setpageparams get exec } if } if } def /getscaling { scaletofit {height totalheight div width totalwidth div min 1 min} {1} ifelse } def /clippage { newpath 0 0 moveto pagewidth inch 0 rlineto 0 pageheight inch rlineto pagewidth neg inch 0 rlineto closepath clip newpath } def /cropmark { gsave translate rotate marklinewidth dup translate 0 0 transform round exch round exch itransform translate markstart inch 0 moveto marklength inch 0 rlineto stroke 0 markstart inch moveto 0 marklength inch rlineto stroke grestore } bind def /@PreviousShowpage /showpage load def end def % % Cropmarks - in the default coordinate system. % /showpage { gsave CropmarkDict begin initgraphics marklinewidth setlinewidth xcenter ycenter translate scaling scaling scale 0 pagewidth inch 2 div pageheight inch 2 div cropmark 90 pagewidth inch neg 2 div pageheight inch 2 div cropmark 180 pagewidth inch neg 2 div pageheight inch 2 div neg cropmark 270 pagewidth inch 2 div pageheight inch 2 div neg cropmark @PreviousShowpage end grestore } bind def 0707070014231030671006440057030057030000010304060522627502300004000000003350post.src/cropmarks/cropmarks.sh # # Center pages and put cropmarks at each corner. Physical page size # is set with -w and -h. The default is 8.5 by 11.0 inches. Device # dependent code to change paper size (e.g. with setpageparams) goes # in the prologue. You may need to customize the device dependent # code that we distribute. By default it only supports variable page # sizes on Linotronic typesetters, and assumes those typesetters are # using 12 inch wide paper. Use -d to disable execution of device # dependent PostScript code. # # What's here was written quickly and will likely be very different # in our next release. It should be part of a more general program!! # POSTLIB=/usr/lib/postscript PROLOGUE=$POSTLIB/cropmarks.ps EXPANDPAGE=true PAGEWIDTH=8.5 PAGEHEIGHT=11.0 SCALETOFIT=false XOFFSET=0.0 YOFFSET=0.0 NONCONFORMING="%!PS" ENDPROLOG="%%EndProlog" BEGINSETUP="%%BeginSetup" ENDSETUP="%%EndSetup" while [ -n "$1" ]; do case $1 in -d) EXPANDPAGE=false;; -h) shift; PAGEHEIGHT=$1;; -h*) PAGEHEIGHT=`echo $1 | sed s/-h//`;; -s) SCALETOFIT=true;; -w) shift; PAGEWIDTH=$1;; -w*) PAGEWIDTH=`echo $1 | sed s/-w//`;; -x) shift; XOFFSET=$1;; -x*) XOFFSET=`echo $1 | sed s/-x//`;; -y) shift; YOFFSET=$1;; -y*) YOFFSET=`echo $1 | sed s/-y//`;; -L) shift; PROLOGUE=$1;; -L*) PROLOGUE=`echo $1 | sed s/-L//`;; --) shift; break;; -*) echo "$0: illegal option $1" >&2; exit 1;; *) break;; esac shift done echo $NONCONFORMING cat $PROLOGUE echo $ENDPROLOG echo $BEGINSETUP echo "CropmarkDict begin" echo "/pageheight $PAGEHEIGHT def" echo "/pagewidth $PAGEWIDTH def" echo "/expandpage $EXPANDPAGE def" echo "/scaletofit $SCALETOFIT def" echo "/xoffset $XOFFSET def" echo "/yoffset $YOFFSET def" echo "setup" echo "end" echo $ENDSETUP cat $* 0707070014231027421006400057030057030000010230260522633073300004000000003045post.src/cropmarks/cropmarks.mk MAKE=/bin/make MAKEFILE=cropmarks.mk OWNER=bin GROUP=bin MAN1DIR=/tmp MAN5DIR=/usr/man/p_man/man5 POSTLIB=/usr/lib/postscript POSTBIN=/usr/bin/postscript all : cropmarks install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp cropmarks $(POSTBIN)/cropmarks @chmod 755 $(POSTBIN)/cropmarks @chgrp $(GROUP) $(POSTBIN)/cropmarks @chown $(OWNER) $(POSTBIN)/cropmarks cp cropmarks.ps $(POSTLIB)/cropmarks.ps @chmod 644 $(POSTLIB)/cropmarks.ps @chgrp $(GROUP) $(POSTLIB)/cropmarks.ps @chown $(OWNER) $(POSTLIB)/cropmarks.ps cp cropmarks.1 $(MAN1DIR)/cropmarks.1 @chmod 644 $(MAN1DIR)/cropmarks.1 @chgrp $(GROUP) $(MAN1DIR)/cropmarks.1 @chown $(OWNER) $(MAN1DIR)/cropmarks.1 clean : clobber : clean rm -f cropmarks cropmarks : cropmarks.sh sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" cropmarks.sh >cropmarks @chmod 755 cropmarks changes : @trap "" 1 2 3 15; \ sed \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ cropmarks.1 >XXX.1; \ mv XXX.1 cropmarks.1 0707070014231027431006400057030057030000010303640522633073300003700000004373post.src/cropmarks/cropmarks.1 .ds dQ /usr/lib/postscript .TH CROPMARKS 1 "DWB 3.2" .SH NAME .B cropmarks \- add cropmarks to PostScript files .SH SYNOPSIS \*(mBcropmarks\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B Cropmarks surrounds PostScript .I files with code that centers each page and adds cropmarks to the four corners. The results are written on the standard output. If no .I files are specified, or if .OP \- is one of the input .I files, the standard input is read. The following .I options are understood: .TP 1.0i .OP \-d Disable the device-dependent PostScript code that expands page sizes. .TP 1.0i .OP \-h num Set the height of each page to .I num inches. The default is 11.0 inches. .TP 1.0i .OP \-s Scale pages so cropmarks always show up. Primarily for debugging and development on devices that don't adjust page sizes. .TP 1.0i .OP \-w num Set the width of each page to .I num inches. The default is 8.5 inches. .TP 1.0i .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/cropmarks.ps . .PP Height and width set with the .OP \-h and .OP \-w options adjust the size of the image area available on each sheet of paper. Neither suggests anything about the orientation of output in that area. Cropmarks are printed at each corner just outside the image area. .SH EXAMPLES .PP Print text in a 6.5\(mu8.0-inch area centered on each sheet of paper: .EX troff -mm \f2file\fP | dpost | cropmarks -w6.5 -h8.0 | \f2spool .EE Print landscape text in exactly the same 6.5\(mu8.0-inch area: .EX troff -mm \f2file\fP | dpost -pland | cropmarks -w6.5 -h8.0 | \f2spool .EE In both examples, .I spool is the spooling command used to send PostScript output to a local printer. .SH WARNINGS .PP Device-dependent PostScript code to automatically expand page sizes may only work on Linotronic 200P typesetters that use 12-inch-wide paper. Local changes to the printer-dependent code can be made in the .MW expandpagesize procedure defined in .MR \*(dQ/cropmarks.ps . .PP The PostScript .I files must be reasonably well behaved. There are no guarantees, particularly if the input .I files redefine the .MW showpage operator. .PP The program is unsupported and may not be included in future releases. .SH FILES .MW \*(dQ/cropmarks.ps .SH SEE ALSO .BR dpost (1), .BRpostio (1), .BR troff (1) 0707070014230361660407550057030057030000031041350522627502700002200000000000post.src/devopost 0707070014230361671006440057030057030000011041360522627502300002500000002037post.src/devopost/AB # AvantGarde-Demi name AB internalname 27 ligatures fi fl 0 charset ! 28 2 33 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 hy 42 0 45 - " . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 = 60 0 61 ? 56 2 63 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 ] 32 3 93 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 ct 56 2 162 fi 52 2 174 fl 52 2 175 dg 56 3 178 bu 60 0 183 de 36 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 48 2 170 '' 48 2 186 0707070014230361701006440057030057030000011041550522627502300002500000002046post.src/devopost/AI # AvantGarde-BookOblique name AI internalname 26 ligatures fi fl 0 charset ! 29 2 33 $ 55 2 36 % 77 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 42 2 42 + 61 0 43 , 28 0 44 hy 33 0 45 - " . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 = 61 0 61 ? 59 2 63 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 ] 35 3 93 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 42 0 122 ct 55 2 162 fi 49 2 174 fl 49 2 175 dg 55 3 178 bu 61 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230361711006440057030057030000011041700522627502300002500000002037post.src/devopost/AR # AvantGarde-Book name AR internalname 25 ligatures fi fl 0 charset ! 29 2 33 $ 55 2 36 % 77 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 42 2 42 + 61 0 43 , 28 0 44 hy 33 0 45 - " . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 = 61 0 61 ? 59 2 63 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 ] 35 3 93 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 42 0 122 ct 55 2 162 fi 49 2 174 fl 49 2 175 dg 55 3 178 bu 61 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230361721006440057030057030000011041720522627502300002500000002046post.src/devopost/AX # AvantGarde-DemiOblique name AX internalname 28 ligatures fi fl 0 charset ! 28 2 33 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 hy 42 0 45 - " . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 = 60 0 61 ? 56 2 63 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 ] 32 3 93 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 ct 56 2 162 fi 52 2 174 fl 52 2 175 dg 56 3 178 bu 60 0 183 de 36 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 48 2 170 '' 48 2 186 0707070014230361731006440057030057030000011041740522627502300002400000002102post.src/devopost/B # Times-Bold name B internalname 3 ligatures fi fl 0 charset ! 33 2 33 $ 50 3 36 % 100 2 37 & 83 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 = 57 0 61 ? 50 2 63 A 72 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 72 2 82 S 56 2 83 T 67 2 84 U 72 2 85 V 72 2 86 W 100 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 33 3 91 ] 33 3 93 ` 33 2 96 a 50 0 97 b 56 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 33 3 106 k 56 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 50 0 111 p 56 1 112 q 56 1 113 r 44 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 ct 50 3 162 fi 56 2 174 fl 56 2 175 ff 60 2 1 Fi 84 2 1 Fl 84 2 1 dg 50 3 178 bu 35 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 sq 50 2 1 `` 50 2 170 '' 50 2 186 0707070014230361741006440057030057030000011041760522627502400002500000002037post.src/devopost/BI # Times-BoldItalic name BI internalname 4 ligatures fi fl 0 charset ! 39 2 33 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 = 57 0 61 ? 50 2 63 A 67 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 67 2 69 F 67 2 70 G 72 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 67 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 89 2 87 X 67 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 ] 33 3 93 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 2 116 u 56 0 117 v 44 0 118 w 67 0 119 x 50 0 120 y 44 1 121 z 39 0 122 ct 50 3 162 fi 56 3 174 fl 56 3 175 dg 50 3 178 bu 35 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230361751006440057030057030000011042300522627502400002500000002213post.src/devopost/CB # Courier-Bold name CB internalname 7 spacewidth 60 charset ! 60 2 33 " 60 2 34 # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 0 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 1 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 3 92 ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 ct 60 2 162 \- 60 0 177 en " dg 60 3 178 bu 60 0 183 de 60 2 202 em 60 0 208 14 60 2 1 34 60 2 1 12 60 2 1 `` 60 2 170 '' 60 2 186 0707070014230361761006440057030057030000011042320522627502400002500000002216post.src/devopost/CI # Courier-Oblique name CI internalname 6 spacewidth 60 charset ! 60 2 33 " 60 2 34 # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 0 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 1 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 3 92 ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 ct 60 2 162 \- 60 0 177 en " dg 60 3 178 bu 60 0 183 de 60 2 202 em 60 0 208 14 60 2 1 34 60 2 1 12 60 2 1 `` 60 2 170 '' 60 2 186 0707070014230361771006440057030057030000011042340522627502400002500000002206post.src/devopost/CO # Courier name CW internalname 5 spacewidth 60 charset ! 60 2 33 " 60 2 34 # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 0 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 1 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 3 92 ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 ct 60 2 162 \- 60 0 177 en " dg 60 3 178 bu 60 0 183 de 60 2 202 em 60 0 208 14 60 2 1 34 60 2 1 12 60 2 1 `` 60 2 170 '' 60 2 186 0707070014230362001006440057030057030000011042360522627502400002500000002206post.src/devopost/CW # Courier name CW internalname 5 spacewidth 60 charset ! 60 2 33 " 60 2 34 # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 0 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 1 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 3 92 ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 ct 60 2 162 \- 60 0 177 en " dg 60 3 178 bu 60 0 183 de 60 2 202 em 60 0 208 14 60 2 1 34 60 2 1 12 60 2 1 `` 60 2 170 '' 60 2 186 0707070014230362011006440057030057030000011042500522627502400002500000002222post.src/devopost/CX # Courier-BoldOblique name CX internalname 8 spacewidth 60 charset ! 60 2 33 " 60 2 34 # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 0 43 , 60 1 44 hy 60 0 45 - " . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 1 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 3 92 ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 ct 60 2 162 \- 60 0 177 en " dg 60 3 178 bu 60 0 183 de 60 2 202 em 60 0 208 14 60 2 1 34 60 2 1 12 60 2 1 `` 60 2 170 '' 60 2 186 0707070014230362021006440057030057030000011041570522627502400002700000001431post.src/devopost/DESC # # Original PostScript tables - now obsolete and unsupported. # PDL PostScript fonts 10 R I B BI CW H HB HX S1 S sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 44 48 54 60 72 0 res 720 hor 1 vert 1 unitwidth 10 biggestfont 200 charset hy ct fi fl ff Fi Fl dg em 14 34 12 \- en \' aa \` ga ru sc dd -> \e br Sl ps cs cy as os =. ld rd le ge pp -+ sq bx ci fa te ** pl mi \< eq \> ~= *A *B *X *D *E *F *G *Y *I *K *L *M *N *O *P *R *H *S *T *U *W *C *Q *Z ul \_ rn *a *b *x *d *e *f *g *y *i *k *l *m *n *o *p *h *r *s *t *u *w *c *q *z \{ \| \} ap fm <= sl if <- ua da de +- >= mu pt pd bu di != == ~~ al Ox O+ es ca cu sp ip sb ib mo gr rg co tm sr no \^ or lc lf lt lk lb bv is rc rf rt rk rb ts lh rh LV LH Lb L1 LA `` '' ob vr 0707070014230362031006440057030057030000011042520522627502400002500000001125post.src/devopost/GR # Greek name GR internalname 33 special charset *a 63 0 97 *b 55 3 98 *g 41 1 103 *d 49 2 100 *e 44 0 101 *z 49 3 122 *y 60 1 104 *h 52 2 113 *i 33 0 105 *k 55 0 107 *l 55 2 108 *m 58 1 109 *n 52 0 110 *c 49 3 120 *o 55 0 111 *p 55 0 112 *r 55 1 114 *s 60 0 115 *t 44 0 116 *u 58 0 117 *f 52 3 102 *x 55 1 99 *q 69 1 121 *w 69 0 119 *A 72 2 65 *B 67 2 66 *G 60 2 71 *D 61 2 68 *E 61 2 69 *Z 61 2 90 *Y 72 2 72 *H 74 2 81 *R 56 2 82 *I 33 2 73 *K 72 2 75 *L 69 2 76 *M 89 2 77 *N 72 2 78 *C 65 2 88 *O 72 2 79 *P 77 2 80 *S 59 2 83 *T 61 2 84 *U 69 2 85 *F 76 2 70 *X 72 2 67 *Q 80 2 89 *W 77 2 87 0707070014230362041006440057030057030000011042530522627502400002400000002027post.src/devopost/H # Helvetica name H internalname 9 ligatures fi fl 0 charset ! 28 2 33 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 = 58 0 61 ? 56 2 63 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 ] 28 3 93 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 ct 56 3 162 fi 50 2 174 fl 50 2 175 dg 56 3 178 bu 35 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 33 2 170 '' 33 2 186 0707070014230362051006440057030057030000011042550522627502400002500000002036post.src/devopost/HB # Helvetica-Bold name HB internalname 11 ligatures fi fl 0 charset ! 33 2 33 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 = 58 0 61 ? 61 2 63 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 ] 33 3 93 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 ct 56 3 162 fi 61 2 174 fl 61 2 175 dg 56 3 178 bu 35 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230362061006440057030057030000011042700522627502400002500000002041post.src/devopost/HI # Helvetica-Oblique name HI internalname 10 ligatures fi fl 0 charset ! 28 2 33 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 = 58 0 61 ? 56 2 63 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 ] 28 3 93 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 ct 56 3 162 fi 50 2 174 fl 50 2 175 dg 56 3 178 bu 35 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 33 2 170 '' 33 2 186 0707070014230362071006440057030057030000011042720522627502400002500000002045post.src/devopost/HX # Helvetica-BoldOblique name HX internalname 12 ligatures fi fl 0 charset ! 33 2 33 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 = 58 0 61 ? 61 2 63 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 ] 33 3 93 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 ct 56 3 162 fi 61 2 174 fl 61 2 175 dg 56 3 178 bu 35 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230362101006440057030057030000011042740522627502400002500000002044post.src/devopost/Hb # Helvetica-Narrow-Bold name Hb internalname 19 ligatures fi fl 0 charset ! 27 2 33 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 = 48 0 61 ? 50 2 63 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 ] 27 3 93 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 ct 46 3 162 fi 50 2 174 fl 50 2 175 dg 46 3 178 bu 29 0 183 de 27 2 202 em 82 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 41 2 170 '' 41 2 186 0707070014230362111006440057030057030000011042760522627502400002500000002047post.src/devopost/Hi # Helvetica-Narrow-Oblique name Hi internalname 18 ligatures fi fl 0 charset ! 23 2 33 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 = 48 0 61 ? 46 2 63 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 ] 23 3 93 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 ct 46 3 162 fi 41 2 174 fl 41 2 175 dg 46 3 178 bu 29 0 183 de 27 2 202 em 82 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 27 2 170 '' 27 2 186 0707070014230362121006440057030057030000011043300522627502400002500000002037post.src/devopost/Hr # Helvetica-Narrow name Hr internalname 17 ligatures fi fl 0 charset ! 23 2 33 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 = 48 0 61 ? 46 2 63 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 ] 23 3 93 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 ct 46 3 162 fi 41 2 174 fl 41 2 175 dg 46 3 178 bu 29 0 183 de 27 2 202 em 82 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 27 2 170 '' 27 2 186 0707070014230362131006440057030057030000011043320522627502400002500000002053post.src/devopost/Hx # Helvetica-Narrow-BoldOblique name Hx internalname 20 ligatures fi fl 0 charset ! 27 2 33 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 hy 27 0 45 - " . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 = 48 0 61 ? 50 2 63 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 ] 27 3 93 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 ct 46 3 162 fi 50 2 174 fl 50 2 175 dg 46 3 178 bu 29 0 183 de 27 2 202 em 82 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 41 2 170 '' 41 2 186 0707070014230362141006440057030057030000011043340522627502400002400000002101post.src/devopost/I # Times-Italic name I internalname 2 ligatures fi fl 0 charset ! 33 2 33 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 68 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 = 68 0 61 ? 50 2 63 A 61 2 65 B 61 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 61 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 44 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 67 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 83 2 87 X 61 2 88 Y 56 2 89 Z 56 2 90 [ 39 3 91 ] 39 3 93 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 72 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 0 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 ct 50 3 162 fi 50 3 174 fl 50 3 175 ff 50 2 1 Fi 72 2 1 Fl 72 2 1 dg 50 2 178 bu 35 0 183 de 33 2 202 em 89 0 208 14 75 2 1 34 75 2 1 12 75 2 1 sq 50 2 1 `` 56 2 170 '' 56 2 186 0707070014230362151006440057030057030000011043360522627502400002500000002035post.src/devopost/KB # Bookman-Demi name KB internalname 23 ligatures fi fl 0 charset ! 36 2 33 $ 66 3 36 % 94 2 37 & 80 2 38 ' 32 2 39 ( 32 3 40 ) 32 3 41 * 46 2 42 + 60 0 43 , 34 1 44 hy 36 0 45 - " . 34 0 46 / 60 3 47 0 66 2 48 1 66 2 49 2 66 2 50 3 66 2 51 4 66 2 52 5 66 2 53 6 66 2 54 7 66 2 55 8 66 2 56 9 66 2 57 : 34 0 58 ; 34 1 59 = 60 0 61 ? 66 2 63 A 72 2 65 B 72 2 66 C 74 2 67 D 78 2 68 E 72 2 69 F 68 2 70 G 78 2 71 H 82 2 72 I 40 2 73 J 64 2 74 K 80 2 75 L 64 2 76 M 94 2 77 N 74 2 78 O 80 2 79 P 66 2 80 Q 80 3 81 R 78 2 82 S 66 2 83 T 70 2 84 U 74 2 85 V 72 2 86 W 94 2 87 X 78 2 88 Y 70 2 89 Z 64 2 90 [ 30 3 91 ] 30 3 93 ` 32 2 96 a 58 0 97 b 60 2 98 c 58 0 99 d 64 2 100 e 58 0 101 f 38 2 102 g 58 3 103 h 68 2 104 i 36 2 105 j 34 3 106 k 66 2 107 l 34 2 108 m 100 0 109 n 68 0 110 o 62 0 111 p 64 1 112 q 62 1 113 r 46 0 114 s 52 0 115 t 46 2 116 u 66 0 117 v 60 0 118 w 80 0 119 x 60 0 120 y 62 1 121 z 56 0 122 ct 66 2 162 fi 74 2 174 fl 74 2 175 dg 44 3 178 bu 46 0 183 de 34 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 54 2 170 '' 54 2 186 0707070014230362161006440057030057030000011043500522627502400002500000002043post.src/devopost/KI # Bookman-LightItalic name KI internalname 22 ligatures fi fl 0 charset ! 32 2 33 $ 62 2 36 % 80 2 37 & 82 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 44 2 42 + 60 0 43 , 30 1 44 hy 32 0 45 - " . 30 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 30 0 58 ; 30 1 59 = 60 0 61 ? 54 2 63 A 70 2 65 B 72 2 66 C 72 2 67 D 74 2 68 E 68 2 69 F 62 2 70 G 76 2 71 H 80 2 72 I 32 2 73 J 56 2 74 K 72 2 75 L 58 2 76 M 86 2 77 N 72 2 78 O 76 2 79 P 60 2 80 Q 78 3 81 R 70 2 82 S 64 2 83 T 60 2 84 U 72 2 85 V 68 2 86 W 96 2 87 X 70 2 88 Y 66 2 89 Z 58 2 90 [ 26 3 91 ] 26 3 93 ` 28 2 96 a 62 0 97 b 60 2 98 c 48 0 99 d 64 2 100 e 54 0 101 f 34 3 102 g 56 1 103 h 62 2 104 i 28 2 105 j 28 3 106 k 60 2 107 l 28 2 108 m 88 0 109 n 62 0 110 o 54 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 54 0 115 t 34 2 116 u 62 0 117 v 54 0 118 w 88 0 119 x 54 0 120 y 60 1 121 z 52 0 122 ct 62 2 162 fi 64 3 174 fl 66 3 175 dg 62 3 178 bu 46 0 183 de 30 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 44 2 170 '' 44 2 186 0707070014230362171006440057030057030000011043520522627502500002500000002035post.src/devopost/KR # Bookman-Light name KR internalname 21 ligatures fi fl 0 charset ! 30 2 33 $ 62 2 36 % 90 2 37 & 80 2 38 ' 22 2 39 ( 30 3 40 ) 30 3 41 * 44 2 42 + 60 0 43 , 32 1 44 hy 40 0 45 - " . 32 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 32 0 58 ; 32 1 59 = 60 0 61 ? 54 2 63 A 68 2 65 B 74 2 66 C 74 2 67 D 80 2 68 E 72 2 69 F 64 2 70 G 80 2 71 H 80 2 72 I 34 2 73 J 60 2 74 K 72 2 75 L 60 2 76 M 92 2 77 N 74 2 78 O 80 2 79 P 62 2 80 Q 82 3 81 R 72 2 82 S 66 2 83 T 62 2 84 U 78 2 85 V 70 2 86 W 96 2 87 X 72 2 88 Y 64 2 89 Z 64 2 90 [ 30 3 91 ] 30 3 93 ` 22 2 96 a 58 0 97 b 62 2 98 c 52 0 99 d 62 2 100 e 52 0 101 f 32 2 102 g 54 3 103 h 66 2 104 i 30 2 105 j 30 3 106 k 62 2 107 l 30 2 108 m 94 0 109 n 66 0 110 o 56 0 111 p 62 1 112 q 58 1 113 r 44 0 114 s 52 0 115 t 38 2 116 u 68 0 117 v 52 0 118 w 78 0 119 x 56 0 120 y 54 1 121 z 48 0 122 ct 62 2 162 fi 62 2 174 fl 62 2 175 dg 54 3 178 bu 46 0 183 de 32 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 40 2 170 '' 40 2 186 0707070014230362201006440057030057030000011043540522627502500002500000002043post.src/devopost/KX # Bookman-DemiItalic name KX internalname 24 ligatures fi fl 0 charset ! 32 2 33 $ 68 3 36 % 88 2 37 & 98 2 38 ' 32 2 39 ( 26 3 40 ) 26 3 41 * 46 2 42 + 60 0 43 , 34 1 44 hy 28 0 45 - " . 34 0 46 / 36 2 47 0 68 2 48 1 68 2 49 2 68 2 50 3 68 2 51 4 68 2 52 5 68 2 53 6 68 2 54 7 68 2 55 8 68 2 56 9 68 2 57 : 34 0 58 ; 34 1 59 = 60 0 61 ? 62 2 63 A 72 2 65 B 72 2 66 C 70 2 67 D 76 2 68 E 72 2 69 F 66 2 70 G 76 2 71 H 80 2 72 I 38 2 73 J 62 2 74 K 78 2 75 L 64 2 76 M 86 2 77 N 74 2 78 O 76 2 79 P 64 2 80 Q 76 3 81 R 74 2 82 S 70 2 83 T 70 2 84 U 74 2 85 V 66 2 86 W 100 2 87 X 74 2 88 Y 66 2 89 Z 68 2 90 [ 26 3 91 ] 26 3 93 ` 32 2 96 a 68 0 97 b 60 2 98 c 56 0 99 d 68 2 100 e 56 0 101 f 42 3 102 g 62 1 103 h 70 2 104 i 38 2 105 j 32 3 106 k 70 2 107 l 38 2 108 m 96 0 109 n 68 0 110 o 60 0 111 p 66 1 112 q 62 1 113 r 50 0 114 s 54 0 115 t 44 2 116 u 68 0 117 v 54 0 118 w 86 0 119 x 62 0 120 y 60 1 121 z 56 0 122 ct 68 2 162 fi 82 3 174 fl 82 3 175 dg 42 3 178 bu 36 0 183 de 36 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 52 2 170 '' 52 2 186 0707070014230362211006440057030057030000011043560522627502500002500000002045post.src/devopost/NB # NewCenturySchlbk-Bold name NB internalname 31 ligatures fi fl 0 charset ! 30 2 33 $ 57 3 36 % 83 2 37 & 85 2 38 ' 24 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 28 0 58 ; 28 1 59 = 61 0 61 ? 50 2 63 A 76 2 65 B 78 2 66 C 78 2 67 D 83 2 68 E 76 2 69 F 72 2 70 G 83 2 71 H 87 2 72 I 44 2 73 J 65 2 74 K 81 2 75 L 72 2 76 M 98 2 77 N 83 2 78 O 83 2 79 P 76 2 80 Q 83 3 81 R 81 2 82 S 67 2 83 T 72 2 84 U 83 2 85 V 76 2 86 W 98 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 39 3 91 ] 39 3 93 ` 24 2 96 a 61 0 97 b 65 2 98 c 56 0 99 d 67 2 100 e 57 0 101 f 39 2 102 g 61 1 103 h 69 2 104 i 37 2 105 j 35 3 106 k 67 2 107 l 35 2 108 m 96 0 109 n 69 0 110 o 61 0 111 p 67 1 112 q 65 1 113 r 52 0 114 s 50 0 115 t 43 2 116 u 69 0 117 v 61 0 118 w 89 0 119 x 61 0 120 y 61 1 121 z 54 0 122 ct 57 3 162 fi 69 2 174 fl 69 2 175 dg 50 2 178 bu 61 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 48 2 170 '' 48 2 186 0707070014230362221006440057030057030000011043700522627502500002500000002047post.src/devopost/NI # NewCenturySchlbk-Italic name NI internalname 30 ligatures fi fl 0 charset ! 33 2 33 $ 56 3 36 % 83 2 37 & 85 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 61 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 = 61 0 61 ? 44 2 63 A 70 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 61 2 74 K 74 2 75 L 67 2 76 M 94 2 77 N 81 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 74 2 82 S 67 2 83 T 69 2 84 U 81 2 85 V 70 2 86 W 93 2 87 X 70 2 88 Y 69 2 89 Z 67 2 90 [ 33 3 91 ] 33 3 93 ` 20 2 96 a 57 0 97 b 56 2 98 c 44 0 99 d 61 2 100 e 44 0 101 f 33 3 102 g 54 1 103 h 61 2 104 i 33 2 105 j 32 3 106 k 56 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 44 0 115 t 35 2 116 u 61 0 117 v 52 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 46 0 122 ct 56 3 162 fi 61 3 174 fl 61 3 175 dg 50 3 178 bu 61 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 39 2 170 '' 39 2 186 0707070014230362231006440057030057030000011043720522627502500002500000002046post.src/devopost/NR # NewCenturySchlbk-Roman name NR internalname 29 ligatures fi fl 0 charset ! 30 2 33 $ 56 3 36 % 83 2 37 & 81 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 = 61 0 61 ? 44 2 63 A 72 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 56 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 81 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 72 2 82 S 63 2 83 T 67 2 84 U 81 2 85 V 72 2 86 W 98 2 87 X 70 2 88 Y 70 2 89 Z 61 2 90 [ 33 3 91 ] 33 3 93 ` 20 2 96 a 56 0 97 b 56 2 98 c 44 0 99 d 57 2 100 e 50 0 101 f 33 2 102 g 54 1 103 h 61 2 104 i 32 2 105 j 30 3 106 k 59 2 107 l 32 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 46 0 115 t 39 2 116 u 61 0 117 v 54 0 118 w 78 0 119 x 54 0 120 y 54 1 121 z 48 0 122 ct 56 3 162 fi 61 2 174 fl 61 2 175 dg 50 3 178 bu 61 2 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 39 2 170 '' 39 2 186 0707070014230362241006440057030057030000011043740522627502500002500000002053post.src/devopost/NX # NewCenturySchlbk-BoldItalic name NX internalname 32 ligatures fi fl 0 charset ! 33 2 33 $ 57 3 36 % 89 2 37 & 89 2 38 ' 26 2 39 ( 41 3 40 ) 41 3 41 * 50 2 42 + 61 0 43 , 29 1 44 hy 33 0 45 - " . 29 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 29 0 58 ; 29 1 59 = 61 0 61 ? 48 2 63 A 74 2 65 B 76 2 66 C 76 2 67 D 83 2 68 E 74 2 69 F 70 2 70 G 81 2 71 H 87 2 72 I 44 2 73 J 67 2 74 K 78 2 75 L 70 2 76 M 94 2 77 N 85 2 78 O 83 2 79 P 74 2 80 Q 83 3 81 R 80 2 82 S 69 2 83 T 72 2 84 U 83 2 85 V 74 2 86 W 94 2 87 X 74 2 88 Y 70 2 89 Z 70 2 90 [ 41 3 91 ] 41 3 93 ` 26 2 96 a 67 0 97 b 61 2 98 c 54 0 99 d 67 2 100 e 52 0 101 f 39 3 102 g 61 1 103 h 69 2 104 i 39 2 105 j 37 3 106 k 65 2 107 l 39 2 108 m 94 0 109 n 69 0 110 o 57 0 111 p 65 1 112 q 63 1 113 r 52 0 114 s 48 0 115 t 41 2 116 u 69 0 117 v 56 0 118 w 83 0 119 x 57 0 120 y 52 1 121 z 52 0 122 ct 57 3 162 fi 69 3 174 fl 69 3 175 dg 50 3 178 bu 61 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 48 2 170 '' 48 2 186 0707070014230362251006440057030057030000011043760522627502500002500000002037post.src/devopost/PA # Palatino-Roman name PA internalname 13 ligatures fi fl 0 charset ! 28 2 33 $ 50 2 36 % 84 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 61 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 = 61 0 61 ? 44 2 63 A 78 2 65 B 61 2 66 C 71 2 67 D 77 2 68 E 61 2 69 F 56 2 70 G 76 2 71 H 83 2 72 I 34 2 73 J 33 3 74 K 73 2 75 L 61 2 76 M 95 2 77 N 83 2 78 O 79 2 79 P 60 2 80 Q 79 3 81 R 67 2 82 S 53 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 ] 33 2 93 ` 28 2 96 a 50 0 97 b 55 2 98 c 44 0 99 d 61 2 100 e 48 0 101 f 33 2 102 g 56 1 103 h 58 2 104 i 29 2 105 j 23 3 106 k 56 2 107 l 29 2 108 m 88 0 109 n 58 0 110 o 55 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 42 0 115 t 33 2 116 u 60 0 117 v 56 0 118 w 83 0 119 x 52 0 120 y 56 1 121 z 50 0 122 ct 50 0 162 fi 61 2 174 fl 61 2 175 dg 50 2 178 bu 61 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230362261006440057030057030000011044100522627502500002500000002037post.src/devopost/PB # Palatino-Bold name PB internalname 15 ligatures fi fl 0 charset ! 28 2 33 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 30 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 = 61 0 61 ? 44 2 63 A 78 2 65 B 67 2 66 C 72 2 67 D 83 2 68 E 61 2 69 F 56 2 70 G 83 2 71 H 83 2 72 I 39 2 73 J 39 3 74 K 78 2 75 L 61 2 76 M 100 2 77 N 83 2 78 O 83 2 79 P 61 2 80 Q 83 3 81 R 72 2 82 S 61 2 83 T 67 2 84 U 78 2 85 V 78 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 ] 33 2 93 ` 28 2 96 a 50 0 97 b 61 2 98 c 44 0 99 d 61 2 100 e 50 0 101 f 39 2 102 g 56 1 103 h 61 2 104 i 33 2 105 j 33 3 106 k 61 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 44 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 ct 50 0 162 fi 61 2 174 fl 61 2 175 dg 50 2 178 bu 61 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230362271006440057030057030000011044120522627502500002500000002037post.src/devopost/PI # Palatino-Italic name PI internalname 14 ligatures fi fl 0 charset ! 33 2 33 $ 50 2 36 % 89 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 30 3 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 = 61 0 61 ? 50 2 63 A 72 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 78 2 72 I 33 2 73 J 33 3 74 K 67 2 75 L 56 2 76 M 94 2 77 N 78 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 ] 33 2 93 ` 28 2 96 a 44 0 97 b 46 2 98 c 41 0 99 d 50 2 100 e 39 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 44 0 111 p 50 1 112 q 46 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 ct 50 0 162 fi 53 3 174 fl 54 3 175 dg 50 2 178 bu 50 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230362301006440057030057030000011044140522627502500002500000002044post.src/devopost/PX # Palatino-BoldItalic name PX internalname 16 ligatures fi fl 0 charset ! 33 2 33 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 hy 39 0 45 - " . 25 0 46 / 32 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 = 61 0 61 ? 44 2 63 A 72 2 65 B 67 2 66 C 69 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 39 3 74 K 72 2 75 L 61 2 76 M 94 2 77 N 78 2 78 O 83 2 79 P 67 2 80 Q 83 3 81 R 72 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 72 2 88 Y 61 2 89 Z 67 2 90 [ 33 2 91 ] 33 2 93 ` 28 2 96 a 56 0 97 b 54 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 33 2 105 j 33 3 106 k 56 2 107 l 33 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 54 1 113 r 39 0 114 s 44 0 115 t 39 2 116 u 56 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 ct 50 0 162 fi 61 3 174 fl 61 3 175 dg 56 2 178 bu 61 0 183 de 56 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 50 2 170 '' 50 2 186 0707070014230362311006440057030057030000011044160522627502500002400000002101post.src/devopost/R # Times-Roman name R internalname 1 ligatures fi fl 0 charset ! 33 2 33 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 56 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 = 56 0 61 ? 44 2 63 A 72 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 39 2 74 K 72 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 56 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 72 2 89 Z 61 2 90 [ 33 3 91 ] 33 3 93 ` 33 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 ct 50 3 162 fi 56 2 174 fl 56 2 175 ff 60 2 1 Fi 84 2 1 Fl 84 2 1 dg 50 3 178 bu 35 0 183 de 33 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 sq 50 2 1 `` 44 2 170 '' 44 2 186 0707070014230362321006440057030057030000011044300522627502500002400000004600post.src/devopost/S # Symbol name S internalname 33 special charset bx 50 2 1 ci 75 0 1 sq 50 2 1 ~= 55 0 1 L1 110 1 2 LA 110 1 2 LV 110 3 2 LH 210 1 2 Lb " lh 100 0 2 rh 100 0 2 --- 25 0 32 --- 33 2 33 fa 71 2 34 --- 50 2 35 te 55 2 36 --- 83 2 37 --- 78 2 38 --- 44 0 39 --- 33 3 40 --- 33 3 41 ** 50 0 42 pl 55 0 43 --- 25 1 44 mi 55 0 45 --- 25 0 46 --- 28 2 47 --- 50 2 48 --- 50 2 49 --- 50 2 50 --- 50 2 51 --- 50 2 52 --- 50 2 53 --- 50 2 54 --- 50 2 55 --- 50 2 56 --- 50 2 57 --- 28 0 58 --- 28 1 59 < 55 0 60 eq 55 0 61 > 55 0 62 --- 44 2 63 *A 72 2 65 *B 67 2 66 *X 72 2 67 *D 61 2 68 *E 61 2 69 *F 76 2 70 *G 60 2 71 *Y 72 2 72 *I 33 2 73 --- 63 2 74 *K 72 2 75 *L 69 2 76 *M 89 2 77 *N 72 2 78 *O 72 2 79 *P 77 2 80 *H 74 2 81 *R 56 2 82 *S 59 2 83 *T 61 2 84 *U 69 2 85 --- 44 1 86 ts 44 1 86 *W 77 2 87 *C 65 2 88 *Q 80 2 89 *Z 61 2 90 --- 33 3 91 --- 86 0 92 --- 33 3 93 --- 66 2 94 ul 50 1 95 _ " rn 50 2 96 *a 63 0 97 *b 55 3 98 *x 55 1 99 *d 49 2 100 *e 44 0 101 *f 52 3 102 *g 41 1 103 *y 60 1 104 *i 33 0 105 --- 60 1 106 *k 55 0 107 *l 55 2 108 *m 58 1 109 *n 52 0 110 *o 55 0 111 *p 55 0 112 *h 52 2 113 *r 55 1 114 *s 60 0 115 *t 44 0 116 *u 58 0 117 --- 71 2 118 *w 69 0 119 *c 49 3 120 *q 69 1 121 *z 49 3 122 { 48 3 123 or 20 3 124 } 48 3 125 ap 55 0 126 --- 62 2 161 fm 25 2 162 <= 55 2 163 sl 17 2 164 if 73 0 165 --- 50 3 166 --- 75 0 167 --- 75 0 168 --- 75 0 169 --- 75 0 170 --- 104 0 171 <- 99 0 172 ua 60 2 173 -> 99 0 174 da 60 2 175 de 40 2 176 +- 55 2 177 --- 41 2 178 >= 55 2 179 mu 55 0 180 pt 71 0 181 pd 49 2 182 bu 46 0 183 di 55 0 184 != 55 0 185 == 55 0 186 ~~ 55 0 187 --- 100 0 188 --- 60 3 189 --- 100 0 190 --- 66 2 191 al 82 2 192 --- 69 2 193 --- 80 2 194 --- 99 3 195 Ox 77 2 196 O+ 77 2 197 es 82 2 198 ca 77 0 199 cu 77 0 200 sp 71 0 201 ip 71 1 202 --- 71 0 203 sb 71 0 204 ib 71 1 205 mo 71 0 206 --- 71 0 207 --- 77 2 208 gr 71 2 209 rg 79 2 210 co 79 2 211 tm 89 2 212 --- 82 2 213 sr 55 2 214 --- 25 0 215 no 71 0 216 ^ 60 0 217 or 60 0 218 --- 104 0 219 --- 99 0 220 --- 60 2 221 --- 99 0 222 --- 60 2 223 --- 49 2 224 --- 33 3 225 --- 79 2 226 --- 79 2 227 --- 79 2 228 --- 71 2 229 --- 38 3 230 br 0 3 231 --- 38 3 232 lc 50 2 233 vr 0 2 234 lf 50 2 235 lt 49 2 236 lk 49 2 237 lb 49 2 238 bv 49 2 239 --- 25 0 240 --- 33 3 241 is 50 3 242 --- 69 2 243 --- 69 2 244 --- 69 2 245 --- 38 3 246 --- 38 2 247 --- 38 3 248 rc 38 2 249 | 50 3 250 rf 38 2 251 rt 49 2 252 rk 49 2 253 rb 49 2 254 0707070014230362331006440057030057030000011042570522627502500002500000000530post.src/devopost/S1 # Times-Roman special font name S1 internalname 1 special charset " 41 2 34 # 50 2 35 < 56 0 60 > 56 0 62 @ 92 3 64 \ 28 2 92 or 20 2 124 ^ 33 2 195 ~ 33 2 196 \' 33 2 194 aa " \` 33 2 193 ga " ru 50 0 95 \- 65 0 177 en " sc 50 3 167 dg 50 3 178 dd 50 3 179 ct 50 3 162 14 75 2 1 34 75 2 1 12 75 2 1 Sl 50 2 1 ob 38 0 1 `` 44 2 170 '' 44 2 186 0707070014230362341006440057030057030000011044330522627502500002500000004145post.src/devopost/ZD # ZapfDingbats name ZD internalname 36 ligatures fi fl 0 charset ! 97 2 33 " 96 2 34 # 97 2 35 $ 98 3 36 % 72 2 37 & 79 3 38 ' 79 3 39 ( 79 3 40 ) 69 2 41 * 96 2 42 + 94 2 43 , 55 3 44 - 86 2 45 . 91 2 46 / 93 2 47 0 91 2 48 1 94 2 49 2 97 2 50 3 76 3 51 4 85 3 52 5 76 2 53 6 76 2 54 7 57 3 55 8 68 3 56 9 76 2 57 : 76 2 58 ; 76 2 59 < 75 3 60 = 49 2 61 > 55 2 62 ? 54 3 63 @ 58 2 64 A 69 3 65 B 79 3 66 C 79 3 67 D 79 3 68 E 79 3 69 F 79 3 70 G 79 3 71 H 82 3 72 I 82 3 73 J 79 3 74 K 84 3 75 L 82 3 76 M 83 3 77 N 82 3 78 O 83 3 79 P 92 3 80 Q 74 2 81 R 72 2 82 S 75 2 83 T 79 3 84 U 79 3 85 V 69 3 86 W 78 3 87 X 77 3 88 Y 79 3 89 Z 76 2 90 [ 71 3 91 \ 71 3 92 ] 68 3 93 ^ 70 3 94 _ 83 3 95 ` 81 3 96 a 79 3 97 b 79 3 98 c 71 3 99 d 69 2 100 e 70 2 101 f 69 2 102 g 79 3 103 h 79 3 104 i 71 3 105 j 79 3 106 k 78 3 107 l 79 3 108 m 87 3 109 n 76 2 110 o 76 2 111 p 76 2 112 q 76 3 113 r 76 3 114 s 89 2 115 t 89 3 116 u 79 3 117 v 78 3 118 w 44 3 119 x 14 2 120 y 28 2 121 z 41 2 122 { 39 2 123 | 39 2 124 } 67 2 125 ~ 67 2 126 hy 73 3 161 em 54 3 162 de 54 3 163 \- 91 2 164 en 67 3 165 ff 76 3 166 fi 76 2 167 fl 78 2 168 Fi 60 3 169 Fl 69 3 170 fm 63 3 171 ru 79 3 172 dg 79 3 173 bu 79 3 174 14 79 3 175 34 79 3 176 12 79 3 177 ct 79 3 178 rg 79 3 179 sq 79 3 180 sl 79 3 181 ul 79 3 182 or 79 3 183 no 79 3 184 -> 79 3 185 <- 79 3 186 da 79 3 187 lh 79 3 188 ua 79 3 189 \e 79 3 190 \' 79 3 191 aa 79 3 192 \` 79 3 193 ga 79 3 194 pl 79 3 195 mi 79 3 196 mu 79 3 197 di 79 3 198 eq 79 3 199 == 79 3 200 >= 79 3 201 <= 79 3 202 != 79 3 203 +- 79 3 204 -+ 79 3 205 ap 79 3 206 ~= 79 3 207 gr 79 3 208 is 79 3 209 pd 79 3 210 if 79 3 211 sr 89 2 212 rn 84 2 213 sb 102 2 214 sp 46 3 215 cu 75 2 216 ca 92 2 217 ib 75 2 218 ip 92 2 219 mo 93 2 220 es 93 2 221 sc 93 2 222 dd 83 2 223 lc 87 2 224 rc 83 2 225 lf 92 2 226 rf 92 2 227 bv 92 2 228 ** 93 2 229 br 93 2 230 ci 46 3 231 ts 88 2 232 co 84 2 233 lt 84 2 234 rt 87 2 235 lb 87 2 236 rb 70 2 237 lk 70 2 238 rk 87 2 239 rh 87 2 241 tm 76 2 242 Sl 95 2 243 ps 77 2 244 cs 86 2 245 cy 77 2 246 as 89 3 247 os 97 2 248 =. 89 3 249 ld 83 2 250 rd 87 2 251 le 93 2 252 ge 97 2 253 pp 92 2 254 0707070014230362351006440057030057030000011044360522627502500002500000002051post.src/devopost/ZI # ZapfChancery-MediumItalic name ZI internalname 37 ligatures fi fl 0 charset ! 28 2 33 $ 44 3 36 % 68 2 37 & 78 2 38 ' 24 2 39 ( 26 3 40 ) 22 3 41 * 42 2 42 + 52 0 43 , 22 0 44 hy 28 0 45 - " . 22 0 46 / 34 3 47 0 44 2 48 1 44 2 49 2 44 2 50 3 44 2 51 4 44 2 52 5 44 2 53 6 44 2 54 7 44 2 55 8 44 2 56 9 44 2 57 : 26 0 58 ; 24 0 59 = 52 0 61 ? 38 2 63 A 62 2 65 B 60 2 66 C 52 2 67 D 70 2 68 E 62 2 69 F 58 2 70 G 62 3 71 H 68 2 72 I 38 2 73 J 40 2 74 K 66 3 75 L 58 2 76 M 84 2 77 N 70 3 78 O 60 2 79 P 54 2 80 Q 60 3 81 R 60 3 82 S 46 2 83 T 50 2 84 U 74 2 85 V 64 2 86 W 88 2 87 X 56 2 88 Y 56 3 89 Z 62 2 90 [ 24 3 91 ] 32 3 93 ` 24 2 96 a 42 0 97 b 42 2 98 c 34 0 99 d 44 2 100 e 34 0 101 f 32 3 102 g 40 1 103 h 44 2 104 i 24 2 105 j 22 3 106 k 44 3 107 l 24 2 108 m 62 0 109 n 46 0 110 o 40 0 111 p 44 1 112 q 40 3 113 r 30 0 114 s 32 0 115 t 32 2 116 u 46 0 117 v 44 0 118 w 68 0 119 x 42 1 120 y 40 1 121 z 44 0 122 ct 44 2 162 fi 52 3 174 fl 52 3 175 dg 46 3 178 bu 60 2 183 de 30 2 202 em 100 0 208 14 75 2 1 34 75 2 1 12 75 2 1 `` 34 2 170 '' 36 2 186 0707070014230642310407550057030057030000021707770522627502700003200000000000post.src/devopost/charlib 0707070014230642321006440057030057030000011704730522627502500003500000000421post.src/devopost/charlib/12 /build_12 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (2) show optsize ofont f } def 0707070014230642331006440057030057030000011704740522627502500003500000000421post.src/devopost/charlib/14 /build_14 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 0707070014230642341006440057030057030000011704750522627502600003500000000421post.src/devopost/charlib/34 /build_34 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (3) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 0707070014230642351006440057030057030000011710100522627502600005000000004542post.src/devopost/charlib/BRACKETS_NOTE lc, rc, lf, and rf contain PostScript code that can be used to build the top and bottom bracket pieces used by eqn. The files are only used if the character code field in the S font file for lc, rc, lf, and rf is set to 1. A code larger than 32 means a character from Adobe's Symbol font will be used. Think the real solution is to change eqn so large brackets and braces are built differently. There were some serious collisions with eqn's bracket building algorithm and Adobe's Symbol font. eqn extends all the pieces with the \(bv character, while the bracket and brace pieces available in Adobe's Symbol are all quite different and are designed to work with their own extenders. The reference points are different, but worse still the thickness of brackets and braces don't match. Anyway using a single extender (the way eqn does) can't ever work with the bracket and brace characters available in Adobe's Symbol font. The lc, rc, lf, and rf files are a very complicated attempt to get around the problem. Each builds the troff character by using the \(bv character from the Symbol font and then draws a small horizontal line at either the top or bottom of the \(bv. Using \(bv for the vertical part guarantees things will stack properly, but getting to the precise top or bottom of the \(bv (down to the pixel level on all devices and in all sizes) proved to be very difficult. In fact you would think that determining the bounding box of \(bv would be enough to let you draw a good bracket piece that matched up nicely with the extender. Not quite, at least I didn't find that it was possible to do a good job drawing the pieces from the \(bv bounding box. Think roundoff errors introduced by the CTM caused the trouble, although I expect there's more to it. Clipping a rectangular region 2 pixels smaller in height than the bounding box of the \(bv character, and using the corners of that box to locate the top and bottom of the bv for the horizontal extender solved the problems I originally had with the precise placement of the horizontal rule. Anyway that's what the clipping and idtransform are for. The initgraphics stuff is an attempt to fit a tight bounding box around the \(bv character independent of the rotation of our coordinate system. pathbbox only returns what we want if the coordinate system has been rotated by a multiple of 90 degrees. 0707070014230642361006440057030057030000011704760522627502600003500000000075post.src/devopost/charlib/Fi /build_Fi { pop size .05 mul neg 0 (ffi) ashow } def 0707070014230642371006440057030057030000011704770522627502600003500000000075post.src/devopost/charlib/Fl /build_Fl { pop size .05 mul neg 0 (ffl) ashow } def 0707070014230642401006440057030057030000011710130522627502600003500000000402post.src/devopost/charlib/L1 /build_L1 { pop /picstr 40 string def gsave currentpoint translate .533 72 mul size mul 36 div .5 72 mul size mul 36 div scale 160 150 1 [160 0 0 -150 0 150] {currentfile picstr readhexstring pop} image grestore } def 0707070014230642411006440057030057030000011710300522627502600004100000014006post.src/devopost/charlib/L1.map FFFFFFFFFFFFFFFFFF0007FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFE0000000007FFFFFFFFFFFFFFF FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFF FFFFFFFFFFFFF8000000000001FFFFFFFFFFFFFF FFFFFFFFFFFFE00000000000003FFFFFFFFFFFFF FFFFFFFFFFFF000000000000000FFFFFFFFFFFFF FFFFFFFFFFFC0000000000000003FFFFFFFFFFFF FFFFFFFFFFF000000000000000007FFFFFFFFFFF FFFFFFFFFFC000000000000000003FFFFFFFFFFF FFFFFFFFFF8FFFFFFF00000000000FFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF0000000007FFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF FFFFFFFFFFFFFFFFFFFFC00000000003FFFFFFFF FFFFFFF81FFFFFFFFFC0000000000001FFFFFFFF FFFFFFF0000000000000000000000000FFFFFFFF FFFFFFE00000000000000000000000007FFFFFFF FFFFFFC00000000000000000000000003FFFFFFF FFFFFF800000000000000000000000001FFFFFFF FFFFFF000000000000000000000000000FFFFFFF FFFFFE0007FFFFFFFF8000000000000007FFFFFF FFFFFE7FFFFFFFFFFFFFFE000000000003FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF0000000003FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFE000000001FFFFF FFFFFFFFFFFFFFFFFFFFFFFF80000000001FFFFF FFFF01FFFFFFFFFFFFFFFFC000000000000FFFFF FFFE00000000000000000000000000000007FFFF FFFE00000000000000000000000000000007FFFF FFFC00000000000000000000000000000003FFFF FFFC00000000000000000000000000000003FFFF FFF800000000000000000000000000000001FFFF FFF800000000000000000000000000000000FFFF FFF80FFFFFFFFFFFFFFFFFE0000000000000FFFF FFFFFFFFFFFFFFFFFFFFFFFFFE0000000000FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FFF FFFFFFFFFFFFFFFFFFFFFFFFFFC0000000001FFF FF87FFFFFFFFFFFFFFFFFFFFC000000000000FFF FF000000007FFFFFFFFFFC000000000000000FFF FF000000000000000000000000000000000007FF FF000000000000000000000000000000000007FF FE000000000000000000000000000000000007FF FE000000000000000000000000000000000003FF FE000000000000000000000000000000000003FF FE0007FFFFFFFFFFFFFFFFC000000000000003FF FC0FFFFFFFFFFFFFFFFFFFFFFC000000000003FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000003FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FF FFFFFFFFFFFFFFFFFFFFFFFFFF800000000001FF F8FFFFFFFFFFFFFFFFFFFFFF80000000000000FF F8000FFFFFFFFFFFFFFFFF0000000000000000FF F8000000000000000000000000000000000000FF F0000000000000000000000000000000000000FF F0000000000000000000000000000000000000FF F0000000000000000000000000000000000000FF F00000000000000000000000000000000000007F F00000007FFFFFFFFFFFE000000000000000007F F000FFFFFFFFFFFFFFFFFFFF000000000000007F F07FFFFFFFFFFFFFFFFFFFFFFFC000000000007F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000007F F007FFFFFFFFFFFFFFFFFFFC000000000000007F F00003FFFFFFFFFFFFFFF000000000000000007F F00000000000000000000000000000000000007F F00000000000000000000000000000000000007F F0000000000000000000000000000000000000FF F0000000000000000000000000000000000000FF F8000000000000000000000000000000000000FF F8000000000000000000000000000000000000FF F80003FFFFFFFFFFFFFFF80000000000000000FF F80FFFFFFFFFFFFFFFFFFFFFC0000000000000FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFE00000000000003FF FC003FFFFFFFFFFFFFFE000000000000000003FF FE000000FFFFFFFFC800000000000000000003FF FE000000000000000000000000000000000003FF FE000000000000000000000000000000000003FF FE000000000000000000000000000000000003FF FF000000000000000000000000000000000007FF FF000000000000000000000000000000000007FF FF000000000000000000000000000000000007FF FF80000000000000000000000000000000000FFF FF8000000007FF80000000000000000000000FFF FFC00007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFC07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFF03FFFFFFFFFFFFFFFC0000000000000007FFF FFF0000007FFFFFE000000000000000000007FFF FFF800000000000000000000000000000000FFFF FFF800000000000000000000000000000000FFFF FFF800000000000000000000000000000000FFFF FFFC00000000000000000000000000000001FFFF FFFE00000000000000000000000000000003FFFF FFFE00000000000000000000000000000003FFFF FFFF00000000000000000000000000000007FFFF FFFF0000000000000000000000000000000FFFFF FFFF8000000000000000000000000000000FFFFF FFFFC000003FFFE00000000000000000001FFFFF FFFFE007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFC0000000000000000000000000001FFFFFF FFFFFE0000000000000000000000000003FFFFFF FFFFFF0000000000000000000000000003FFFFFF FFFFFF0000000000000000000000000007FFFFFF FFFFFF800000000000000000000000000FFFFFFF FFFFFFC00000000000000000000000001FFFFFFF FFFFFFE00000000000000000000000003FFFFFFF FFFFFFF00000000000000000000000007FFFFFFF FFFFFFFC000000000000000000000000FFFFFFFF FFFFFFFE000000000000000000000003FFFFFFFF FFFFFFFF000000000000000000000007FFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFF00000000000000000003FFFFFFFFFF FFFFFFFFFF8000000000000000000FFFFFFFFFFF FFFFFFFFFFE000000000000000001FFFFFFFFFFF FFFFFFFFFFF000000000000000007FFFFFFFFFFF FFFFFFFFFFFC0000000000000001FFFFFFFFFFFF FFFFFFFFFFFF0000000000000007FFFFFFFFFFFF FFFFFFFFFFFFE00000000000003FFFFFFFFFFFFF FFFFFFFFFFFFF8000000000000FFFFFFFFFFFFFF FFFFFFFFFFFFFF000000000007FFFFFFFFFFFFFF FFFFFFFFFFFFFFF0000000007FFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFF 0707070014230642421006440057030057030000011710370522627502600003500000000024post.src/devopost/charlib/LH /build_LH {pop} def 0707070014230642431006440057030057030000011710500522627502600004100000017112post.src/devopost/charlib/LH.map gsave /M {moveto} def /L {lineto} def currentpoint translate 0 360 translate 2.4 2.4 scale ptsize 36 div dup neg scale 68 1 M 68 1 L 60 2 L 55 3 L 52 4 L 49 5 L 47 6 L 44 7 L 42 8 L 40 9 L 38 10 L 37 11 L 39 11 L 53 10 L 68 11 L 76 12 L 112 12 L 111 11 L 109 10 L 108 9 L 105 8 L 103 7 L 101 6 L 98 5 L 95 4 L 92 3 L 88 2 L 80 1 L closepath 84 17 M 84 17 L 78 18 L 70 19 L 50 20 L 30 19 L 25 19 L 24 20 L 23 21 L 22 22 L 21 23 L 20 24 L 19 25 L 19 26 L 20 26 L 32 25 L 50 24 L 69 25 L 83 26 L 92 27 L 129 27 L 129 26 L 128 25 L 127 24 L 126 23 L 125 22 L 124 21 L 123 20 L 122 19 L 121 18 L 119 17 L closepath 99 32 M 99 32 L 93 33 L 86 34 L 52 35 L 18 34 L 12 34 L 11 35 L 11 36 L 10 37 L 10 38 L 9 39 L 9 40 L 9 41 L 15 41 L 51 40 L 87 41 L 99 42 L 139 42 L 139 41 L 139 40 L 138 39 L 137 38 L 137 37 L 136 36 L 136 35 L 135 34 L 134 33 L 134 32 L closepath 110 47 M 110 47 L 102 48 L 94 49 L 82 50 L 59 51 L 36 50 L 8 49 L 5 49 L 4 50 L 4 51 L 4 52 L 3 53 L 3 54 L 3 55 L 3 56 L 2 57 L 7 57 L 16 56 L 51 55 L 86 56 L 98 57 L 110 58 L 145 58 L 145 57 L 145 56 L 145 55 L 145 54 L 144 53 L 144 52 L 144 51 L 143 50 L 143 49 L 142 48 L 142 47 L closepath 178 49 M 178 49 L 178 50 L 177 51 L 177 52 L 177 53 L 176 54 L 176 55 L 176 56 L 175 57 L 175 58 L 175 59 L 174 60 L 174 61 L 174 62 L 173 63 L 173 64 L 173 65 L 172 66 L 172 67 L 172 68 L 171 69 L 171 70 L 171 71 L 170 72 L 170 73 L 170 74 L 169 75 L 169 76 L 169 77 L 168 78 L 168 79 L 168 80 L 167 81 L 167 82 L 167 83 L 166 84 L 166 85 L 166 86 L 165 87 L 165 88 L 165 89 L 164 90 L 164 91 L 164 92 L 163 93 L 163 94 L 163 95 L 162 96 L 162 97 L 162 98 L 161 99 L 161 100 L 161 101 L 160 102 L 174 102 L 174 101 L 175 100 L 175 99 L 175 98 L 176 97 L 176 96 L 176 95 L 177 94 L 185 93 L 194 94 L 194 95 L 195 96 L 195 97 L 195 98 L 195 99 L 196 100 L 196 101 L 196 102 L 210 102 L 209 101 L 209 100 L 209 99 L 208 98 L 208 97 L 208 96 L 208 95 L 207 94 L 207 93 L 207 92 L 206 91 L 206 90 L 206 89 L 205 88 L 205 87 L 205 86 L 204 85 L 204 84 L 204 83 L 203 82 L 203 81 L 203 80 L 202 79 L 202 78 L 202 77 L 202 76 L 201 75 L 201 74 L 201 73 L 200 72 L 200 71 L 200 70 L 199 69 L 199 68 L 199 67 L 198 66 L 198 65 L 198 64 L 197 63 L 197 62 L 197 61 L 197 60 L 196 59 L 196 58 L 196 57 L 195 56 L 195 55 L 195 54 L 194 53 L 194 52 L 194 51 L 193 50 L 193 49 L closepath 200 49 M 200 49 L 200 50 L 200 51 L 200 52 L 200 53 L 200 54 L 200 55 L 200 56 L 200 57 L 200 58 L 200 59 L 200 60 L 214 61 L 214 62 L 214 63 L 214 64 L 214 65 L 214 66 L 214 67 L 214 68 L 214 69 L 214 70 L 214 71 L 214 72 L 214 73 L 214 74 L 214 75 L 214 76 L 214 77 L 214 78 L 214 79 L 214 80 L 214 81 L 214 82 L 214 83 L 214 84 L 214 85 L 214 86 L 214 87 L 214 88 L 214 89 L 214 90 L 214 91 L 214 92 L 214 93 L 214 94 L 214 95 L 214 96 L 214 97 L 214 98 L 214 99 L 214 100 L 214 101 L 214 102 L 228 102 L 228 101 L 228 100 L 228 99 L 228 98 L 228 97 L 228 96 L 228 95 L 228 94 L 228 93 L 228 92 L 228 91 L 228 90 L 228 89 L 228 88 L 228 87 L 228 86 L 228 85 L 228 84 L 228 83 L 228 82 L 228 81 L 228 80 L 228 79 L 228 78 L 228 77 L 228 76 L 228 75 L 228 74 L 228 73 L 228 72 L 228 71 L 228 70 L 228 69 L 228 68 L 228 67 L 228 66 L 228 65 L 228 64 L 228 63 L 228 62 L 228 61 L 241 60 L 241 59 L 241 58 L 241 57 L 241 56 L 241 55 L 241 54 L 241 53 L 241 52 L 241 51 L 241 50 L 241 49 L closepath 266 49 M 266 49 L 266 50 L 266 51 L 266 52 L 266 53 L 266 54 L 266 55 L 266 56 L 266 57 L 266 58 L 266 59 L 266 60 L 280 61 L 280 62 L 280 63 L 280 64 L 280 65 L 280 66 L 280 67 L 280 68 L 280 69 L 280 70 L 280 71 L 280 72 L 280 73 L 280 74 L 280 75 L 280 76 L 280 77 L 280 78 L 280 79 L 280 80 L 280 81 L 280 82 L 280 83 L 280 84 L 280 85 L 280 86 L 280 87 L 280 88 L 280 89 L 280 90 L 280 91 L 280 92 L 280 93 L 280 94 L 280 95 L 280 96 L 280 97 L 280 98 L 280 99 L 280 100 L 280 101 L 280 102 L 294 102 L 294 101 L 294 100 L 294 99 L 294 98 L 294 97 L 294 96 L 294 95 L 294 94 L 294 93 L 294 92 L 294 91 L 294 90 L 294 89 L 294 88 L 294 87 L 294 86 L 294 85 L 294 84 L 294 83 L 294 82 L 294 81 L 294 80 L 294 79 L 294 78 L 294 77 L 294 76 L 294 75 L 294 74 L 294 73 L 294 72 L 294 71 L 294 70 L 294 69 L 294 68 L 294 67 L 294 66 L 294 65 L 294 64 L 294 63 L 294 62 L 294 61 L 308 60 L 308 59 L 308 58 L 308 57 L 308 56 L 308 55 L 308 54 L 308 53 L 308 52 L 308 51 L 308 50 L 308 49 L closepath 251 59 M 251 59 L 245 60 L 243 61 L 241 62 L 240 63 L 239 64 L 239 65 L 238 66 L 238 67 L 237 68 L 237 69 L 237 70 L 237 71 L 237 72 L 238 73 L 238 74 L 238 75 L 239 76 L 239 77 L 240 78 L 239 79 L 238 80 L 237 81 L 237 82 L 237 83 L 236 84 L 236 85 L 235 86 L 235 87 L 235 88 L 235 89 L 235 90 L 235 91 L 235 92 L 236 93 L 236 94 L 237 95 L 237 96 L 238 97 L 239 98 L 240 99 L 241 100 L 243 101 L 245 102 L 249 103 L 259 103 L 262 102 L 265 101 L 267 100 L 270 101 L 272 102 L 276 102 L 276 101 L 276 100 L 276 99 L 276 98 L 276 97 L 276 96 L 276 95 L 276 94 L 276 93 L 273 92 L 273 91 L 274 90 L 274 89 L 274 88 L 274 87 L 274 86 L 274 85 L 274 84 L 274 83 L 274 82 L 274 81 L 274 80 L 274 79 L 274 78 L 274 77 L 274 76 L 264 75 L 264 74 L 264 73 L 264 72 L 264 71 L 264 70 L 264 69 L 264 68 L 264 67 L 263 66 L 263 65 L 263 64 L 262 63 L 261 62 L 260 61 L 258 60 L 253 59 L closepath 114 62 M 114 62 L 101 63 L 93 64 L 84 65 L 49 66 L 15 65 L 3 64 L 1 64 L 1 65 L 1 66 L 0 67 L 0 68 L 0 69 L 0 70 L 0 71 L 0 72 L 0 73 L 4 73 L 11 72 L 28 71 L 53 70 L 79 71 L 92 72 L 102 73 L 148 73 L 148 72 L 148 71 L 148 70 L 147 69 L 147 68 L 147 67 L 147 66 L 147 65 L 147 64 L 146 63 L 146 62 L closepath 185 68 M 185 68 L 186 67 L 187 68 L 187 69 L 187 70 L 188 71 L 188 72 L 188 73 L 188 74 L 189 75 L 189 76 L 189 77 L 189 78 L 190 79 L 190 80 L 190 81 L 185 82 L 181 81 L 181 80 L 181 79 L 182 78 L 182 77 L 182 76 L 183 75 L 183 74 L 183 73 L 184 72 L 184 71 L 184 70 L 184 69 L closepath 250 68 M 250 68 L 251 67 L 253 68 L 254 69 L 254 70 L 254 71 L 254 72 L 254 73 L 254 74 L 254 75 L 252 76 L 251 75 L 250 74 L 249 73 L 249 72 L 249 71 L 249 70 L 249 69 L closepath 254 77 M 254 77 L 259 76 L 264 77 L 264 78 L 264 79 L 264 80 L 264 81 L 264 82 L 264 83 L 264 84 L 263 85 L 262 84 L 261 83 L 260 82 L 258 81 L 257 80 L 256 79 L 255 78 L closepath 100 78 M 100 78 L 90 79 L 80 80 L 48 81 L 17 80 L 8 79 L 0 79 L 0 80 L 0 81 L 0 82 L 0 83 L 0 84 L 1 85 L 1 86 L 1 87 L 1 88 L 7 88 L 17 87 L 49 86 L 81 87 L 94 88 L 147 88 L 147 87 L 147 86 L 147 85 L 147 84 L 147 83 L 148 82 L 148 81 L 148 80 L 148 79 L 148 78 L closepath 246 86 M 246 86 L 247 85 L 249 86 L 250 87 L 252 88 L 253 89 L 254 90 L 255 91 L 255 92 L 252 93 L 250 92 L 248 91 L 247 90 L 247 89 L 246 88 L 246 87 L closepath 91 93 M 91 93 L 75 94 L 65 95 L 64 96 L 63 95 L 62 95 L 44 96 L 27 95 L 13 94 L 2 94 L 3 95 L 3 96 L 3 97 L 3 98 L 4 99 L 4 100 L 4 101 L 5 102 L 5 103 L 6 104 L 6 105 L 12 105 L 24 104 L 40 103 L 46 102 L 53 103 L 143 103 L 143 102 L 144 101 L 144 100 L 144 99 L 145 98 L 145 97 L 145 96 L 145 95 L 145 94 L 145 93 L closepath 8 108 M 8 108 L 8 109 L 9 110 L 9 111 L 9 112 L 10 113 L 11 114 L 11 115 L 12 116 L 12 117 L 13 118 L 14 119 L 15 120 L 24 120 L 37 119 L 46 118 L 55 119 L 134 119 L 135 118 L 135 117 L 136 116 L 137 115 L 137 114 L 138 113 L 139 112 L 139 111 L 139 110 L 140 109 L 140 108 L 78 108 L 59 109 L 45 110 L 32 109 L 13 108 L closepath 18 124 M 18 124 L 19 125 L 20 126 L 20 127 L 21 128 L 22 129 L 23 130 L 24 131 L 26 132 L 27 133 L 28 134 L 120 134 L 121 133 L 123 132 L 124 131 L 125 130 L 126 129 L 127 128 L 128 127 L 129 126 L 129 125 L 130 124 L closepath 36 139 M 36 139 L 37 140 L 39 141 L 40 142 L 42 143 L 44 144 L 47 145 L 49 146 L 52 147 L 56 148 L 60 149 L 67 150 L 80 150 L 88 149 L 92 148 L 96 147 L 99 146 L 101 145 L 104 144 L 106 143 L 108 142 L 110 141 L 111 140 L 113 139 L closepath fill grestore 0707070014230642441006440057030057030000011710140522627502600003500000000402post.src/devopost/charlib/Lb /build_Lb { pop /picstr 78 string def gsave currentpoint translate 1.03 72 mul size mul 36 div .5 72 mul size mul 36 div scale 309 150 1 [309 0 0 -150 0 150] {currentfile picstr readhexstring pop} image grestore } def 0707070014230642451006440057030057030000011710700522627502600004100000027112post.src/devopost/charlib/Lb.map FFFFFFFFFFFFFFFFF0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFE0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFE00000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFC0000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFF000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFC000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFF8FFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFC00000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF81FFFFFFFFFC0000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFE00000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFC00000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFF800000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFF000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFE0007FFFFFFFF8000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFE7FFFFFFFFFFFFFFE000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF0000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF80000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFF01FFFFFFFFFFFFFFFFC000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFE00000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFE00000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFC00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFC00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF800000000000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF80FFFFFFFFFFFFFFFFFE0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFC0000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F87FFFFFFFFFFFFFFFFFFFFC000000000000FFFFFFFFC0003F00000000003FFFFFC00000000007 F000000007FFFFFFFFFFC000000000000000FFFFFFFFC0003F00000000003FFFFFC00000000007 F000000000000000000000000000000000007FFFFFFF80001F00000000003FFFFFC00000000007 F000000000000000000000000000000000007FFFFFFF80001F00000000003FFFFFC00000000007 E000000000000000000000000000000000007FFFFFFF80001F00000000003FFFFFC00000000007 E000000000000000000000000000000000003FFFFFFF00000F00000000003FFFFFC00000000007 E000000000000000000000000000000000003FFFFFFF00000F00000000003FFFFFC00000000007 E0007FFFFFFFFFFFFFFFFC000000000000003FFFFFFF00000F00000000003FFFFFC00000000007 C0FFFFFFFFFFFFFFFFFFFFFFC000000000003FFFFFFE00000700000000003FFFFFC00000000007 FFFFFFFFFFFFFFFFFFFFFFFFFFFC000000003FFFFFFE00000700000000003FFFFFC00000000007 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000700000000003FE3FFC00000000007 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000003000000000038001FC00000000007 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000003FFFC0007FFE00007FFFF0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FFFFFFC000003FFFC0007FF800003FFFF0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFF800000000001FFFFFF8000003FFFC0007FF000001FFFF0001FFFF 8FFFFFFFFFFFFFFFFFFFFFF80000000000000FFFFFF8000001FFFC0007FE000000FFFF0001FFFF 8000FFFFFFFFFFFFFFFFF0000000000000000FFFFFF8000001FFFC0007FE000000FFFF0001FFFF 8000000000000000000000000000000000000FFFFFF0000001FFFC0007FC000000FFFF0001FFFF 0000000000000000000000000000000000000FFFFFF0000000FFFC0007FC0000007FFF0001FFFF 0000000000000000000000000000000000000FFFFFF0002000FFFC0007F80018007FFF0001FFFF 0000000000000000000000000000000000000FFFFFE0006000FFFC0007F8003C007FFF0001FFFF 00000000000000000000000000000000000007FFFFE00060007FFC0007F8003C007FFF0001FFFF 00000007FFFFFFFFFFFE000000000000000007FFFFE00070007FFC0007F8003C007FFF0001FFFF 000FFFFFFFFFFFFFFFFFFFF000000000000007FFFFC00070007FFC0007F8003C007FFF0001FFFF 07FFFFFFFFFFFFFFFFFFFFFFFC000000000007FFFFC000F0003FFC0007FC003C007FFF0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000F0003FFC0007FC001C007FFF0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000F8003FFC0007FC000C007FFF0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8001F8001FFC0007FE000000001F0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8001F8001FFC0007FE0001FF001F0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFF0000000000007FFFF0001F8001FFC0007FF0000FF001F0001FFFF 007FFFFFFFFFFFFFFFFFFFC000000000000007FFFF0003FC001FFC0007FE00007F001F0001FFFF 00003FFFFFFFFFFFFFFF000000000000000007FFFF0003FC000FFC0007FC00003F001F0001FFFF 00000000000000000000000000000000000007FFFE0003FC000FFC0007F800001F001F0001FFFF 00000000000000000000000000000000000007FFFE000000000FFC0007F8000007001F0001FFFF 0000000000000000000000000000000000000FFFFE0000000007FC0007F8000003001F0001FFFF 0000000000000000000000000000000000000FFFFC0000000007FC0007F0000001001F0001FFFF 8000000000000000000000000000000000000FFFFC0000000007FC0007F0000000001F0001FFFF 8000000000000000000000000000000000000FFFFC0000000003FC0007E0018000001F0001FFFF 80003FFFFFFFFFFFFFFF80000000000000000FFFF80000000003FC0007E001C000001F0001FFFF 80FFFFFFFFFFFFFFFFFFFFFC0000000000000FFFF80000000003FC0007E001F000001F0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000000001FC0007E000F800001F0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000001FC0007E000FC00001F0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000001FC0007E0007E00003F0001FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FC0007E0001E00003F0001FFFF FFFFFFFFFFFFFFFFFFFFFFE00000000000003FFFE00000000000FC0007F000000000070001FFFF C003FFFFFFFFFFFFFFE000000000000000003FFFE0003FFFC000FC0007F000000000070001FFFF E000000FFFFFFFFC800000000000000000003FFFE0007FFFC0007C0007F800000000070001FFFF E000000000000000000000000000000000003FFFC0007FFFE0007C0007F800000000070001FFFF E000000000000000000000000000000000003FFFC0007FFFE0007C0007FC00000000070001FFFF E000000000000000000000000000000000003FFFC000FFFFE0007C0007FE00000000070001FFFF F000000000000000000000000000000000007FFF8000FFFFE0003C0007FF00000000070001FFFF F000000000000000000000000000000000007FFF8000FFFFF0003C0007FF80000000070001FFFF F000000000000000000000000000000000007FFF8001FFFFF0003C0007FFE000003C070001FFFF F80000000000000000000000000000000000FFFF0001FFFFF0001C0007FFF80001FF070001FFFF F8000000007FF80000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF800FFFFFFFFFFFFF FC00007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FC07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF03FFFFFFFFFFFFFFFC0000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF0000007FFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFC00000000000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFE00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFE00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFF00000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFF0000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFF8000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFC000003FFFE00000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFE007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFC0000000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFE0000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFF0000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFF0000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFF800000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFC00000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFE00000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF00000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFF00000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFF8000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFE000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFF000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFC0000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFF0000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFE00000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFF0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0707070014230642461006440057030057030000011710150522627502600004100000001173post.src/devopost/charlib/README Postscript definitions for special troff characters. File names are the two character troff names. Each defines a PostScript procedure that begins with build_ and ends with the character's name. The build_?? procedure is called with the character width as it's only argument. The .map files contain extra character data (e.g. image data) that dpost downloads immediately after the build_?? call, if the character's font table code field is 2 (rather than 1). The following PostScript variables are available: font current font ptsize current point size size actual font size - scaled up from ptsize Don't overuse this stuff! 0707070014230642471006440057030057030000011710160522627502600003500000002631post.src/devopost/charlib/Sl /build_Sl { pop gsave size .0022 mul dup scale currentpoint translate 14 93 moveto 14 96 lineto 29 110 lineto 44 121 lineto 54 127 lineto 55 132 lineto 57 146 lineto 59 157 lineto 62 171 lineto 66 186 lineto 70 199 lineto 75 213 lineto 81 228 lineto 88 243 lineto 96 257 lineto 106 272 lineto 118 287 lineto 133 300 lineto 148 307 lineto 163 308 lineto 178 304 lineto 191 293 lineto 197 281 lineto 198 277 lineto 198 260 lineto 194 246 lineto 187 231 lineto 179 217 lineto 168 202 lineto 155 187 lineto 141 172 lineto 126 158 lineto 111 146 lineto 96 136 lineto 94 131 lineto 93 123 lineto 92 112 lineto 91 103 lineto 90 93 lineto 89 81 lineto 89 40 lineto 92 28 lineto 97 18 lineto 108 10 lineto 122 10 lineto 134 18 lineto 145 33 lineto 152 48 lineto 158 62 lineto 168 58 lineto 168 59 lineto 163 45 lineto 157 31 lineto 148 16 lineto 133 3 lineto 118 -1 lineto 103 0 lineto 88 5 lineto 73 18 lineto 64 31 lineto 58 46 lineto 55 59 lineto 53 73 lineto 52 111 lineto 37 101 lineto 22 86 lineto 14 93 lineto 97 152 moveto 97 153 lineto 99 166 lineto 101 178 lineto 103 190 lineto 106 205 lineto 109 218 lineto 113 232 lineto 118 246 lineto 124 261 lineto 132 275 lineto 144 290 lineto 157 298 lineto 171 298 lineto 181 291 lineto 186 283 lineto 187 279 lineto 187 264 lineto 186 260 lineto 181 246 lineto 174 233 lineto 165 218 lineto 155 204 lineto 142 190 lineto 127 175 lineto 112 162 lineto 97 152 lineto eofill grestore } def 0707070014230642501006440057030057030000011711140522627502600003500000000264post.src/devopost/charlib/bx /build_bx { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath fill } def 0707070014230642511006440057030057030000011711150522627502600003500000000221post.src/devopost/charlib/ci /build_ci { pop size 3 mul 8 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 0707070014230642521006440057030057030000011711160522627502600003500000000074post.src/devopost/charlib/ff /build_ff { pop size .05 mul neg 0 (ff) ashow } def 0707070014230642531006440057030057030000011711170522627502600003500000001716post.src/devopost/charlib/lc % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch neg rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 0707070014230642541006440057030057030000011711300522627502600003500000001712post.src/devopost/charlib/lf % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 0707070014230642551006440057030057030000011711310522627502600003500000004412post.src/devopost/charlib/lh /build_lh { pop gsave size .0022 mul dup scale currentpoint translate 16 177 moveto 16 188 lineto 21 193 lineto 30 193 lineto 34 189 lineto 36 183 lineto 36 180 lineto 34 174 lineto 27 170 lineto 19 172 lineto 16 177 lineto stroke 38 194 moveto 38 196 lineto 53 199 lineto 68 201 lineto 83 202 lineto 98 203 lineto 113 204 lineto 128 204 lineto 143 205 lineto 158 205 lineto 173 205 lineto 188 204 lineto 203 203 lineto 218 202 lineto 233 200 lineto 248 198 lineto 263 196 lineto 278 194 lineto 293 190 lineto 308 186 lineto 323 181 lineto 338 176 lineto 353 168 lineto 361 162 lineto 364 153 lineto 366 138 lineto 367 126 lineto 368 106 lineto 369 80 lineto 369 74 lineto 368 60 lineto 367 54 lineto 362 43 lineto 348 34 lineto 333 28 lineto 318 25 lineto 303 26 lineto 288 29 lineto 273 31 lineto 258 32 lineto 243 32 lineto 228 30 lineto 213 27 lineto 198 24 lineto 183 23 lineto 168 23 lineto 153 27 lineto 148 34 lineto 148 47 lineto 153 54 lineto 168 58 lineto 183 58 lineto 198 58 lineto 213 59 lineto 226 60 lineto 228 62 lineto 228 67 lineto 223 71 lineto 208 71 lineto 193 70 lineto 178 70 lineto 163 70 lineto 148 70 lineto 133 71 lineto 123 76 lineto 120 84 lineto 120 91 lineto 122 98 lineto 129 104 lineto 144 106 lineto 159 107 lineto 174 107 lineto 189 107 lineto 202 108 lineto 204 110 lineto 204 117 lineto 201 119 lineto 186 119 lineto 171 119 lineto 156 119 lineto 141 119 lineto 126 119 lineto 111 121 lineto 103 128 lineto 101 137 lineto 101 142 lineto 103 150 lineto 111 158 lineto 126 161 lineto 141 161 lineto 156 162 lineto 171 163 lineto 186 163 lineto 191 165 lineto 192 167 lineto 192 171 lineto 190 174 lineto 176 175 lineto 161 175 lineto 146 175 lineto 131 174 lineto 116 174 lineto 101 174 lineto 86 173 lineto 71 172 lineto 56 171 lineto 41 171 lineto 41 174 lineto 43 178 lineto 43 187 lineto 38 194 lineto stroke 373 169 moveto 373 176 lineto 375 182 lineto 386 190 lineto 401 193 lineto 408 191 lineto 411 185 lineto 412 181 lineto 414 167 lineto 415 158 lineto 416 144 lineto 417 128 lineto 418 110 lineto 418 60 lineto 417 45 lineto 415 37 lineto 409 34 lineto 394 31 lineto 381 35 lineto 379 42 lineto 379 52 lineto 380 67 lineto 380 77 lineto 379 77 lineto 378 106 lineto 377 121 lineto 376 133 lineto 375 147 lineto 374 158 lineto 373 169 lineto stroke grestore } def 0707070014230642561006440057030057030000011711340522627502600003500000000222post.src/devopost/charlib/ob /build_ob { pop size 3 mul 16 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 0707070014230642571006440057030057030000011711350522627502700003500000001716post.src/devopost/charlib/rc % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch neg rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 0707070014230642601006440057030057030000011711360522627502700003500000001712post.src/devopost/charlib/rf % % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 0707070014230642611006440057030057030000011711500522627502700003500000004171post.src/devopost/charlib/rh /build_rh { pop gsave size .0022 mul dup scale currentpoint translate 15 66 moveto 15 86 lineto 16 131 lineto 17 146 lineto 18 158 lineto 19 167 lineto 21 181 lineto 24 190 lineto 34 193 lineto 49 189 lineto 58 182 lineto 60 177 lineto 60 166 lineto 59 156 lineto 58 143 lineto 57 130 lineto 56 117 lineto 55 102 lineto 54 42 lineto 53 39 lineto 49 35 lineto 34 34 lineto 19 39 lineto 16 47 lineto 15 66 lineto stroke 65 60 moveto 65 111 lineto 66 127 lineto 67 139 lineto 69 153 lineto 72 163 lineto 83 171 lineto 98 177 lineto 113 182 lineto 128 187 lineto 143 190 lineto 158 194 lineto 173 196 lineto 188 199 lineto 203 201 lineto 218 203 lineto 233 205 lineto 248 205 lineto 263 206 lineto 278 206 lineto 293 206 lineto 308 206 lineto 323 206 lineto 338 205 lineto 353 203 lineto 368 202 lineto 383 200 lineto 394 197 lineto 389 190 lineto 389 180 lineto 391 176 lineto 391 173 lineto 380 173 lineto 365 173 lineto 350 174 lineto 335 175 lineto 320 176 lineto 305 176 lineto 290 176 lineto 275 177 lineto 260 177 lineto 245 177 lineto 240 173 lineto 240 170 lineto 245 165 lineto 260 164 lineto 275 164 lineto 290 164 lineto 305 163 lineto 320 160 lineto 327 155 lineto 330 149 lineto 330 134 lineto 328 129 lineto 323 124 lineto 309 121 lineto 294 121 lineto 279 121 lineto 264 121 lineto 249 121 lineto 234 121 lineto 228 118 lineto 228 112 lineto 234 109 lineto 249 109 lineto 264 109 lineto 279 108 lineto 294 108 lineto 306 104 lineto 311 97 lineto 312 91 lineto 312 88 lineto 311 82 lineto 305 74 lineto 290 72 lineto 275 72 lineto 260 72 lineto 245 73 lineto 230 73 lineto 215 73 lineto 205 70 lineto 205 63 lineto 217 60 lineto 232 60 lineto 247 60 lineto 262 60 lineto 277 57 lineto 283 52 lineto 285 44 lineto 285 41 lineto 284 35 lineto 280 30 lineto 268 26 lineto 253 25 lineto 238 26 lineto 223 28 lineto 208 31 lineto 193 33 lineto 178 34 lineto 163 33 lineto 148 31 lineto 133 28 lineto 118 27 lineto 103 28 lineto 88 34 lineto 73 43 lineto 67 52 lineto 65 60 lineto stroke 396 180 moveto 396 188 lineto 399 194 lineto 410 196 lineto 416 190 lineto 416 180 lineto 415 177 lineto 411 173 lineto 400 173 lineto 396 180 lineto stroke grestore } def 0707070014230642621006440057030057030000011711370522627502700003500000000320post.src/devopost/charlib/sq /build_sq { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath font B eq {fill} {stroke} ifelse } def 0707070014230642631006440057030057030000011711530522627502700003500000000130post.src/devopost/charlib/~= /build_~= { pop (\176) stringwidth pop neg size -.15 mul (\176\055) ashow } def 0707070014230362361006440057030057030000011044500522627502700003600000003013post.src/devopost/devopost.mk MAKE=/bin/make MAKEFILE=devopost.mk SYSTEM=SYSV VERSION=3.3 GROUP=bin OWNER=bin FONTDIR=/usr/lib/font FONTFILES=DESC ? ?? [A-Z]??* all : install : all @rm -fr $(FONTDIR)/devopost/*.out @if [ ! -d $(FONTDIR) ]; then \ mkdir $(FONTDIR); \ chmod 755 $(FONTDIR); \ chgrp $(GROUP) $(FONTDIR); \ chown $(OWNER) $(FONTDIR); \ fi @if [ ! -d $(FONTDIR)/devopost ]; then \ mkdir $(FONTDIR)/devopost; \ chmod 755 $(FONTDIR)/devopost; \ chgrp $(GROUP) $(FONTDIR)/devopost; \ chown $(OWNER) $(FONTDIR)/devopost; \ fi @if [ ! -d $(FONTDIR)/devopost/charlib ]; then \ mkdir $(FONTDIR)/devopost/charlib; \ chmod 755 $(FONTDIR)/devopost/charlib; \ chgrp $(GROUP) $(FONTDIR)/devopost/charlib; \ chown $(OWNER) $(FONTDIR)/devopost/charlib; \ fi cp $(FONTFILES) $(FONTDIR)/devopost @for i in $(FONTFILES); do \ chmod 644 $(FONTDIR)/devopost/$$i; \ chgrp $(GROUP) $(FONTDIR)/devopost/$$i; \ chown $(OWNER) $(FONTDIR)/devopost/$$i; \ done cp charlib/* $(FONTDIR)/devopost/charlib @for i in charlib/*; do \ chmod 644 $(FONTDIR)/devopost/$$i; \ chgrp $(GROUP) $(FONTDIR)/devopost/$$i; \ chown $(OWNER) $(FONTDIR)/devopost/$$i; \ done clean : clobber : clean changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014231030720407550057030057030000020303470522627503100002500000000000post.src/devpost.add 0707070014231030731006440057030057030000010304460522627502700003000000003356post.src/devpost.add/C1 name C1 fontname CenturyOldStyle-Regular ligatures fi fl 0 spacewidth 25 charset ! 26 2 33 " 40 2 34 dq " # 50 2 35 $ 50 3 36 % 58 2 37 & 79 2 38 ' 21 2 39 ( 40 3 40 ) 40 3 41 * 50 2 42 + 50 0 43 , 25 1 44 hy 24 0 45 - " . 25 0 46 / 53 3 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 40 2 63 @ 85 2 64 A 66 2 65 B 69 2 66 C 69 2 67 D 76 2 68 E 66 2 69 F 61 2 70 G 74 2 71 H 76 2 72 I 34 2 73 J 40 3 74 K 71 2 75 L 58 2 76 M 95 2 77 N 76 2 78 O 76 2 79 P 61 2 80 Q 76 3 81 R 63 2 82 S 55 2 83 T 63 2 84 U 74 2 85 V 66 2 86 W 95 2 87 X 63 2 88 Y 63 2 89 Z 58 2 90 [ 40 3 91 \ 25 2 92 bs " ] 40 3 93 --- 50 2 94 --- 50 1 95 ` 21 2 96 a 47 0 97 b 55 2 98 c 47 0 99 d 55 2 100 e 50 0 101 f 29 2 102 g 55 1 103 h 58 2 104 i 26 2 105 j 24 3 106 k 55 2 107 l 26 2 108 m 84 0 109 n 55 0 110 o 53 0 111 p 53 1 112 q 55 1 113 r 40 0 114 s 45 0 115 t 31 2 116 u 55 0 117 v 47 0 118 w 71 0 119 x 53 0 120 y 50 1 121 z 45 0 122 { 40 3 123 --- 25 2 124 } 40 3 125 --- 50 0 126 --- 26 1 161 ct 50 2 162 ps 50 2 163 fr 9 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 21 2 169 `` 40 2 170 --- 47 0 171 --- 29 0 172 --- 29 0 173 fi 58 2 174 fl 55 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 25 0 180 pg 66 3 182 --- 66 0 183 --- 21 1 184 --- 40 1 185 '' 40 2 186 --- 47 0 187 --- 100 0 188 --- 92 2 189 --- 40 1 191 ga 29 2 193 \` " aa 29 2 194 \' " ^a 37 2 195 ^ " ~a 50 2 196 ~ " -a 47 2 197 Ua 50 2 198 .a 26 2 199 :a 47 2 200 oa 34 2 202 ,a 34 1 203 "a 40 2 205 Ca 37 1 206 va 37 2 207 em 100 0 208 --- 103 2 225 --- 34 2 227 --- 58 2 232 --- 76 2 233 --- 108 2 234 --- 34 2 235 --- 76 0 241 --- 26 0 245 --- 26 2 248 --- 53 0 249 --- 84 0 250 --- 58 2 251 0707070014231030741006440057030057030000010304600522627502700003000000003355post.src/devpost.add/C2 name C2 fontname CenturyOldStyle-Italic ligatures fi fl 0 spacewidth 27 charset ! 31 2 33 " 35 2 34 dq " # 54 0 35 $ 54 3 36 % 70 2 37 & 75 2 38 ' 21 2 39 ( 46 3 40 ) 46 3 41 * 59 2 42 + 54 0 43 , 27 1 44 hy 25 0 45 - " . 27 0 46 / 46 3 47 0 54 2 48 1 54 0 49 2 54 2 50 3 54 2 51 4 54 0 52 5 54 0 53 6 54 2 54 7 54 0 55 8 54 2 56 9 54 2 57 : 27 0 58 ; 27 1 59 --- 54 0 60 = 54 0 61 --- 54 0 62 ? 48 2 63 @ 78 2 64 A 67 2 65 B 68 2 66 C 65 2 67 D 75 2 68 E 66 2 69 F 61 2 70 G 72 2 71 H 77 2 72 I 36 2 73 J 34 3 74 K 68 2 75 L 58 2 76 M 90 2 77 N 74 2 78 O 74 2 79 P 59 2 80 Q 75 3 81 R 65 2 82 S 57 2 83 T 63 2 84 U 72 2 85 V 62 2 86 W 88 2 87 X 64 2 88 Y 61 2 89 Z 57 2 90 [ 46 3 91 \ 27 2 92 bs " ] 46 3 93 --- 54 2 94 --- 50 1 95 ` 21 2 96 a 54 0 97 b 46 2 98 c 41 0 99 d 50 2 100 e 42 0 101 f 25 3 102 g 45 1 103 h 52 2 104 i 31 2 105 j 27 3 106 k 48 2 107 l 27 2 108 m 82 0 109 n 56 0 110 o 47 0 111 p 50 1 112 q 49 1 113 r 40 0 114 s 35 0 115 t 30 0 116 u 56 0 117 v 47 0 118 w 69 0 119 x 41 0 120 y 40 1 121 z 39 0 122 { 46 3 123 --- 27 2 124 } 46 3 125 --- 54 0 126 --- 31 1 161 ct 54 0 162 ps 54 2 163 fr 5 2 164 yn 54 0 165 fn 54 3 166 sc 59 3 167 cr 54 0 168 --- 19 2 169 `` 37 2 170 --- 45 0 171 --- 29 0 172 --- 29 0 173 fi 52 3 174 fl 52 3 175 en 50 0 177 \- " dg 59 3 178 dd 59 3 179 --- 27 0 180 pg 61 3 182 --- 61 0 183 --- 21 1 184 --- 37 1 185 '' 37 2 186 --- 45 0 187 --- 100 0 188 --- 103 2 189 --- 48 1 191 ga 39 2 193 \` " aa 31 2 194 \' " ^a 40 2 195 ^ " ~a 51 2 196 ~ " -a 47 0 197 Ua 51 2 198 .a 26 2 199 :a 46 2 200 oa 32 2 202 ,a 35 1 203 "a 39 2 205 Ca 34 1 206 va 40 2 207 em 100 0 208 --- 94 2 225 --- 32 2 227 --- 58 2 232 --- 74 2 233 --- 107 2 234 --- 32 2 235 --- 69 0 241 --- 31 0 245 --- 27 2 248 --- 47 0 249 --- 71 0 250 --- 53 2 251 0707070014231030751006440057030057030000010304620522627502700003000000003355post.src/devpost.add/C3 name C3 fontname CenturyOldStyle-Bold ligatures fi fl 0 spacewidth 33 charset ! 34 2 33 " 40 2 34 dq " # 56 2 35 $ 66 3 36 % 79 2 37 & 84 2 38 ' 28 2 39 ( 39 3 40 ) 39 3 41 * 56 2 42 + 56 0 43 , 33 1 44 hy 32 0 45 - " . 33 0 46 / 51 3 47 0 66 2 48 1 66 2 49 2 66 2 50 3 66 2 51 4 66 2 52 5 66 2 53 6 66 2 54 7 66 2 55 8 66 2 56 9 66 2 57 : 33 0 58 ; 33 1 59 --- 56 0 60 = 56 0 61 --- 56 0 62 ? 47 2 63 @ 72 2 64 A 69 2 65 B 76 2 66 C 70 2 67 D 80 2 68 E 71 2 69 F 64 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 48 2 74 K 76 2 75 L 63 2 76 M 94 2 77 N 80 2 78 O 81 2 79 P 72 2 80 Q 81 3 81 R 72 2 82 S 61 2 83 T 60 2 84 U 78 2 85 V 64 2 86 W 97 2 87 X 68 2 88 Y 67 2 89 Z 59 2 90 [ 39 3 91 \ 28 2 92 bs " ] 39 3 93 --- 56 2 94 --- 50 1 95 ` 28 2 96 a 53 0 97 b 60 2 98 c 52 0 99 d 62 2 100 e 54 0 101 f 30 2 102 g 52 3 103 h 62 2 104 i 31 2 105 j 27 3 106 k 60 2 107 l 30 2 108 m 92 0 109 n 62 0 110 o 57 0 111 p 61 1 112 q 60 1 113 r 44 0 114 s 50 0 115 t 33 2 116 u 63 0 117 v 50 0 118 w 74 0 119 x 53 0 120 y 49 1 121 z 44 0 122 { 39 3 123 --- 28 2 124 } 39 3 125 --- 56 0 126 --- 34 1 161 ct 66 2 162 ps 66 2 163 fr 10 2 164 yn 66 2 165 fn 66 3 166 sc 56 3 167 cr 66 2 168 --- 22 2 169 `` 52 2 170 --- 58 0 171 --- 37 0 172 --- 37 0 173 fi 62 2 174 fl 61 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 33 0 180 pg 62 3 182 --- 62 0 183 --- 28 1 184 --- 52 1 185 '' 52 2 186 --- 58 0 187 --- 100 0 188 --- 118 2 189 --- 47 1 191 ga 34 2 193 \` " aa 34 2 194 \' " ^a 45 2 195 ^ " ~a 56 2 196 ~ " -a 53 2 197 Ua 56 2 198 .a 29 2 199 :a 51 2 200 oa 34 2 202 ,a 37 1 203 "a 50 2 205 Ca 38 1 206 va 45 2 207 em 100 0 208 --- 109 2 225 --- 40 2 227 --- 63 2 232 --- 81 2 233 --- 114 2 234 --- 40 2 235 --- 83 0 241 --- 31 0 245 --- 30 2 248 --- 57 0 249 --- 90 0 250 --- 58 2 251 0707070014231030761006440057030057030000010304640522627502700003000000003353post.src/devpost.add/F1 name F1 fontname FranklinGothic-Book ligatures fi fl 0 spacewidth 30 charset ! 30 2 33 " 46 2 34 dq " # 60 2 35 $ 60 2 36 % 70 2 37 & 68 2 38 ' 30 2 39 ( 30 3 40 ) 30 3 41 * 60 2 42 + 60 0 43 , 30 1 44 hy 22 0 45 - " . 30 0 46 / 52 3 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 30 0 58 ; 30 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 54 2 63 @ 80 2 64 A 56 2 65 B 62 2 66 C 62 2 67 D 66 2 68 E 56 2 69 F 48 2 70 G 66 2 71 H 66 2 72 I 26 2 73 J 40 2 74 K 62 2 75 L 50 2 76 M 82 2 77 N 66 2 78 O 66 2 79 P 56 2 80 Q 66 3 81 R 62 2 82 S 62 2 83 T 50 2 84 U 64 2 85 V 56 2 86 W 82 2 87 X 54 2 88 Y 56 2 89 Z 54 2 90 [ 30 3 91 \ 52 2 92 bs " ] 30 3 93 --- 60 2 94 --- 50 1 95 ` 30 2 96 a 54 0 97 b 54 2 98 c 48 0 99 d 54 2 100 e 54 0 101 f 30 2 102 g 50 1 103 h 54 2 104 i 24 2 105 j 22 3 106 k 50 2 107 l 24 2 108 m 82 0 109 n 54 0 110 o 54 0 111 p 54 1 112 q 54 1 113 r 32 0 114 s 52 0 115 t 32 2 116 u 54 0 117 v 44 0 118 w 66 0 119 x 44 0 120 y 42 1 121 z 42 0 122 { 30 3 123 --- 26 2 124 } 30 3 125 --- 60 0 126 --- 30 1 161 ct 60 2 162 ps 60 2 163 fr 16 2 164 yn 60 2 165 fn 60 3 166 sc 60 3 167 cr 60 0 168 --- 30 2 169 `` 46 2 170 --- 40 0 171 --- 26 0 172 --- 26 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 60 3 178 dd 60 3 179 --- 30 0 180 pg 54 3 182 --- 60 0 183 --- 30 1 184 --- 46 1 185 '' 46 2 186 --- 40 0 187 --- 100 0 188 --- 104 2 189 --- 54 1 191 ga 38 2 193 \` " aa 38 2 194 \' " ^a 48 2 195 ^ " ~a 50 2 196 ~ " -a 46 2 197 Ua 48 2 198 .a 24 2 199 :a 40 2 200 oa 32 2 202 ,a 32 1 203 "a 50 2 205 Ca 32 1 206 va 48 2 207 em 100 0 208 --- 96 2 225 --- 36 2 227 --- 50 2 232 --- 66 2 233 --- 100 2 234 --- 36 2 235 --- 90 0 241 --- 24 0 245 --- 20 2 248 --- 54 0 249 --- 88 0 250 --- 58 2 251 0707070014231030771006440057030057030000010304660522627502700003000000003362post.src/devpost.add/F2 name F2 fontname FranklinGothic-BookOblique ligatures fi fl 0 spacewidth 30 charset ! 30 2 33 " 46 2 34 dq " # 60 2 35 $ 60 2 36 % 70 2 37 & 68 2 38 ' 30 2 39 ( 30 3 40 ) 30 3 41 * 60 2 42 + 60 0 43 , 30 1 44 hy 22 0 45 - " . 30 0 46 / 52 3 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 30 0 58 ; 30 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 54 2 63 @ 80 2 64 A 56 2 65 B 62 2 66 C 62 2 67 D 66 2 68 E 56 2 69 F 48 2 70 G 66 2 71 H 66 2 72 I 26 2 73 J 40 2 74 K 62 2 75 L 50 2 76 M 82 2 77 N 66 2 78 O 66 2 79 P 56 2 80 Q 66 3 81 R 62 2 82 S 62 2 83 T 50 2 84 U 64 2 85 V 56 2 86 W 82 2 87 X 54 2 88 Y 56 2 89 Z 54 2 90 [ 30 3 91 \ 52 2 92 bs " ] 30 3 93 --- 60 2 94 --- 50 1 95 ` 30 2 96 a 54 0 97 b 54 2 98 c 48 0 99 d 54 2 100 e 54 0 101 f 30 2 102 g 50 1 103 h 54 2 104 i 24 2 105 j 22 3 106 k 50 2 107 l 24 2 108 m 82 0 109 n 54 0 110 o 54 0 111 p 54 1 112 q 54 1 113 r 32 0 114 s 52 0 115 t 32 2 116 u 54 0 117 v 44 0 118 w 66 0 119 x 44 0 120 y 42 1 121 z 42 0 122 { 30 3 123 --- 26 2 124 } 30 3 125 --- 60 0 126 --- 30 1 161 ct 60 2 162 ps 60 2 163 fr 16 2 164 yn 60 2 165 fn 60 3 166 sc 60 3 167 cr 60 0 168 --- 30 2 169 `` 46 2 170 --- 40 0 171 --- 26 0 172 --- 26 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 60 3 178 dd 60 3 179 --- 30 0 180 pg 54 3 182 --- 60 0 183 --- 30 1 184 --- 46 1 185 '' 46 2 186 --- 40 0 187 --- 100 0 188 --- 104 2 189 --- 54 1 191 ga 38 2 193 \` " aa 38 2 194 \' " ^a 48 2 195 ^ " ~a 50 2 196 ~ " -a 46 2 197 Ua 48 2 198 .a 24 2 199 :a 40 2 200 oa 32 2 202 ,a 32 1 203 "a 50 2 205 Ca 32 1 206 va 48 2 207 em 100 0 208 --- 96 2 225 --- 36 2 227 --- 50 2 232 --- 66 2 233 --- 100 2 234 --- 36 2 235 --- 90 0 241 --- 24 0 245 --- 20 2 248 --- 54 0 249 --- 88 0 250 --- 58 2 251 0707070014231031001006440057030057030000010305000522627502700003000000003351post.src/devpost.add/F3 name F3 fontname FranklinGothic-Demi ligatures fi fl 0 spacewidth 30 charset ! 32 2 33 " 46 2 34 dq " # 60 2 35 $ 60 2 36 % 70 2 37 & 72 2 38 ' 30 2 39 ( 38 3 40 ) 38 3 41 * 60 2 42 + 60 0 43 , 30 1 44 hy 24 0 45 - " . 30 0 46 / 60 3 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 30 0 58 ; 30 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 54 2 63 @ 80 2 64 A 64 2 65 B 66 2 66 C 66 2 67 D 66 2 68 E 58 2 69 F 54 2 70 G 66 2 71 H 66 2 72 I 30 2 73 J 40 2 74 K 64 2 75 L 50 2 76 M 88 2 77 N 66 2 78 O 66 2 79 P 62 2 80 Q 66 3 81 R 66 2 82 S 60 2 83 T 54 2 84 U 66 2 85 V 60 2 86 W 90 2 87 X 64 2 88 Y 60 2 89 Z 66 2 90 [ 38 3 91 \ 60 2 92 bs " ] 38 3 93 --- 60 2 94 --- 50 1 95 ` 30 2 96 a 54 0 97 b 54 2 98 c 54 0 99 d 54 2 100 e 54 0 101 f 30 2 102 g 56 3 103 h 54 2 104 i 26 2 105 j 26 3 106 k 56 2 107 l 26 2 108 m 82 0 109 n 54 0 110 o 54 0 111 p 54 1 112 q 54 1 113 r 34 0 114 s 50 0 115 t 38 2 116 u 54 0 117 v 48 0 118 w 74 0 119 x 54 0 120 y 48 1 121 z 42 0 122 { 38 3 123 --- 30 2 124 } 38 3 125 --- 60 0 126 --- 32 1 161 ct 60 2 162 ps 60 2 163 fr 8 2 164 yn 60 2 165 fn 60 3 166 sc 60 3 167 cr 60 0 168 --- 30 2 169 `` 48 2 170 --- 40 0 171 --- 26 0 172 --- 26 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 60 3 178 dd 60 3 179 --- 30 0 180 pg 54 3 182 --- 60 0 183 --- 30 1 184 --- 48 1 185 '' 48 2 186 --- 40 0 187 --- 100 0 188 --- 104 2 189 --- 54 1 191 ga 38 2 193 \` " aa 40 2 194 \' " ^a 50 2 195 ^ " ~a 50 2 196 ~ " -a 46 2 197 Ua 52 2 198 .a 26 2 199 :a 42 2 200 oa 32 2 202 ,a 34 1 203 "a 52 2 205 Ca 34 1 206 va 52 2 207 em 100 0 208 --- 90 2 225 --- 36 2 227 --- 52 2 232 --- 66 2 233 --- 96 2 234 --- 36 2 235 --- 82 0 241 --- 26 0 245 --- 26 2 248 --- 54 0 249 --- 86 0 250 --- 66 2 251 0707070014231031011006440057030057030000010305020522627502700003000000003360post.src/devpost.add/F4 name F4 fontname FranklinGothic-DemiOblique ligatures fi fl 0 spacewidth 30 charset ! 32 2 33 " 46 2 34 dq " # 60 2 35 $ 60 2 36 % 70 2 37 & 72 2 38 ' 30 2 39 ( 38 3 40 ) 38 3 41 * 60 2 42 + 60 0 43 , 30 1 44 hy 24 0 45 - " . 30 0 46 / 60 3 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 30 0 58 ; 30 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 54 2 63 @ 80 2 64 A 64 2 65 B 66 2 66 C 66 2 67 D 66 2 68 E 58 2 69 F 54 2 70 G 66 2 71 H 66 2 72 I 30 2 73 J 40 2 74 K 64 2 75 L 50 2 76 M 88 2 77 N 66 2 78 O 66 2 79 P 62 2 80 Q 66 3 81 R 66 2 82 S 60 2 83 T 54 2 84 U 66 2 85 V 60 2 86 W 90 2 87 X 64 2 88 Y 60 2 89 Z 66 2 90 [ 38 3 91 \ 60 2 92 bs " ] 38 3 93 --- 60 2 94 --- 50 1 95 ` 30 2 96 a 54 0 97 b 54 2 98 c 54 0 99 d 54 2 100 e 54 0 101 f 30 2 102 g 56 3 103 h 54 2 104 i 26 2 105 j 26 3 106 k 56 2 107 l 26 2 108 m 82 0 109 n 54 0 110 o 54 0 111 p 54 1 112 q 54 1 113 r 34 0 114 s 50 0 115 t 38 2 116 u 54 0 117 v 48 0 118 w 74 0 119 x 54 0 120 y 48 1 121 z 42 0 122 { 38 3 123 --- 30 2 124 } 38 3 125 --- 60 0 126 --- 32 1 161 ct 60 2 162 ps 60 2 163 fr 8 2 164 yn 60 2 165 fn 60 3 166 sc 60 3 167 cr 60 0 168 --- 30 2 169 `` 48 2 170 --- 40 0 171 --- 26 0 172 --- 26 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 60 3 178 dd 60 3 179 --- 30 0 180 pg 54 3 182 --- 60 0 183 --- 30 1 184 --- 48 1 185 '' 48 2 186 --- 40 0 187 --- 100 0 188 --- 104 2 189 --- 54 1 191 ga 38 2 193 \` " aa 40 2 194 \' " ^a 50 2 195 ^ " ~a 50 2 196 ~ " -a 46 2 197 Ua 52 2 198 .a 26 2 199 :a 42 2 200 oa 32 2 202 ,a 34 1 203 "a 52 2 205 Ca 34 1 206 va 52 2 207 em 100 0 208 --- 90 2 225 --- 36 2 227 --- 52 2 232 --- 66 2 233 --- 96 2 234 --- 36 2 235 --- 82 0 241 --- 26 0 245 --- 26 2 248 --- 54 0 249 --- 86 0 250 --- 66 2 251 0707070014231031021006440057030057030000010305040522627502700003000000003353post.src/devpost.add/F5 name F5 fontname FranklinGothic-Heavy ligatures fi fl 0 spacewidth 30 charset ! 32 2 33 " 52 2 34 dq " # 60 2 35 $ 60 2 36 % 74 2 37 & 78 2 38 ' 30 2 39 ( 38 3 40 ) 38 3 41 * 60 2 42 + 60 0 43 , 30 1 44 hy 26 0 45 - " . 30 0 46 / 60 3 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 30 0 58 ; 30 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 60 2 63 @ 80 2 64 A 66 2 65 B 66 2 66 C 66 2 67 D 68 2 68 E 60 2 69 F 54 2 70 G 68 2 71 H 68 2 72 I 32 2 73 J 44 2 74 K 66 2 75 L 54 2 76 M 86 2 77 N 70 2 78 O 70 2 79 P 66 2 80 Q 70 3 81 R 68 2 82 S 66 2 83 T 50 2 84 U 66 2 85 V 66 2 86 W 92 2 87 X 70 2 88 Y 66 2 89 Z 60 2 90 [ 38 3 91 \ 60 2 92 bs " ] 38 3 93 --- 60 2 94 --- 50 1 95 ` 30 2 96 a 58 0 97 b 58 2 98 c 54 0 99 d 58 2 100 e 60 0 101 f 40 2 102 g 58 3 103 h 58 2 104 i 30 2 105 j 30 3 106 k 58 2 107 l 30 2 108 m 86 0 109 n 58 0 110 o 60 0 111 p 58 1 112 q 58 1 113 r 38 0 114 s 54 0 115 t 40 2 116 u 60 0 117 v 54 0 118 w 78 0 119 x 58 0 120 y 54 1 121 z 50 0 122 { 38 3 123 --- 30 2 124 } 38 3 125 --- 60 0 126 --- 32 1 161 ct 60 2 162 ps 60 2 163 fr 12 2 164 yn 60 2 165 fn 60 3 166 sc 60 3 167 cr 60 0 168 --- 30 2 169 `` 52 2 170 --- 42 0 171 --- 26 0 172 --- 26 0 173 fi 62 2 174 fl 60 2 175 en 50 0 177 \- " dg 60 3 178 dd 60 3 179 --- 30 0 180 pg 54 3 182 --- 60 0 183 --- 30 1 184 --- 52 1 185 '' 52 2 186 --- 42 0 187 --- 100 0 188 --- 108 2 189 --- 60 1 191 ga 40 2 193 \` " aa 40 2 194 \' " ^a 54 2 195 ^ " ~a 50 2 196 ~ " -a 46 2 197 Ua 52 2 198 .a 28 2 199 :a 44 2 200 oa 34 2 202 ,a 34 1 203 "a 60 2 205 Ca 34 1 206 va 54 2 207 em 100 0 208 --- 96 2 225 --- 38 2 227 --- 56 2 232 --- 70 2 233 --- 98 2 234 --- 38 2 235 --- 82 0 241 --- 30 0 245 --- 30 2 248 --- 60 0 249 --- 86 0 250 --- 66 2 251 0707070014231031031006440057030057030000010305060522627502700003000000003361post.src/devpost.add/F6 name F6 fontname FranklinGothic-HeavyOblique ligatures fi fl 0 spacewidth 30 charset ! 32 2 33 " 52 2 34 dq " # 60 2 35 $ 60 2 36 % 74 2 37 & 78 2 38 ' 30 2 39 ( 38 3 40 ) 38 3 41 * 60 2 42 + 60 0 43 , 30 1 44 hy 26 0 45 - " . 30 0 46 / 60 3 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 30 0 58 ; 30 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 60 2 63 @ 80 2 64 A 66 2 65 B 66 2 66 C 66 2 67 D 68 2 68 E 60 2 69 F 54 2 70 G 68 2 71 H 68 2 72 I 32 2 73 J 44 2 74 K 66 2 75 L 54 2 76 M 86 2 77 N 70 2 78 O 70 2 79 P 66 2 80 Q 70 3 81 R 68 2 82 S 66 2 83 T 50 2 84 U 66 2 85 V 66 2 86 W 92 2 87 X 70 2 88 Y 66 2 89 Z 60 2 90 [ 38 3 91 \ 60 2 92 bs " ] 38 3 93 --- 60 2 94 --- 50 1 95 ` 30 2 96 a 58 0 97 b 58 2 98 c 54 0 99 d 58 2 100 e 60 0 101 f 40 2 102 g 58 3 103 h 58 2 104 i 30 2 105 j 30 3 106 k 58 2 107 l 30 2 108 m 86 0 109 n 58 0 110 o 60 0 111 p 58 1 112 q 58 1 113 r 38 0 114 s 54 0 115 t 40 2 116 u 60 0 117 v 54 0 118 w 78 0 119 x 58 0 120 y 54 1 121 z 50 0 122 { 38 3 123 or 30 2 124 } 38 3 125 --- 60 0 126 --- 32 1 161 ct 60 2 162 ps 60 2 163 fr 12 2 164 yn 60 2 165 fn 60 3 166 sc 60 3 167 cr 60 0 168 --- 30 2 169 `` 52 2 170 --- 42 0 171 --- 26 0 172 --- 26 0 173 fi 62 2 174 fl 60 2 175 en 50 0 177 \- " dg 60 3 178 dd 60 3 179 --- 30 0 180 pg 54 3 182 --- 60 0 183 --- 30 1 184 --- 52 1 185 '' 52 2 186 --- 42 0 187 --- 100 0 188 --- 108 2 189 --- 60 1 191 ga 40 2 193 \` " aa 40 2 194 \' " ^a 54 2 195 ^ " ~a 50 2 196 ~ " -a 46 2 197 Ua 52 2 198 .a 28 2 199 :a 44 2 200 oa 34 2 202 ,a 34 1 203 "a 60 2 205 Ca 34 1 206 va 54 2 207 em 100 0 208 --- 96 2 225 --- 38 2 227 --- 56 2 232 --- 70 2 233 --- 98 2 234 --- 38 2 235 --- 82 0 241 --- 30 0 245 --- 30 2 248 --- 60 0 249 --- 86 0 250 --- 66 2 251 0707070014231031041006440057030057030000010305200522627502700003000000003346post.src/devpost.add/G1 name G1 fontname Garamond-Light ligatures fi fl 0 spacewidth 32 charset ! 22 2 33 " 34 2 34 dq " # 60 2 35 $ 50 2 36 % 76 2 37 & 70 2 38 ' 22 2 39 ( 36 3 40 ) 36 3 41 * 34 2 42 + 56 0 43 , 26 1 44 hy 32 0 45 - " . 26 0 46 / 40 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 26 0 58 ; 26 1 59 --- 56 0 60 = 56 0 61 --- 56 0 62 ? 30 2 63 @ 74 3 64 A 64 2 65 B 64 2 66 C 62 2 67 D 74 2 68 E 56 2 69 F 52 2 70 G 74 2 71 H 74 2 72 I 32 2 73 J 32 2 74 K 66 2 75 L 48 2 76 M 80 2 77 N 70 2 78 O 78 2 79 P 56 2 80 Q 78 3 81 R 58 2 82 S 48 2 83 T 58 2 84 U 70 2 85 V 64 2 86 W 92 2 87 X 64 2 88 Y 66 2 89 Z 60 2 90 [ 24 3 91 \ 52 2 92 bs " ] 24 3 93 --- 56 2 94 --- 50 1 95 ` 22 2 96 a 48 0 97 b 56 2 98 c 46 0 99 d 56 2 100 e 50 0 101 f 30 2 102 g 52 1 103 h 56 2 104 i 26 2 105 j 22 3 106 k 54 2 107 l 26 2 108 m 82 0 109 n 56 0 110 o 56 0 111 p 58 1 112 q 56 1 113 r 34 0 114 s 40 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 78 0 119 x 52 0 120 y 50 1 121 z 46 0 122 { 26 3 123 --- 56 3 124 } 26 3 125 --- 56 0 126 --- 22 1 161 ct 50 2 162 ps 64 2 163 fr 16 2 164 yn 66 2 165 fn 50 3 166 sc 36 3 167 cr 50 2 168 --- 20 2 169 `` 38 2 170 --- 26 0 171 --- 16 0 172 --- 16 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 40 3 178 dd 40 3 179 --- 26 0 180 pg 62 3 182 --- 62 0 183 --- 22 1 184 --- 36 1 185 '' 38 2 186 --- 26 0 187 --- 100 0 188 --- 108 2 189 --- 30 1 191 ga 36 2 193 \` " aa 36 2 194 \' " ^a 42 2 195 ^ " ~a 42 2 196 ~ " -a 38 2 197 Ua 40 2 198 .a 22 2 199 :a 40 2 200 oa 28 2 202 ,a 32 1 203 "a 38 2 205 Ca 30 1 206 va 42 2 207 em 100 0 208 --- 94 2 225 --- 34 2 227 --- 48 2 232 --- 78 2 233 --- 100 2 234 --- 34 2 235 --- 74 0 241 --- 26 0 245 --- 26 2 248 --- 56 0 249 --- 88 0 250 --- 56 2 251 0707070014231031051006440057030057030000010305220522627502700003000000003353post.src/devpost.add/G2 name G2 fontname Garamond-LightItalic ligatures fi fl 0 spacewidth 27 charset ! 26 2 33 " 35 2 34 dq " # 54 2 35 $ 55 2 36 % 78 2 37 & 64 2 38 ' 25 2 39 ( 38 3 40 ) 38 3 41 * 32 2 42 + 57 0 43 , 27 1 44 hy 33 0 45 - " . 27 0 46 / 30 2 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 27 0 58 ; 27 1 59 --- 57 0 60 = 57 0 61 --- 57 0 62 ? 35 2 63 @ 69 3 64 A 64 2 65 B 63 2 66 C 63 2 67 D 72 2 68 E 55 2 69 F 52 2 70 G 71 2 71 H 73 2 72 I 31 2 73 J 30 2 74 K 63 2 75 L 46 2 76 M 80 2 77 N 66 2 78 O 72 2 79 P 58 2 80 Q 73 3 81 R 58 2 82 S 46 2 83 T 54 2 84 U 63 2 85 V 62 2 86 W 90 2 87 X 65 2 88 Y 58 2 89 Z 59 2 90 [ 23 3 91 \ 51 2 92 bs " ] 23 3 93 --- 57 2 94 --- 50 1 95 ` 25 2 96 a 57 0 97 b 52 2 98 c 46 0 99 d 57 2 100 e 44 0 101 f 30 2 102 g 48 1 103 h 56 2 104 i 30 2 105 j 27 3 106 k 49 2 107 l 26 2 108 m 84 0 109 n 62 0 110 o 50 0 111 p 51 1 112 q 52 1 113 r 39 0 114 s 36 0 115 t 28 2 116 u 61 0 117 v 46 0 118 w 73 0 119 x 53 0 120 y 47 1 121 z 51 0 122 { 26 3 123 --- 57 3 124 } 26 3 125 --- 57 0 126 --- 26 1 161 ct 55 2 162 ps 65 2 163 fr 12 2 164 yn 55 2 165 fn 55 3 166 sc 36 3 167 cr 56 2 168 --- 19 2 169 `` 41 2 170 --- 27 0 171 --- 16 0 172 --- 16 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 42 3 178 dd 42 3 179 --- 27 0 180 pg 61 3 182 --- 62 0 183 --- 25 1 184 --- 41 1 185 '' 41 2 186 --- 27 0 187 --- 100 0 188 --- 113 2 189 --- 35 1 191 ga 39 2 193 \` " aa 34 2 194 \' " ^a 43 2 195 ^ " ~a 46 2 196 ~ " -a 38 2 197 Ua 43 2 198 .a 21 2 199 :a 36 2 200 oa 29 2 202 ,a 33 1 203 "a 32 2 205 Ca 29 1 206 va 43 2 207 em 100 0 208 --- 80 2 225 --- 37 2 227 --- 47 2 232 --- 72 2 233 --- 92 2 234 --- 37 2 235 --- 78 0 241 --- 30 0 245 --- 29 2 248 --- 50 0 249 --- 81 0 250 --- 59 2 251 0707070014231031061006440057030057030000010305240522627503000003000000003345post.src/devpost.add/G3 name G3 fontname Garamond-Bold ligatures fi fl 0 spacewidth 28 charset ! 28 2 33 " 40 2 34 dq " # 60 2 35 $ 56 2 36 % 88 2 37 & 76 2 38 ' 26 2 39 ( 40 3 40 ) 40 3 41 * 34 2 42 + 56 0 43 , 28 1 44 hy 30 0 45 - " . 28 0 46 / 44 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 56 0 60 = 56 0 61 --- 56 0 62 ? 42 2 63 @ 72 3 64 A 66 2 65 B 64 2 66 C 66 2 67 D 76 2 68 E 60 2 69 F 56 2 70 G 72 2 71 H 78 2 72 I 36 2 73 J 40 2 74 K 74 2 75 L 54 2 76 M 86 2 77 N 72 2 78 O 76 2 79 P 60 2 80 Q 76 3 81 R 66 2 82 S 52 2 83 T 60 2 84 U 70 2 85 V 64 2 86 W 94 2 87 X 70 2 88 Y 68 2 89 Z 62 2 90 [ 28 3 91 \ 54 2 92 bs " ] 28 3 93 --- 56 2 94 --- 50 1 95 ` 26 2 96 a 52 0 97 b 60 2 98 c 50 0 99 d 60 2 100 e 52 0 101 f 36 2 102 g 54 1 103 h 66 2 104 i 32 2 105 j 30 3 106 k 60 2 107 l 32 2 108 m 94 0 109 n 66 0 110 o 60 0 111 p 64 1 112 q 60 1 113 r 46 0 114 s 46 0 115 t 34 2 116 u 60 0 117 v 54 0 118 w 82 0 119 x 62 0 120 y 56 1 121 z 48 0 122 { 28 3 123 --- 56 3 124 } 28 3 125 --- 56 0 126 --- 28 1 161 ct 56 2 162 ps 68 2 163 fr 56 2 164 yn 72 2 165 fn 66 3 166 sc 40 3 167 cr 56 2 168 --- 22 2 169 `` 44 2 170 --- 34 0 171 --- 20 0 172 --- 20 0 173 fi 70 2 174 fl 70 2 175 en 50 0 177 \- " dg 54 3 178 dd 54 3 179 --- 28 0 180 pg 66 3 182 --- 62 0 183 --- 26 1 184 --- 44 1 185 '' 44 2 186 --- 34 0 187 --- 100 0 188 --- 126 2 189 --- 42 1 191 ga 40 2 193 \` " aa 40 2 194 \' " ^a 50 2 195 ^ " ~a 52 2 196 ~ " -a 52 2 197 Ua 48 2 198 .a 30 2 199 :a 44 2 200 oa 32 2 202 ,a 32 1 203 "a 42 2 205 Ca 34 1 206 va 50 2 207 em 100 0 208 --- 96 2 225 --- 36 2 227 --- 54 2 232 --- 76 2 233 --- 100 2 234 --- 36 2 235 --- 80 0 241 --- 32 0 245 --- 34 2 248 --- 60 0 249 --- 92 0 250 --- 64 2 251 0707070014231031071006440057030057030000010305260522627503000003000000003354post.src/devpost.add/G4 name G4 fontname Garamond-BoldItalic ligatures fi fl 0 spacewidth 28 charset ! 24 2 33 " 40 2 34 dq " # 56 2 35 $ 56 2 36 % 76 2 37 & 74 2 38 ' 22 2 39 ( 48 3 40 ) 48 3 41 * 54 2 42 + 56 0 43 , 24 1 44 hy 30 0 45 - " . 24 0 46 / 44 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 24 0 58 ; 24 1 59 --- 56 0 60 = 56 0 61 --- 56 0 62 ? 40 2 63 @ 76 3 64 A 64 2 65 B 64 2 66 C 64 2 67 D 76 2 68 E 64 2 69 F 60 2 70 G 72 2 71 H 84 2 72 I 42 2 73 J 40 2 74 K 76 2 75 L 56 2 76 M 88 2 77 N 74 2 78 O 74 2 79 P 68 2 80 Q 74 3 81 R 72 2 82 S 52 2 83 T 58 2 84 U 72 2 85 V 64 2 86 W 90 2 87 X 72 2 88 Y 62 2 89 Z 62 2 90 [ 34 3 91 \ 54 2 92 bs " ] 34 3 93 --- 56 2 94 --- 50 1 95 ` 22 2 96 a 62 0 97 b 56 2 98 c 50 0 99 d 62 2 100 e 52 0 101 f 38 2 102 g 56 1 103 h 64 2 104 i 34 2 105 j 32 3 106 k 60 2 107 l 28 2 108 m 86 0 109 n 58 0 110 o 60 0 111 p 64 1 112 q 60 1 113 r 50 0 114 s 50 0 115 t 34 2 116 u 64 0 117 v 52 0 118 w 82 0 119 x 66 0 120 y 54 1 121 z 56 0 122 { 34 3 123 --- 56 3 124 } 34 3 125 --- 56 0 126 --- 24 1 161 ct 56 2 162 ps 56 2 163 fr 18 2 164 yn 56 2 165 fn 56 3 166 sc 54 3 167 cr 56 2 168 --- 22 2 169 `` 42 2 170 --- 42 0 171 --- 24 0 172 --- 24 0 173 fi 70 2 174 fl 66 2 175 en 50 0 177 \- " dg 54 3 178 dd 54 3 179 --- 24 0 180 pg 70 3 182 --- 62 0 183 --- 22 1 184 --- 42 1 185 '' 42 2 186 --- 42 0 187 --- 100 0 188 --- 114 2 189 --- 40 1 191 ga 42 2 193 \` " aa 38 2 194 \' " ^a 50 2 195 ^ " ~a 56 2 196 ~ " -a 52 2 197 Ua 50 2 198 .a 26 2 199 :a 48 2 200 oa 32 2 202 ,a 38 1 203 "a 38 2 205 Ca 34 1 206 va 50 2 207 em 100 0 208 --- 100 2 225 --- 40 2 227 --- 56 2 232 --- 76 2 233 --- 104 2 234 --- 38 2 235 --- 88 0 241 --- 34 0 245 --- 28 2 248 --- 60 0 249 --- 90 0 250 --- 64 2 251 0707070014231031101006440057030057030000010305400522627503000003000000003344post.src/devpost.add/Gb name Gb fontname Goudy-Bold ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 50 2 34 dq " # 61 2 35 $ 56 2 36 % 89 2 37 & 89 2 38 ' 28 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 39 2 63 @ 75 3 64 A 78 2 65 B 67 2 66 C 72 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 83 2 72 I 39 2 73 J 39 2 74 K 72 2 75 L 61 2 76 M 89 2 77 N 83 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 72 2 82 S 56 2 83 T 72 2 84 U 83 2 85 V 78 2 86 W 100 2 87 X 72 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 \ 61 2 92 bs " ] 33 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 2 102 g 44 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 39 0 122 { 33 3 123 --- 61 3 124 } 33 3 125 --- 61 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 50 3 167 cr 56 2 168 --- 28 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 28 0 180 pg 63 3 182 --- 61 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 39 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 28 2 227 --- 61 2 232 --- 78 2 233 --- 100 2 234 --- 30 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 0 249 --- 78 0 250 --- 56 2 251 0707070014231031111006440057030057030000010305420522627503000003000000003343post.src/devpost.add/Gi name Gi fontname Goudy-Italic ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 44 2 34 dq " # 61 2 35 $ 50 2 36 % 83 2 37 & 83 2 38 ' 28 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 39 2 63 @ 75 3 64 A 72 2 65 B 61 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 78 2 72 I 33 2 73 J 33 2 74 K 67 2 75 L 56 2 76 M 89 2 77 N 78 2 78 O 78 2 79 P 56 2 80 Q 78 3 81 R 61 2 82 S 50 2 83 T 67 2 84 U 78 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 56 2 89 Z 56 2 90 [ 28 3 91 \ 61 2 92 bs " ] 28 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 44 0 97 b 44 2 98 c 39 0 99 d 44 2 100 e 39 0 101 f 28 2 102 g 39 1 103 h 44 2 104 i 22 2 105 j 22 3 106 k 44 2 107 l 22 2 108 m 72 0 109 n 50 0 110 o 44 0 111 p 44 1 112 q 44 1 113 r 33 0 114 s 33 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 28 3 123 --- 61 3 124 } 28 3 125 --- 61 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 61 2 168 --- 28 2 169 `` 44 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 33 0 180 pg 63 3 182 --- 61 0 183 --- 28 1 184 --- 44 1 185 '' 44 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 39 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 94 2 225 --- 50 2 227 --- 56 2 232 --- 78 2 233 --- 94 2 234 --- 50 2 235 --- 67 0 241 --- 22 0 245 --- 22 2 248 --- 44 0 249 --- 72 0 250 --- 50 2 251 0707070014231031121006440057030057030000010305440522627503000003000000003347post.src/devpost.add/Gr name Gr fontname Goudy-Regular ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 37 2 34 dq " # 61 2 35 $ 50 2 36 % 83 2 37 & 83 2 38 ' 22 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 33 2 63 @ 75 3 64 A 78 2 65 B 61 2 66 C 72 2 67 D 72 2 68 E 56 2 69 F 50 2 70 G 78 2 71 H 78 2 72 I 33 2 73 J 33 2 74 K 67 2 75 L 56 2 76 M 89 2 77 N 78 2 78 O 78 2 79 P 56 2 80 Q 78 3 81 R 67 2 82 S 56 2 83 T 67 2 84 U 78 2 85 V 72 2 86 W 100 2 87 X 67 2 88 Y 61 2 89 Z 56 2 90 [ 28 3 91 \ 61 2 92 bs " ] 28 3 93 --- 61 2 94 --- 50 1 95 ` 22 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 2 102 g 44 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 33 0 115 t 33 2 116 u 50 0 117 v 50 0 118 w 67 0 119 x 50 0 120 y 44 1 121 z 33 0 122 { 28 3 123 --- 61 3 124 } 28 3 125 --- 61 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 22 2 169 `` 39 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 25 0 180 pg 63 3 182 --- 61 0 183 --- 22 1 184 --- 39 1 185 '' 39 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 33 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 39 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 43 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 0 249 --- 78 0 250 --- 50 2 251 0707070014231031131006440057030057030000010305460522627503000003000000003347post.src/devpost.add/Gx name Gx fontname Goudy-BoldItalic ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 50 2 34 dq " # 61 2 35 $ 56 2 36 % 83 2 37 & 83 2 38 ' 28 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 39 2 63 @ 75 3 64 A 72 2 65 B 67 2 66 C 67 2 67 D 78 2 68 E 67 2 69 F 61 2 70 G 72 2 71 H 78 2 72 I 39 2 73 J 44 2 74 K 72 2 75 L 61 2 76 M 94 2 77 N 78 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 72 2 82 S 50 2 83 T 72 2 84 U 78 2 85 V 67 2 86 W 94 2 87 X 72 2 88 Y 61 2 89 Z 61 2 90 [ 39 3 91 \ 61 2 92 bs " ] 39 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 2 102 g 44 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 44 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 44 0 118 w 72 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 39 3 123 --- 61 3 124 } 39 3 125 --- 61 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 50 3 167 cr 61 2 168 --- 28 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 33 0 180 pg 63 3 182 --- 61 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 39 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 89 2 225 --- 30 2 227 --- 61 2 232 --- 78 2 233 --- 94 2 234 --- 30 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 44 0 249 --- 72 0 250 --- 50 2 251 0707070014231031141006440057030057030000010305600522627503000003000000003360post.src/devpost.add/H1 name H1 fontname Helvetica-Condensed-Light ligatures fi fl 0 spacewidth 22 charset ! 22 2 33 " 31 2 34 dq " # 44 2 35 $ 44 2 36 % 78 2 37 & 61 2 38 ' 16 2 39 ( 28 3 40 ) 28 3 41 * 39 2 42 + 44 0 43 , 22 1 44 hy 33 0 45 - " . 22 0 46 / 28 2 47 0 44 2 48 1 44 2 49 2 44 2 50 3 44 2 51 4 44 2 52 5 44 2 53 6 44 2 54 7 44 2 55 8 44 2 56 9 44 2 57 : 22 0 58 ; 22 1 59 --- 44 0 60 = 44 0 61 --- 44 0 62 ? 39 2 63 @ 80 3 64 A 50 2 65 B 50 2 66 C 56 2 67 D 56 2 68 E 44 2 69 F 44 2 70 G 56 2 71 H 56 2 72 I 22 2 73 J 39 2 74 K 50 2 75 L 44 2 76 M 72 2 77 N 56 2 78 O 56 2 79 P 50 2 80 Q 56 3 81 R 50 2 82 S 50 2 83 T 44 2 84 U 56 2 85 V 50 2 86 W 72 2 87 X 50 2 88 Y 50 2 89 Z 44 2 90 [ 28 3 91 \ 22 2 92 bs " ] 28 3 93 --- 44 2 94 --- 50 1 95 ` 22 2 96 a 39 0 97 b 44 2 98 c 39 0 99 d 44 2 100 e 39 0 101 f 22 2 102 g 44 1 103 h 44 2 104 i 22 2 105 j 22 3 106 k 39 2 107 l 22 2 108 m 67 0 109 n 44 0 110 o 44 0 111 p 44 1 112 q 44 1 113 r 28 0 114 s 39 0 115 t 22 2 116 u 44 0 117 v 39 0 118 w 56 0 119 x 39 0 120 y 39 1 121 z 33 0 122 { 35 3 123 --- 22 3 124 } 35 3 125 --- 44 0 126 --- 22 1 161 ct 44 2 162 ps 44 2 163 fr 17 2 164 yn 44 2 165 fn 44 3 166 sc 44 3 167 cr 44 2 168 --- 20 2 169 `` 33 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 44 2 174 fl 44 2 175 en 50 0 177 \- " dg 44 3 178 dd 44 3 179 --- 22 0 180 pg 56 3 182 --- 61 0 183 --- 22 1 184 --- 33 1 185 '' 33 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 39 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 72 2 225 --- 27 2 227 --- 44 2 232 --- 56 2 233 --- 78 2 234 --- 27 2 235 --- 61 0 241 --- 20 0 245 --- 22 2 248 --- 44 0 249 --- 67 0 250 --- 44 2 251 0707070014231031151006440057030057030000010305620522627503000003000000003367post.src/devpost.add/H2 name H2 fontname Helvetica-Condensed-LightOblique ligatures fi fl 0 spacewidth 22 charset ! 22 2 33 " 31 2 34 dq " # 44 2 35 $ 44 2 36 % 78 2 37 & 61 2 38 ' 16 2 39 ( 28 3 40 ) 28 3 41 * 39 2 42 + 44 0 43 , 22 1 44 hy 33 0 45 - " . 22 0 46 / 28 2 47 0 44 2 48 1 44 2 49 2 44 2 50 3 44 2 51 4 44 2 52 5 44 2 53 6 44 2 54 7 44 2 55 8 44 2 56 9 44 2 57 : 22 0 58 ; 22 1 59 --- 44 0 60 = 44 0 61 --- 44 0 62 ? 39 2 63 @ 80 3 64 A 50 2 65 B 50 2 66 C 56 2 67 D 56 2 68 E 44 2 69 F 44 2 70 G 56 2 71 H 56 2 72 I 22 2 73 J 39 2 74 K 50 2 75 L 44 2 76 M 72 2 77 N 56 2 78 O 56 2 79 P 50 2 80 Q 56 3 81 R 50 2 82 S 50 2 83 T 44 2 84 U 56 2 85 V 50 2 86 W 72 2 87 X 50 2 88 Y 50 2 89 Z 44 2 90 [ 28 3 91 \ 22 2 92 bs " ] 28 3 93 --- 44 2 94 --- 50 1 95 ` 22 2 96 a 39 0 97 b 44 2 98 c 39 0 99 d 44 2 100 e 39 0 101 f 22 2 102 g 44 1 103 h 44 2 104 i 22 2 105 j 22 3 106 k 39 2 107 l 22 2 108 m 67 0 109 n 44 0 110 o 44 0 111 p 44 1 112 q 44 1 113 r 28 0 114 s 39 0 115 t 22 2 116 u 44 0 117 v 39 0 118 w 56 0 119 x 39 0 120 y 39 1 121 z 33 0 122 { 35 3 123 --- 22 3 124 } 35 3 125 --- 44 0 126 --- 22 1 161 ct 44 2 162 ps 44 2 163 fr 17 2 164 yn 44 2 165 fn 44 3 166 sc 44 3 167 cr 44 2 168 --- 20 2 169 `` 33 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 44 2 174 fl 44 2 175 en 50 0 177 \- " dg 44 3 178 dd 44 3 179 --- 22 0 180 pg 56 3 182 --- 61 0 183 --- 22 1 184 --- 33 1 185 '' 33 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 39 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 72 2 225 --- 27 2 227 --- 44 2 232 --- 56 2 233 --- 78 2 234 --- 27 2 235 --- 61 0 241 --- 20 0 245 --- 22 2 248 --- 44 0 249 --- 67 0 250 --- 44 2 251 0707070014231031161006440057030057030000010305640522627503000003000000003352post.src/devpost.add/H3 name H3 fontname Helvetica-Condensed ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 25 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 50 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 50 2 63 @ 80 3 64 A 56 2 65 B 56 2 66 C 56 2 67 D 61 2 68 E 50 2 69 F 44 2 70 G 61 2 71 H 61 2 72 I 28 2 73 J 44 2 74 K 56 2 75 L 50 2 76 M 78 2 77 N 61 2 78 O 61 2 79 P 56 2 80 Q 61 3 81 R 61 2 82 S 56 2 83 T 50 2 84 U 61 2 85 V 56 2 86 W 83 2 87 X 56 2 88 Y 56 2 89 Z 50 2 90 [ 33 3 91 \ 25 2 92 bs " ] 33 3 93 --- 50 2 94 --- 50 1 95 ` 22 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 2 102 g 50 1 103 h 50 2 104 i 22 2 105 j 22 3 106 k 44 2 107 l 22 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 44 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 27 3 123 --- 25 3 124 } 27 3 125 --- 48 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 25 2 169 `` 39 2 170 --- 50 0 171 --- 28 0 172 --- 28 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 28 0 180 pg 44 3 182 --- 33 0 183 --- 22 1 184 --- 39 1 185 '' 39 2 186 --- 50 0 187 --- 100 0 188 --- 111 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 83 2 225 --- 30 2 227 --- 50 2 232 --- 61 2 233 --- 83 2 234 --- 30 2 235 --- 67 0 241 --- 22 0 245 --- 22 2 248 --- 50 0 249 --- 72 0 250 --- 50 2 251 0707070014231031171006440057030057030000010305660522627503000003000000003362post.src/devpost.add/H4 name H4 fontname Helvetica-Condensed-Oblique ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 25 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 50 0 43 , 25 1 44 hy 33 0 45 - " . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 50 2 63 @ 80 3 64 A 56 2 65 B 56 2 66 C 56 2 67 D 61 2 68 E 50 2 69 F 44 2 70 G 61 2 71 H 61 2 72 I 28 2 73 J 44 2 74 K 56 2 75 L 50 2 76 M 78 2 77 N 61 2 78 O 61 2 79 P 56 2 80 Q 61 3 81 R 61 2 82 S 56 2 83 T 50 2 84 U 61 2 85 V 56 2 86 W 83 2 87 X 56 2 88 Y 56 2 89 Z 50 2 90 [ 33 3 91 \ 25 2 92 bs " ] 33 3 93 --- 50 2 94 --- 50 1 95 ` 22 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 2 102 g 50 1 103 h 50 2 104 i 22 2 105 j 22 3 106 k 44 2 107 l 22 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 44 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 27 3 123 --- 25 3 124 } 27 3 125 --- 48 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 25 2 169 `` 39 2 170 --- 50 0 171 --- 28 0 172 --- 28 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 28 0 180 pg 44 3 182 --- 33 0 183 --- 22 1 184 --- 39 1 185 '' 39 2 186 --- 50 0 187 --- 100 0 188 --- 111 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 83 2 225 --- 30 2 227 --- 50 2 232 --- 61 2 233 --- 83 2 234 --- 30 2 235 --- 67 0 241 --- 22 0 245 --- 22 2 248 --- 50 0 249 --- 72 0 250 --- 50 2 251 0707070014231031201006440057030057030000010306000522627503000003000000003357post.src/devpost.add/H5 name H5 fontname Helvetica-Condensed-Bold ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 33 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 67 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 50 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 50 2 63 @ 83 3 64 A 56 2 65 B 56 2 66 C 56 2 67 D 61 2 68 E 50 2 69 F 50 2 70 G 61 2 71 H 61 2 72 I 28 2 73 J 44 2 74 K 56 2 75 L 50 2 76 M 78 2 77 N 61 2 78 O 61 2 79 P 56 2 80 Q 61 3 81 R 61 2 82 S 56 2 83 T 50 2 84 U 61 2 85 V 56 2 86 W 83 2 87 X 56 2 88 Y 56 2 89 Z 50 2 90 [ 33 3 91 \ 25 2 92 bs " ] 33 3 93 --- 50 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 50 0 101 f 28 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 44 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 27 3 123 --- 25 3 124 } 27 3 125 --- 50 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 25 2 169 `` 50 2 170 --- 50 0 171 --- 28 0 172 --- 28 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 33 0 180 pg 55 3 182 --- 42 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 111 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 78 2 225 --- 30 2 227 --- 50 2 232 --- 61 2 233 --- 83 2 234 --- 30 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 0 249 --- 72 0 250 --- 50 2 251 0707070014231031211006440057030057030000010306020522627503000003000000003366post.src/devpost.add/H6 name H6 fontname Helvetica-Condensed-BoldOblique ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 33 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 67 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 50 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 50 2 63 @ 83 3 64 A 56 2 65 B 56 2 66 C 56 2 67 D 61 2 68 E 50 2 69 F 50 2 70 G 61 2 71 H 61 2 72 I 28 2 73 J 44 2 74 K 56 2 75 L 50 2 76 M 78 2 77 N 61 2 78 O 61 2 79 P 56 2 80 Q 61 3 81 R 61 2 82 S 56 2 83 T 50 2 84 U 61 2 85 V 56 2 86 W 83 2 87 X 56 2 88 Y 56 2 89 Z 50 2 90 [ 33 3 91 \ 25 2 92 bs " ] 33 3 93 --- 50 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 50 0 101 f 28 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 44 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 27 3 123 --- 25 3 124 } 27 3 125 --- 50 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 25 2 169 `` 50 2 170 --- 50 0 171 --- 28 0 172 --- 28 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 33 0 180 pg 55 3 182 --- 42 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 111 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 78 2 225 --- 30 2 227 --- 50 2 232 --- 61 2 233 --- 83 2 234 --- 30 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 0 249 --- 72 0 250 --- 50 2 251 0707070014231031221006440057030057030000010306040522627503000003000000003360post.src/devpost.add/H7 name H7 fontname Helvetica-Condensed-Black ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 33 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 67 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 50 2 42 + 50 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 50 2 63 @ 83 3 64 A 56 2 65 B 56 2 66 C 56 2 67 D 56 2 68 E 50 2 69 F 50 2 70 G 56 2 71 H 56 2 72 I 28 2 73 J 44 2 74 K 56 2 75 L 44 2 76 M 78 2 77 N 56 2 78 O 56 2 79 P 56 2 80 Q 56 3 81 R 56 2 82 S 50 2 83 T 50 2 84 U 56 2 85 V 56 2 86 W 78 2 87 X 56 2 88 Y 56 2 89 Z 44 2 90 [ 28 3 91 \ 25 2 92 bs " ] 28 3 93 --- 50 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 50 2 98 c 50 0 99 d 50 2 100 e 50 0 101 f 33 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 72 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 44 0 115 t 33 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 27 3 123 --- 25 3 124 } 27 3 125 --- 50 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 25 2 169 `` 50 2 170 --- 50 0 171 --- 28 0 172 --- 28 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 33 0 180 pg 55 3 182 --- 42 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 111 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 78 2 225 --- 30 2 227 --- 44 2 232 --- 56 2 233 --- 78 2 234 --- 30 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 0 249 --- 72 0 250 --- 50 2 251 0707070014231031231006440057030057030000010306060522627503000003000000003367post.src/devpost.add/H8 name H8 fontname Helvetica-Condensed-BlackOblique ligatures fi fl 0 spacewidth 25 charset ! 33 2 33 " 33 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 67 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 50 2 42 + 50 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 50 2 63 @ 83 3 64 A 56 2 65 B 56 2 66 C 56 2 67 D 56 2 68 E 50 2 69 F 50 2 70 G 56 2 71 H 56 2 72 I 28 2 73 J 44 2 74 K 56 2 75 L 44 2 76 M 78 2 77 N 56 2 78 O 56 2 79 P 56 2 80 Q 56 3 81 R 56 2 82 S 50 2 83 T 50 2 84 U 56 2 85 V 56 2 86 W 78 2 87 X 56 2 88 Y 56 2 89 Z 44 2 90 [ 28 3 91 \ 25 2 92 bs " ] 28 3 93 --- 50 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 50 2 98 c 50 0 99 d 50 2 100 e 50 0 101 f 33 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 72 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 44 0 115 t 33 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 27 3 123 --- 25 3 124 } 27 3 125 --- 50 0 126 --- 33 1 161 ct 50 2 162 ps 50 2 163 fr 17 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 25 2 169 `` 50 2 170 --- 50 0 171 --- 28 0 172 --- 28 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 33 0 180 pg 55 3 182 --- 42 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 111 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 78 2 225 --- 30 2 227 --- 44 2 232 --- 56 2 233 --- 78 2 234 --- 30 2 235 --- 72 0 241 --- 28 0 245 --- 28 2 248 --- 50 0 249 --- 72 0 250 --- 50 2 251 0707070014231031241006440057030057030000010306200522627503000003000000003355post.src/devpost.add/HC name HC fontname Helvetica-Black ligatures fi fl 0 spacewidth 33 charset ! 33 2 33 " 50 2 34 dq " # 66 2 35 $ 67 2 36 % 100 2 37 & 89 2 38 ' 28 2 39 ( 39 3 40 ) 39 3 41 * 56 2 42 + 66 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 67 2 48 1 67 2 49 2 67 2 50 3 67 2 51 4 67 2 52 5 67 2 53 6 67 2 54 7 67 2 55 8 67 2 56 9 67 2 57 : 33 0 58 ; 33 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 61 2 63 @ 74 3 64 A 78 2 65 B 78 2 66 C 78 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 83 2 71 H 83 2 72 I 39 2 73 J 67 2 74 K 83 2 75 L 67 2 76 M 94 2 77 N 83 2 78 O 83 2 79 P 72 2 80 Q 83 3 81 R 78 2 82 S 72 2 83 T 72 2 84 U 83 2 85 V 78 2 86 W 100 2 87 X 78 2 88 Y 78 2 89 Z 72 2 90 [ 39 3 91 \ 28 2 92 bs " ] 39 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 67 0 97 b 67 2 98 c 67 0 99 d 67 2 100 e 67 0 101 f 38 2 102 g 67 1 103 h 67 2 104 i 33 2 105 j 33 3 106 k 67 2 107 l 33 2 108 m 100 0 109 n 67 0 110 o 67 0 111 p 67 1 112 q 67 1 113 r 44 0 114 s 61 0 115 t 44 2 116 u 67 0 117 v 61 0 118 w 94 0 119 x 67 0 120 y 61 1 121 z 56 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 --- 66 0 126 --- 33 1 161 ct 67 2 162 ps 67 2 163 fr 17 2 164 yn 67 2 165 fn 67 3 166 sc 67 3 167 cr 66 2 168 --- 28 2 169 `` 50 2 170 --- 67 0 171 --- 33 0 172 --- 33 0 173 fi 67 2 174 fl 67 2 175 en 50 0 177 \- " dg 67 3 178 dd 67 3 179 --- 33 0 180 pg 85 3 182 --- 50 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 67 0 187 --- 100 0 188 --- 100 2 189 --- 61 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 40 2 227 --- 67 2 232 --- 83 2 233 --- 100 2 234 --- 40 2 235 --- 100 0 241 --- 33 0 245 --- 33 2 248 --- 67 0 249 --- 100 0 250 --- 67 2 251 0707070014231031251006440057030057030000010306220522627503000003000000003357post.src/devpost.add/HK name HK fontname Helvetica-LightOblique ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 66 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 3 124 } 33 3 125 --- 66 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 2 168 --- 22 2 169 `` 39 2 170 --- 56 0 171 --- 39 0 172 --- 39 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 65 3 182 --- 50 0 183 --- 22 1 184 --- 39 1 185 '' 39 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 33 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 33 2 235 --- 89 0 241 --- 22 0 245 --- 22 2 248 --- 56 0 249 --- 94 0 250 --- 50 2 251 0707070014231031261006440057030057030000010306240522627503000003000000003350post.src/devpost.add/HL name HL fontname Helvetica-Light ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 66 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 3 124 } 33 3 125 --- 66 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 2 168 --- 22 2 169 `` 39 2 170 --- 56 0 171 --- 39 0 172 --- 39 0 173 fi 50 2 174 fl 50 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 65 3 182 --- 50 0 183 --- 22 1 184 --- 39 1 185 '' 39 2 186 --- 56 0 187 --- 100 0 188 --- 100 2 189 --- 50 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 33 2 227 --- 56 2 232 --- 78 2 233 --- 100 2 234 --- 33 2 235 --- 89 0 241 --- 22 0 245 --- 22 2 248 --- 56 0 249 --- 94 0 250 --- 50 2 251 0707070014231031271006440057030057030000010306260522627503000003000000003364post.src/devpost.add/HY name HY fontname Helvetica-BlackOblique ligatures fi fl 0 spacewidth 33 charset ! 33 2 33 " 50 2 34 dq " # 66 2 35 $ 67 2 36 % 100 2 37 & 89 2 38 ' 28 2 39 ( 39 3 40 ) 39 3 41 * 56 2 42 + 66 0 43 , 33 1 44 hy 33 0 45 - " . 33 0 46 / 28 2 47 0 67 2 48 1 67 2 49 2 67 2 50 3 67 2 51 4 67 2 52 5 67 2 53 6 67 2 54 7 67 2 55 8 67 2 56 9 67 2 57 : 33 0 58 ; 33 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 61 2 63 @ 74 3 64 A 78 2 65 B 78 2 66 C 78 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 83 2 71 H 83 2 72 I 39 2 73 J 67 2 74 K 83 2 75 L 67 2 76 M 94 2 77 N 83 2 78 O 83 2 79 P 72 2 80 Q 83 3 81 R 78 2 82 S 72 2 83 T 72 2 84 U 83 2 85 V 78 2 86 W 100 2 87 X 78 2 88 Y 78 2 89 Z 72 2 90 [ 39 3 91 \ 28 2 92 bs " ] 39 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 67 0 97 b 67 2 98 c 67 0 99 d 67 2 100 e 67 0 101 f 38 2 102 g 67 1 103 h 67 2 104 i 33 2 105 j 33 3 106 k 67 2 107 l 33 2 108 m 100 0 109 n 67 0 110 o 67 0 111 p 67 1 112 q 67 1 113 r 44 0 114 s 61 0 115 t 44 2 116 u 67 0 117 v 61 0 118 w 94 0 119 x 67 0 120 y 61 1 121 z 56 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 --- 66 0 126 --- 33 1 161 ct 67 2 162 ps 67 2 163 fr 17 2 164 yn 67 2 165 fn 67 3 166 sc 67 3 167 cr 66 2 168 --- 28 2 169 `` 50 2 170 --- 67 0 171 --- 33 0 172 --- 33 0 173 fi 67 2 174 fl 67 2 175 en 50 0 177 \- " dg 67 3 178 dd 67 3 179 --- 33 0 180 pg 85 3 182 --- 50 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 67 0 187 --- 100 0 188 --- 100 2 189 --- 61 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 100 2 225 --- 40 2 227 --- 67 2 232 --- 83 2 233 --- 100 2 234 --- 40 2 235 --- 100 0 241 --- 33 0 245 --- 33 2 248 --- 67 0 249 --- 100 0 250 --- 67 2 251 0707070014231031301006440057030057030000010306400522627503000003000000004160post.src/devpost.add/MU fontname Sonata name MU charset --- 15 0 32 --- 21 0 33 --- 51 2 34 --- 22 1 35 --- 51 3 36 --- 52 1 37 --- 61 3 38 --- 13 0 39 --- 17 2 40 --- 17 2 41 --- 36 0 42 --- 30 0 43 --- 18 1 44 --- 30 0 45 --- 9 0 46 --- 17 2 47 --- 36 1 48 --- 25 1 49 --- 34 1 50 --- 32 1 51 --- 33 1 52 --- 30 1 53 --- 33 1 54 --- 34 1 55 --- 33 1 56 --- 33 1 57 --- 15 1 58 --- 27 2 59 --- 100 2 61 --- 42 0 62 --- 69 2 63 --- 20 0 64 --- 30 1 65 --- 67 2 66 --- 42 1 67 --- 81 0 68 --- 30 1 69 --- 83 2 70 --- 15 0 71 --- 30 1 72 --- 11 0 73 --- 0 1 74 --- 0 1 75 --- 41 1 76 --- 59 0 77 --- 30 0 79 --- 80 1 80 --- 30 3 81 --- 20 3 82 --- 60 3 83 --- 62 0 84 --- 66 2 85 --- 72 2 86 --- 61 0 87 --- 30 1 88 --- 56 1 89 --- 65 3 90 --- 15 2 91 --- 0 2 92 --- 46 2 93 --- 6 2 94 --- 50 0 95 --- 50 0 96 --- 30 3 97 --- 20 3 98 --- 42 1 99 --- 75 0 100 --- 55 3 101 --- 52 3 102 --- 14 2 103 --- 30 3 104 --- 10 1 105 --- 0 2 106 --- 0 2 107 --- 4 2 108 --- 6 0 109 --- 18 1 110 --- 12 1 111 --- 45 1 112 --- 30 3 113 --- 56 3 114 --- 23 0 115 --- 52 2 116 --- 66 1 117 --- 26 2 118 --- 41 0 119 --- 56 3 120 --- 30 3 121 --- 29 0 122 --- 13 2 123 --- 0 1 124 --- 46 2 125 --- 34 0 126 --- 17 2 160 --- 79 2 161 --- 25 0 162 --- 24 0 163 --- 21 0 164 --- 26 0 165 --- 23 0 166 --- 30 3 167 --- 21 3 168 --- 15 2 169 --- 25 0 170 --- 8 2 172 --- 30 0 173 --- 13 0 174 --- 30 1 175 --- 23 0 176 --- 30 1 177 --- 30 0 178 --- 34 0 179 --- 30 3 180 --- 85 0 181 --- 31 0 183 --- 120 1 184 --- 82 1 185 --- 37 1 186 --- 22 0 187 --- 23 0 188 --- 48 0 189 --- 30 2 190 --- 30 3 191 --- 30 0 192 --- 20 0 193 --- 41 2 194 --- 57 2 195 --- 78 3 196 --- 14 1 197 --- 56 3 198 --- 0 0 199 --- 0 1 200 --- 28 2 201 --- 28 0 202 --- 26 1 206 --- 30 0 207 --- 30 0 208 --- 30 0 209 --- 26 2 210 --- 46 2 211 --- 61 2 212 --- 28 2 214 --- 56 2 215 --- 47 2 217 --- 56 2 218 --- 27 0 220 --- 50 2 221 --- 44 1 222 --- 23 0 224 --- 30 1 225 --- 30 1 226 --- 15 0 227 --- 7 1 228 --- 35 3 229 --- 56 1 231 --- 28 0 232 --- 9 1 233 --- 30 3 234 --- 105 3 236 --- 15 1 237 --- 31 0 238 --- 30 1 239 --- 0 2 240 --- 4 2 241 --- 37 2 242 --- 28 0 243 --- 28 3 244 --- 0 0 246 --- 30 0 250 --- 0 1 251 0707070014231031311006440057030057030000010306430522627503000003000000003347post.src/devpost.add/OA fontname Optima-Regular name OA ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 33 2 34 dq " # 61 2 35 $ 56 2 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 44 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 39 2 63 @ 80 3 64 A 67 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 50 2 69 F 50 2 70 G 78 2 71 H 78 2 72 I 28 2 73 J 28 2 74 K 61 2 75 L 50 2 76 M 89 2 77 N 78 2 78 O 83 2 79 P 56 2 80 Q 83 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 50 2 92 bs " ] 33 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 50 0 101 f 28 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 39 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 33 3 124 } 33 3 125 --- 61 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 50 3 167 cr 56 2 168 --- 28 2 169 `` 44 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 28 0 180 pg 80 3 182 --- 61 0 183 --- 28 1 184 --- 44 1 185 '' 44 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 39 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 83 2 225 --- 32 2 227 --- 50 2 232 --- 83 2 233 --- 100 2 234 --- 34 2 235 --- 78 0 241 --- 28 0 245 --- 28 2 248 --- 56 0 249 --- 89 0 250 --- 56 2 251 0707070014231031321006440057030057030000010306450522627503100003000000003345post.src/devpost.add/OB name OB fontname Optima-Bold ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 33 2 34 dq " # 61 2 35 $ 56 2 36 % 100 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 44 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 39 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 3 64 A 67 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 50 2 69 F 50 2 70 G 78 2 71 H 78 2 72 I 33 2 73 J 33 2 74 K 61 2 75 L 50 2 76 M 89 2 77 N 78 2 78 O 83 2 79 P 56 2 80 Q 83 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 52 2 92 bs " ] 33 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 50 0 101 f 32 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 61 3 124 } 33 3 125 --- 61 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 2 168 --- 28 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 61 2 174 fl 61 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 70 3 182 --- 61 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 44 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 89 2 225 --- 33 2 227 --- 50 2 232 --- 83 2 233 --- 100 2 234 --- 34 2 235 --- 78 0 241 --- 28 0 245 --- 28 2 248 --- 56 0 249 --- 89 0 250 --- 56 2 251 0707070014231031331006440057030057030000010306600522627503100003000000003347post.src/devpost.add/OI name OI fontname Optima-Oblique ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 33 2 34 dq " # 61 2 35 $ 56 2 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 44 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 39 2 63 @ 80 3 64 A 67 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 50 2 69 F 50 2 70 G 78 2 71 H 78 2 72 I 28 2 73 J 28 2 74 K 61 2 75 L 50 2 76 M 89 2 77 N 78 2 78 O 83 2 79 P 56 2 80 Q 83 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 50 2 92 bs " ] 33 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 50 0 101 f 28 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 39 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 33 3 124 } 33 3 125 --- 61 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 50 3 167 cr 56 2 168 --- 28 2 169 `` 44 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 56 2 174 fl 56 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 28 0 180 pg 80 3 182 --- 61 0 183 --- 28 1 184 --- 44 1 185 '' 44 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 39 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 83 2 225 --- 32 2 227 --- 50 2 232 --- 83 2 233 --- 100 2 234 --- 34 2 235 --- 78 0 241 --- 28 0 245 --- 28 2 248 --- 56 0 249 --- 89 0 250 --- 56 2 251 0707070014231031341006440057030057030000010306620522627503100003000000003354post.src/devpost.add/OX name OX fontname Optima-BoldOblique ligatures fi fl 0 spacewidth 28 charset ! 33 2 33 " 33 2 34 dq " # 61 2 35 $ 56 2 36 % 100 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 44 2 42 + 61 0 43 , 28 1 44 hy 33 0 45 - " . 28 0 46 / 39 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 3 64 A 67 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 50 2 69 F 50 2 70 G 78 2 71 H 78 2 72 I 33 2 73 J 33 2 74 K 61 2 75 L 50 2 76 M 89 2 77 N 78 2 78 O 83 2 79 P 56 2 80 Q 83 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 52 2 92 bs " ] 33 3 93 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 50 0 101 f 32 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 61 3 124 } 33 3 125 --- 61 0 126 --- 33 1 161 ct 56 2 162 ps 56 2 163 fr 17 2 164 yn 56 2 165 fn 56 3 166 sc 56 3 167 cr 56 2 168 --- 28 2 169 `` 50 2 170 --- 50 0 171 --- 33 0 172 --- 33 0 173 fi 61 2 174 fl 61 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 28 0 180 pg 70 3 182 --- 61 0 183 --- 28 1 184 --- 50 1 185 '' 50 2 186 --- 50 0 187 --- 100 0 188 --- 100 2 189 --- 44 1 191 ga 33 2 193 \` " aa 33 2 194 \' " ^a 33 2 195 ^ " ~a 33 2 196 ~ " -a 33 2 197 Ua 33 2 198 .a 33 2 199 :a 33 2 200 oa 33 2 202 ,a 33 1 203 "a 33 2 205 Ca 33 1 206 va 33 2 207 em 100 0 208 --- 89 2 225 --- 33 2 227 --- 50 2 232 --- 83 2 233 --- 100 2 234 --- 34 2 235 --- 78 0 241 --- 28 0 245 --- 28 2 248 --- 56 0 249 --- 89 0 250 --- 56 2 251 0707070014231031351006440057030057030000010306640522627503100003000000003366post.src/devpost.add/a1 name a1 fontname CenturyOldStyleAbstract-Regular ligatures fi fl 0 spacewidth 25 charset ! 26 2 33 " 40 2 34 dq " # 50 2 35 $ 50 3 36 % 58 2 37 & 79 2 38 ' 21 2 39 ( 40 3 40 ) 40 3 41 * 50 2 42 + 50 0 43 , 25 1 44 hy 24 0 45 - " . 25 0 46 / 53 3 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 40 2 63 @ 85 2 64 A 66 2 65 B 69 2 66 C 69 2 67 D 76 2 68 E 66 2 69 F 61 2 70 G 74 2 71 H 76 2 72 I 34 2 73 J 40 3 74 K 71 2 75 L 58 2 76 M 95 2 77 N 76 2 78 O 76 2 79 P 61 2 80 Q 76 3 81 R 63 2 82 S 55 2 83 T 63 2 84 U 74 2 85 V 66 2 86 W 95 2 87 X 63 2 88 Y 63 2 89 Z 58 2 90 [ 40 3 91 \ 25 2 92 bs " ] 40 3 93 --- 50 2 94 --- 50 1 95 ` 21 2 96 a 47 0 97 b 55 2 98 c 47 0 99 d 55 2 100 e 50 0 101 f 29 2 102 g 55 1 103 h 58 2 104 i 26 2 105 j 24 3 106 k 55 2 107 l 26 2 108 m 84 0 109 n 55 0 110 o 53 0 111 p 53 1 112 q 55 1 113 r 40 0 114 s 45 0 115 t 31 2 116 u 55 0 117 v 47 0 118 w 71 0 119 x 53 0 120 y 50 1 121 z 45 0 122 { 40 3 123 --- 25 2 124 } 40 3 125 --- 50 0 126 --- 26 1 161 ct 50 2 162 ps 50 2 163 fr 9 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 21 2 169 `` 40 2 170 --- 47 0 171 --- 29 0 172 --- 29 0 173 fi 58 2 174 fl 55 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 25 0 180 pg 66 3 182 --- 66 0 183 --- 21 1 184 --- 40 1 185 '' 40 2 186 --- 47 0 187 --- 100 0 188 --- 92 2 189 --- 40 1 191 ga 29 2 193 \` " aa 29 2 194 \' " ^a 37 2 195 ^ " ~a 50 2 196 ~ " -a 47 2 197 Ua 50 2 198 .a 26 2 199 :a 47 2 200 oa 34 2 202 ,a 34 1 203 "a 40 2 205 Ca 37 1 206 va 37 2 207 em 100 0 208 --- 103 2 225 --- 34 2 227 --- 58 2 232 --- 76 2 233 --- 108 2 234 --- 34 2 235 --- 76 0 241 --- 26 0 245 --- 26 2 248 --- 53 0 249 --- 84 0 250 --- 58 2 251 0707070014231031361006440057030057030000010306660522627503100003000000003365post.src/devpost.add/a2 name a2 fontname CenturyOldStyleAbstract-Italic ligatures fi fl 0 spacewidth 27 charset ! 31 2 33 " 35 2 34 dq " # 54 0 35 $ 54 3 36 % 70 2 37 & 75 2 38 ' 21 2 39 ( 46 3 40 ) 46 3 41 * 59 2 42 + 54 0 43 , 27 1 44 hy 25 0 45 - " . 27 0 46 / 46 3 47 0 54 2 48 1 54 0 49 2 54 2 50 3 54 2 51 4 54 0 52 5 54 0 53 6 54 2 54 7 54 0 55 8 54 2 56 9 54 2 57 : 27 0 58 ; 27 1 59 --- 54 0 60 = 54 0 61 --- 54 0 62 ? 48 2 63 @ 78 2 64 A 67 2 65 B 68 2 66 C 65 2 67 D 75 2 68 E 66 2 69 F 61 2 70 G 72 2 71 H 77 2 72 I 36 2 73 J 34 3 74 K 68 2 75 L 58 2 76 M 90 2 77 N 74 2 78 O 74 2 79 P 59 2 80 Q 75 3 81 R 65 2 82 S 57 2 83 T 63 2 84 U 72 2 85 V 62 2 86 W 88 2 87 X 64 2 88 Y 61 2 89 Z 57 2 90 [ 46 3 91 \ 27 2 92 bs " ] 46 3 93 --- 54 2 94 --- 50 1 95 ` 21 2 96 a 54 0 97 b 46 2 98 c 41 0 99 d 50 2 100 e 42 0 101 f 25 3 102 g 45 1 103 h 52 2 104 i 31 2 105 j 27 3 106 k 48 2 107 l 27 2 108 m 82 0 109 n 56 0 110 o 47 0 111 p 50 1 112 q 49 1 113 r 40 0 114 s 35 0 115 t 30 0 116 u 56 0 117 v 47 0 118 w 69 0 119 x 41 0 120 y 40 1 121 z 39 0 122 { 46 3 123 --- 27 2 124 } 46 3 125 --- 54 0 126 --- 31 1 161 ct 54 0 162 ps 54 2 163 fr 5 2 164 yn 54 0 165 fn 54 3 166 sc 59 3 167 cr 54 0 168 --- 19 2 169 `` 37 2 170 --- 45 0 171 --- 29 0 172 --- 29 0 173 fi 52 3 174 fl 52 3 175 en 50 0 177 \- " dg 59 3 178 dd 59 3 179 --- 27 0 180 pg 61 3 182 --- 61 0 183 --- 21 1 184 --- 37 1 185 '' 37 2 186 --- 45 0 187 --- 100 0 188 --- 103 2 189 --- 48 1 191 ga 39 2 193 \` " aa 31 2 194 \' " ^a 40 2 195 ^ " ~a 51 2 196 ~ " -a 47 0 197 Ua 51 2 198 .a 26 2 199 :a 46 2 200 oa 32 2 202 ,a 35 1 203 "a 39 2 205 Ca 34 1 206 va 40 2 207 em 100 0 208 --- 94 2 225 --- 32 2 227 --- 58 2 232 --- 74 2 233 --- 107 2 234 --- 32 2 235 --- 69 0 241 --- 31 0 245 --- 27 2 248 --- 47 0 249 --- 71 0 250 --- 53 2 251 0707070014231031371006440057030057030000010307000522627503100003000000003367post.src/devpost.add/c1 name c1 fontname CenturyOldStyleCondensed-Regular ligatures fi fl 0 spacewidth 25 charset ! 26 2 33 " 40 2 34 dq " # 50 2 35 $ 50 3 36 % 58 2 37 & 79 2 38 ' 21 2 39 ( 40 3 40 ) 40 3 41 * 50 2 42 + 50 0 43 , 25 1 44 hy 24 0 45 - " . 25 0 46 / 53 3 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 50 0 60 = 50 0 61 --- 50 0 62 ? 40 2 63 @ 85 2 64 A 66 2 65 B 69 2 66 C 69 2 67 D 76 2 68 E 66 2 69 F 61 2 70 G 74 2 71 H 76 2 72 I 34 2 73 J 40 3 74 K 71 2 75 L 58 2 76 M 95 2 77 N 76 2 78 O 76 2 79 P 61 2 80 Q 76 3 81 R 63 2 82 S 55 2 83 T 63 2 84 U 74 2 85 V 66 2 86 W 95 2 87 X 63 2 88 Y 63 2 89 Z 58 2 90 [ 40 3 91 \ 25 2 92 bs " ] 40 3 93 --- 50 2 94 --- 50 1 95 ` 21 2 96 a 47 0 97 b 55 2 98 c 47 0 99 d 55 2 100 e 50 0 101 f 29 2 102 g 55 1 103 h 58 2 104 i 26 2 105 j 24 3 106 k 55 2 107 l 26 2 108 m 84 0 109 n 55 0 110 o 53 0 111 p 53 1 112 q 55 1 113 r 40 0 114 s 45 0 115 t 31 2 116 u 55 0 117 v 47 0 118 w 71 0 119 x 53 0 120 y 50 1 121 z 45 0 122 { 40 3 123 --- 25 2 124 } 40 3 125 --- 50 0 126 --- 26 1 161 ct 50 2 162 ps 50 2 163 fr 9 2 164 yn 50 2 165 fn 50 3 166 sc 50 3 167 cr 50 2 168 --- 21 2 169 `` 40 2 170 --- 47 0 171 --- 29 0 172 --- 29 0 173 fi 58 2 174 fl 55 2 175 en 50 0 177 \- " dg 50 3 178 dd 50 3 179 --- 25 0 180 pg 66 3 182 --- 66 0 183 --- 21 1 184 --- 40 1 185 '' 40 2 186 --- 47 0 187 --- 100 0 188 --- 92 2 189 --- 40 1 191 ga 29 2 193 \` " aa 29 2 194 \' " ^a 37 2 195 ^ " ~a 50 2 196 ~ " -a 47 2 197 Ua 50 2 198 .a 26 2 199 :a 47 2 200 oa 34 2 202 ,a 34 1 203 "a 40 2 205 Ca 37 1 206 va 37 2 207 em 100 0 208 --- 103 2 225 --- 34 2 227 --- 58 2 232 --- 76 2 233 --- 108 2 234 --- 34 2 235 --- 76 0 241 --- 26 0 245 --- 26 2 248 --- 53 0 249 --- 84 0 250 --- 58 2 251 0707070014231031401006440057030057030000010307020522627503100003000000003366post.src/devpost.add/c2 name c2 fontname CenturyOldStyleCondensed-Italic ligatures fi fl 0 spacewidth 27 charset ! 31 2 33 " 35 2 34 dq " # 54 0 35 $ 54 3 36 % 70 2 37 & 75 2 38 ' 21 2 39 ( 46 3 40 ) 46 3 41 * 59 2 42 + 54 0 43 , 27 1 44 hy 25 0 45 - " . 27 0 46 / 46 3 47 0 54 2 48 1 54 0 49 2 54 2 50 3 54 2 51 4 54 0 52 5 54 0 53 6 54 2 54 7 54 0 55 8 54 2 56 9 54 2 57 : 27 0 58 ; 27 1 59 --- 54 0 60 = 54 0 61 --- 54 0 62 ? 48 2 63 @ 78 2 64 A 67 2 65 B 68 2 66 C 65 2 67 D 75 2 68 E 66 2 69 F 61 2 70 G 72 2 71 H 77 2 72 I 36 2 73 J 34 3 74 K 68 2 75 L 58 2 76 M 90 2 77 N 74 2 78 O 74 2 79 P 59 2 80 Q 75 3 81 R 65 2 82 S 57 2 83 T 63 2 84 U 72 2 85 V 62 2 86 W 88 2 87 X 64 2 88 Y 61 2 89 Z 57 2 90 [ 46 3 91 \ 27 2 92 bs " ] 46 3 93 --- 54 2 94 --- 50 1 95 ` 21 2 96 a 54 0 97 b 46 2 98 c 41 0 99 d 50 2 100 e 42 0 101 f 25 3 102 g 45 1 103 h 52 2 104 i 31 2 105 j 27 3 106 k 48 2 107 l 27 2 108 m 82 0 109 n 56 0 110 o 47 0 111 p 50 1 112 q 49 1 113 r 40 0 114 s 35 0 115 t 30 0 116 u 56 0 117 v 47 0 118 w 69 0 119 x 41 0 120 y 40 1 121 z 39 0 122 { 46 3 123 --- 27 2 124 } 46 3 125 --- 54 0 126 --- 31 1 161 ct 54 0 162 ps 54 2 163 fr 5 2 164 yn 54 0 165 fn 54 3 166 sc 59 3 167 cr 54 0 168 --- 19 2 169 `` 37 2 170 --- 45 0 171 --- 29 0 172 --- 29 0 173 fi 52 3 174 fl 52 3 175 en 50 0 177 \- " dg 59 3 178 dd 59 3 179 --- 27 0 180 pg 61 3 182 --- 61 0 183 --- 21 1 184 --- 37 1 185 '' 37 2 186 --- 45 0 187 --- 100 0 188 --- 103 2 189 --- 48 1 191 ga 39 2 193 \` " aa 31 2 194 \' " ^a 40 2 195 ^ " ~a 51 2 196 ~ " -a 47 0 197 Ua 51 2 198 .a 26 2 199 :a 46 2 200 oa 32 2 202 ,a 35 1 203 "a 39 2 205 Ca 34 1 206 va 40 2 207 em 100 0 208 --- 94 2 225 --- 32 2 227 --- 58 2 232 --- 74 2 233 --- 107 2 234 --- 32 2 235 --- 69 0 241 --- 31 0 245 --- 27 2 248 --- 47 0 249 --- 71 0 250 --- 53 2 251 0707070014231031411006440057030057030000010307040522627503100003000000003366post.src/devpost.add/c3 name c3 fontname CenturyOldStyleCondensed-Bold ligatures fi fl 0 spacewidth 33 charset ! 34 2 33 " 40 2 34 dq " # 56 2 35 $ 66 3 36 % 79 2 37 & 84 2 38 ' 28 2 39 ( 39 3 40 ) 39 3 41 * 56 2 42 + 56 0 43 , 33 1 44 hy 32 0 45 - " . 33 0 46 / 51 3 47 0 66 2 48 1 66 2 49 2 66 2 50 3 66 2 51 4 66 2 52 5 66 2 53 6 66 2 54 7 66 2 55 8 66 2 56 9 66 2 57 : 33 0 58 ; 33 1 59 --- 56 0 60 = 56 0 61 --- 56 0 62 ? 47 2 63 @ 72 2 64 A 69 2 65 B 76 2 66 C 70 2 67 D 80 2 68 E 71 2 69 F 64 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 48 2 74 K 76 2 75 L 63 2 76 M 94 2 77 N 80 2 78 O 81 2 79 P 72 2 80 Q 81 3 81 R 72 2 82 S 61 2 83 T 60 2 84 U 78 2 85 V 64 2 86 W 97 2 87 X 68 2 88 Y 67 2 89 Z 59 2 90 [ 39 3 91 \ 28 2 92 bs " ] 39 3 93 --- 56 2 94 --- 50 1 95 ` 28 2 96 a 53 0 97 b 60 2 98 c 52 0 99 d 62 2 100 e 54 0 101 f 30 2 102 g 52 3 103 h 62 2 104 i 31 2 105 j 27 3 106 k 60 2 107 l 30 2 108 m 92 0 109 n 62 0 110 o 57 0 111 p 61 1 112 q 60 1 113 r 44 0 114 s 50 0 115 t 33 2 116 u 63 0 117 v 50 0 118 w 74 0 119 x 53 0 120 y 49 1 121 z 44 0 122 { 39 3 123 --- 28 2 124 } 39 3 125 --- 56 0 126 --- 34 1 161 ct 66 2 162 ps 66 2 163 fr 10 2 164 yn 66 2 165 fn 66 3 166 sc 56 3 167 cr 66 2 168 --- 22 2 169 `` 52 2 170 --- 58 0 171 --- 37 0 172 --- 37 0 173 fi 62 2 174 fl 61 2 175 en 50 0 177 \- " dg 56 3 178 dd 56 3 179 --- 33 0 180 pg 62 3 182 --- 62 0 183 --- 28 1 184 --- 52 1 185 '' 52 2 186 --- 58 0 187 --- 100 0 188 --- 118 2 189 --- 47 1 191 ga 34 2 193 \` " aa 34 2 194 \' " ^a 45 2 195 ^ " ~a 56 2 196 ~ " -a 53 2 197 Ua 56 2 198 .a 29 2 199 :a 51 2 200 oa 34 2 202 ,a 37 1 203 "a 50 2 205 Ca 38 1 206 va 45 2 207 em 100 0 208 --- 109 2 225 --- 40 2 227 --- 63 2 232 --- 81 2 233 --- 114 2 234 --- 40 2 235 --- 83 0 241 --- 31 0 245 --- 30 2 248 --- 57 0 249 --- 90 0 250 --- 58 2 251 0707070014231031421006440057030057030000010307060522627503100004400000002013post.src/devpost.add/devpost.add.mk MAKE=/bin/make MAKEFILE=devpost.add.mk SYSTEM=SYSV VERSION=3.2 GROUP=bin OWNER=bin FONTDIR=/usr/lib/font FONTFILES=?? all : install : all @if [ ! -d $(FONTDIR) ]; then \ mkdir $(FONTDIR); \ chmod 755 $(FONTDIR); \ chgrp $(GROUP) $(FONTDIR); \ chown $(OWNER) $(FONTDIR); \ fi @if [ ! -d $(FONTDIR)/devpost ]; then \ mkdir $(FONTDIR)/devpost; \ chmod 755 $(FONTDIR)/devpost; \ chgrp $(GROUP) $(FONTDIR)/devpost; \ chown $(OWNER) $(FONTDIR)/devpost; \ fi cp $(FONTFILES) $(FONTDIR)/devpost @for i in $(FONTFILES); do \ chmod 644 $(FONTDIR)/devpost/$$i; \ chgrp $(GROUP) $(FONTDIR)/devpost/$$i; \ chown $(OWNER) $(FONTDIR)/devpost/$$i; \ done clean : clobber : clean changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014230547760407550057030057030000021527350522633074000002200000000000post.src/download 0707070014230547771006440057030057030000011527360522627503100003100000000756post.src/download/README A simple program that scans PostScript files for %%DocumentFonts: comments and prepends requested host resident font files to the input. Written for Unix 4.0 lp. Downloaded fonts are the ones named in the %%DocumentFonts: comment and listed in a special map file (which can be selected using the -m option). See example.map and comments in download.c for examples of map files. By default map files and font files are in *hostfontdir. It's initialized using HOSTDIR (file ../common/path.h). 0707070014230550001006440057030057030000011527370522627503100003500000000443post.src/download/download.h /* * * The font data for a printer is saved in an array of the following type. * */ typedef struct map { char *font; /* a request for this PostScript font */ char *file; /* means copy this unix file */ int downloaded; /* TRUE after *file is downloaded */ } Map; Map *allocate(); 0707070014230550061006400057030057030000011527660522633073700003600000003434post.src/download/download.mk MAKE=/bin/make MAKEFILE=download.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin HOSTDIR=/usr/lib/font/postscript MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=download.h\ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=download.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/tempnam.o all : download install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi cp download $(POSTBIN)/download @chmod 755 $(POSTBIN)/download @chgrp $(GROUP) $(POSTBIN)/download @chown $(OWNER) $(POSTBIN)/download cp download.1 $(MAN1DIR)/download.1 @chmod 644 $(MAN1DIR)/download.1 @chgrp $(GROUP) $(MAN1DIR)/download.1 @chown $(OWNER) $(MAN1DIR)/download.1 clean : rm -f *.o clobber : clean rm -f download download : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o download $(OFILES) download.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/tempnam.o : @cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^HOSTDIR=.*'HOSTDIR=$(HOSTDIR)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dH.*'.ds dH $(HOSTDIR)'" \ download.1 >XXX.1; \ mv XXX.1 download.1 0707070014230550021006440057030057030000011527420522627503100003600000001664post.src/download/example.map % % An example font map table that extends the standard collection of 13 % fonts to the 35 made popular by the LaserWriter Plus. % % First string is full PostScript font name, exactly as it would appear % in a %%DocumentFonts comment. Second string is the name of the Unix % file relative to *hostfontdir, unless that string begins with a /, in % which case it's taken as the full pathname. % Palatino-Roman PA Palatino-Italic PI Palatino-Bold PB Palatino-BoldItalic PX Helvetica-Narrow Hr Helvetica-Narrow-Oblique Hi Helvetica-Narrow-Bold Hb Helvetica-Narrow-BoldOblique Hx Bookman-Light KR Bookman-LightItalic KI Bookman-Demi KB Bookman-DemiItalic KX AvantGarde-Book AR AvantGarde-BookOblique AI AvantGarde-Demi AB AvantGarde-DemiOblique AX NewCenturySchlbk-Roman NR NewCenturySchlbk-Italic NI NewCenturySchlbk-Bold NB NewCenturySchlbk-BoldItalic NX ZapfDingbats ZD ZapfChancery-MediumItalic ZI 0707070014230550031006440057030057030000011527500522627503100003500000034165post.src/download/download.c /* * * download - host resident font downloader * * Prepends host resident fonts to PostScript input files. The program assumes * the input files are part of a single PostScript job and that requested fonts * can be downloaded at the start of each input file. Downloaded fonts are the * ones named in a %%DocumentFonts: comment and listed in a special map table. * Map table pathnames (supplied using the -m option) that begin with a / are * taken as is. Otherwise the final pathname is built using *hostfontdir (-H * option), *mapname (-m option), and *suffix. * * The map table consists of fontname-filename pairs, separated by white space. * Comments are introduced by % (as in PostScript) and extend to the end of the * current line. The only fonts that can be downloaded are the ones listed in * the active map table that point the program to a readable Unix file. A request * for an unlisted font or inaccessible file is ignored. All font requests are * ignored if the map table can't be read. In that case the program simply copies * the input files to stdout. * * An example (but not one to follow) of what can be in a map table is, * * % * % Map requests for Bookman-Light to file *hostfontdir/KR * % * * Bookman-Light KR % Keeping everything (including the map * % table) in *hostfontdir seems like the * % cleanest approach. * * % * % Map Palatino-Roman to file *hostfontdir/palatino/Roman * % * Palatino-Roman palatino/Roman * * % Map ZapfDingbats to file /usr/lib/host/dingbats * * ZapfDingbats /usr/lib/host/dingbats * * Once again, file names that begin with a / are taken as is. All others have * *hostfontdir/ prepended to the file string associated with a particular font. * * Map table can be associated with a printer model (e.g. a LaserWriter), a * printer destination, or whatever - the choice is up to an administrator. * By destination may be best if your spooler is running several private * printers. Host resident fonts are usually purchased under a license that * restricts their use to a limited number of printers. A font licensed for * a single printer should only be used on that printer. * * Was written quickly, so there's much room for improvement. Undoubtedly should * be a more general program (e.g. scan for other comments). * */ #include <stdio.h> #include <signal.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for temporary directory */ #include "ext.h" /* external variable declarations */ #include "download.h" /* a few special definitions */ char *temp_dir = TEMPDIR; /* temp directory - for copying stdin */ char *hostfontdir = HOSTDIR; /* host resident directory */ char *mapname = "map"; /* map table - usually in *hostfontdir */ char *suffix = ""; /* appended to the map table pathname */ Map *map = NULL; /* device font map table */ char *stringspace = NULL; /* for storing font and file strings */ int next = 0; /* next free slot in map[] */ char *residentfonts = NULL; /* list of printer resident fonts */ char *printer = NULL; /* printer name - only for Unix 4.0 lp */ char buf[2048]; /* input file line buffer */ char *comment = DOCUMENTFONTS; /* look for this comment */ int atend = FALSE; /* TRUE only if a comment says so */ FILE *fp_in = stdin; /* next input file */ FILE *fp_temp = NULL; /* for copying stdin */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * Host resident font downloader. The input files are assumed to be part of a * single PostScript job. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* just for error messages */ init_signals(); /* sets up interrupt handling */ options(); /* first get command line options */ readmap(); /* read the font map table */ readresident(); /* and the optional resident font list */ arguments(); /* then process non-option arguments */ done(); /* and clean things up */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Makes sure we handle interrupts properly. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ char *optnames = "c:fm:p:r:H:T:DI"; extern char *optarg; /* used by getopt() */ extern int optind; /* * * Reads and processes the command line options. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'c': /* look for this comment */ comment = optarg; break; case 'f': /* force a complete input file scan */ atend = TRUE; break; case 'm': /* printer map table name */ mapname = optarg; break; case 'p': /* printer name - for Unix 4.0 lp */ printer = optarg; break; case 'r': /* resident font list */ residentfonts = optarg; break; case 'H': /* host resident font directory */ hostfontdir = optarg; break; case 'T': /* temporary file directory */ temp_dir = optarg; break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ readmap() { char *path; char *ptr; int fd; struct stat sbuf; /* * * Initializes the map table by reading an ASCII mapping file. If mapname begins * with a / it's the map table. Otherwise hostfontdir, mapname, and suffix are * combined to build the final pathname. If we can open the file we read it all * into memory, erase comments, and separate the font and file name pairs. When * we leave next points to the next free slot in the map[] array. If it's zero * nothing was in the file or we couldn't open it. * */ if ( hostfontdir == NULL || mapname == NULL ) return; if ( *mapname != '/' ) { if ( (path = malloc(strlen(hostfontdir) + strlen(mapname) + strlen(suffix) + 2)) == NULL ) error(FATAL, "no memory"); sprintf(path, "%s/%s%s", hostfontdir, mapname, suffix); } else path = mapname; if ( (fd = open(path, 0)) != -1 ) { if ( fstat(fd, &sbuf) == -1 ) error(FATAL, "can't fstat %s", path); if ( (stringspace = malloc(sbuf.st_size + 2)) == NULL ) error(FATAL, "no memory"); if ( read(fd, stringspace, sbuf.st_size) == -1 ) error(FATAL, "can't read %s", path); close(fd); stringspace[sbuf.st_size] = '\n'; /* just to be safe */ stringspace[sbuf.st_size+1] = '\0'; for ( ptr = stringspace; *ptr != '\0'; ptr++ ) /* erase comments */ if ( *ptr == '%' ) for ( ; *ptr != '\n' ; ptr++ ) *ptr = ' '; for ( ptr = stringspace; ; next++ ) { if ( (next % 50) == 0 ) map = allocate(map, next+50); map[next].downloaded = FALSE; map[next].font = strtok(ptr, " \t\n"); map[next].file = strtok(ptr = NULL, " \t\n"); if ( map[next].font == NULL ) break; if ( map[next].file == NULL ) error(FATAL, "map table format error - check %s", path); } /* End for */ } /* End if */ } /* End of readmap */ /*****************************************************************************/ readresident() { FILE *fp; char *path; int ch; int n; /* * * Reads a file that lists the resident fonts for a particular printer and marks * each font as already downloaded. Nothing's done if the file can't be read or * there's no mapping file. Comments, as in the map file, begin with a % and * extend to the end of the line. Added for Unix 4.0 lp. * */ if ( next == 0 || (printer == NULL && residentfonts == NULL) ) return; if ( printer != NULL ) { /* use Unix 4.0 lp pathnames */ sprintf(buf, "/etc/lp/printers/%s/residentfonts", printer); path = buf; } else path = residentfonts; if ( (fp = fopen(path, "r")) != NULL ) { while ( fscanf(fp, "%s", buf) != EOF ) if ( buf[0] == '%' ) while ( (ch = getc(fp)) != EOF && ch != '\n' ) ; else if ( (n = lookup(buf)) < next ) map[n].downloaded = TRUE; fclose(fp); } /* End if */ } /* End of readresident */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll translate stdin. Assumes input files are part of a single PostScript * job and fonts can be downloaded at the start of each file. * */ if ( argc < 1 ) download(); else { while ( argc > 0 ) { fp_temp = NULL; if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); download(); if ( fp_in != stdin ) fclose(fp_in); if ( fp_temp != NULL ) fclose(fp_temp); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Clean things up before we quit. * */ if ( temp_file != NULL ) unlink(temp_file); } /* End of done */ /*****************************************************************************/ download() { int infontlist = FALSE; /* * * If next is zero the map table is empty and all we do is copy the input file * to stdout. Otherwise we read the input file looking for %%DocumentFonts: or * continuation comments, add any accessible fonts to the output file, and then * append the input file. When reading stdin we append lines to fp_temp and * recover them when we're ready to copy the input file. fp_temp will often * only contain part of stdin - if there's no %%DocumentFonts: (atend) comment * we stop reading fp_in after the header. * */ if ( next > 0 ) { if ( fp_in == stdin ) { if ( (temp_file = tempnam(temp_dir, "post")) == NULL ) error(FATAL, "can't generate temp file name"); if ( (fp_temp = fopen(temp_file, "w+r")) == NULL ) error(FATAL, "can't open %s", temp_file); unlink(temp_file); temp_file = NULL; } /* End if */ while ( fgets(buf, sizeof(buf), fp_in) != NULL ) { if ( fp_temp != NULL ) fprintf(fp_temp, "%s", buf); if ( buf[0] != '%' || buf[1] != '%' ) { if ( (buf[0] != '%' || buf[1] != '!') && atend == FALSE ) break; infontlist = FALSE; } else if ( strncmp(buf, comment, strlen(comment)) == 0 ) { copyfonts(buf); infontlist = TRUE; } else if ( buf[2] == '+' && infontlist == TRUE ) copyfonts(buf); else infontlist = FALSE; } /* End while */ } /* End if */ copyinput(); } /* End of download */ /*****************************************************************************/ copyfonts(list) char *list; { char *font; char *path; int n; /* * * list points to a %%DocumentFonts: or continuation comment. What follows the * the keyword will be a list of fonts separated by white space (or (atend)). * Look for each font in the map table and if it's found copy the font file to * stdout (once only). * */ strtok(list, " \n"); /* skip to the font list */ while ( (font = strtok(NULL, " \t\n")) != NULL ) { if ( strcmp(font, ATEND) == 0 ) { atend = TRUE; break; } /* End if */ if ( (n = lookup(font)) < next ) { if ( *map[n].file != '/' ) { if ( (path = malloc(strlen(hostfontdir)+strlen(map[n].file)+2)) == NULL ) error(FATAL, "no memory"); sprintf(path, "%s/%s", hostfontdir, map[n].file); cat(path); free(path); } else cat(map[n].file); map[n].downloaded = TRUE; } /* End if */ } /* End while */ } /* End of copyfonts */ /*****************************************************************************/ copyinput() { /* * * Copies the input file to stdout. If fp_temp isn't NULL seek to the start and * add it to the output file - it's a partial (or complete) copy of stdin made * by download(). Then copy fp_in, but only seek to the start if it's not stdin. * */ if ( fp_temp != NULL ) { fseek(fp_temp, 0L, 0); while ( fgets(buf, sizeof(buf), fp_temp) != NULL ) printf("%s", buf); } /* End if */ if ( fp_in != stdin ) fseek(fp_in, 0L, 0); while ( fgets(buf, sizeof(buf), fp_in) != NULL ) printf("%s", buf); } /* End of copyinput */ /*****************************************************************************/ lookup(font) char *font; { int i; /* * * Looks for *font in the map table. Return the map table index if found and * not yet downloaded - otherwise return next. * */ for ( i = 0; i < next; i++ ) if ( strcmp(font, map[i].font) == 0 ) { if ( map[i].downloaded == TRUE ) i = next; break; } /* End if */ return(i); } /* End of lookup */ /*****************************************************************************/ Map *allocate(ptr, num) Map *ptr; int num; { /* * * Allocates space for num Map elements. Calls malloc() if ptr is NULL and * realloc() otherwise. * */ if ( ptr == NULL ) ptr = (Map *)malloc(num * sizeof(Map)); else ptr = (Map *)realloc(ptr, num * sizeof(Map)); if ( ptr == NULL ) error(FATAL, "no map memory"); return(ptr); } /* End of allocate */ /*****************************************************************************/ 0707070014230550121006400057030057030000011530300522633074000003500000007101post.src/download/download.1 .ds dH /usr/lib/font/postscript .TH DOWNLOAD 1 "DWB 3.2" .SH NAME download \- host-resident PostScript font download .SH SYNOPSIS \*(mBdownload\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B download prepends host-resident fonts to .I files and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. .B download assumes the input .I files are a single PostScript job and that requested fonts can be included at the start of each input .IR file . The following .I options are understood: .TP 1.0i .OP \-f Force a complete scan of each input .I file. In the absence of an explicit comment pointing .I download to the end of the file, the default scan stops immediately after the PostScript header comments. .TP 1.0i .OP \-m name Use .I name as the font map table. A .I name that begins with .MW / is the full pathname of the map table. Otherwise .I name is relative to the host font directory. .TP 1.0i .OP \-p printer Read the printer-resident font list from file .br .MI /etc/lp/printers/ printer /residentfonts \f1. .br Fonts named in this file will not be downloaded. The .OP \-p option is for use with Unix 4.0 lp. Other spoolers should use the .OP \-r option. .TP 1.0i .OP \-r file Read the list of printer-resident fonts from .I file. Fonts named in this file will not be downloaded. .TP 1.0i .OP \-H dir Use .I dir as the host font directory. The default is .MR \*(dH . .TP 1.0i .OP \-T dir Use .I dir as the temporary file directory. Only used to make a copy of standard input. By default .I dir is set to .MR /tmp . .PP Requested fonts are named in a .MW %%DocumentFonts: comment in the input .IR files . Available fonts are the ones listed in the map table selected using the .OP \-m option. .PP The map table consists of fontname\-filename pairs. The fontname is the full name of the PostScript font, exactly as it would appear in a .MW %%DocumentFonts: comment. The filename is the pathname of the host resident font. A filename that begins with a .MW / is used as is, otherwise the pathname is relative to the host font directory. Comments are introduced by .MW % (as in PostScript) and extend to the end of the line. .PP The only candidates for downloading are fonts listed in the map table that point .B download to readable files. A font is downloaded at most once per job. Requests for unlisted fonts or inaccessible files are ignored. All requests are ignored if the map table can't be read. .SH EXAMPLES A map table used to control the downloading of the Bookman font family might be, .EX -1 % % The first string is the full PostScript font name. The second string % is the file name - relative the host font directory unless it begins % with a /. % Bookman-Light KR Bookman-LightItalic KI Bookman-Demi KB Bookman-DemiItalic KX .EE Use file .MW myprinter (in the default host font directory) as the map table: .EX download -m myprinter \f2file .EE Set the host font directory to .MW /tmp/font and use .MW /tmp/font/xxx as the map table: .EX download -H /tmp/font -mxxx \f2file .EE .SH DIAGNOSTICS 0 exit status is returned if .I files were successfully processed. .SH BUGS .B download should be part of a more general program. .PP .B download does not look for .MW %%PageFonts: comments and there is no way to force multiple downloads of a particular font. .PP Using full pathnames, either in map tables or for the map table name, is not often recommended. .SH SEE ALSO .BR dpost (1), .BR postdaisy (1), .BR postdmd (1), .BR postio (1), .BR postmd (1), .BR postprint (1), .BR posttek (1) 0707070014231031431006440057030057030000010231460522634431100001700000002663post.src/NOTES Directory dpost is DWB 3.3 version without UTF changes. dpost.utf is stuff for Plan 9. Both build and install dpost, so only pick one. The makefile I sent (postscript.mk) builds dpost.utf. Left READING set to ONEBYTE in common/gen.h. Expect dpost errors unless 'x E UTF' is added to troff output or READING set to UTFENCODING. Easy to make 'x E UTF' anything else too. Left RUNELIB defined in common/rune.h so rune.c stuff is used when dpost.utf is built. UTF.enc is in directory psencoding. Install and link to Default.enc on Plan 9. Carmela requested two new characters: \(bs for backslash and \(dq for double quote. Both are in devLatin1 and devpost tables. Carmela also asked for a bunch of her devpost accent characters in devLatin1. Added them to the end of the devLatin1 tables. A word of warning about devLatin1. Carmela, Peter and others complained about - and hyphens being too long in the Latin1 fonts. I used Abode's choice but nobody liked it. New devLatin1 tables use a smaller character for hy. Looks better (I guess) but a width change affects line and page breaks!! Not sure what you want to do. Complaints on this one go to npn and carmela!!! Didn't take your suggested pathname change in download. Didn't want to risk breaking Unix 4.0 lp. What's there is bogus but was only for Unix 4.0. The -r option accomplishes something similiar but needs a full path. postio.mk is very different and not tested on V9. 0707070014230735420407550057030057030000020011070522633074300002000000000000post.src/grabit 0707070014230732661006400057030057030000010000700522633074200003200000002732post.src/grabit/grabit.mk MAKE=/bin/make MAKEFILE=grabit.mk OWNER=bin GROUP=bin MAN1DIR=/tmp MAN5DIR=/usr/man/p_man/man5 POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript all : grabit install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp grabit $(POSTBIN)/grabit @chmod 755 $(POSTBIN)/grabit @chgrp $(GROUP) $(POSTBIN)/grabit @chown $(OWNER) $(POSTBIN)/grabit cp grabit.ps $(POSTLIB)/grabit.ps @chmod 644 $(POSTLIB)/grabit.ps @chgrp $(GROUP) $(POSTLIB)/grabit.ps @chown $(OWNER) $(POSTLIB)/grabit.ps cp grabit.1 $(MAN1DIR)/grabit.1 @chmod 644 $(MAN1DIR)/grabit.1 @chgrp $(GROUP) $(MAN1DIR)/grabit.1 @chown $(OWNER) $(MAN1DIR)/grabit.1 clean : clobber : clean rm -f grabit grabit : grabit.sh sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" grabit.sh >grabit @chmod 755 grabit changes : @trap "" 1 2 3 15; \ sed \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ grabit.1 >XXX.1; \ mv XXX.1 grabit.1 0707070014230735441006440057030057030000010014500522627503200003200000030161post.src/grabit/grabit.ps % % Dump a PostScript object, occasionally in a form that can be sent back % through the interpreter. Similiar to Adobe's == procedure, but output % is usually easier to read. No binding so operators like rcheck and exec % can be conviently redefined. % /GrabitDict 100 dict dup begin /recursive true def /scratchstring 200 string def /slowdown 100 def /column 0 def /lastcolumn 80 def /level 0 def /multiline 100 array def /nextname 0 def /arraylength 0 def /lengthonly false def /GrabitSetup { counttomark {OmitNames exch true put} repeat pop 0 0 moveto % for hardcopy output } def /OmitNames 30 dict def % ignore these names /OtherDicts 200 dict def % unrecognized dictionaries % % All strings returned to the host go through Print. First pass through an % array has lengthonly set to true. % /Print { dup type /stringtype ne {scratchstring cvs} if lengthonly { length arraylength add /arraylength exch def }{ dup length column add /column exch def print flush slowdown {1 pop} repeat } ifelse } def /Indent {level {( ) Print} repeat} def /Newline {(\n) Print lengthonly not {/column 0 def} if} def /NextLevel {/level level 1 add def multiline level 0 put} def /LastLevel {/level level 1 sub def} def % % Make a unique name for each unrecognized dictionary and remember the name % and dictionary in OtherDicts. % /Register { dup type /dicttype eq { /nextname nextname 1 add def dup (UnknownDict ) dup (UnknownDict) length nextname ( ) cvs putinterval 0 (UnknownDict) length nextname ( ) cvs length add getinterval cvn exch OtherDicts 3 1 roll put } if } def % % Replace array or dictionary values by known names. Lookups are in the % standard PostScript dictionaries and in OtherDicts. If found replace % the value by the name and make it executable so nametype omits the % leading /. % /Replace { false 1 index type /dicttype eq {pop true} if 1 index type /arraytype eq 2 index xcheck not and {pop true} if { false [userdict systemdict statusdict serverdict OtherDicts] { { 3 index eq {exch pop exch pop cvx true exit} {pop} ifelse } forall dup {exit} if } forall pop } if } def % % Simple type handlers. In some cases (e.g. savetype) what's returned can't % be sent back through the interpreter. % /booleantype {{(true )}{(false )} ifelse Print} def /marktype {pop (mark ) Print} def /nulltype {pop (null ) Print} def /integertype {Print ( ) Print} def /realtype {Print ( ) Print} def /filetype {pop (-file- ) Print} def /fonttype {pop (-fontID- ) Print} def /savetype {pop (-saveobj- ) Print} def % % Special formatting for operators is enabled if the flag in multiline % (for the current level) is set to 1. In that case each operator, after % being printed, is looked up in OperatorDict. If found the value is used % as an index into the OperatorProcs array and the object at that index % is retrieved and executed. Currently only used to choose the operators % that end a line. % /operatortype { dup Print ( ) Print multiline level get 1 eq { scratchstring cvs cvn dup OperatorDict exch known { OperatorDict exch get OperatorProcs exch get exec }{ pop column lastcolumn gt {Newline Indent} if } ifelse }{pop} ifelse } def % % Executable names are passed to operatortype. Non-executable names get a % leading /. % /nametype { dup xcheck { operatortype }{ (/) Print Print ( ) Print } ifelse } def % % Arrays are processed in two passes. The first computes the length of the % string returned to the host without any special formatting. If it extends % past the last column special formatting is enabled by setting a flag in % array multiline. Arrays are processed in a for loop so the last element % easily recognized. At that point special fortmatting is disabled. % /packedarraytype {arraytype} def /arraytype { NextLevel lengthonly not { /lengthonly true def /arraylength 0 def dup dup type exec arraylength 20 gt arraylength column add lastcolumn gt and { multiline level 1 put } if /lengthonly false def } if dup rcheck not { (-array- ) Print pop }{ dup xcheck {({)}{([)} ifelse Print multiline level get 0 ne {Newline Indent}{( ) Print} ifelse 0 1 2 index length 1 sub { 2 copy exch length 1 sub eq multiline level get 1 eq and { multiline level 2 put } if 2 copy get exch pop dup type /dicttype eq { Replace dup type /dicttype eq { dup Register Replace recursive { 2 copy cvlit /def load 3 1 roll count 3 roll } if exch pop } if } if dup type exec dup xcheck not multiline level get 1 eq and { 0 index type /arraytype eq 1 index type /packedarray eq or 1 index type /stringtype eq or {Newline Indent} if } if } for multiline level get 0 ne {Newline LastLevel Indent NextLevel} if xcheck {(} )}{(] )} ifelse Print } ifelse LastLevel } def % % Dictionary handler. Try to replace the value by a name before processing % the dictionary. % /dicttype { dup rcheck not { (-dictionary- ) Print pop }{ dup maxlength Print ( dict dup begin) Print Newline NextLevel { 1 index OmitNames exch known { pop pop }{ Indent Replace % arrays and dicts by known names Register % new dictionaries in OtherDicts exch cvlit dup type exec % key first - force a / dup type exec % then the value (def) Print Newline } ifelse } forall LastLevel Indent (end ) Print } ifelse } def % % Strings containing characters not in AsciiDict are returned in hex. All % others are ASCII strings and use AsciiDict for character mapping. % /onecharstring ( ) def /twocharstring ( ) def /stringtype { dup rcheck not { (-string- ) Print }{ /hexit false def dup { onecharstring 0 3 -1 roll put AsciiDict onecharstring cvn known not { /hexit true def exit } if } forall hexit {(<)}{(\()} ifelse Print 0 1 2 index length 1 sub { 2 copy 1 getinterval exch pop hexit { 0 get /n exch def n -4 bitshift 16#F and 16 twocharstring cvrs pop n 16#F and twocharstring 1 1 getinterval 16 exch cvrs pop twocharstring }{cvn AsciiDict exch get} ifelse Print column lastcolumn gt { hexit not {(\\) Print} if Newline } if } for hexit {(> )}{(\) )} ifelse Print } ifelse pop } def % % ASCII characters and replacement strings. Ensures the returned string will % reproduce the original when passed through the scanner. Strings containing % characters not in this list should be returned as hex strings. % /AsciiDict 128 dict dup begin (\n) cvn (\\n) def (\r) cvn (\\r) def (\t) cvn (\\t) def (\b) cvn (\\b) def (\f) cvn (\\f) def ( ) cvn ( ) def (!) cvn (!) def (") cvn (") def (#) cvn (#) def ($) cvn ($) def (%) cvn (\\%) def (&) cvn (&) def (') cvn (') def (\() cvn (\\\() def (\)) cvn (\\\)) def (*) cvn (*) def (+) cvn (+) def (,) cvn (,) def (-) cvn (-) def (.) cvn (.) def (/) cvn (/) def (0) cvn (0) def (1) cvn (1) def (2) cvn (2) def (3) cvn (3) def (4) cvn (4) def (5) cvn (5) def (6) cvn (6) def (7) cvn (7) def (8) cvn (8) def (9) cvn (9) def (:) cvn (:) def (;) cvn (;) def (<) cvn (<) def (=) cvn (=) def (>) cvn (>) def (?) cvn (?) def (@) cvn (@) def (A) cvn (A) def (B) cvn (B) def (C) cvn (C) def (D) cvn (D) def (E) cvn (E) def (F) cvn (F) def (G) cvn (G) def (H) cvn (H) def (I) cvn (I) def (J) cvn (J) def (K) cvn (K) def (L) cvn (L) def (M) cvn (M) def (N) cvn (N) def (O) cvn (O) def (P) cvn (P) def (Q) cvn (Q) def (R) cvn (R) def (S) cvn (S) def (T) cvn (T) def (U) cvn (U) def (V) cvn (V) def (W) cvn (W) def (X) cvn (X) def (Y) cvn (Y) def (Z) cvn (Z) def ([) cvn ([) def (\\) cvn (\\\\) def (]) cvn (]) def (^) cvn (^) def (_) cvn (_) def (`) cvn (`) def (a) cvn (a) def (b) cvn (b) def (c) cvn (c) def (d) cvn (d) def (e) cvn (e) def (f) cvn (f) def (g) cvn (g) def (h) cvn (h) def (i) cvn (i) def (j) cvn (j) def (k) cvn (k) def (l) cvn (l) def (m) cvn (m) def (n) cvn (n) def (o) cvn (o) def (p) cvn (p) def (q) cvn (q) def (r) cvn (r) def (s) cvn (s) def (t) cvn (t) def (u) cvn (u) def (v) cvn (v) def (w) cvn (w) def (x) cvn (x) def (y) cvn (y) def (z) cvn (z) def ({) cvn ({) def (|) cvn (|) def (}) cvn (}) def (~) cvn (~) def end def % % OperatorDict can help format procedure listings. The value assigned to each % name is used as an index into the OperatorProcs array. The procedure at that % index is fetched and executed after the named operator is printed. What's in % OperatorDict is a matter of taste rather than correctness. The default list % represents our choice of which of Adobe's operators should end a line. % /OperatorProcs [{} {Newline Indent}] def /OperatorDict 250 dict def OperatorDict /arc 1 put OperatorDict /arcn 1 put OperatorDict /ashow 1 put OperatorDict /awidthshow 1 put OperatorDict /banddevice 1 put OperatorDict /begin 1 put OperatorDict /charpath 1 put OperatorDict /clear 1 put OperatorDict /cleardictstack 1 put OperatorDict /cleartomark 1 put OperatorDict /clip 1 put OperatorDict /clippath 1 put OperatorDict /closefile 1 put OperatorDict /closepath 1 put OperatorDict /concat 1 put OperatorDict /copypage 1 put OperatorDict /curveto 1 put OperatorDict /def 1 put OperatorDict /end 1 put OperatorDict /eoclip 1 put OperatorDict /eofill 1 put OperatorDict /erasepage 1 put OperatorDict /exec 1 put OperatorDict /exit 1 put OperatorDict /fill 1 put OperatorDict /flattenpath 1 put OperatorDict /flush 1 put OperatorDict /flushfile 1 put OperatorDict /for 1 put OperatorDict /forall 1 put OperatorDict /framedevice 1 put OperatorDict /grestore 1 put OperatorDict /grestoreall 1 put OperatorDict /gsave 1 put OperatorDict /handleerror 1 put OperatorDict /if 1 put OperatorDict /ifelse 1 put OperatorDict /image 1 put OperatorDict /imagemask 1 put OperatorDict /initclip 1 put OperatorDict /initgraphics 1 put OperatorDict /initmatrix 1 put OperatorDict /kshow 1 put OperatorDict /lineto 1 put OperatorDict /loop 1 put OperatorDict /moveto 1 put OperatorDict /newpath 1 put OperatorDict /nulldevice 1 put OperatorDict /pathforall 1 put OperatorDict /print 1 put OperatorDict /prompt 1 put OperatorDict /put 1 put OperatorDict /putinterval 1 put OperatorDict /quit 1 put OperatorDict /rcurveto 1 put OperatorDict /renderbands 1 put OperatorDict /repeat 1 put OperatorDict /resetfile 1 put OperatorDict /restore 1 put OperatorDict /reversepath 1 put OperatorDict /rlineto 1 put OperatorDict /rmoveto 1 put OperatorDict /rotate 1 put OperatorDict /run 1 put OperatorDict /scale 1 put OperatorDict /setcachedevice 1 put OperatorDict /setcachelimit 1 put OperatorDict /setcacheparams 1 put OperatorDict /setcharwidth 1 put OperatorDict /setdash 1 put OperatorDict /setdefaulttimeouts 1 put OperatorDict /setdostartpage 1 put OperatorDict /seteescratch 1 put OperatorDict /setflat 1 put OperatorDict /setfont 1 put OperatorDict /setgray 1 put OperatorDict /sethsbcolor 1 put OperatorDict /setidlefonts 1 put OperatorDict /setjobtimeout 1 put OperatorDict /setlinecap 1 put OperatorDict /setlinejoin 1 put OperatorDict /setlinewidth 1 put OperatorDict /setmargins 1 put OperatorDict /setmatrix 1 put OperatorDict /setmiterlimit 1 put OperatorDict /setpacking 1 put OperatorDict /setpagetype 1 put OperatorDict /setprintname 1 put OperatorDict /setrgbcolor 1 put OperatorDict /setsccbatch 1 put OperatorDict /setsccinteractive 1 put OperatorDict /setscreen 1 put OperatorDict /settransfer 1 put OperatorDict /show 1 put OperatorDict /showpage 1 put OperatorDict /start 1 put OperatorDict /stop 1 put OperatorDict /store 1 put OperatorDict /stroke 1 put OperatorDict /strokepath 1 put OperatorDict /translate 1 put OperatorDict /widthshow 1 put OperatorDict /write 1 put OperatorDict /writehexstring 1 put OperatorDict /writestring 1 put end def % % Put an object on the stack and call Grabit. Output continues until stack % is empty. For example, % % /letter load Grabit % % prints a listing of the letter procedure. % /Grabit { /saveobj save def GrabitDict begin { count 0 eq {exit} if count {dup type exec} repeat (\n) print flush } loop end currentpoint % for hardcopy output saveobj restore moveto } def 0707070014230735451006440057030057030000010011550522627503200003200000002271post.src/grabit/grabit.sh # # Print a listing of an object, often a dictionary or an array. Something # like ==, but the output is often easier to read and closer to PostScript # that can be sent back through the interpreter. # POSTLIB=/usr/lib/postscript PROLOGUE=$POSTLIB/grabit.ps COPYFILE= RECURSIVE=true OMITNAMES="/Grabit /GrabitDict" NONCONFORMING="%!PS" ENDPROLOG="%%EndProlog" BEGINSETUP="%%BeginSetup" ENDSETUP="%%EndSetup" TRAILER="%%Trailer" SETUP=GrabitSetup while [ -n "$1" ]; do case $1 in -d) RECURSIVE=false;; -o) shift; OMITNAMES="$OMITNAMES $1";; -o*) OMITNAMES="$OMITNAMES `echo $1 | sed s/-o//`";; -C) shift; COPYFILE="$COPYFILE $1";; -C*) COPYFILE="$COPYFILE `echo $1 | sed s/-C//`";; -L) shift; PROLOGUE=$1;; -L*) PROLOGUE=`echo $1 | sed s/-L//`;; --) shift; break;; -*) echo "$0: illegal option $1" >&2; exit 1;; *) break;; esac shift done echo $NONCONFORMING cat $PROLOGUE echo $ENDPROLOG echo $BEGINSETUP cat ${COPYFILE:-/dev/null} echo "GrabitDict begin" echo "/recursive $RECURSIVE def" echo mark for i in $OMITNAMES; do case $i in /*) echo "$i";; ?*) echo "/$i";; esac done echo GrabitSetup echo end echo $ENDSETUP for i do echo "$i Grabit" done 0707070014230733311006400057030057030000011776300522633074300003100000003520post.src/grabit/grabit.1 .ds dQ /usr/lib/postscript .TH GRABIT 1 "DWB 3.2" .SH NAME .B grabit \- recover the text representation of PostScript objects .SH SYNOPSIS \*(mBgrabit\f1 .OP "" options [] .OP "" object \&... .SH DESCRIPTION .B Grabit builds a PostScript program that generates a text representation of one or more PostScript .IR object s. The program is written on the standard output. The following .I options are understood: .TP 1.0i .OP \-d Do not automatically dump the contents of unrecognized dictionary objects found in PostScript arrays. .TP 1.0i .OP \-C file Copy .I file into the PostScript program. .I file must contain legitimate PostScript. .TP 1.0i .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/grabit.ps . .PP When the program built by .B grabit is sent to a PostScript printer the text representation of each .I object is normally returned to the host computer over the printer's serial port. Use .BR hardcopy (1) if you do not have access to the port. .PP Each argument should be a PostScript .I object or commands that generate a PostScript .IR object . The program built by .B grabit produces results that are often close to legitimate PostScript that can be successfully sent through an interpreter. .SH EXAMPLES .PP If you can read and write .MW /dev/tty00 and there is a PostScript printer on the other end, then recover the readable portions of the .MW userdict and .MW statusdict dictionaries: .EX grabit userdict statusdict | postio -l/dev/tty00 -t .EE Otherwise get a printout of the dictionaries: .EX grabit userdict statusdict | hardcopy | lp ... .EE Arguments should be PostScript code that leaves an object on the stack. Dump the contents of Adobe's .MW internaldict dictionary: .EX grabit "1183615869 internaldict" | postio -l/dev/tty00 -t .EE .SH FILES .MW \*(dQ/grabit.ps .SH SEE ALSO .BR hardcopy (1), .BR postio (1) 0707070014230642640407550057030057030000021711540522633074500002200000000000post.src/hardcopy 0707070014230642651006440057030057030000011711550522627503200003600000003137post.src/hardcopy/hardcopy.sh # # Generate paper output from the data that a PostScript program normally # sends back to a host computer using file output operators. # POSTLIB=/usr/lib/postscript PROLOGUE=$POSTLIB/hardcopy.ps OPTIONS= MODE=portrait NONCONFORMING="%!PS" ENDPROLOG="%%EndProlog" BEGINSETUP="%%BeginSetup" ENDSETUP="%%EndSetup" TRAILER="%%Trailer" SETUP=HardcopySetup DONE="(%stdout)(w) file -1 write" while [ -n "$1" ]; do case $1 in -c) shift; OPTIONS="$OPTIONS /#copies $1 store";; -c*) OPTIONS="$OPTIONS /#copies `echo $1 | sed s/-c//` store";; -f) shift; OPTIONS="$OPTIONS /font /$1 def";; -f*) OPTIONS="$OPTIONS /font /`echo $1 | sed s/-f//` def";; -p) shift; MODE=$1;; -p*) MODE=`echo $1 | sed s/-p//`;; -m) shift; OPTIONS="$OPTIONS /magnification $1 def";; -m*) OPTIONS="$OPTIONS /magnification `echo $1 | sed s/-m//` def";; -s) shift; OPTIONS="$OPTIONS /pointsize $1 def";; -s*) OPTIONS="$OPTIONS /pointsize `echo $1 | sed s/-s//` def";; -x) shift; OPTIONS="$OPTIONS /xoffset $1 def";; -x*) OPTIONS="$OPTIONS /xoffset `echo $1 | sed s/-x//` def";; -y) shift; OPTIONS="$OPTIONS /yoffset $1 def";; -y*) OPTIONS="$OPTIONS /yoffset `echo $1 | sed s/-y//` def";; -L) shift; PROLOGUE=$1;; -L*) PROLOGUE=`echo $1 | sed s/-L//`;; --) shift; break;; -*) echo "$0: illegal option $1" >&2; exit 1;; *) break;; esac shift done case "$MODE" in l*) OPTIONS="$OPTIONS /landscape true def";; *) OPTIONS="$OPTIONS /landscape false def";; esac echo $NONCONFORMING cat $PROLOGUE echo $ENDPROLOG echo $BEGINSETUP echo $OPTIONS echo $SETUP echo $ENDSETUP cat $* echo $TRAILER echo $DONE 0707070014230642661006440057030057030000011711700522627503200003600000007544post.src/hardcopy/hardcopy.ps % % Redefiniton of the PostScript file output operators so results go to paper. % Complicated and slow, but the implementation doesn't place many demands on % included PostScript. About all that's required is gentle treatment of the % graphics state between write calls. % /#copies 1 store /aspectratio 1 def /font /Courier def /formsperpage 1 def /landscape false def /magnification 1 def /orientation 0 def /pointsize 10 def /rotation 1 def /xoffset .1 def /yoffset .1 def /roundpage true def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} def /min {2 copy gt {exch} if pop} def /HardcopySetup { landscape {/orientation 90 orientation add def} if font findfont 1 1.1 div scalefont setfont pagedimensions xcenter ycenter translate orientation rotation mul rotate width 2 div neg height 2 div translate xoffset inch yoffset inch neg translate pointsize 1.1 mul dup scale magnification dup aspectratio mul scale height width div 1 min dup scale 0 -1 translate 0 0 moveto } def /pagedimensions { useclippath { /pagebbox [clippath pathbbox newpath] def roundpage currentdict /roundpagebbox known and {roundpagebbox} if } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def } def % % Unbind the operators in an executable array or packedarray. Leaves the % unbound array or the original object on the stack. % /Unbind { 0 index xcheck 1 index type /arraytype eq 2 index type /packedarraytype eq or and { dup length array copy cvx dup 0 exch { dup type /operatortype eq { ( ) cvs cvn cvx } if dup type /dicttype eq { dup maxlength dict exch { Unbind 3 copy put pop pop } forall } if 0 index xcheck 1 index type /arraytype eq 2 index type /packedarraytype eq or and { Unbind } if 3 copy put pop 1 add } forall pop } if } def % % New write operator - don't bind the definition! Expands tabs and backspaces, % wraps long lines, and starts a new page whenever necessary. The code that % handles newlines assumes lines are separated by one vertical unit. % /write { true exch %%case '\b': dup 8#10 eq { ( ) stringwidth pop neg 0 rmoveto currentpoint pop 0 lt { currentpoint exch pop 0 exch moveto } if exch pop false exch } if %%case '\t': dup 8#11 eq { currentpoint pop ( ) stringwidth pop div round cvi 8 mod 8 exch sub { 2 index 8#40 write } repeat exch pop false exch } if %%case '\n': dup 8#12 eq { currentpoint 0 exch 1 sub moveto pop gsave clippath pathbbox pop pop exch pop grestore currentpoint exch pop 1 sub ge { 2 index 8#14 write } if exch pop false exch } if %%case '\f': dup 8#14 eq { gsave showpage grestore 0 0 moveto exch pop false exch } if %%case '\r': dup 8#15 eq { currentpoint 0 exch moveto pop exch pop false exch } if %%case EOF: dup -1 eq { currentpoint 0 ne exch 0 ne or { 2 index 8#14 write } if exch pop false exch } if %%default: exch { dup gsave clippath pathbbox pop 3 1 roll pop pop grestore ( ) stringwidth pop currentpoint pop add le { 2 index 8#12 write } if ( ) dup 0 4 -1 roll put show } if pop % the character pop % and file object } def % % All the other file output operators call our redefined write operator. % /print { (%stdout) (w) file exch {1 index exch write} forall pop } def /writestring { {1 index exch write} forall pop } def /writehexstring { (0123456789ABCDEF) 3 1 roll { dup 3 index exch -4 bitshift 16#F and get 2 index exch write 2 index exch 16#F and get 1 index exch write } forall pop pop } def % % Unbind and redefine the remaining file output procedures. % /= dup load Unbind def /== dup load Unbind def /stack dup load Unbind def /pstack dup load Unbind def 0707070014230642671006440057030057030000011711570522627503200003100000000602post.src/hardcopy/README Redirect output of the print operator to paper. Particularly useful if you're trying to extract information from a printer, but you don't have access to the data the printer returns to the host. For example, FontDirectory {pop ==} forall names all the fonts registered in the FontDirectory dictionary. Simple, but only if you can read the data returned to the host by the printer. 0707070014230640011006400057030057030000011722500522633074500003500000005143post.src/hardcopy/hardcopy.1 .ds dQ /usr/lib/postscript .TH HARDCOPY 1 "DWB 3.2" .SH NAME .B hardcopy \- redirects output from PostScript file operators to paper .SH SYNOPSIS \*(mBhardcopy\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B hardcopy surrounds .I files with PostScript that redirects file output to paper, and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP 0.75i .OP \-f name Print .I files using font .IR name , which should be the name of a constant width font. The default font is Courier. .TP 0.75i .OP \-m num Magnify each page by the factor .IR num . Pages are scaled uniformly about the origin, which is located near the upper left corner of each page. The default magnification is 1.0. .TP 0.75i .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP 0.75i .OP \-s num Print .I files using point size .IR num . When printing in landscape mode .I num is scaled by a factor that depends on the imaging area of the device. The default size for portrait mode is 10. .TP 0.75i .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed near the upper left corner of the page, with positive x to the right and positive y down the page. Positive .I num moves everything right. The default offset is 0.25 inches. .TP 0.75i .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves text down the page. The default offset is 0.25 inches. .TP 0.75i .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/hardcopy.ps . .PP .B hardcopy generates paper output from data that a PostScript program normally sends back to a host computer. It is particularly useful for recovering data from a printer that does not allow access to its serial port. .SH EXAMPLES For a list of ROM based fonts type: .EX echo 'FontDirectory {pop ==} forall' | hardcopy | lp \(el .EE To recover the version number of the PostScript interpreter: .EX echo 'version ==' | hardcopy -pland | lp \(el .EE To build and print a width table for font .MW R type: .EX trofftable -TLatin1 R | hardcopy | lp \(el .EE .SH WARNINGS Results are unpredictable if the input .I files make changes to the graphics state. .SH FILES .MW \*(dQ/hardcopy.ps .SH SEE ALSO .BR buildtables (1), .BR postio (1), .BR trofftable (1) 0707070014230640001006400057030057030000011713560522633074400003600000003016post.src/hardcopy/hardcopy.mk MAKE=/bin/make MAKEFILE=hardcopy.mk OWNER=bin GROUP=bin MAN1DIR=/tmp MAN5DIR=/usr/man/p_man/man5 POSTLIB=/usr/lib/postscript POSTBIN=/usr/bin/postscript all : hardcopy install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp hardcopy $(POSTBIN)/hardcopy @chmod 755 $(POSTBIN)/hardcopy @chgrp $(GROUP) $(POSTBIN)/hardcopy @chown $(OWNER) $(POSTBIN)/hardcopy cp hardcopy.ps $(POSTLIB)/hardcopy.ps @chmod 644 $(POSTLIB)/hardcopy.ps @chgrp $(GROUP) $(POSTLIB)/hardcopy.ps @chown $(OWNER) $(POSTLIB)/hardcopy.ps cp hardcopy.1 $(MAN1DIR)/hardcopy.1 @chmod 644 $(MAN1DIR)/hardcopy.1 @chgrp $(GROUP) $(MAN1DIR)/hardcopy.1 @chown $(OWNER) $(MAN1DIR)/hardcopy.1 clean : clobber : clean rm -f hardcopy hardcopy : hardcopy.sh sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" hardcopy.sh >hardcopy @chmod 755 hardcopy changes : @trap "" 1 2 3 15; \ sed \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ hardcopy.1 >XXX.1; \ mv XXX.1 hardcopy.1 0707070014230735470407550057030057030000020011170522633100500002000000000000post.src/mcolor 0707070014230735501006440057030057030000010012140522627503200003100000004007post.src/mcolor/color.sr .ds Dc black .ds Cc \*(Dc .de CL \" Color selection macro . \" . \" $1=color (e.g. .CL red) or . \" $1=textcolor on backgroundcolor (e.g. .CL "red on blue") . \" $1=red green blue rgb (e.g. .CL ".2 .3 .4 rgb") or . \" $1=hue saturation brightness hsb (e.g. .CL ".5 .6 .7 hsb") . \" $2=text . \" . \" If no arguments are given the default color (usually black) will be . \" restored. If $2 is omitted the color selected by $1 remains in effect . \" until another color is selected. If two arguments are given $2 will be . \" printed in color $1 and then the default color will be restored. . \" . \" The color of the text and the background can be selected by setting $1 . \" to "textcolor on backgroundcolor" where textcolor and backgroundcolor . \" can be any of the known colors. For example use .CL "white on black" . \" for reverse video printing. Changing color in a word can be accomplished . \" by preceeding the characters with a \X'SetColor:val' command, where val . \" is the color you wish to use. Named colors are case independent. . \" . \" Implementation details are device dependent and are handled in the . \" appropriate post-processor. Requesting a color that's not available . \" (eg. not defined in /usr/lib/postscript/color.ps) results in the use . \" of default colors - black or white on black for reverse video mode. . \" . \" All colors may not be supported on every output device, and the direct . \" specification of a color via an explicit rgb or hsb argument may also . \" be device dependent. In any case, to be safe on PostScript devices, all . \" numeric paramenters in the direct rgb or hsb specifications should lie . \" between 0 and 1 (inclusive). The names of the currently available colors . \" on PostScript printers are listed in file /usr/lib/postscript/color.ps. . \" .mk Ov .if \\n(.$=0 .ds Cc \\*(Dc .if \\n(.$=1 .ds Cc \\$1 .if \\n(.$<2 \\X'SetColor:\\*(Cc' .if \\n(.$=2 \\X'SetColor:\\$1'\\c .if \\n(.$=2 'sp |\\n(Ovu .if \\n(.$=2 \\$2 .if \\n(.$=2 .mk Ov .if \\n(.$=2 \\X'SetColor:\\*(Cc'\\c 'sp |\\n(Ovu .. 0707070014230733361006400057030057030000010014750522633100500003100000002066post.src/mcolor/mcolor.5 .ds dP /usr/lib/postscript .ds dT /usr/lib/tmac .TH MCOLOR 5 .SH NAME .B mcolor \- color and reverse video macro .SH SYNOPSIS \*(mBtroff \-mcolor\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B mcolor is a macro package for color selection and reverse video printing on PostScript printers. The package is compatible with most existing macro packages and includes the following macro: .TP 1.25i .MI .CL "\0color\0text" Prints .I text in .IR color . No arguments restores the default color (black). If .I text is omitted the selected .I color remains in effect until another .I color is selected. If two arguments are given the .I text is printed in .I color and then the default color is restored. .PP Both the text and background color can be selected. A .I color argument of .RI `` color1 .MW on .IR color2 '' prints text in .I color1 on a background in .I color2 . .PP Named colors must be listed in the ``colordict'' dictionary in file .MR \*(dP/color.ps . .SH FILES .MW \*(dT/tmac.color .br .MW \*(dP/color.ps .SH SEE ALSO .BR troff (1), .BR dpost (1), .BR mps (5) 0707070014230732631006400057030057030000010014600522633100500003200000002056post.src/mcolor/mcolor.mk # # Not installing the man page. # MAKE=/bin/make MAKEFILE=mcolor.mk SYSTEM=V9 VERSION=3.3.2 OWNER=bin GROUP=bin POSTLIB=/usr/lib/postscript TMACDIR=/usr/lib/tmac all : @cp color.sr tmac.color install : all @if [ ! -d $(TMACDIR) ]; then \ mkdir $(TMACDIR); \ chmod 755 $(TMACDIR); \ chgrp $(GROUP) $(TMACDIR); \ chown $(OWNER) $(TMACDIR); \ fi cp tmac.color $(TMACDIR)/tmac.color @chmod 644 $(TMACDIR)/tmac.color @chgrp $(GROUP) $(TMACDIR)/tmac.color @chown $(OWNER) $(TMACDIR)/tmac.color clean : rm -f tmac.color clobber : clean changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ -e "s'^TMACDIR=.*'TMACDIR=$(TMACDIR)'" \ $(MAKEFILE) >X$(MAKEFILE); \ mv X$(MAKEFILE) $(MAKEFILE); \ sed \ -e "s'^.ds dP.*'.ds dP $(POSTLIB)'" \ -e "s'^.ds dT.*'.ds dT $(TMACDIR)'" \ mcolor.5 >Xmcolor.5; \ mv Xmcolor.5 mcolor.5 0707070014230642720407550057030057030000021711770522633074700002300000000000post.src/mpictures 0707070014230642731006440057030057030000011712120522627503300003700000010340post.src/mpictures/pictures.sr .de PI \" Picture Include . \" $1=file(page) $2=height,width,yoff,xoff $3=flags . \" Height, width, xoff, and yoff are for the frame, flags is for the . \" picture. Default dimensions are inches. \\X'PI:\\n(.o:\\n(.i:\\n(.l:\\n(.t:\\$1:\\$2:\\$3:'\\c .. .nr FT 0 .de BP \" Begin a Picture . \" . \" $1=file(page) $2=height $3=width $4=position $5=offset $6=flags $7=label . \" . \" Height, width, position, and offset are for the frame, flags is for . \" the picture. The postion flag should be l, c, r, or "". Omitting the . \" position argument is also allowed for compatibility with the original . \" version of the macro. In that case offset is taken relative to your . \" left margin. .if \\n(FT>1 .EP . \" Need these when we switch environments. .nr Ov \\n(.v .nr Oi \\n(.i .nr Ol \\n(.l . \" Remember the arguments - sometimes as both a string and number register. .nr $2 \\$2i .nr $3 \\$3i .nr $4 \\$4i .ds $4 \\$4 .nr $5 \\$5i .ds $5 \\$6 .ds $6 \\$7 . \" Accept a few unadvertised position flags. .if '\\*($4'L' .ds $4 l .if '\\*($4'C' .ds $4 c .if '\\*($4'R' .ds $4 r . \" A null with more than three arguments means l. .if \\n(.$>3 .if '\\*($4'' .ds $4 l . \" Default frame dimensions if missing, zero, or null. .if !\\n($2>0 .nr $2 3.0i .if !\\n($3>0 .nr $3 \\n(.lu-\\n(.iu-\\n($4u .if !\\n($3>0 .nr $3 \\n($2u . \" Figure out the offset that will be used the rest of the way. .if '\\*($4'l' .nr $4 \\n($5u .if '\\*($4'c' .nr $4 (\\n(.lu-\\n(.iu-\\n($3u)/2u+\\n($5u .if '\\*($4'r' .nr $4 \\n(.lu-\\n(.iu-\\n($3u+\\n($5u . \" If we haven't recognized the position flag assume it wasn't given and . \" treat argument four as an offset from the left. .if !'\\*($4'l' .if !'\\*($4'c' .if !'\\*($4'r' .ds $5 \\$5 .if !'\\*($4'l' .if !'\\*($4'c' .if !'\\*($4'r' .ds $6 \\$6 . \" Set increments for line length and indent. .nr Ii \\n($3u+\\n($4u+.1i .nr Il \\n(.lu-\\n(.iu-\\n($4u+.1i . \" Set the frame type to one of: . \" 0 - frame is as wide as a line of text - skip over it. . \" 1 - fits in left or right margins . \" 2 - fill with text on the right . \" 3 - on the left . \" 4 - or on both sides of the frame . \" 5 - only set in EP if FT was 4 and now filling on the right. . \" Assume the frame is as wide as a line of text, then check dimensions . \" to see what's really true. The order of these tests is important! .nr FT 0 .if \\n($4u>1.0i .nr FT 3 .if \\n($4u+\\n(.iu>=\\n(.lu .nr FT 1 .if \\n($3u+\\n($4u+\\n(.iu+1.0i<\\n(.lu .nr FT 2 .if \\n($3u+\\n($4u<=0 .nr FT 1 .if \\n(FT=2 .if \\n($4u>1.0i .nr FT 4 . \" Ask for some vertical space - labeled pictures need a little extra, . \" margin pictures a little less. .if \\n(FT=1 .if '\\*($6'' .ne \\n($2u .if \\n(FT=1 .if !'\\*($6'' .ne \\n($2u+2v .if !\\n(FT=1 .if '\\*($6'' .ne \\n($2u+3v .if !\\n(FT=1 .if !'\\*($6'' .ne \\n($2u+5v . \" Save our place, draw the picture, label it, and return. Need precise . \" control of when \X'...' is put out - thus the new environment. .mk Oh .ev 1 .in \\n(Oiu .ll \\n(Olu .vs \\n(Ovu .if \\n(FT=1 .sp -1v .if \\n(FT=1 .PI \\$1 \\n($2u,\\n($3u,\\n(.vu,\\n($4u t\\*($5 .if !\\n(FT=1 .PI \\$1 \\n($2u,\\n($3u,\\n(.vu,\\n($4u \\*($5 .in .ll .vs .ev .lt \\n($3u .tl \(ts\(ts\\h'\\n($4u+\\n(.iu'\\v'\\n($2u+1.5v'\\*($6\\v'-\\n($2u-1.5v'\\h'-\\n($4u-\\n(.iu'\(ts\(ts .lt 'sp |\\n(Ohu . \" Figure out what to do with the text that follows. .if !'\\*($6'' .nr $2 +2v .if \\n(FT=0 .sp \\n($2u+2v .if \\n(FT=1 .nr FT 0 .if \\n(FT=2 'in +\\n(Iiu .if \\n(FT>2 .ll -\\n(Ilu .if \\n(FT>1 .di BB .if \\n(FT>1 .dt \\n($2u+2v+1u EP . \" Clean things up. .rr $2 .rr $3 .rr $4 .rm $4 .rr $5 .rm $5 .rm $6 .rr Oh .rr Oi .rr Ol .rr Ov .if \\n(FT=0 .EP .. .de EP \" End the Picture - Normally called from a trap, although it can be used . \" on its own to mark the end of a picture. .nr Ot 0 .if \\n(.tu<\\n(.pu .nr Ot \\n(.tu .if \\n(Ot>0 .if \\n(FT=4 .nr FT 3 .if \\n(FT<2 .nr Ot 0 .if \\n(Ot>0 .br .if \\n(FT=5 .nr Ot 0 .if \\n(FT>1 \{\ . ev 1 . eo . br . di . nf . in 0 . BB . in . fi . ec . ev . rm BB\} .if \\n(FT=5 \{\ . nr FT 2 ' sp |\\n(Nhu+1v\} .if \\n(FT=4 \{\ . mk Nh . nr Nh -1v . nr FT 5 ' sp -\\n(dnu+1v ' in +\\n(Iiu . ll +\\n(Ilu . di BB . dt \\n(dnu-2v+1u EP\} .if \\n(FT=2 'in -\\n(Iiu .if \\n(FT=3 .ll +\\n(Ilu .if \\n(FT<4 .nr FT 0 .if \\n(Ot>0 .sp \\n(Otu .rr Ot .if \\n(FT=0 \{\ . rr Nh . rr Ii . rr Il\} .. 0707070014230637741006400057030057030000011563000522633074700003700000010664post.src/mpictures/mpictures.5 .ds dT /usr/lib/tmac .TH MPICTURES 5 .SH NAME .B mpictures \- picture inclusion macros .SH SYNOPSIS \*(mBtroff \-mpictures\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B mpictures is a macro package used to include PostScript pictures in .B troff documents. The package is compatible with many existing .B troff macro packages and includes the following three macros: .TP .MI .BP "\0file\0height\0width\0position\0offset\0flags\0label" .sp 0.3v Places the picture .I file in the space set aside by .IR height , .IR width , .IR position , and .IR offset , which together define and position the picture frame. The macro arguments are: .in +0.75i .de XX .sp 3p .ti -0.75i \f2\\$1\fP .sp -1v .. .XX file Pathname of a PostScript picture .IR file . Appending .MI ( n ) to .I file selects page number .I n from a multiple-page picture .IR file . By default the first page in .I file is selected. .XX height Vertical extent of the frame. The default is .MR 3i . .XX width Horizontal extent of the frame. The default is the current length of a line of text. .XX position One of .MR l , .MR c , or .MW r used to align the left, center, or right of the frame with the corresponding position on the current line of text. The default is .MR l . .XX offset Moves the frame right (positive) or left (negative) from the selected .IR position . The default is .MR 0i . .XX flags A string built from one or more of the following: .in +0.5i .sp 3p .de YY .br .ti -0.5i \*(mW\\$1\f1 .sp -1v .. .YY a[\f2d\*(mW] Rotate the picture clockwise .I d degrees. If .I d is omitted, 90 degrees is added to the current angle, which starts at zero. .YY o Outline the picture with a box. .YY s Freely scale both picture dimensions. .YY w White out (erase) the area to be occupied by the picture. .YY l Attach the picture to the left side of the frame. .YY r Attach the picture to the right side of the frame. .YY t Attach the picture to the top of the frame. .YY b Attach the picture to the bottom of the frame. .in -0.5i .XX label Place .I label 1.5 vertical lines below the frame. .in -0.75i .sp 0.3v If there is room .MW .BP fills text around the frame. Everything destined for either side of the frame first goes into a diversion and only reappears when the accumulated text sweeps past the trap set by .MW .BP or when the diversion is explicitly closed by the .MW .EP macro (see below). .sp 0.5v Null arguments, represented by .MR \&"" , are replaced by the defaults as noted above. .TP .MI .PI "\0file\0height,\|width,\|yoffset,\|xoffset\0flags" .sp 0.3v A low level macro used by .MR .BP . It can help if you are trying to do things that .MW .BP will not allow or does not do well. The two arguments not already described are: .in +0.75i .XX xoffset Moves the frame right (positive) or left (negative) from the left margin. The default is .MR 0i . .XX yoffset Moves the frame down (positive) or up (negative) from the current baseline. The default is .MR 0i . .in -0.75i .sp 0.3v The second argument is a comma separated list of four numbers, and although defaults are available, supplying values for all four numbers is recommended. .br .ne 2v .TP .MW .EP Ends a picture started by .MW .BP . An explicit .MW .EP call is not often required. Instead .MW .EP is usually called by .MW .BP at the bottom of each frame. .PP Much of what is done depends on file structuring comments commonly found in PostScript files. If the comments needed to isolate a particular page are missing the entire .I file is included. If a .MW %%BoundingBox comment is missing the picture is assumed to fill an 8.5\(mu11-inch page. A picture .I file that cannot be read when the .B troff postprocessor runs is replaced by white space. Nothing done in .MW .BP or .MW .PI guarantees the picture has not been placed off the page. All dimensions should be explicitly given in inches. .SH BUGS A picture and associated text can silently disappear if the diversion trap set by .MW .BP is not reached. Including a call to .MW .EP at the end of the paper should recover whatever appears to be missing. .PP Macros in other packages occasionally break the adjustments made to the line length and indent when text is being placed around a picture. .PP A missing or improper .MW %%BoundingBox comment often explains why a picture does not properly fill the space that has been set aside. .SH FILES .MW \*(dT/tmac.pictures .SH SEE ALSO .BR troff (1), .BR dpost (1), .BR picpack (1), .BR mps (5) .SH REFERENCE R. L. Drechsler and A. R. Wilks, .ul PostScript Pictures in Troff Documents 0707070014230637731006400057030057030000011577770522633074600004000000001740post.src/mpictures/mpictures.mk # # Not installing the man page. # MAKE=/bin/make MAKEFILE=mpictures.mk SYSTEM=V9 VERSION=3.3.2 OWNER=bin GROUP=bin TMACDIR=/usr/lib/tmac all : @cp pictures.sr tmac.pictures install : all @if [ ! -d $(TMACDIR) ]; then \ mkdir $(TMACDIR); \ chmod 755 $(TMACDIR); \ chgrp $(GROUP) $(TMACDIR); \ chown $(OWNER) $(TMACDIR); \ fi cp tmac.pictures $(TMACDIR)/tmac.pictures @chmod 644 $(TMACDIR)/tmac.pictures @chgrp $(GROUP) $(TMACDIR)/tmac.pictures @chown $(OWNER) $(TMACDIR)/tmac.pictures clean : rm -f tmac.pictures clobber : clean changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^TMACDIR=.*'TMACDIR=$(TMACDIR)'" \ $(MAKEFILE) >X$(MAKEFILE); \ mv X$(MAKEFILE) $(MAKEFILE); \ sed \ -e "s'^.ds dT.*'.ds dT $(TMACDIR)'" \ mpictures.5 >Xmpictures.5; \ mv Xmpictures.5 mpictures.5 0707070014230735530407550057030057030000020011570522627503300001600000000000post.src/misc 0707070014230735541004440057030057030000010014640522627503300002700000003144post.src/misc/lp.model # qmsps800 mac 10/22/86 # LPDEST=`basename $0` QMS_FILE="$1" DATE="`date +%D`" TIME="`date +%T`" owner="$2" site=`uname` port="`/usr/bin/lpstat -v$LPDEST | sed -e 's/.*: //'`" filter_cmd="/usr/lbin/postscript/postio" filter="$filter_cmd -l $port" landscape="" formsperpage="" path=/usr/lbin/postscript printer=postprint bannerflag=ON prev="| $path/postreverse" for i in $5 do case "$i" in L2) formsperpage="-n2" ;; land) landscape="-pland" ;; dpost|postprint|posttek|postbgi|postdmd|postio) printer="$i" ;; postreverse) prev="" ;; nobanner) bannerflag=OFF ;; F*) QMS_FILE="`expr $i : 'F\(.*\)'`" ;; esac done if [ -n "$filter_cmd" -a ! -x "$filter_cmd" ] then disable -r"can't execute filter: $filter_cmd" $LPDEST exit 1 fi shift; shift; shift; shift; shift files="$*" cp /usr/spool/lp/model/banner.ps /tmp/ban.$$ echo "($QMS_FILE) ($LPDEST) ($TIME) ($DATE) ($owner) banner" >> /tmp/ban.$$ if [ "$printer" = "postio" ] then eval $filter $files 2> /dev/null else eval $path/$printer $landscape $formsperpage $files $prev | $filter 2> /dev/null fi if [ "$bannerflag" = "ON" ] then eval $filter /tmp/ban.$$ 2> /dev/null fi rm -f /tmp/ban.$$ exit 0 0707070014230735551004440057030057030000010012170522627503300002500000000763post.src/misc/README Miscellaneous programs - all are unsupported. ibmfont.c IBM PC to Unix font conversion program laserbar.[c1] Barcode filter and man page - Jan Wolitzky lp.model Sample lp interface (not for Unix 4.0) - Maryann Csaszar macfont.c Macintosh to Unix font conversion program pscrypt.c Quick implementation of Adobe's encryption/decryption algorithm setbaud.ps Example of how to change the printer's baudrate Use make to compile C programs. For example, make macfont compiles macfont.c. 0707070014230735561004440057030057030000010015000522627503300003000000013025post.src/misc/macfont.c /* * * Program that converts Macintosh font files to a format that works on Unix * systems. Essentially all the information needed came from the Adobe paper * "Supporting Downloadable PostScript Fonts". To use the program type, * * macfont font.mac >font.unix * * where font.mac is the font file, exactly as it came over from a Macintosh, * and font.unix is equivalent host resident font file usable on Unix systems. * */ #include <stdio.h> #include <signal.h> #define OFF 0 #define ON 1 #define NON_FATAL 0 #define FATAL 1 #define FALSE 0 #define TRUE 1 char **argv; int argc; char *prog_name; int x_stat; int debug = OFF; int ignore = OFF; FILE *fp_in = stdin; FILE *fp_out = stdout; /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * Macintosh to Unix font converter. * */ argc = agc; argv = agv; prog_name = argv[0]; options(); arguments(); exit(x_stat); } /* End of main */ /*****************************************************************************/ options() { int ch; char *names = "DI"; extern char *optarg; extern int optind; /* * * Command line options. * */ while ( (ch = getopt(argc, argv, names)) != EOF ) { switch ( ch ) { case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; argv += optind; } /* End of options */ /*****************************************************************************/ arguments() { /* * * Everything else is an input file. No arguments or '-' means stdin. * */ if ( argc < 1 ) conv(); else while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); conv(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End of arguments */ /*****************************************************************************/ conv() { int blocksize; int blocktype; /* * * The first four bytes (in a block) are the block size, the fifth is the block * type, and the sixth always appears to be NULL. Type 0 blocks are comments and * are always skipped. Type 1 blocks are ASCII text, type 2 is binary data that * should be converted to hex, while type 5 blocks represent the end of the font * file. Commment block lengths appear to be from the first byte, while other * lengths seem to be measured from block type byte (ie. the fifth byte). Type * four blocks aren't used, while type 3 blocks mean an end of file indication * should be sent to the printer. Haven't done anything with type 3 blocks. * */ while ( 1 ) { blocksize = getint(fp_in); blocktype = getc(fp_in); getc(fp_in); if ( debug == ON ) fprintf(stderr, "blocktype = %d, blocksize = %d\n", blocktype, blocksize); switch ( blocktype ) { case 0: /* comment - skip blockcount bytes */ fseek(fp_in, (long) blocksize - 6, 1); break; case 1: asciitext(blocksize - 2); break; case 2: hexdata(blocksize - 2); break; case 3: case 4: error(FATAL, "resource type %d not implemented", blocktype); break; case 5: return; default: error(FATAL, "unknown resource type %d", blocktype); } /* End switch */ } /* End while */ } /* End of conv */ /*****************************************************************************/ asciitext(count) int count; /* bytes left in the block */ { int ch; int i = 0; /* * * Handles type 1 (ie. ASCII text) blocks. Changing carriage returns to newlines * is all I've done. * */ for ( i = 0; i < count; i++ ) { if ( (ch = getc(fp_in)) == '\r' ) ch = '\n'; putc(ch, fp_out); } /* End for */ } /* End of asciitext */ /*****************************************************************************/ hexdata(count) int count; /* bytes left in the block */ { int i; int n; /* * * Reads the next count bytes and converts each byte to hex. Also starts a new * line every 80 hex characters. * */ for ( i = 0, n = 0; i < count; i++ ) { fprintf(fp_out, "%.2X", getc(fp_in)); if ( (++n % 40) == 0 ) putc('\n', fp_out); } /* End for */ } /* End of hexdata */ /*****************************************************************************/ getint() { int val; int i; /* * * Reads the next four bytes into an integer and returns the value to the caller. * First two bytes are probably always 0. * */ for ( i = 0, val = (getc(fp_in) & 0377); i < 3; i++ ) val = (val << 8) | (getc(fp_in) & 0377); return(val); } /* End of getint */ /*****************************************************************************/ error(kind, mesg, a1, a2, a3) int kind; char *mesg; unsigned a1, a2, a3; { /* * * Print *mesg then quit if kind is FATAL. * */ if ( mesg != NULL && *mesg != '\0' ) { fprintf(stderr, "%s: ", prog_name); fprintf(stderr, mesg, a1, a2, a3); putc('\n', stderr); } /* End if */ if ( kind == FATAL && ignore == OFF ) exit(x_stat | 01); } /* End of error */ /*****************************************************************************/ 0707070014230735571004440057030057030000010015100522627503300003100000010626post.src/misc/laserbar.c /* laserbar -- filter to print barcodes on postscript printer */ #define MAIN 1 #define LABEL 01 #define NFLAG 02 #define SFLAG 04 #include <stdio.h> #include <ctype.h> static int code39[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* sp ! " # $ % & ' */ 0304, 0, 0, 0, 0250, 0052, 0, 0, /* ( ) * + , - - / */ 0, 0, 0224, 0212, 0, 0205, 0604, 0242, /* 0 1 2 3 4 5 6 7 */ 0064, 0441, 0141, 0540, 0061, 0460, 0160, 0045, /* 8 9 : ; < = > ? */ 0444, 0144, 0, 0, 0, 0, 0, 0, /* @ A B C D E F G */ 0, 0411, 0111, 0510, 0031, 0430, 0130, 0015, /* H I J K L M N O */ 0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422, /* P Q R S T U V W */ 0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700, /* X Y Z [ \ ] ^ _ */ 0221, 0620, 0320, 0, 0, 0, 0, 0, /* ` a b c d e f g */ 0, 0411, 0111, 0510, 0031, 0430, 0130, 0015, /* h i j k l m n o */ 0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422, /* p q r s t u v w */ 0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700, /* x y z { | } ~ del */ 0221, 0620, 0320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static void barprt(); void laserbar(); #ifdef MAIN main(argc, argv) char **argv; { int c, flags = 0, error = 0; double rotate = 0, xoffset = 0, yoffset = 0, xscale = 1, yscale = 1; extern char *optarg; extern int optind; extern double atof(); extern void exit(); while ((c = getopt(argc, argv, "r:x:y:X:Y:lns")) != EOF) { switch(c) { case 'r': rotate = atof(optarg); break; case 'x': xoffset = atof(optarg); break; case 'y': yoffset = atof(optarg); break; case 'X': xscale = atof(optarg); break; case 'Y': yscale = atof(optarg); break; case 'l': flags |= LABEL; break; case 'n': flags |= NFLAG; break; case 's': flags |= SFLAG; break; case '?': ++error; } } if ((argc - optind) != 1) ++error; if (error) { (void) fprintf(stderr, "Usage: %s [-r rotate] [-x xoffset] [-y yoffset] [-X xscale] [-Y yscale] [-lns] string\n", *argv); exit(1); } laserbar(stdout, argv[optind], rotate, xoffset, yoffset, xscale, yscale, flags); return 0; } #endif MAIN static int right = 0; void laserbar(fp, str, rotate, xoffset, yoffset, xscale, yscale, flags) FILE *fp; char *str; double rotate, xoffset, yoffset, xscale, yscale; int flags; { xoffset *= 72.; yoffset *= 72.; (void) fprintf(fp, "gsave %s\n", (flags & NFLAG) ? "newpath" : ""); if (xoffset || yoffset) (void) fprintf(fp, "%f %f moveto\n", xoffset, yoffset); if (xscale != 1 || yscale != 1) (void) fprintf(fp, "%f %f scale\n", xscale, yscale); if (rotate) (void) fprintf(fp, "%f rotate\n", rotate); (void) fputs("/Helvetica findfont 16 scalefont setfont\n", fp); (void) fputs("/w { 0 rmoveto gsave 3 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp); (void) fputs("/n { 0 rmoveto gsave 1 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp); (void) fputs("/l { gsave 2 -88 rmoveto show grestore } def\n", fp); barprt(fp, '*', 0); while (*str) barprt(fp, *(str++), (flags & LABEL)); barprt(fp, '*', 0); (void) fprintf(fp, "%sgrestore\n", (flags & SFLAG) ? "showpage " : ""); right = 0; } static void barprt(fp, c, label) FILE *fp; int c, label; { int i, mask, bar, wide; if (!(i = code39[c])) return; if (islower(c)) c = toupper(c); if (label) (void) fprintf(fp, "(%c) l", c); else (void) fputs(" ", fp); for (bar = 1, mask = 0400; mask; bar = 1 - bar, mask >>= 1) { wide = mask & i; if (bar) { if (wide) ++right; (void) fprintf(fp, " %d %s", right, wide ? "w" : "n"); right = (wide ? 2 : 1); } else right += (wide ? 3 : 1); } (void) fputs("\n", fp); ++right; } 0707070014230735601004440057030057030000010014770522627503300003100000000226post.src/misc/setbaud.ps % % Sets baud rate to 9600, options to 0 assuming the password is 0. % serverdict begin 0 exitserver statusdict begin 25 9600 0 setsccbatch end 0707070014230735611004440057030057030000010015200522627503300003000000012333post.src/misc/ibmfont.c /* * * Program that converts IBM font files to a format that works on Unix systems. * Essentially all the information needed came from the Adobe paper "Supporting * Downloadable PostScript Fonts". To use the program type, * * ibmfont font.ibm >font.unix * * where font.ibm is the font file, exactly as it came over from an IBM PC, * and font.unix is equivalent host resident font file usable on Unix systems. * */ #include <stdio.h> #include <signal.h> #define OFF 0 #define ON 1 #define NON_FATAL 0 #define FATAL 1 #define FALSE 0 #define TRUE 1 char **argv; int argc; char *prog_name; int x_stat; int debug = OFF; int ignore = OFF; FILE *fp_in = stdin; FILE *fp_out = stdout; /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * IBM PC to Unix font converter. * */ argc = agc; argv = agv; prog_name = argv[0]; options(); arguments(); exit(x_stat); } /* End of main */ /*****************************************************************************/ options() { int ch; char *names = "DI"; extern char *optarg; extern int optind; /* * * Command line options. * */ while ( (ch = getopt(argc, argv, names)) != EOF ) { switch ( ch ) { case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; argv += optind; } /* End of options */ /*****************************************************************************/ arguments() { /* * * Everything esle is an input file. No arguments or '-' means stdin. * */ if ( argc < 1 ) conv(); else while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); conv(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End of arguments */ /*****************************************************************************/ conv() { int blocksize; int blocktype; int seg; long ftell(); /* * * Font files on the IBM PC are stored in a compressed binary format. Individual * segments in the file are preceeded by a header that looks like, * * Byte 1: 128 * Byte 2: segment type (1=ASCII, 2=TOHEX, or 3=EOF) * Bytes 3-6: length of the segment * Bytes 7 ... data * */ while ( 1 ) { seg = ftell(fp_in); if ( getc(fp_in) != 128 ) error(FATAL, "bad file format"); blocktype = getc(fp_in); blocksize = getint(fp_in); if ( debug == ON ) { fprintf(stderr, "blocktype = %d, blocksize = %d\n", blocktype, blocksize); fprintf(stderr, "start=0%o, end=0%o\n", seg, seg+blocksize+6); fprintf(stderr, "start=%d, end=%d\n", seg, seg+blocksize+6); } /* End if */ switch ( blocktype ) { case 1: asciitext(blocksize); break; case 2: hexdata(blocksize); break; case 3: return; default: error(FATAL, "unknown resource type %d", blocktype); } /* End switch */ } /* End while */ } /* End of conv */ /*****************************************************************************/ asciitext(count) int count; /* bytes left in the block */ { int ch; int i = 0; /* * * Handles type 1 (ie. ASCII text) blocks. Changing carriage returns to newlines * is all I've done. * */ for ( i = 0; i < count; i++ ) { if ( (ch = getc(fp_in)) == '\r' ) ch = '\n'; putc(ch, fp_out); } /* End for */ } /* End of asciitext */ /*****************************************************************************/ hexdata(count) int count; /* bytes left in the block */ { int i; int n; /* * * Reads the next count bytes and converts each byte to hex. Also starts a new * line every 80 hex characters. * */ for ( i = 0, n = 0; i < count; i++ ) { fprintf(fp_out, "%.2X", getc(fp_in)); if ( (++n % 40) == 0 ) putc('\n', fp_out); } /* End for */ } /* End of hexdata */ /*****************************************************************************/ getint() { int val; /* * * Reads the next four bytes into an integer and returns the value to the caller. * First two bytes are probably always 0. * */ val = getc(fp_in); val |= (getc(fp_in) << 8); val |= (getc(fp_in) << 16); val |= (getc(fp_in) << 24); return(val); } /* End of getint */ /*****************************************************************************/ error(kind, mesg, a1, a2, a3) int kind; char *mesg; unsigned a1, a2, a3; { /* * * Print mesg and quit if kind is FATAL. * */ if ( mesg != NULL && *mesg != '\0' ) { fprintf(stderr, "%s: ", prog_name); fprintf(stderr, mesg, a1, a2, a3); putc('\n', stderr); } /* End if */ if ( kind == FATAL && ignore == OFF ) exit(x_stat | 01); } /* End of error */ /*****************************************************************************/ 0707070014230735621004440057030057030000010015300522627503300003000000014610post.src/misc/pscrypt.c /* * * Adobe's encryption/decryption algorithm for eexec and show. Runs in * eexec mode unless told otherwise. Use, * * pscrypt file.cypher > file.clear * * to decrypt eexec input. Assumes file.cypher is hex with the key as the * first four bytes, and writes file.clear as binary (omitting the key). * Use * * pscrypt -e12ab34ef file.clear >file.cypher * * to encrypt file.clear (for eexec) using 12ab34ef as the key. Input is * binary and output is hex. The key must be given as a hex number. Use * -sshow to encrypt or decrypt a CharString or Subr, * * pscrypt -sshow file.cypher > file.clear * * Use -b or -x to read binary or hex input, and -B or -X to output binary * or hex. * */ #include <stdio.h> #include <ctype.h> #define ENCRYPT 0 #define DECRYPT 1 #define NOTSET -1 #define BINARY 0 #define HEX 1 #define LINELENGTH 40 #define CHARSTRING 4330 #define EEXEC 55665 #define MAGIC1 52845 #define MAGIC2 22719 int argc; char **argv; int mode = DECRYPT; int input = NOTSET; int output = NOTSET; int outoffset = NOTSET; int inoffset = NOTSET; int cryptkey = 0; /* encryption key set with -e */ int linelength = LINELENGTH; /* only for hex output */ int lastchar = 0; unsigned long seed = EEXEC; unsigned long key; FILE *fp_in = stdin; /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * Implementation of the encryption/decryption used by eexec and show. * */ argc = agc; argv = agv; options(); initialize(); arguments(); exit(0); } /* End of main */ /*****************************************************************************/ options() { int ch; char *names = "bde:l:os:xBSX"; extern char *optarg; extern int optind; /* * * Command line options. * */ while ( (ch = getopt(argc, argv, names)) != EOF ) switch ( ch ) { case 'b': /* binary input */ input = BINARY; break; case 'd': /* decrypt */ mode = DECRYPT; break; case 'e': /* encrypt */ mode = ENCRYPT; if ( *optarg == '0' && *optarg == 'x' ) optarg += 2; sscanf(optarg, "%8x", &cryptkey); break; case 'l': /* line length hex output */ linelength = atoi(optarg); break; case 'o': /* output all bytes - debugging */ outoffset = 0; break; case 's': /* seed */ if ( *optarg == 'e' ) seed = EEXEC; else if ( *optarg == 's' ) seed = CHARSTRING; else if ( *optarg == '0' && *(optarg+1) == 'x' ) sscanf(optarg+2, "%x", &seed); else if ( *optarg == '0' ) sscanf(optarg, "%o", &seed); else sscanf(optarg, "%d", &seed); break; case 'x': /* hex input */ input = HEX; break; case 'B': /* binary output */ output = BINARY; break; case 'X': /* hex output */ output = HEX; break; case '?': /* don't understand the option */ fprintf(stderr, "bad option -%c\n", ch); exit(1); break; default: /* don't know what to do for ch */ fprintf(stderr, "missing case for option -%c\n", ch); exit(1); break; } /* End switch */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ initialize() { /* * * Initialization that has to be done after the options. * */ key = seed; if ( mode == DECRYPT ) { input = (input == NOTSET) ? HEX : input; output = (output == NOTSET) ? BINARY : output; inoffset = (inoffset == NOTSET) ? 0 : inoffset; outoffset = (outoffset == NOTSET) ? -4 : outoffset; } else { input = (input == NOTSET) ? BINARY : input; output = (output == NOTSET) ? HEX : output; inoffset = (inoffset == NOTSET) ? 4 : inoffset; outoffset = (outoffset == NOTSET) ? 0 : outoffset; } /* End else */ if ( linelength <= 0 ) linelength = LINELENGTH; } /* End of initialize */ /*****************************************************************************/ arguments() { /* * * Everything left is an input file. No arguments or '-' means stdin. * */ if ( argc < 1 ) crypt(); else while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) { fprintf(stderr, "can't open %s\n", *argv); exit(1); } /* End if */ crypt(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End of arguments */ /*****************************************************************************/ crypt() { unsigned int cypher; unsigned int clear; /* * * Runs the encryption/decryption algorithm. * */ while ( lastchar != EOF ) { cypher = nextbyte(); clear = ((key >> 8) ^ cypher) & 0xFF; key = (key + (mode == DECRYPT ? cypher : clear)) * MAGIC1 + MAGIC2; if ( ++outoffset > 0 && lastchar != EOF ) { if ( output == HEX ) { printf("%.2X", clear); if ( linelength > 0 && (outoffset % linelength) == 0 ) putchar('\n'); } else putchar(clear); } /* End if */ } /* End while */ } /* End of crypt */ /*****************************************************************************/ nextbyte() { int val = EOF; /* * * Returns the next byte. Uses cryptkey (i.e. what followed -e) while inoffset is * positive, otherwise reads (hex or binary) from fp_in. * */ if ( inoffset-- > 0 ) val = (cryptkey >> (inoffset*8)) & 0xFF; else if ( input == HEX ) { if ( (val = nexthexchar()) != EOF ) val = (val << 4) | nexthexchar(); } else if ( input == BINARY ) val = Getc(fp_in); return(val); } /* End of nextbyte */ /*****************************************************************************/ nexthexchar() { int ch; /* * * Reads the next hex character. * */ while ( (ch = Getc(fp_in)) != EOF && ! isxdigit(ch) ) ; if ( isdigit(ch) ) ch -= '0'; else if ( isupper(ch) ) ch -= 'A' - 10; else if ( islower(ch) ) ch -= 'a' - 10; return(ch); } /* End of nexthexchar */ /*****************************************************************************/ Getc(fp) FILE *fp; { /* * * Reads the next byte from *fp, sets lastchar, and returns the character. * */ return(lastchar = getc(fp)); } /* End of Getc */ /*****************************************************************************/ 0707070014230735631004440057030057030000010014660522627503300003100000003244post.src/misc/laserbar.1 .TH LASERBAR 1 .SH NAME laserbar \- produce bar codes on a PostScript laser printer .SH SYNOPSIS .B laserbar [\fB-r\fP rotate] [\fB-x\fP xoffset] [\fB-y\fP yoffset] [\fB-X\fP xscale] [\fB-Y\fP yscale] [\fB-lns\fP] string .SH DESCRIPTION .I Laserbar prints on the standard output the PostScript text that will produce (on a suitable laser printer) the \s-2CODE-39\s+2 bar code corresponding to .I string. The \fBr\fP option may be used to specify a rotation (in degrees) of the bar code. The \fBx\fP, \fBy\fP, \fBX\fP, and \fBY\fP options may be used to specify an x- or y-axis offset (in inches) or scaling factor, respectively. (The offset is measured from the lower left corner of the page to the upper left corner of the bar code. By default, the bar code produced is one inch high, and is scaled so that the narrowest elements are each 1/72-inch \- i.e., one point \- wide.) If the \fBl\fP option is specified, the bar code produced is labeled. If the \fBn\fP option is specified, the resulting PostScript text includes a leading \f(CWnewpath\fP command, so that the text may stand alone or precede any other PostScript commands. If the \fBs\fP option is specified, the resulting PostScript text includes a trailing \f(CWshowpage\fP command, so that the text may stand alone or follow any other PostScript commands. .P This manual page (if it appears with a bar code printed on it) was produced by something like the following sequence: .IP .ft CW laserbar -x 2.5 -y 3 -l -n ABC123xyz > tempfile .br troff -man -Tpost laserbar.1 | dpost >> tempfile .br prt -dprinter -lpostscript tempfile .ft P .SH SEE ALSO laserbar(3), prt(1), dpost(1), postbgi(1), postprint(1), postdmd(1), posttek(1), etc. 0707070014231310670407550057030057030000021027270522633075100002100000000000post.src/picpack 0707070014231307541006400057030057030000011033650522633075000003400000002737post.src/picpack/picpack.mk MAKE=/bin/make MAKEFILE=picpack.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=$(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=picpack.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/tempnam.o all : picpack install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi cp picpack $(POSTBIN)/picpack @chmod 755 $(POSTBIN)/picpack @chgrp $(GROUP) $(POSTBIN)/picpack @chown $(OWNER) $(POSTBIN)/picpack cp picpack.1 $(MAN1DIR)/picpack.1 @chmod 644 $(MAN1DIR)/picpack.1 @chgrp $(GROUP) $(MAN1DIR)/picpack.1 @chown $(OWNER) $(MAN1DIR)/picpack.1 clean : rm -f *.o clobber : clean rm -f picpack picpack : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o picpack $(OFILES) picpack.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/tempnam.o : @cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014231310711006440057030057030000011030000522627503400003300000030265post.src/picpack/picpack.c /* * * picpack - picture packing pre-processor * * A trivial troff pre-processor that copies files to stdout, expanding picture * requests into an in-line format that's passed transparently through troff and * handled by dpost. The program is an attempt to address requirements, expressed * by several organizations, of being able to store a document as a single file * (usually troff input) that can then be sent through dpost and ultimately to * a PostScript printer. * * The program looks for strings listed in the keys[] array at the start of each * line. When a picture request (as listed in keys[]) is found the second string * on the line is taken to be a picture file pathname that's added (in transparent * mode) to the output file. In addition each in-line picture file is preceeded by * device control command (again passed through in transparent mode) that looks * like, * * x X InlinePicture filename bytes * * where bytes is the size of the picture file (which begins on the next line) * and filename is the pathname of the picture file. dpost uses both arguments to * manage in-line pictures (in a big temp file). To handle pictures in diversions * picpack reads each input file twice. The first pass looks for picture inclusion * requests and copies each picture file transparently to the output file, while * second pass just copies the input file to the output file. Things could still * break, but the two pass method should handle most jobs. * * The recognized in-line picture requests are saved in keys[] and by default only * expand .BP and .PI macro calls. The -k option changes the recognized strings, * and may be needed if you've built your own picture inclusion macros on top of * .BP or .PI or decided to list each picture file at the start of your input file * using a dummy macro. For example you could require every in-line picture be * named by a dummy macro (say .iP), then the command line, * * picpack -k.iP file > file.pack * * hits on lines that begin with .iP (rather than .BP or .PI), and the only files * pulled in would be ones named as the second argument to the new .iP macro. The * -k option accepts a space or comma separated list of up to 10 different key * strings. picpack imposes no contraints on key strings, other than not allowing * spaces or commas. A key string can begin with \" and in that case it would be * troff comment. * * Although the program will help some users, there are obvious disadvantages. * Perhaps the most important is that troff output files (with in-line pictures * included) don't fit the device independent language accepted by important post * processors like proof, and that means you won't be able to reliably preview a * packed file on your 5620 or whatever. Another potential problem is that picture * files can be large. Packing everything together in a single file at an early * stage has a better chance of exceeding your system's ulimit. * */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include "gen.h" /* general purpose definitions */ #include "ext.h" /* external variable definitions */ #include "path.h" /* just for TEMPDIR definition */ char *keys[11] = {".BP", ".PI", NULL}; int quiet = FALSE; FILE *fp_in = stdin; /* input */ FILE *fp_out = stdout; /* and output files */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A picture packing pre-processor that copies input files to stdout, expanding * picture requests (as listed in keys[]) to an in-line format that can be passed * through troff (using transparent mode) and handled later by dpost. * */ argc = agc; /* global so everyone can use them */ argv = agv; prog_name = argv[0]; /* just for error messages */ options(); /* command line options */ arguments(); /* translate all the input files */ done(); /* clean things up */ exit(x_stat); /* everything probably went OK */ } /* End of main */ /*****************************************************************************/ options() { int ch; /* name returned by getopt() */ extern char *optarg; /* option argument set by getopt() */ extern int optind; /* * * Handles the command line options. * */ while ( (ch = getopt(argc, argv, "k:qDI")) != EOF ) { switch ( ch ) { case 'k': /* new expansion key strings */ newkeys(optarg); break; case 'q': /* disables "missing picture" messages */ quiet = TRUE; break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't know the option */ error(FATAL, ""); break; default: error(FATAL, "missing case for option %c", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-options args */ argv += optind; } /* End of options */ /*****************************************************************************/ newkeys(list) char *list; /* comma or space separated key strings */ { char *p; /* next key string from *list */ int i; /* goes in keys[i] */ int n; /* last key string slot in keys[] */ /* * * Separates *list into space or comma separated strings and adds each to the * keys[] array. The strings in keys[] are used to locate the picture inclusion * requests that are translated to the in-line format. The keys array must end * with a NULL pointer and by default only expands .BP and .PI macro calls. * */ n = (sizeof(keys) / sizeof(char *)) - 1; for ( i = 0, p = strtok(list, " ,"); p != NULL; i++, p = strtok(NULL, " ,") ) if ( i >= n ) error(FATAL, "too many key strings"); else keys[i] = p; keys[i] = NULL; } /* End of newkeys */ /*****************************************************************************/ arguments() { FILE *copystdin(); /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we process stdin, after copying it to a temporary file. * */ if ( argc < 1 ) { fp_in = copystdin(); picpack(); } else while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = copystdin(); else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); picpack(); fclose(fp_in); argc--; argv++; } /* End while */ } /* End of arguments */ /*****************************************************************************/ FILE *copystdin() { char *tfile; /* temporary file name */ int fd_out; /* and its file descriptor */ FILE *fp; /* return value - the new input file */ /* * * Copies stdin to a temp file, unlinks the file, and returns the file pointer * for the new temporary file to the caller. Needed because we read each input * file twice in an attempt to handle pictures in diversions. * */ if ( (tfile = tempnam(TEMPDIR, "post")) == NULL ) error(FATAL, "can't generate temp file name"); if ( (fd_out = creat(tfile, 0660)) == -1 ) error(FATAL, "can't create %s", tfile); copyfile(fileno(stdin), fd_out); close(fd_out); if ( (fp = fopen(tfile, "r")) == NULL ) error(FATAL, "can't open %s", tfile); unlink(tfile); return(fp); } /* End of copystdin */ /*****************************************************************************/ copyfile(fd_in, fd_out) int fd_in; /* input */ int fd_out; /* and output files */ { char buf[512]; /* internal buffer for reads and writes */ int count; /* number of bytes put in buf[] */ /* * * Copies file fd_in to fd_out. Handles the second pass for each input file and * also used to copy stdin to a temporary file. * */ while ( (count = read(fd_in, buf, sizeof(buf))) > 0 ) if ( write(fd_out, buf, count) != count ) error(FATAL, "write error"); } /* End of copyfile */ /*****************************************************************************/ done() { /* * * Finished with all the input files - unlink the temporary file that was used * to record the in-line picture file pathnames. * */ if ( temp_file != NULL ) unlink(temp_file); } /* End of done */ /*****************************************************************************/ picpack() { char line[512]; /* next input line */ char name[100]; /* picture file names - from BP or PI */ int i; /* for looking through keys[] */ /* * * Handles the two passes over the next input file. First pass compares the start * of each line in *fp_in with the key strings saved in the keys[] array. If a * match is found inline() is called to copy the picture file (ie. the file named * as the second string in line[]) to stdout, provided the file hasn't previously * been copied. The second pass goes back to the start of fp_in and copies it all * to the output file. * */ while ( fgets(line, sizeof(line), fp_in) != NULL ) { for ( i = 0; keys[i] != NULL; i++ ) if ( strncmp(line, keys[i], strlen(keys[i])) == 0 ) { if ( sscanf(line, "%*s %s", name) == 1 ) { strtok(name, "("); if ( gotpicfile(name) == FALSE ) inline(name); } /* End if */ } /* End if */ } /* End while */ fflush(fp_out); /* second pass - copy fp_in to fp_out */ fseek(fp_in, 0L, 0); copyfile(fileno(fp_in), fileno(fp_out)); } /* End of picpack */ /*****************************************************************************/ inline(name) char *name; /* name of the in-line picture file */ { long size; /* size in bytes - from fstat */ FILE *fp; /* for reading *name */ int ch; /* next character from picture file */ int lastch = '\n'; /* so we know when to put out \! */ struct stat sbuf; /* for the picture file size */ /* * * Copies the picture file *name to the output file in an in-line format that can * be passed through troff and recovered later by dpost. Transparent mode is used * so each line starts with \! and all \ characters must be escaped. The in-line * picture sequence begins with an "x X InlinePicture" device control command that * names the picture file and gives its size (in bytes). * */ if ( (fp = fopen(name, "r")) != NULL ) { fstat(fileno(fp), &sbuf); if ( (size = sbuf.st_size) > 0 ) { fprintf(fp_out, "\\!x X InlinePicture %s %ld\n", name, size); while ( (ch = getc(fp)) != EOF ) { if ( lastch == '\n' ) fprintf(fp_out, "\\!"); if ( ch == '\\' ) putc('\\', fp_out); putc(lastch = ch, fp_out); } /* End while */ if ( lastch != '\n' ) putc('\n', fp_out); } /* End if */ fclose(fp); addpicfile(name); } else if ( quiet == FALSE ) error(NON_FATAL, "can't read picture file %s", name); } /* End of inline */ /*****************************************************************************/ gotpicfile(name) char *name; { char buf[100]; FILE *fp_pic; /* * * Checks the list of previously added picture files in *temp_file and returns * FALSE if it's a new file and TRUE otherwise. Probably should open the temp * file once for update and leave it open, rather than opening and closing it * every time. * */ if ( temp_file != NULL ) if ( (fp_pic = fopen(temp_file, "r")) != NULL ) { while ( fscanf(fp_pic, "%s", buf) != EOF ) if ( strcmp(buf, name) == 0 ) { fclose(fp_pic); return(TRUE); } /* End if */ fclose(fp_pic); } /* End if */ return(FALSE); } /* End of gotpicfile */ /*****************************************************************************/ addpicfile(name) char *name; { FILE *fp_pic; /* * * Adds string *name to the list of in-line picture files that's maintained in * *temp_file. Should undoubtedly open the file once for update and use fseek() * to move around in the file! * */ if ( temp_file == NULL ) if ( (temp_file = tempnam(TEMPDIR, "picpac")) == NULL ) return; if ( (fp_pic = fopen(temp_file, "a")) != NULL ) { fprintf(fp_pic, "%s\n", name); fclose(fp_pic); } /* End if */ } /* End of addpicfile */ /*****************************************************************************/ 0707070014231310721006440057030057030000011030250522627503400003300000005252post.src/picpack/picpack.1 .TH PICPACK 1 .SH NAME .B picpack \- PostScript picture packing preprocessor .SH SYNOPSIS \*(mBpicpack\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B picpack copies .I files to stdout, expanding picture inclusion requests (marked by the .MW .BP or .MW .PI macros) into an in-line format that can be passed through .B troff and handled by .BR dpost . If no .I files are specified or if .OP \- is one of the input .I files standard input is read. The following .I options are understood: .TP 0.75i .OP \-k list .I list is a comma- or space-separated string of words used to locate picture inclusion requests. The start of every line in the input .I files is compared with each word in .I list . If there is a match, the second string on the line is taken as the pathname of a picture file that is added to the output file. The default .I list is .RM `` ".BP .PI ''. .TP .OP \-q Suppress ``missing picture file'' error messages. .PP .B picpack is a trivial preprocessor that, in a sense, duplicates some of the picture inclusion capabilities already available in .BR dpost . .B picpack should not be used if your formatting command line includes a call to .BR dpost . Its only purpose is to combine picture files with text in a single file that can be passed through .B troff and unpacked, at some later time, by .BR dpost . The original picture inclusion mechanism, with files are pulled in by .BR dpost , is the preferred approach. .SH EXAMPLES A typical application might be in a distributed printing environment where everything up to .B troff is run by the user and everything after .B troff is handled by a spooling daemon (perhaps .BR lp ). In that case the command line would be, .EX pic \f2file\fP | tbl | eqn | picpack | troff -mm -Tpost | lp .EE A poor example, although one that should still work, would be, .EX pic \f2file\fP | tbl | eqn | picpack | troff -mm -Tpost | dpost >\f2file\fP.ps .EE In this case picture inclusion requests could (and should) be handled by .BR dpost . Running .B picpack is not needed or even recommended. It should be dropped from any pipeline that includes a call to .BR dpost . .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .SH WARNINGS .PP Combining pictures and text using the capabilities available in .B dpost is the recommended approach and is always guaranteed to be more efficient than .BR picpack . Running .B picpack and .B dpost in the same pipeline makes little sense. .PP Using .B picpack will likely result in files that can no longer be reliably passed through other important .B troff postprocessors like .BR proof . At present .B picpack is only guaranteed to work with .BR dpost . .SH SEE ALSO .BR dpost (1), .BR troff (1) 0707070014230265620407550057030057030000020675370522633075200002100000000000post.src/postbgi 0707070014230265771006400057030057030000010664560522633075200003400000003742post.src/postbgi/postbgi.mk MAKE=/bin/make MAKEFILE=postbgi.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=postbgi.h\ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=postbgi.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o all : postbgi install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp postbgi $(POSTBIN)/postbgi @chmod 755 $(POSTBIN)/postbgi @chgrp $(GROUP) $(POSTBIN)/postbgi @chown $(OWNER) $(POSTBIN)/postbgi cp postbgi.ps $(POSTLIB)/postbgi.ps @chmod 644 $(POSTLIB)/postbgi.ps @chgrp $(GROUP) $(POSTLIB)/postbgi.ps @chown $(OWNER) $(POSTLIB)/postbgi.ps cp postbgi.1 $(MAN1DIR)/postbgi.1 @chmod 644 $(MAN1DIR)/postbgi.1 @chgrp $(GROUP) $(MAN1DIR)/postbgi.1 @chown $(OWNER) $(MAN1DIR)/postbgi.1 clean : rm -f *.o clobber : clean rm -f postbgi postbgi : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postbgi $(OFILES) -lm postbgi.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o : @cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ postbgi.1 >XXX.1; \ mv XXX.1 postbgi.1 0707070014230265641006440057030057030000010675700522627503400003300000117472post.src/postbgi/postbgi.c /* * * postbgi - BGI (Basic Graphical Instructions) to PostScript translator. * * A simple program that translates BGI files into PostScript. Probably only * useful in Computer Centers that support STARE or PRISM plotters. Most of the * code was borrowed from the corresponding program that was written for printers * that understand Impress. * * Extending the original program to handle PRISM jobs was not trivial. Graphics * packages that support PRISM occasionally use BGI commands that I ignored in the * STARE implementation. Subroutines, color requests, patterns (for filling), and * filled trapeziods were the most important omissions. All are now implemented, * and at present only repeats, filled slices, and raster rectangles are missing. * * Pattern filling results were not always predictable or even good, unless the * halftone screen definitions were changed and scaling was adjusted so one pixel * in user space mapped into an integral number of device space pixels. Doing that * makes the resulting PostScript output device dependent, but was often necessary. * I've added two booleans to the PostScript prologue (fixscreen and scaletodevice) * that control what's done. By default both are false (check postbgi.ps) but can * be set to true on the command line using the -P option or by hand by changing * the definitions in the prologue. A command line that would set fixscreen and * scaletodevice true would look like, * * postbgi -P"/fixscreen true" -P"/scaletodevice true" file >file.ps * * Several other approaches are available if you want to have your spooler handle * STARE and PRISM jobs differently. A boolean called prism is defined in the * prologue (postbgi.ps) and if it's set to true PostScript procedure setup will * set fixscreen and scaletodevice to true before anything important is done. That * means the following command line, * * postbgi -P"/prism true" file >file.ps * * accomplishes the same things as the last example. Two different prologue files, * one for STARE jobs and the other for PRISM, could be used and the spooler could * point postbgi to the appropriate one using the -L option. In that case the only * important difference in the two prologues would be the definition of prism. The * prologue used for PRISM jobs would have prism set to true, while the STARE * prologue would have it set to false. * * Also included is code that ties lines to device space coordinates. What you get * is a consistent line thickness, but placement of lines won't be exact. It's a * trade-off that should be right for most jobs. Everything is implemented in the * prologue (postbgi.ps) and nothing will be done if the linewidth is zero or if * the boolean fixlinewidth (again in postbgi.ps) is false. Once again the -P * option can be used to set fixlinewidth to whatever you choose. * * BGI supports color mixing but PostScript doesn't. BGI files that expect to mix * colors won't print properly. PostScript's fill operator overlays whatever has * already been put down. Implementing color mixing would have been a terribly * difficult job - not worth the effort! * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following PostScript procedures * are defined in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how the program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects * to find the current page number on the stack. * * v * * dx1 dy1 ... dxn dyn x y v - * * Draws the vector described by the numbers on the stack. The top two * numbers are the coordinates of the starting point. The rest of the * numbers are relative displacements from the preceeding point. * * pp * * x1 y1 ... xn yn string pp - * * Prints string, which is always a single character, at the points * represented by the rest of the numbers on the stack. * * R * * n deltax deltay x y R - * * Creates a rectangular path with its lower left corner at (x, y) and * sides of length deltax and deltay. The resulting path is stroked if * n is 0 and filled otherwise. * * T * * dx3 dy3 dx2 dy2 dx1 dy1 x y T - * * Fills a trapezoid starting at (x, y) and having relative displacements * given by the (dx, dy) pairs. * * t * * angle x y string t - * * Prints string starting at (x, y) using an orientation of angle degrees. * The PostScript procedure can handle any angle, but BGI files will only * request 0 or 90 degrees. Text printed at any other orientation will be * vector generated. * * p * * x y p - * * Called to mark the point (x, y). It fills a small circle, that right * now has a constant radius. This stuff could probably be much more * efficient? * * l * * array l - * * Sets the line drawing mode according to the description given in * array. The arrays that describe the different line styles are declared * in STYLES (file posttek.h), although it would be better to have them * defined in the prologue. * * c * * red green blue c - * * Sets the current PostScript RGB color using setrgbcolor. Also used for * selecting appropriate patterns as colors. * * f * * bgisize f - * * Changes the size of the font that's used to print text. bgisize is a * grid separation in a 5 by 7 array in which characters are assumed to * be built. * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * The default line width is zero, which forces lines to be one pixel wide. That * works well for 'write to black' engines but won't be right for 'write to white' * engines. The line width can be changed using the -w option, or you can change * the initialization of linewidth in the prologue. Code in the prologue supports * the generation of uniform width lines when linewidth is non-zero and boolean * fixlinewidth is true. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <fcntl.h> #include <signal.h> #include <math.h> #include <ctype.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable declarations */ #include "postbgi.h" /* a few definitions just used here */ char *optnames = "a:c:f:m:n:o:p:w:x:y:A:C:E:J:L:P:R:DI"; char *prologue = POSTBGI; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ char *styles[] = STYLES; /* descriptions of line styles */ int hpos = 0; /* current horizontal */ int vpos = 0; /* and vertical position */ int bgisize = BGISIZE; /* just the character grid spacing */ int linespace; /* distance between lines of text */ int bgimode; /* character or graph mode */ int in_subr = FALSE; /* currently defining a subroutine */ int in_global = FALSE; /* to save space with subroutine defs */ int subr_id = 0; /* defining this subroutine */ int shpos = 0; /* starting horizontal */ int svpos = 0; /* and vertical positions - subroutines */ Disp displacement[64]; /* dx and dy after a subroutine call */ Fontmap fontmap[] = FONTMAP; /* for translating font names */ char *fontname = "Courier"; /* use this PostScript font */ int page = 0; /* page we're working on */ int printed = 0; /* printed this many pages */ FILE *fp_in = stdin; /* read from this file */ FILE *fp_out = NULL; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A program that converts BGI (Basic Graphical Instructions) files generated by * packages like GRAFPAC and DISSPLA into PostScript. It does an adequate job but * is far from perfect. A few things still haven't been implemented (eg. repeats * and raster rectangles), but what's here should be good enough for most of our * STARE and PRISM jobs. Color mixing (in PRISM jobs) won't work on PostScript * printers, and there's no chance I'll implement it! * */ argc = agc; /* global so everyone can use them */ argv = agv; prog_name = argv[0]; /* just for error messages */ init_signals(); /* set up interrupt handling */ header(); /* PostScript header comments */ options(); /* command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* everything probably went OK */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Make sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* option name - from getopt() */ /* * * Reads and processes the command line options. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s def\n", optarg); break; case 'f': /* new font */ fontname = get_font(optarg); fprintf(stdout, "/font /%s def\n", fontname); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'w': /* line width */ fprintf(stdout, "/linewidth %s def\n", optarg); break; case 'x': /* shift horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding */ fontencoding = optarg; break; case 'L': /* Postscript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't know the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ char *get_font(name) char *name; /* name the user asked for */ { int i; /* for looking through fontmap[] */ /* * * Called from options() to map a user's font name into a legal PostScript name. * If the lookup fails *name is returned to the caller. That should let you choose * any PostScript font. * */ for ( i = 0; fontmap[i].name != NULL; i++ ) if ( strcmp(name, fontmap[i].name) == 0 ) return(fontmap[i].val); return(name); } /* End of get_font */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } /* End of setup */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line options are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll process stdin. * */ if ( argc < 1 ) conv(); else while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); conv(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with the last input file, so mark the end of the pages, make sure the * last page is printed, and restore the initial environment. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname); fprintf(stdout, "%s %d\n", PAGES, printed); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct, provided it's not NULL. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ conv() { int ch; /* next input character */ /* * * Controls the conversion of BGI files into PostScript. Not everything has been * implemented, but what's been done should be good enough for our purposes. * */ redirect(-1); /* get ready for the first page */ bgimode = 0; formfeed(); while ( (ch = get_char()) != EOF ) { switch ( ch ) { case BRCHAR: /* rotated character mode */ bgimode = ch; text(90); break; case BCHAR: /* graphical character mode */ bgimode = ch; text(0); break; case BGRAPH: /* graphical master mode */ bgimode = ch; break; case BSUB: /* subroutine definition */ subr_def(); break; case BRET: /* end of subroutine */ subr_end(); break; case BCALL: /* subroutine call */ subr_call(); break; case BEND: /* end display - page */ formfeed(); break; case BERASE: /* erase - shouldn't be used */ error(FATAL, "BGI erase opcode obsolete"); break; case BREP: /* repeat */ error(FATAL, "Repeat not implemented"); repeat(); break; case BSETX: /* new x coordinate */ hgoto(get_int(0)); break; case BSETY: /* new y coordinate */ vgoto(get_int(0)); break; case BSETXY: /* new x and y coordinates */ hgoto(get_int(0)); vgoto(get_int(0)); break; case BINTEN: /* mark the current point */ fprintf(fp_out, "%d %d p\n", hpos, vpos); break; case BVISX: /* visible x */ vector(X_COORD, VISIBLE); break; case BINVISX: /* invisible x */ vector(X_COORD, INVISIBLE); break; case BVISY: /* visible y */ vector(Y_COORD, VISIBLE); break; case BINVISY: /* invisible y */ vector(Y_COORD, INVISIBLE); break; case BVEC: /* arbitrary vector */ vector(LONGVECTOR, VISIBLE); break; case BSVEC: /* short vector */ vector(SHORTVECTOR, VISIBLE); break; case BRECT: /* draw rectangle */ rectangle(OUTLINE); break; case BPOINT1: /* point plot 1 */ case BPOINT: /* point plot 2 */ point_plot(ch, get_char()); break; case BLINE: /* line plot */ line_plot(); break; case BLTY: /* line type */ fprintf(fp_out, "%s l\n", styles[get_data()]); break; case BARC: /* circular arc */ arc(OUTLINE); break; case BFARC: /* filled circle */ arc(FILL); break; case BFRECT: /* filled rectangle */ rectangle(FILL); break; case BRASRECT: /* raster rectangle */ error(FATAL, "Raster Rectangle not implemented"); break; case BCOL: /* select color */ set_color(get_data()); break; case BFTRAPH: /* filled trapezoid */ trapezoid(); break; case BPAT: /* pattern for area filling */ pattern(); break; case BCSZ: /* change BGI character 'size' */ setsize(get_data()); break; case BNOISE: /* from bad file format */ break; default: /* don't recognize the code */ error(FATAL, "bad BGI command %d (0%o)", ch, ch); break; } /* End switch */ if ( debug == ON ) fprintf(stderr, "\n"); } /* End while */ formfeed(); /* in case BEND was missing */ } /* End of conv */ /*****************************************************************************/ hgoto(n) int n; /* new horizontal position */ { /* * * Sets the current BGI horizontal position to n. * */ hpos = n; } /* End of hgoto */ /*****************************************************************************/ vgoto(n) int n; /* move to this vertical position */ { /* * * Sets the absolute vertical position to n. * */ vpos = n; } /* End of vgoto */ /*****************************************************************************/ setsize(n) int n; /* BGI size - just a grid separation */ { /* * * Called when we're supposed to change the BGI character size to n. The BGI * size is the grid separation in a 5 by 7 array in which characters are assumed * to be built. * */ bgisize = n; linespace = LINESPACE(bgisize); fprintf(fp_out, "%d f\n", bgisize); if ( debug == ON ) fprintf(stderr, "BGI size = %d\n", n); } /* End of setsize */ /*****************************************************************************/ repeat() { int count; /* repeat this many times */ int ch; /* next input character */ /* * * Haven't implemented repeats, although it wouldn't be difficult. Apparently it's * not used by any graphics packages that generate BGI. * */ count = get_int(); /* get the repeat count */ while ( (ch = get_char()) != EOF && ch != BENDR ) ; } /* End of repeat */ /*****************************************************************************/ text(angle) int angle; /* either 0 or 90 degrees */ { int ch; /* next character from file *fp_in */ /* * * Called from conv() after we've entered one of the graphical character modes. * Characters are read from the input file and printed until the next mode change * opcode is found (or until EOF). angle will be 90 for rotated character mode * and 0 otherwise. * * */ fprintf(fp_out, "%d %d %d(", angle, hpos, vpos); while ( (ch = get_char()) != EOF ) { if ( ch == BGRAPH || ch == BCHAR || ch == BRCHAR ) { ungetc(ch, fp_in); position--; break; } /* End if */ switch ( ch ) { case '\012': vgoto(vpos - linespace); case '\015': hgoto(0); fprintf(fp_out, ")t\n%d %d %d(", angle, hpos, vpos); break; case '(': case ')': case '\\': putc('\\', fp_out); default: if ( isascii(ch) && isprint(ch) ) putc(ch, fp_out); else fprintf(fp_out, "\\%.3o", ch & 0377); break; } /* End switch */ } /* End while */ fprintf(fp_out, ") t\n"); } /* End of text */ /*****************************************************************************/ formfeed() { int ch; /* repeat count for this page */ /* * * Does whatever is needed to print the last page and get ready for the next one. * It's called, from conv(), after a BEND code is processed. I'm ignoring the * copy count that's expected to follow each page. * */ if ( bgimode == BGRAPH && (ch = get_char()) != EOF && ! (ch & MSB) ) { ungetc(ch, fp_in); position--; } /* End if */ if ( fp_out == stdout ) /* count the last page */ printed++; fprintf(fp_out, "cleartomark\n"); fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); while ( (ch = get_char()) == 0 ) ; /* skip any NULL characters */ ungetc(ch, fp_in); position--; if ( ungetc(getc(fp_in), fp_in) == EOF ) redirect(-1); else redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "mark\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%d pagesetup\n", printed+1); setsize(bgisize); hpos = vpos = 0; } /* End of formfeed */ /*****************************************************************************/ subr_def() { /* * * Starts a subroutine definition. All subroutines are defined as PostScript * procedures that begin with the character S and end with the subroutine's id * (a number between 0 and 63 - I guess). The primary, and perhaps only use of * subroutines is in special color plots produced by several graphics libraries, * and even there it's not all that common. I've also chosen not to worry about * nested subroutine definitions - that would certainly be overkill! * * All subroutines set up their own (translated) coordinate system, do their work * in that system, and restore things when they exit. To make everything work * properly we save the current point (in shpos and svpos), set our position to * (0, 0), and restore things at the end of the subroutine definition. That means * hpos and vpos measure the relative displacement after a subroutine returns, and * we save those values in the displacement[] array. The displacements are used * (in subr_call()) to properly adjust our position after each subroutine call, * and all subroutines are called with the current x and y coordinates on top of * the stack. * */ if ( in_subr == TRUE ) /* a nested subroutine definition?? */ error(FATAL, "can't handle nested subroutine definitions"); if ( (subr_id = get_data()) == EOF ) error(FATAL, "missing subroutine identifier"); if ( in_global == FALSE ) { /* just used to reduce file size some */ fprintf(fp_out, "cleartomark\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s", BEGINGLOBAL); in_global = TRUE; } /* End if */ fprintf(fp_out, "/S%d {\n", subr_id); fprintf(fp_out, "gsave translate\n"); shpos = hpos; /* save our current position */ svpos = vpos; hgoto(0); /* start at the origin */ vgoto(0); in_subr = TRUE; /* in a subroutine definition */ } /* End of subr_def */ /*****************************************************************************/ subr_end() { int ch; /* for looking at next opcode */ /* * * Handles stuff needed at the end of each subroutine. Want to remember the change * in horizontal and vertical positions for each subroutine so we can adjust our * position after each call - just in case. The current position was set to (0, 0) * before we started the subroutine definition, so when we get here hpos and vpos * are the relative displacements after the subroutine is called. They're saved in * the displacement[] array and used to adjust the current position when we return * from a subroutine. * */ if ( in_subr == FALSE ) /* not in a subroutine definition?? */ error(FATAL, "subroutine end without corresponding start"); fprintf(fp_out, "grestore\n"); fprintf(fp_out, "} def\n"); if ( in_global == TRUE && (ch = get_char()) != BSUB ) { fprintf(fp_out, "%s", ENDGLOBAL); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "mark\n"); in_global = FALSE; } /* End if */ ungetc(ch, fp_in); /* put back the next opcode */ displacement[subr_id].dx = hpos; displacement[subr_id].dy = vpos; hgoto(shpos); /* back to where we started */ vgoto(svpos); in_subr = FALSE; /* done with the definition */ } /* End of subr_end */ /*****************************************************************************/ subr_call() { int ch; /* next byte from *fp_in */ int id; /* subroutine id if ch wasn't an opcode */ /* * * Handles subroutine calls. Everything that follows the BCALL opcode (up to the * next opcode) is taken as a subroutine identifier - thus the loop that generates * the subroutine calls. * */ while ( (ch = get_char()) != EOF && (ch & MSB) ) { id = ch & DMASK; fprintf(fp_out, "%d %d S%d\n", hpos, vpos, id); hgoto(hpos + displacement[id].dx); /* adjust our position */ vgoto(vpos + displacement[id].dy); } /* End while */ ungetc(ch, fp_in); } /* End of subr_call */ /*****************************************************************************/ vector(var, mode) int var; /* coordinate that varies next? */ int mode; /* VISIBLE or INVISIBLE vectors */ { int ch; /* next character from *fp_in */ int x, y; /* line drawn to this point */ int count = 0; /* number of points so far */ /* * * Handles plotting of all types of BGI vectors. If it's a manhattan vector var * specifies which coordinate will be changed by the next number in the input * file. * */ x = hpos; /* set up the first point */ y = vpos; while ( (ch = get_char()) != EOF && ch & MSB ) { if ( var == X_COORD ) /* next length is change in x */ x += get_int(ch); else if ( var == Y_COORD ) /* it's the change in y */ y += get_int(ch); else if ( var == LONGVECTOR ) { /* long vector */ x += get_int(ch); y += get_int(0); } else { /* must be a short vector */ x += ((ch & MSBMAG) * ((ch & SGNB) ? -1 : 1)); y += (((ch = get_data()) & MSBMAG) * ((ch & SGNB) ? -1 : 1)); } /* End else */ if ( mode == VISIBLE ) { /* draw the line segment */ fprintf(fp_out, "%d %d\n", hpos - x, vpos - y); count++; } /* End if */ hgoto(x); /* adjust the current BGI position */ vgoto(y); if ( var == X_COORD ) /* vertical length comes next */ var = Y_COORD; else if ( var == Y_COORD ) /* change horizontal next */ var = X_COORD; } /* End while */ if ( count > 0 ) fprintf(fp_out, "%d %d v\n", hpos, vpos); ungetc(ch, fp_in); /* it wasn't part of the vector */ position--; } /* End of vector */ /*****************************************************************************/ rectangle(mode) int mode; /* FILL or OUTLINE the rectangle */ { int deltax; /* displacement for horizontal side */ int deltay; /* same but for vertical sides */ /* * * Draws a rectangle and either outlines or fills it, depending on the value of * mode. Would be clearer, and perhaps better, if {stroke} or {fill} were put on * the stack instead of 0 or 1. R could then define the path and just do an exec * to fill or stroke it. * */ deltax = get_int(0); /* get the height and width */ deltay = get_int(0); if ( mode == OUTLINE ) fprintf(fp_out, "0 %d %d %d %d R\n", deltax, deltay, hpos, vpos); else fprintf(fp_out, "1 %d %d %d %d R\n", deltax, deltay, hpos, vpos); } /* End of rectangle */ /*****************************************************************************/ trapezoid() { int kind; /* which sides are parallel */ int d[6]; /* true displacements - depends on kind */ /* * * Handles filled trapeziods. A data byte of 0101 following the opcode means the * horizontal sides are parallel, 0102 means the vertical sides are parallel. * Filling is handled by eofill so we don't need to get things in the right order. * */ kind = get_data(); d[0] = get_int(0); d[1] = 0; d[2] = get_int(0); d[3] = get_int(0); d[4] = get_int(0); d[5] = 0; if ( kind == 2 ) { /* parallel sides are vertical */ d[1] = d[0]; d[0] = 0; d[5] = d[4]; d[4] = 0; } /* End if */ fprintf(fp_out, "%d %d %d %d %d %d %d %d T\n", d[4], d[5], d[2], d[3], d[0], d[1], hpos, vpos); } /* End of trapezoid */ /*****************************************************************************/ point_plot(mode, ch) int mode; /* plotting mode BPOINT or BPOINT1 */ int ch; /* will be placed at the points */ { int c; /* next character from input file */ int x, y; /* ch gets put here next */ int deltax; /* x increment for BPOINT1 mode */ /* * * The two point plot modes are used to place a character at selected points. The * difference in the two modes, namely BPOINT and BPOINT1, is the way we get the * coordinates of the next point. In BPOINT1 the two bytes immediately following * ch select a constant horizontal change, while both coordinates are given for * all points in BPOINT mode. * */ if ( mode == BPOINT1 ) { /* first integer is change in x */ deltax = get_int(0); x = hpos - deltax; } /* End if */ while ( (c = get_char()) != EOF && (c & MSB) ) { if ( mode == BPOINT1 ) { /* only read y coordinate */ y = get_int(c); x += deltax; } else { /* get new x and y from input file */ x = get_int(c); y = get_int(0); } /* End else */ hgoto(x); /* adjust BGI position */ vgoto(y); fprintf(fp_out, "%d %d\n", hpos, vpos); } /* End while */ putc('(', fp_out); switch ( ch ) { case '(': case ')': case '\\': putc('\\', fp_out); default: putc(ch, fp_out); } /* End switch */ fprintf(fp_out, ")pp\n"); ungetc(c, fp_in); /* it wasn't part of the point plot */ position--; } /* End of point_plot */ /*****************************************************************************/ line_plot() { int c; /* next input character from fp_in */ int deltax; /* change in x coordinate */ int x0, y0; /* starting point for next segment */ int x1, y1; /* endpoint of the line */ int count = 0; /* number of points so far */ /* * * Essentially the same format as BPOINT1, except that in this case we connect * pairs of points by line segments. * */ deltax = get_int(0); /* again the change in x is first */ x1 = hpos; /* so it works first time through */ y1 = get_int(0); while ( (c = get_char()) != EOF && (c & MSB) ) { x0 = x1; /* line starts here */ y0 = y1; x1 += deltax; /* and ends at this point */ y1 = get_int(c); fprintf(fp_out, "%d %d\n", -deltax, y0 - y1); count++; } /* End while */ hgoto(x1); /* adjust current BGI position */ vgoto(y1); if ( count > 0 ) fprintf(fp_out, "%d %d v\n", hpos, vpos); ungetc(c, fp_in); /* wasn't part of the line */ position--; } /* End of line_plot */ /*****************************************************************************/ arc(mode) int mode; /* FILL or OUTLINE the path */ { int dx1, dy1; /* displacements for first point */ int dx2, dy2; /* same for the second point */ int radius; /* of the arc */ int angle1, angle2; /* starting and ending angles */ /* * * Called whenever we need to draw an arc. I'm ignoring filled slices for now. * */ dx1 = get_int(0); /* displacements relative to center */ dy1 = get_int(0); dx2 = get_int(0); dy2 = get_int(0); radius = get_int(0); /* and the radius */ if ( radius == 0 ) /* nothing to do */ return; angle1 = (atan2((double) dy1, (double) dx1) * 360) / (2 * PI) + .5; angle2 = (atan2((double) dy2, (double) dx2) * 360) / (2 * PI) + .5; fprintf(fp_out, "%d %d %d %d %d arcn stroke\n", hpos, vpos, radius, angle1, angle2); } /* End of arc */ /*****************************************************************************/ pattern() { double red = 0; /* color components */ double green = 0; double blue = 0; int kind; /* corse or fine pattern */ int val; /* next color data byte */ int i; /* loop index */ /* * * Handles patterns by setting the current color based of the values assigned to * the next four data bytes. BGI supports two kinds of patterns (fine or coarse) * but I'm handling each in the same way - for now. In a fine pattern the four * data bytes assign a color to four individual pixels (upperleft first) while * in a coarse pattern the four colors are assigned to groups of four pixels, * for a total of 16. Again the first color goes to the group in the upper left * corner. The byte immediately following the BPAT opcode selects fine (040) or * coarse (041) patterns. The PostScript RGB color is assigned by averaging the * RED, GREEN, and BLUE components assigned to the four pixels (or groups of * pixels). Acceptable results, but there's no distinction between fine and * coarse patterns. * */ if ( (kind = get_char()) == EOF ) error(FATAL, "bad pattern command"); for ( i = 0; i < 4; i++ ) { val = get_data(); red += get_color(val, RED); green += get_color(val, GREEN); blue += get_color(val, BLUE); } /* End for */ fprintf(fp_out, "%g %g %g c\n", red/4, green/4, blue/4); } /* End of pattern */ /*****************************************************************************/ get_color(val, component) int val; /* color data byte */ int component; /* RED, GREEN, or BLUE component */ { int primary; /* color mixing mode - bits 2 to 4 */ int plane; /* primary color plane - bits 5 to 7 */ unsigned rgbcolor; /* PostScript expects an RGB triple */ /* * * Picks the requested color component (RED, GREEN, or BLUE) from val and returns * the result to the caller. BGI works with Cyan, Yellow, and Magenta so the one's * complement stuff (following the exclusive or'ing) recovers the RED, BLUE, and * GREEN components that PostScript's setrgbcolor operator needs. The PostScript * interpreter in the ColorScript 100 has a setcmycolor operator, but it's not * generally available so I've decided to stick with setrgbcolor. * */ primary = (val >> 3) & 07; plane = val & 07; rgbcolor = (~(primary ^ plane)) & 07; if ( debug == ON ) fprintf(stderr, "val = %o, primary = %o, plane = %o, rgbcolor = %o\n", val, primary, plane, rgbcolor); switch ( component ) { case RED: return(rgbcolor>>2); case GREEN: return(rgbcolor&01); case BLUE: return((rgbcolor>>1)&01); default: error(FATAL, "unknown color component"); return(0); } /* End switch */ } /* End of get_color */ /*****************************************************************************/ set_color(val) int val; /* color data byte */ { /* * * Arranges to have the color set to the value requested in the BGI data byte val. * */ fprintf(fp_out, "%d %d %d c\n", get_color(val, RED), get_color(val, GREEN), get_color(val, BLUE)); } /* End of set_color */ /*****************************************************************************/ get_int(highbyte) int highbyte; /* already read this byte */ { int lowbyte; /* this and highbyte make the int */ /* * * Figures out the value on the integer (sign magnitude form) that's next in the * input file. If highbyte is nonzero we'll use it and the next byte to build the * integer, otherwise two bytes are read from fp_in. * */ if ( highbyte == 0 ) /* need to read the first byte */ highbyte = get_data(); lowbyte = get_data(); /* always need the second byte */ return(highbyte & SGNB ? -MAG(highbyte, lowbyte) : MAG(highbyte, lowbyte)); } /* End of get_int */ /*****************************************************************************/ get_data() { int val; /* data value returned to caller */ /* * * Called when we expect to find a single data character in the input file. The * data bit is turned off and the resulting value is returned to the caller. * */ if ( (val = get_char()) == EOF || ! (val & MSB) ) error(FATAL, "missing data value"); return(val & DMASK); } /* End of get_data */ /*****************************************************************************/ get_char() { int ch; /* character we just read */ /* * * Reads the next character from file *fp_in and returns the value to the caller. * This routine isn't really needed, but we may want to deal directly with some * screwball file formats so I thought it would probably be a good idea to isolate * all the input in one routine that could be easily changed. * */ if ( (ch = getc(fp_in)) != EOF ) { position++; ch &= CHMASK; } /* End if */ if ( debug == ON ) fprintf(stderr, "%o ", ch); return(ch); } /* End of get_char */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014230265651006440057030057030000010675520522627503400003300000012631post.src/postbgi/postbgi.h /* * * BGI opcodes. * */ #define BRCHAR 033 /* rotated character mode */ #define BCHAR 034 /* graphical character mode */ #define BGRAPH 035 /* graphical master mode */ #define BSUB 042 /* subroutine definition */ #define BRET 043 /* end of subroutine */ #define BCALL 044 /* subroutine call */ #define BEND 045 /* end page */ #define BERASE 046 /* erase - obsolete */ #define BREP 047 /* repeat */ #define BENDR 050 /* end repeat */ #define BSETX 051 /* set horizontal position */ #define BSETY 052 /* set vertical position */ #define BSETXY 053 /* set horizontal and vertical positions */ #define BINTEN 054 /* intensify - mark current pixel */ #define BVISX 055 /* manhattan vector - change x first */ #define BINVISX 056 /* same as BVISX but nothing drawn */ #define BVISY 057 /* manhattan vector - change y first */ #define BINVISY 060 /* same as BVISY but nothing drawn */ #define BVEC 061 /* arbitrary long vector */ #define BSVEC 062 /* arbitrary short vector */ #define BRECT 063 /* outline rectangle */ #define BPOINT1 064 /* point plot - mode 1 */ #define BPOINT 065 /* point plot - mode 2 */ #define BLINE 066 /* line plot */ #define BCSZ 067 /* set character size */ #define BLTY 070 /* select line type */ #define BARC 071 /* draw circular arc */ #define BFARC 072 /* filled circular arc */ #define BFRECT 073 /* filled rectangle */ #define BRASRECT 074 /* raster rectangle */ #define BCOL 075 /* select color */ #define BFTRAPH 076 /* filled trapezoid */ #define BPAT 077 /* pattern are for filling - no info */ #define BNOISE 0 /* from bad file format */ /* * * Character size is controlled by the spacing of dots in a 5x7 dot matrix, which * by default is set to BGISIZE. * */ #define BGISIZE 2 /* default character grid spacing */ /* * * Definitions used to decode the bytes read from a BGI file. * */ #define CHMASK 0177 /* characters only use 7 bits */ #define DMASK 077 /* data values use lower 6 bits */ #define MSB 0100 /* used to check for data or opcode */ #define SGNB 040 /* sign bit for integers */ #define MSBMAG 037 /* mag of most sig byte in a BGI int */ /* * * Descriptions of BGI vectors and what's done when they're drawn. * */ #define X_COORD 0 /* change x next in manhattan vector */ #define Y_COORD 1 /* same but y change comes next */ #define LONGVECTOR 2 /* arbitrary long vector */ #define SHORTVECTOR 3 /* components given in 6 bits */ #define VISIBLE 0 /* really draw the vector */ #define INVISIBLE 1 /* just move the current position */ /* * * What's done with a closed path. * */ #define OUTLINE 0 /* outline the defined path */ #define FILL 1 /* fill it in */ /* * * BGI line style definitions. They're used as an index into the STYLES array, * which really belongs in the prologue. * */ #define SOLID 0 #define DOTTED 1 #define SHORTDASH 2 #define DASH 3 #define LONGDASH 4 #define DOTDASH 5 #define THREEDOT 6 #define STYLES \ \ { \ "[]", \ "[.5 2]", \ "[2 4]", \ "[4 4]", \ "[8 4]", \ "[.5 2 4 2]", \ "[.5 2 .5 2 .5 2 4 2]" \ } /* * * Three constants used to choose which component (RED, GREEN, or BLUE) we're * interested in. BGI colors are specified as a single data byte and pulling a * particular component out of the BGI color byte is handled by procedure * get_color(). * */ #define RED 0 #define GREEN 1 #define BLUE 2 /* * * An array of type Disp is used to save the horizontal and vertical displacements * that result after a subroutine has been called. Needed so we can properly adjust * our horizontal and vertical positions after a subroutine call. Entries are made * immediately after a subroutine is defined and used after the call. Subroutine * names are integers that range from 0 to 63 (assigned in the BG file) and the * name is used as an index into the Disp array when we save or retrieve the * displacement. * */ typedef struct { int dx; /* horizontal and */ int dy; /* vertical displacements */ } Disp; /* * * An array of type Fontmap helps convert font names requested by users into * legitimate PostScript names. The array is initialized using FONTMAP, which must * end with and entry that has NULL defined as its name field. * */ typedef struct { char *name; /* user's font name */ char *val; /* corresponding PostScript name */ } Fontmap; #define FONTMAP \ \ { \ "R", "Courier", \ "I", "Courier-Oblique", \ "B", "Courier-Bold", \ "CO", "Courier", \ "CI", "Courier-Oblique", \ "CB", "Courier-Bold", \ "CW", "Courier", \ "PO", "Courier", \ "courier", "Courier", \ "cour", "Courier", \ "co", "Courier", \ NULL, NULL \ } /* * * Two macros that are useful in processing BGI files: * * MAG(A, B) - Takes bytes A and B which have been read from a BGI file * and returns the magnitude of the integer represented by * the two bytes. * * LINESPACE(A) - Takes BGI size A and returns the number of address units * that can be used for a reasonable interline spacing. * */ #define MAG(A, B) (((A & MSBMAG) << 6) | (B & DMASK)) #define LINESPACE(A) (8 * A) /* * * Some of the non-integer valued functions in postdmd.c. * */ char *get_font(); 0707070014230265661006440057030057030000010677100522627503400003000000001447post.src/postbgi/README BGI (Basic Graphical Instructions) to PostScript translator. Probably not useful outside the Computer Centers. Added code to tie lines to device space coordinates. Helps eliminate variations in line widths noticeable when users selected a non-zero linewidth with the -w option. Much that was omitted from early versions of the program has been implemented. What's in place will handle most STARE (black and white) and PRISM (color) BGI jobs. PRISM jobs often fill regions with color, and need require device specific tuning to get things just right. An easy solution is add "-P/prism true def" option to the postbgi command line when you translate PRISM jobs. A typical command line for STARE jobs would be, postbgi file >file.ps while for PRISM jobs use, postbgi -P"/prism true def" file >file.ps 0707070014230266641006400057030057030000010700100522633075200003300000010325post.src/postbgi/postbgi.1 .ds dQ /usr/lib/postscript .TH POSTBGI 1 "DWB 3.2" .SH NAME .B postbgi \- PostScript translator for .SM BGI (Basic Graphical Instructions) files .SH SYNOPSIS \*(mBpostbgi\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B postbgi translates .SM BGI (Basic Graphical Instructions) .I files into PostScript and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-f name Print text using font .IR name . Any PostScript font can be used, although the best results will only be obtained with constant width fonts. The default font is Courier. .TP .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which by default is located at the center of each page. The default magnification is 1.0. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP .OP \-w num Set the line width used for graphics to .I num points, where a point is approximately 1/72 of an inch. By default .I num is set to 0 points, which forces lines to be one pixel wide. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed at the center of the page, with positive x to the right and positive y up the page. Positive .I num moves everything right. The default offset is 0 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves everything up the page. The default offset is 0 inches. .TP .OP \-E name Set the character encoding for text fonts to .IR name . Requesting .I name means include file .MI \*(dQ name .enc \f1. A nonexistent encoding file is silently ignored. The default selects file .MR \*(dQ/Default.enc . .TP .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/postbgi.ps . .PP Three options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include .I string in the output file; .I string must be legitimate PostScript. .TP .OP \-R action Requests special .I action (e.g., .MR manualfeed ) on a per page or global basis. The .I action string can be given as .IR request , .IM request : page\f1\|, or .IM request : page : file\f1\|. If .I page is omitted or given as 0, the request applies to all pages. If .I file is omitted, the request lookup is done in .MR \*(dQ/ps.requests . .PP .B postbgi can handle .SM STARE (black and white) and .SM PRISM (color) .SM BGI jobs. By default plots are rigidly scaled to fill the page, which produces the good results for most .SM STARE jobs. .SM PRISM jobs typically fill regions with colors, and often require device specific tuning to produce acceptable results. Adding the .MW \-P"/prism\ true\ def" option is strongly recommended when .B postbgi is translating .SM PRISM jobs. .br .ne 7v .SH EXAMPLES For most .SM STARE jobs, .EX postbgi \f2file .EE gives good results, while .EX postbgi \-P"/prism true def" \f2file .EE is recommended when translating .SM PRISM jobs. .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .SH BUGS The default line width is too small for write-white print engines, like the one used by the PS-2400. Several .SM BGI opcodes have not been implemented. .SH FILES .MW \*(dQ/postbgi.ps .br .MW \*(dQ/forms.ps .br .MW \*(dQ/ps.requests .SH SEE ALSO .BR dpost (1), .BR postdaisy (1), .BR postdmd (1), .BR postio (1), .BR postmd (1), .BR postprint (1), .BR postreverse (1), .BR posttek (1), .BR psencoding (1) 0707070014230265701006440057030057030000010677300522627503400003400000006016post.src/postbgi/postbgi.ps % % Version 3.3.2 prologue for BGI files - STARE or PRISM. % /#copies 1 store /aspectratio 1 def /fixlinewidth true def /fixscreen false def /font /Courier def /formsperpage 1 def /landscape false def /linewidth 0 def /magnification 1 def /margin 0 def /orientation 0 def /prism false def /resolution 128 def /rotation 1 def /scaletodevice false def /screenheight 1280 def /screenwidth 1024 def /xoffset 0 def /yoffset 0 def /devres 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /kshow {kshow} bind def % so later references don't bind /show {show} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if prism {/fixscreen true def /scaletodevice true def} if prism linewidth 0 eq and {/linewidth .3 def} if fixscreen {devres 4 div orientation currentscreen 3 1 roll pop pop setscreen} if pagedimensions /scaling scaletodevice {devres resolution div truncate 72 mul devres div dup} {height margin sub screenheight div width margin sub screenwidth div} ifelse min def xcenter ycenter translate orientation rotation mul rotate xoffset inch yoffset inch translate magnification dup aspectratio mul scale scaling scaling scale screenwidth 2 div neg screenheight 2 div neg translate tietodevicespace linewidth scaling div setlinewidth 1 setlinecap newpath } def /pagedimensions { useclippath { /pagebbox [clippath pathbbox newpath] def } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /pagesetup {/page exch def} bind def /tietodevicespace { fixlinewidth linewidth 0 gt and linewidth 1 lt and { /moveto { 2 copy /Y exch def /X exch def transform round exch round exch itransform moveto } bind def /lineto { 2 copy /Y exch def /X exch def transform round exch round exch itransform lineto } bind def /rlineto {Y add exch X add exch lineto} bind def /v V 0 get bind def } if } def /V [{moveto counttomark 2 idiv {rlineto} repeat stroke}] def /v V 0 get bind def /p {linewidth 2 div 0 360 arc fill} bind def /pp {/ch exch def counttomark 2 idiv {moveto xc yc rmoveto ch show} repeat} bind def /l {{scaling div} forall counttomark array astore 0 setdash} bind def /c {setrgbcolor} bind def /T {newpath moveto rlineto rlineto rlineto closepath eofill} bind def /R { newpath moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath 0 eq {stroke} {eofill} ifelse } bind def /f { dup dup /charwidth exch 6 mul def /xc exch -2.5 mul def /yc exch -3.5 mul def font findfont charwidth .6 div scalefont setfont } bind def /t { /str exch def gsave translate rotate xc yc moveto currentpoint { pop pop exch charwidth add exch moveto currentpoint } str kshow pop pop grestore } bind def /done {/lastpage where {pop lastpage} if} def 0707070014230642760407550057030057030000021712350522633075400002300000000000post.src/postdaisy 0707070014230637751006400057030057030000011711740522633075300004000000004021post.src/postdaisy/postdaisy.mk MAKE=/bin/make MAKEFILE=postdaisy.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=postdaisy.h \ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=postdaisy.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o all : postdaisy install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp postdaisy $(POSTBIN)/postdaisy @chmod 755 $(POSTBIN)/postdaisy @chgrp $(GROUP) $(POSTBIN)/postdaisy @chown $(OWNER) $(POSTBIN)/postdaisy cp postdaisy.ps $(POSTLIB)/postdaisy.ps @chmod 644 $(POSTLIB)/postdaisy.ps @chgrp $(GROUP) $(POSTLIB)/postdaisy.ps @chown $(OWNER) $(POSTLIB)/postdaisy.ps cp postdaisy.1 $(MAN1DIR)/postdaisy.1 @chmod 644 $(MAN1DIR)/postdaisy.1 @chgrp $(GROUP) $(MAN1DIR)/postdaisy.1 @chown $(OWNER) $(MAN1DIR)/postdaisy.1 clean : rm -f *.o clobber : clean rm -f postdaisy postdaisy : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postdaisy $(OFILES) postdaisy.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o : @cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ postdaisy.1 >XXX.1; \ mv XXX.1 postdaisy.1 0707070014230643001006440057030057030000011712530522627503500003700000004056post.src/postdaisy/postdaisy.h /* * * Definitions used by the PostScript translator for Diablo 1640 files. * * Diablo printers have horizontal and vertical resolutions of 120 and 48 dpi. * We'll use a single resolution of 240 dpi and let the program scale horizontal * and vertical positions by HSCALE and VSCALE. * */ #define RES 240 #define HSCALE 2 #define VSCALE 5 /* * * HMI is the default character spacing and VMI is the line spacing. Both values * are in terms of the 240 dpi resolution. * */ #define HMI (12 * HSCALE) #define VMI (8 * VSCALE) /* * * Paper dimensions don't seem to be all that important. They're just used to * set the right and bottom margins. Both are given in terms of the 240 dpi * resolution. * */ #define LEFTMARGIN 0 #define RIGHTMARGIN 3168 #define TOPMARGIN 0 #define BOTTOMMARGIN 2640 /* * * ROWS and COLUMNS set the dimensions of the horizontal and vertical tab arrays. * The way I've implemented both kinds of tabs leaves something to be desired, but * it was simple and should be good enough for now. If arrays are going to be used * to mark tab stops I probably should use malloc() to get enough space once the * initial hmi and vmi are know. * */ #define ROWS 400 #define COLUMNS 200 /* * * An array of type Fontmap helps convert font names requested by users into * legitimate PostScript names. The array is initialized using FONTMAP, which must * end with an entry that has NULL defined as its name field. * */ typedef struct { char *name; /* user's font name */ char *val; /* corresponding PostScript name */ } Fontmap; #define FONTMAP \ \ { \ "R", "Courier", \ "I", "Courier-Oblique", \ "B", "Courier-Bold", \ "CO", "Courier", \ "CI", "Courier-Oblique", \ "CB", "Courier-Bold", \ "CW", "Courier", \ "PO", "Courier", \ "courier", "Courier", \ "cour", "Courier", \ "co", "Courier", \ NULL, NULL \ } /* * * Some of the non-integer functions in postdaisy.c. * */ char *get_font(); 0707070014230643011006440057030057030000011712700522627503500003700000067263post.src/postdaisy/postdaisy.c /* * * postdaisy - PostScript translator for Diablo 1640 files. * * A program that translates Diablo 1640 files into PostScript. Absolutely nothing * is guaranteed. Quite a few things haven't been implemented, and what's been * done isn't well tested. Most of the documentation used to write this program * was taken from the 'Diablo Emulator' section of a recent Imagen manual. * * Some of document comments that are generated may not be right. Most of the test * files I used produced a trailing blank page. I've put a check in formfeed() that * won't print the last page if it doesn't contain any text, but PAGES comments may * not be right. The DOCUMENTFONTS comment will also be wrong if auto underline or * bold printing have been turned on by escape commands. * * The brute force approach used to implement horizontal and vertical tabs leaves * much to be desired, and may not work for very small initial hmi and vmi values. * At the very least I should have used malloc() to get space for the two tabstop * arrays after hmi and vmi are known! * * Reverse printing mode hasn't been tested at all, but what's here should be * close even though it's not efficient. * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following PostScript procedures * are defined in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how this program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects to * find the current page number on the stack. * * t * * mark str1 x1 str2 x2 ... strn xn y hmi t mark * * Handles all the text on the stack. Characters in the strings are * printed using hmi as the character advance, and all strings are at * vertical position y. Each string is begins at the horizontal position * that preceeds it. * * f * * font f - * * Use font f, where f is the full PostScript font name. Only used when * we switch to auto underline (Courier-Italic) or bold (Courier-Bold) * printing. * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable declarations */ #include "postdaisy.h" /* a few special definitions */ char *optnames = "a:c:f:h:l:m:n:o:p:r:s:v:x:y:A:C:E:J:L:P:DI"; char *prologue = POSTDAISY; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ char htabstops[COLUMNS]; /* horizontal */ char vtabstops[ROWS]; /* and vertical tabs */ int res = RES; /* input file resolution - sort of */ int hmi = HMI; /* horizontal motion index - 1/120 inch */ int vmi = VMI; /* vertical motion index - 1/48 inch */ int ohmi = HMI; /* original hmi */ int ovmi = VMI; /* and vmi - for tabs and char size */ int hpos = 0; /* current horizontal */ int vpos = 0; /* and vertical position */ int lastx = -1; /* printer's last horizontal */ int lasty = -1; /* and vertical position */ int lasthmi = -1; /* hmi for current text strings */ int lastc = -1; /* last printed character */ int prevx = -1; /* at this position */ int leftmargin = LEFTMARGIN; /* page margins */ int rightmargin = RIGHTMARGIN; int topmargin = TOPMARGIN; int bottommargin = BOTTOMMARGIN; int stringcount = 0; /* number of strings on the stack */ int stringstart = 1; /* column where current one starts */ int advance = 1; /* -1 if in backward print mode */ int lfiscr = OFF; /* line feed implies carriage return */ int crislf = OFF; /* carriage return implies line feed */ int linespp = 0; /* lines per page if it's positive */ int markedpage = FALSE; /* helps prevent trailing blank page */ int page = 0; /* page we're working on */ int printed = 0; /* printed this many pages */ Fontmap fontmap[] = FONTMAP; /* for translating font names */ char *fontname = "Courier"; /* use this PostScript font */ int shadowprint = OFF; /* automatic bold printing if ON */ FILE *fp_in; /* read from this file */ FILE *fp_out = stdout; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that translates Diablo 1640 files into PostScript. Nothing * is guaranteed - the program not well tested and doesn't implement everything. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* really just for error messages */ init_signals(); /* sets up interrupt handling */ header(); /* PostScript header comments */ options(); /* handle the command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Makes sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); if ( DOROUND ) cat(ROUNDPAGE); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ int n; /* for CR and LF modes */ /* * * Reads and processes the command line options. Added the -P option so arbitrary * PostScript code can be passed through. Expect it could be useful for changing * definitions in the prologue for which options have not been defined. * * Although any PostScript font can be used, things will only work for constant * width fonts. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'f': /* use this PostScript font */ fontname = get_font(optarg); fprintf(stdout, "/font /%s def\n", fontname); break; case 'h': /* default character spacing */ ohmi = hmi = atoi(optarg) * HSCALE; fprintf(stdout, "/hmi %s def\n", optarg); break; case 'l': /* lines per page */ linespp = atoi(optarg); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'r': /* set CR and LF modes */ n = atoi(optarg); if ( n & 01 ) lfiscr = ON; else lfiscr = OFF; if ( n & 02 ) crislf = ON; else crislf = OFF; break; case 's': /* point size */ fprintf(stdout, "/pointsize %s def\n", optarg); break; case 'v': /* default line spacing */ ovmi = vmi = atoi(optarg) * VSCALE; break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding */ fontencoding = optarg; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ char *get_font(name) char *name; /* name the user asked for */ { int i; /* for looking through fontmap[] */ /* * * Called from options() to map a user's font name into a legal PostScript name. * If the lookup fails *name is returned to the caller. That should let you choose * any PostScript font, although things will only work well for constant width * fonts. * */ for ( i = 0; fontmap[i].name != NULL; i++ ) if ( strcmp(name, fontmap[i].name) == 0 ) return(fontmap[i].val); return(name); } /* End of get_font */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } /* End of setup */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll process stdin. * */ fp_in = stdin; if ( argc < 1 ) text(); else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); text(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with all the input files, so mark the end of the pages, make sure the * last page is printed, and restore the initial environment. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname); fprintf(stdout, "%s %d\n", PAGES, printed); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct provided it's not NULL. Accounting * is requested using the -A or -J options. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ text() { int ch; /* next input character */ /* * * Translates the next input file into PostScript. The redirect(-1) call forces * the initial output to go to /dev/null - so the stuff formfeed() does at the * end of each page doesn't go to stdout. * */ redirect(-1); /* get ready for the first page */ formfeed(); /* force PAGE comment etc. */ inittabs(); while ( (ch = getc(fp_in)) != EOF ) switch ( ch ) { case '\010': /* backspace */ backspace(); break; case '\011': /* horizontal tab */ htab(); break; case '\012': /* new line */ linefeed(); break; case '\013': /* vertical tab */ vtab(); break; case '\014': /* form feed */ formfeed(); break; case '\015': /* carriage return */ carriage(); break; case '\016': /* extended character set - SO */ break; case '\017': /* extended character set - SI */ break; case '\031': /* next char from supplementary set */ break; case '\033': /* 2 or 3 byte escape sequence */ escape(); break; default: oput(ch); break; } /* End switch */ formfeed(); /* next file starts on a new page? */ } /* End of text */ /*****************************************************************************/ inittabs() { int i; /* loop index */ /* * * Initializes the horizontal and vertical tab arrays. The way tabs are handled is * quite inefficient and may not work for all initial hmi or vmi values. * */ for ( i = 0; i < COLUMNS; i++ ) htabstops[i] = ((i % 8) == 0) ? ON : OFF; for ( i = 0; i < ROWS; i++ ) vtabstops[i] = ((i * ovmi) > BOTTOMMARGIN) ? ON : OFF; } /* End of inittabs */ /*****************************************************************************/ cleartabs() { int i; /* loop index */ /* * * Clears all horizontal and vertical tab stops. * */ for ( i = 0; i < ROWS; i++ ) htabstops[i] = OFF; for ( i = 0; i < COLUMNS; i++ ) vtabstops[i] = OFF; } /* End of cleartabs */ /*****************************************************************************/ formfeed() { /* * * Called whenever we've finished with the last page and want to get ready for the * next one. Also used at the beginning and end of each input file, so we have to * be careful about what's done. I've added a simple test before the showpage that * should eliminate the extra blank page that was put out at the end of many jobs, * but the PAGES comments may be wrong. * */ if ( fp_out == stdout ) /* count the last page */ printed++; endline(); /* print the last line */ fprintf(fp_out, "cleartomark\n"); if ( feof(fp_in) == 0 || markedpage == TRUE ) fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); if ( ungetc(getc(fp_in), fp_in) == EOF ) redirect(-1); else redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "mark\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%d pagesetup\n", printed+1); vgoto(topmargin); hgoto(leftmargin); markedpage = FALSE; } /* End of formfeed */ /*****************************************************************************/ linefeed() { int line = 0; /* current line - based on ovmi */ /* * * Adjust our current vertical position. If we've passed the bottom of the page * or exceeded the number of lines per page, print it and go to the upper left * corner of the next page. This routine is also called from carriage() if crislf * is ON. * */ vmot(vmi); if ( lfiscr == ON ) hgoto(leftmargin); if ( linespp > 0 ) /* means something so see where we are */ line = vpos / ovmi + 1; if ( vpos > bottommargin || line > linespp ) formfeed(); } /* End of linefeed */ /*****************************************************************************/ carriage() { /* * * Handles carriage return character. If crislf is ON we'll generate a line feed * every time we get a carriage return character. * */ if ( shadowprint == ON ) /* back to normal mode */ changefont(fontname); advance = 1; shadowprint = OFF; hgoto(leftmargin); if ( crislf == ON ) linefeed(); } /* End of carriage */ /*****************************************************************************/ htab() { int col; /* 'column' we'll be at next */ int i; /* loop index */ /* * * Tries to figure out where the next tab stop is. Wasn't positive about this * one, since hmi can change. I'll assume columns are determined by the original * value of hmi. That fixes them on the page, which seems to make more sense than * letting them float all over the place. * */ endline(); col = hpos/ohmi + 1; for ( i = col; i < ROWS; i++ ) if ( htabstops[i] == ON ) { col = i; break; } /* End if */ hgoto(col * ohmi); lastx = hpos; } /* End of htab */ /*****************************************************************************/ vtab() { int line; /* line we'll be at next */ int i; /* loop index */ /* * * Looks for the next vertical tab stop in the vtabstops[] array and moves to that * line. If we don't find a tab we'll just move down one line - shouldn't happen. * */ endline(); line = vpos/ovmi + 1; for ( i = line; i < COLUMNS; i++ ) if ( vtabstops[i] == ON ) { line = i; break; } /* End if */ vgoto(line * ovmi); } /* End of vtab */ /*****************************************************************************/ backspace() { /* * * Moves backwards a distance equal to the current value of hmi, but don't go * past the left margin. * */ endline(); if ( hpos - leftmargin >= hmi ) hmot(-hmi); else hgoto(leftmargin); /* maybe just ignore the backspace?? */ lastx = hpos; } /* End of backspace */ /*****************************************************************************/ escape() { int ch; /* control character */ /* * * Handles special codes that are expected to follow an escape character. The * initial escape character is followed by one or two bytes. * */ switch ( ch = getc(fp_in) ) { case 'T': /* top margin */ topmargin = vpos; break; case 'L': /* bottom margin */ bottommargin = vpos; break; case 'C': /* clear top and bottom margins */ bottommargin = BOTTOMMARGIN; topmargin = TOPMARGIN; break; case '9': /* left margin */ leftmargin = hpos; break; case '0': /* right margin */ rightmargin = hpos; break; case '1': /* set horizontal tab */ htabstops[hpos/ohmi] = ON; break; case '8': /* clear horizontal tab at hpos */ htabstops[hpos/ohmi] = OFF; break; case '-': /* set vertical tab */ vtabstops[vpos/ovmi] = ON; break; case '2': /* clear all tabs */ cleartabs(); break; case '\014': /* set lines per page */ linespp = getc(fp_in); break; case '\037': /* set hmi to next byte minus 1 */ hmi = HSCALE * (getc(fp_in) - 1); break; case 'S': /* reset hmi to default */ hmi = ohmi; break; case '\011': /* move to column given by next byte */ hgoto((getc(fp_in)-1) * ohmi); break; case '?': /* do carriage return after line feed */ lfiscr = ON; break; case '!': /* don't generate carriage return */ lfiscr = OFF; break; case '5': /* forward print mode */ advance = 1; break; case '6': /* backward print mode */ advance = -1; break; case '\036': /* set vmi to next byte minus 1 */ vmi = VSCALE * (getc(fp_in) - 1); break; case '\013': /* move to line given by next byte */ vgoto((getc(fp_in)-1) * ovmi); break; case 'U': /* positive half line feed */ vmot(vmi/2); break; case 'D': /* negative half line feed */ vmot(-vmi/2); break; case '\012': /* negative line feed */ vmot(-vmi); break; case '\015': /* clear all margins */ bottommargin = BOTTOMMARGIN; topmargin = TOPMARGIN; leftmargin = BOTTOMMARGIN; rightmargin = RIGHTMARGIN; break; case 'E': /* auto underscore - use italic font */ changefont("/Courier-Oblique"); break; case 'R': /* disable auto underscore */ changefont(fontname); break; case 'O': /* bold/shadow printing */ case 'W': changefont("/Courier-Bold"); shadowprint = ON; break; case '&': /* disable bold printing */ changefont(fontname); shadowprint = OFF; break; case '/': /* ignored 2 byte escapes */ case '\\': case '<': case '>': case '%': case '=': case '.': case '4': case 'A': case 'B': case 'M': case 'N': case 'P': case 'Q': case 'X': case '\010': break; case ',': /* ignored 3 byte escapes */ case '\016': case '\021': getc(fp_in); break; case '3': /* graphics mode - should quit! */ case '7': case 'G': case 'V': case 'Y': case 'Z': error(FATAL, "graphics mode is not implemented"); break; default: error(FATAL, "missing case for escape o%o\n", ch); break; } /* End switch */ } /* End of escape */ /*****************************************************************************/ vmot(n) int n; /* move this far vertically */ { /* * * Move vertically n units from where we are. * */ vpos += n; } /* End of vmot */ /*****************************************************************************/ vgoto(n) int n; /* new vertical position */ { /* * * Moves to absolute vertical position n. * */ vpos = n; } /* End of vgoto */ /*****************************************************************************/ hmot(n) int n; /* move this horizontally */ { /* * * Moves horizontally n units from our current position. * */ hpos += n * advance; if ( hpos < leftmargin ) hpos = leftmargin; } /* End of hmot */ /*****************************************************************************/ hgoto(n) int n; /* go to this horizontal position */ { /* * * Moves to absolute horizontal position n. * */ hpos = n; } /* End of hgoto */ /*****************************************************************************/ changefont(name) char *name; { /* * * Changes the current font. Used to get in and out of auto underscore and bold * printing. * */ endline(); fprintf(fp_out, "%s f\n", name); } /* End of changefont */ /*****************************************************************************/ startline() { /* * * Called whenever we want to be certain we're ready to start pushing characters * into an open string on the stack. If stringcount is positive we've already * started, so there's nothing to do. The first string starts in column 1. * */ if ( stringcount < 1 ) { putc('(', fp_out); stringstart = lastx = hpos; lasty = vpos; lasthmi = hmi; lastc = -1; prevx = -1; stringcount = 1; } /* End if */ } /* End of startline */ /*****************************************************************************/ endline() { /* * * Generates a call to the PostScript procedure that processes the text on the * the stack - provided stringcount is positive. * */ if ( stringcount > 0 ) fprintf(fp_out, ")%d %d %d t\n", stringstart, lasty, lasthmi); stringcount = 0; } /* End of endline */ /*****************************************************************************/ endstring() { /* * * Takes the string we've been working on and adds it to the output file. Called * when we need to adjust our horizontal position before starting a new string. * Also called from endline() when we're done with the current line. * */ if ( stringcount > 0 ) { fprintf(fp_out, ")%d(", stringstart); lastx = stringstart = hpos; stringcount++; } /* End if */ } /* End of endstring */ /*****************************************************************************/ oput(ch) int ch; /* next output character */ { /* * * Responsible for adding all printing characters from the input file to the * open string on top of the stack. The only other characters that end up in * that string are the quotes required for special characters. Reverse printing * mode hasn't been tested but it should be close. hpos and lastx should disagree * each time (except after startline() does something), and that should force a * call to endstring() for every character. * */ if ( stringcount > 100 ) /* don't put too much on the stack */ endline(); if ( vpos != lasty ) endline(); if ( advance == -1 ) /* for reverse printing - move first */ hmot(hmi); startline(); if ( lastc != ch || hpos != prevx ) { if ( lastx != hpos ) endstring(); if ( isascii(ch) && isprint(ch) ) { if ( ch == '\\' || ch == '(' || ch == ')' ) putc('\\', fp_out); putc(ch, fp_out); } else fprintf(fp_out, "\\%.3o", ch & 0377); lastc = ch; prevx = hpos; lastx += lasthmi; } /* End if */ if ( advance != -1 ) hmot(hmi); markedpage = TRUE; } /* End of oput */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014230643021006440057030057030000011712360522627503500003200000000127post.src/postdaisy/README Diablo 630 to PostScript translator. Not terribly useful, and much has been omitted. 0707070014230637761006400057030057030000011712300522633075400003700000007451post.src/postdaisy/postdaisy.1 .ds dQ /usr/lib/postscript .TH POSTDAISY 1 "DWB 3.2" .SH NAME .B postdaisy \- PostScript translator for Diablo 630 files .SH SYNOPSIS \*(mBpostdaisy\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B postdaisy translates Diablo 630 daisy-wheel .I files into PostScript and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-f name Print .I files using font .IR name . Any PostScript font can be used, although the best results will only be obtained with constant width fonts. The default font is Courier. .TP .OP \-h num Set the initial horizontal motion index to .IR num . Determines the character advance and the default point size, unless the .OP \-s option is used. The default is 12. .TP .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which is located near the upper left corner of each page. The default magnification is 1.0. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP .OP \-r num Selects carriage return and line feed behavior. If .I num is 1 a line feed generates a carriage return. If .I num is 2 a carriage return generates a line feed. Setting .I num to 3 enables both modes. .TP .OP \-s num Use point size .I num instead of the default value set by the initial horizontal motion index. .TP .OP \-v num Set the initial vertical motion index to .IR num . The default is 8. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed near the upper left corner of the page, with positive x to the right and positive y down the page. Positive .I num moves everything right. The default offset is 0.25 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves text down the page. The default offset is 0.25 inches. .TP .OP \-E name Set the character encoding for text fonts to .IR name . Requesting .I name means include file .MI \*(dQ/ name .enc \f1. A nonexistent encoding file is silently ignored. The default selects file .MR \*(dQ/Default.enc . .TP .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/postdaisy.ps . .PP Three options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include .I string in output file; .I string must be legitimate PostScript. .TP .OP \-R action Requests special .I action (e.g., .MR manualfeed ) on a per page or global basis. The .I action string can be given as .IR request , .IM request : page\f1\|, or .IM request : page : file\f1\|. If .I page is omitted or given as 0, the request applies to all pages. If .I file is omitted, the request lookup is done in .MR \*(dQ/ps.requests . .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .SH FILES .MW \*(dQ/postdaisy.ps .br .MW \*(dQ/forms.ps .br .MW \*(dQ/ps.requests .SH SEE ALSO .BR dpost (1), .BR postdmd (1), .BR postio (1), .BR postmd (1), .BR postprint (1), .BR postreverse (1), .BR posttek (1), .BR psencoding (1) 0707070014230643041006440057030057030000011712560522627503500004000000003367post.src/postdaisy/postdaisy.ps % % Version 3.3.2 prologue for Diablo 1640 files. % /#copies 1 store /aspectratio 1 def /font /Courier def /formsperpage 1 def /hmi 12 def /landscape false def /magnification 1 def /margin 10 def /orientation 0 def /resolution 240 def /rotation 1 def /xoffset .25 def /yoffset .25 def /roundpage true def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /ashow {ashow} bind def % so later references don't bind /stringwidth {stringwidth} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if /scaling 72 resolution div def currentdict /pointsize known not {/pointsize hmi def} if font findfont pointsize scaling div scalefont setfont /charwidth (M) stringwidth pop def pagedimensions xcenter ycenter translate orientation rotation mul rotate width 2 div neg height 2 div translate xoffset inch yoffset inch neg translate margin 2 div dup neg translate magnification dup aspectratio mul scale height width div 1 min dup scale scaling dup scale } def /pagedimensions { useclippath userdict /gotpagebbox known not and { /pagebbox [clippath pathbbox newpath] def roundpage currentdict /roundpagebbox known and {roundpagebbox} if } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /pagesetup {/page exch def 0 0 moveto} bind def /t { charwidth sub /advance exch def neg /y exch def counttomark 2 idiv {y moveto advance 0 3 -1 roll ashow} repeat } bind def /f {findfont pointsize scaling div scalefont setfont} bind def /done {/lastpage where {pop lastpage} if} def 0707070014230643051006440057030057030000011713700522627503500004000000067255post.src/postdaisy/Opostdaisy.c /* * * postdaisy - PostScript translator for Diablo 1640 files. * * A program that translates Diablo 1640 files into PostScript. Absolutely nothing * is guaranteed. Quite a few things haven't been implemented, and what's been * done isn't well tested. Most of the documentation used to write this program * was taken from the 'Diablo Emulator' section of a recent Imagen manual. * * Some of document comments that are generated may not be right. Most of the test * files I used produced a trailing blank page. I've put a check in formfeed() that * won't print the last page if it doesn't contain any text, but PAGES comments may * not be right. The DOCUMENTFONTS comment will also be wrong if auto underline or * bold printing have been turned on by escape commands. * * The brute force approach used to implement horizontal and vertical tabs leaves * much to be desired, and may not work for very small initial hmi and vmi values. * At the very least I should have used malloc() to get space for the two tabstop * arrays after hmi and vmi are known! * * Reverse printing mode hasn't been tested at all, but what's here should be * close even though it's not efficient. * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following PostScript procedures * are defined in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how this program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects to * find the current page number on the stack. * * t * * mark str1 x1 str2 x2 ... strn xn y hmi t mark * * Handles all the text on the stack. Characters in the strings are * printed using hmi as the character advance, and all strings are at * vertical position y. Each string is begins at the horizontal position * that preceeds it. * * f * * font f - * * Use font f, where f is the full PostScript font name. Only used when * we switch to auto underline (Courier-Italic) or bold (Courier-Bold) * printing. * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable declarations */ #include "postdaisy.h" /* a few special definitions */ char *optnames = "a:c:f:h:l:m:n:o:p:r:s:v:x:y:A:C:E:J:L:P:DI"; char *prologue = POSTDAISY; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ char htabstops[COLUMNS]; /* horizontal */ char vtabstops[ROWS]; /* and vertical tabs */ int res = RES; /* input file resolution - sort of */ int hmi = HMI; /* horizontal motion index - 1/120 inch */ int vmi = VMI; /* vertical motion index - 1/48 inch */ int ohmi = HMI; /* original hmi */ int ovmi = VMI; /* and vmi - for tabs and char size */ int hpos = 0; /* current horizontal */ int vpos = 0; /* and vertical position */ int lastx = -1; /* printer's last horizontal */ int lasty = -1; /* and vertical position */ int lasthmi = -1; /* hmi for current text strings */ int lastc = -1; /* last printed character */ int prevx = -1; /* at this position */ int leftmargin = LEFTMARGIN; /* page margins */ int rightmargin = RIGHTMARGIN; int topmargin = TOPMARGIN; int bottommargin = BOTTOMMARGIN; int stringcount = 0; /* number of strings on the stack */ int stringstart = 1; /* column where current one starts */ int advance = 1; /* -1 if in backward print mode */ int lfiscr = OFF; /* line feed implies carriage return */ int crislf = OFF; /* carriage return implies line feed */ int linespp = 0; /* lines per page if it's positive */ int markedpage = FALSE; /* helps prevent trailing blank page */ int page = 0; /* page we're working on */ int printed = 0; /* printed this many pages */ Fontmap fontmap[] = FONTMAP; /* for translating font names */ char *fontname = "Courier"; /* use this PostScript font */ int shadowprint = OFF; /* automatic bold printing if ON */ FILE *fp_in; /* read from this file */ FILE *fp_out = stdout; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that translates Diablo 1640 files into PostScript. Nothing * is guaranteed - the program not well tested and doesn't implement everything. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* really just for error messages */ init_signals(); /* sets up interrupt handling */ header(); /* PostScript header comments */ options(); /* handle the command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { int interrupt(); /* signal handler */ /* * * Makes sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); if ( DOROUND ) cat(ROUNDPAGE); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ int n; /* for CR and LF modes */ /* * * Reads and processes the command line options. Added the -P option so arbitrary * PostScript code can be passed through. Expect it could be useful for changing * definitions in the prologue for which options have not been defined. * * Although any PostScript font can be used, things will only work for constant * width fonts. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'f': /* use this PostScript font */ fontname = get_font(optarg); fprintf(stdout, "/font /%s def\n", fontname); break; case 'h': /* default character spacing */ ohmi = hmi = atoi(optarg) * HSCALE; fprintf(stdout, "/hmi %s def\n", optarg); break; case 'l': /* lines per page */ linespp = atoi(optarg); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'r': /* set CR and LF modes */ n = atoi(optarg); if ( n & 01 ) lfiscr = ON; else lfiscr = OFF; if ( n & 02 ) crislf = ON; else crislf = OFF; break; case 's': /* point size */ fprintf(stdout, "/pointsize %s def\n", optarg); break; case 'v': /* default line spacing */ ovmi = vmi = atoi(optarg) * VSCALE; break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding */ fontencoding = optarg; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ char *get_font(name) char *name; /* name the user asked for */ { int i; /* for looking through fontmap[] */ /* * * Called from options() to map a user's font name into a legal PostScript name. * If the lookup fails *name is returned to the caller. That should let you choose * any PostScript font, although things will only work well for constant width * fonts. * */ for ( i = 0; fontmap[i].name != NULL; i++ ) if ( strcmp(name, fontmap[i].name) == 0 ) return(fontmap[i].val); return(name); } /* End of get_font */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } /* End of setup */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll process stdin. * */ fp_in = stdin; if ( argc < 1 ) text(); else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); text(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with all the input files, so mark the end of the pages, make sure the * last page is printed, and restore the initial environment. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname); fprintf(stdout, "%s %d\n", PAGES, printed); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct provided it's not NULL. Accounting * is requested using the -A or -J options. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ text() { int ch; /* next input character */ /* * * Translates the next input file into PostScript. The redirect(-1) call forces * the initial output to go to /dev/null - so the stuff formfeed() does at the * end of each page doesn't go to stdout. * */ redirect(-1); /* get ready for the first page */ formfeed(); /* force PAGE comment etc. */ inittabs(); while ( (ch = getc(fp_in)) != EOF ) switch ( ch ) { case '\010': /* backspace */ backspace(); break; case '\011': /* horizontal tab */ htab(); break; case '\012': /* new line */ linefeed(); break; case '\013': /* vertical tab */ vtab(); break; case '\014': /* form feed */ formfeed(); break; case '\015': /* carriage return */ carriage(); break; case '\016': /* extended character set - SO */ break; case '\017': /* extended character set - SI */ break; case '\031': /* next char from supplementary set */ break; case '\033': /* 2 or 3 byte escape sequence */ escape(); break; default: if ( isascii(ch) && isprint(ch) ) oput(ch); break; } /* End switch */ formfeed(); /* next file starts on a new page? */ } /* End of text */ /*****************************************************************************/ inittabs() { int i; /* loop index */ /* * * Initializes the horizontal and vertical tab arrays. The way tabs are handled is * quite inefficient and may not work for all initial hmi or vmi values. * */ for ( i = 0; i < COLUMNS; i++ ) htabstops[i] = ((i % 8) == 0) ? ON : OFF; for ( i = 0; i < ROWS; i++ ) vtabstops[i] = ((i * ovmi) > BOTTOMMARGIN) ? ON : OFF; } /* End of inittabs */ /*****************************************************************************/ cleartabs() { int i; /* loop index */ /* * * Clears all horizontal and vertical tab stops. * */ for ( i = 0; i < ROWS; i++ ) htabstops[i] = OFF; for ( i = 0; i < COLUMNS; i++ ) vtabstops[i] = OFF; } /* End of cleartabs */ /*****************************************************************************/ formfeed() { /* * * Called whenever we've finished with the last page and want to get ready for the * next one. Also used at the beginning and end of each input file, so we have to * be careful about what's done. I've added a simple test before the showpage that * should eliminate the extra blank page that was put out at the end of many jobs, * but the PAGES comments may be wrong. * */ if ( fp_out == stdout ) /* count the last page */ printed++; endline(); /* print the last line */ fprintf(fp_out, "cleartomark\n"); if ( feof(fp_in) == 0 || markedpage == TRUE ) fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); if ( ungetc(getc(fp_in), fp_in) == EOF ) redirect(-1); else redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "mark\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%d pagesetup\n", printed+1); vgoto(topmargin); hgoto(leftmargin); markedpage = FALSE; } /* End of formfeed */ /*****************************************************************************/ linefeed() { int line = 0; /* current line - based on ovmi */ /* * * Adjust our current vertical position. If we've passed the bottom of the page * or exceeded the number of lines per page, print it and go to the upper left * corner of the next page. This routine is also called from carriage() if crislf * is ON. * */ vmot(vmi); if ( lfiscr == ON ) hgoto(leftmargin); if ( linespp > 0 ) /* means something so see where we are */ line = vpos / ovmi + 1; if ( vpos > bottommargin || line > linespp ) formfeed(); } /* End of linefeed */ /*****************************************************************************/ carriage() { /* * * Handles carriage return character. If crislf is ON we'll generate a line feed * every time we get a carriage return character. * */ if ( shadowprint == ON ) /* back to normal mode */ changefont(fontname); advance = 1; shadowprint = OFF; hgoto(leftmargin); if ( crislf == ON ) linefeed(); } /* End of carriage */ /*****************************************************************************/ htab() { int col; /* 'column' we'll be at next */ int i; /* loop index */ /* * * Tries to figure out where the next tab stop is. Wasn't positive about this * one, since hmi can change. I'll assume columns are determined by the original * value of hmi. That fixes them on the page, which seems to make more sense than * letting them float all over the place. * */ endline(); col = hpos/ohmi + 1; for ( i = col; i < ROWS; i++ ) if ( htabstops[i] == ON ) { col = i; break; } /* End if */ hgoto(col * ohmi); lastx = hpos; } /* End of htab */ /*****************************************************************************/ vtab() { int line; /* line we'll be at next */ int i; /* loop index */ /* * * Looks for the next vertical tab stop in the vtabstops[] array and moves to that * line. If we don't find a tab we'll just move down one line - shouldn't happen. * */ endline(); line = vpos/ovmi + 1; for ( i = line; i < COLUMNS; i++ ) if ( vtabstops[i] == ON ) { line = i; break; } /* End if */ vgoto(line * ovmi); } /* End of vtab */ /*****************************************************************************/ backspace() { /* * * Moves backwards a distance equal to the current value of hmi, but don't go * past the left margin. * */ endline(); if ( hpos - leftmargin >= hmi ) hmot(-hmi); else hgoto(leftmargin); /* maybe just ignore the backspace?? */ lastx = hpos; } /* End of backspace */ /*****************************************************************************/ escape() { int ch; /* control character */ /* * * Handles special codes that are expected to follow an escape character. The * initial escape character is followed by one or two bytes. * */ switch ( ch = getc(fp_in) ) { case 'T': /* top margin */ topmargin = vpos; break; case 'L': /* bottom margin */ bottommargin = vpos; break; case 'C': /* clear top and bottom margins */ bottommargin = BOTTOMMARGIN; topmargin = TOPMARGIN; break; case '9': /* left margin */ leftmargin = hpos; break; case '0': /* right margin */ rightmargin = hpos; break; case '1': /* set horizontal tab */ htabstops[hpos/ohmi] = ON; break; case '8': /* clear horizontal tab at hpos */ htabstops[hpos/ohmi] = OFF; break; case '-': /* set vertical tab */ vtabstops[vpos/ovmi] = ON; break; case '2': /* clear all tabs */ cleartabs(); break; case '\014': /* set lines per page */ linespp = getc(fp_in); break; case '\037': /* set hmi to next byte minus 1 */ hmi = HSCALE * (getc(fp_in) - 1); break; case 'S': /* reset hmi to default */ hmi = ohmi; break; case '\011': /* move to column given by next byte */ hgoto((getc(fp_in)-1) * ohmi); break; case '?': /* do carriage return after line feed */ lfiscr = ON; break; case '!': /* don't generate carriage return */ lfiscr = OFF; break; case '5': /* forward print mode */ advance = 1; break; case '6': /* backward print mode */ advance = -1; break; case '\036': /* set vmi to next byte minus 1 */ vmi = VSCALE * (getc(fp_in) - 1); break; case '\013': /* move to line given by next byte */ vgoto((getc(fp_in)-1) * ovmi); break; case 'U': /* positive half line feed */ vmot(vmi/2); break; case 'D': /* negative half line feed */ vmot(-vmi/2); break; case '\012': /* negative line feed */ vmot(-vmi); break; case '\015': /* clear all margins */ bottommargin = BOTTOMMARGIN; topmargin = TOPMARGIN; leftmargin = BOTTOMMARGIN; rightmargin = RIGHTMARGIN; break; case 'E': /* auto underscore - use italic font */ changefont("/Courier-Oblique"); break; case 'R': /* disable auto underscore */ changefont(fontname); break; case 'O': /* bold/shadow printing */ case 'W': changefont("/Courier-Bold"); shadowprint = ON; break; case '&': /* disable bold printing */ changefont(fontname); shadowprint = OFF; break; case '/': /* ignored 2 byte escapes */ case '\\': case '<': case '>': case '%': case '=': case '.': case '4': case 'A': case 'B': case 'M': case 'N': case 'P': case 'Q': case 'X': case '\010': break; case ',': /* ignored 3 byte escapes */ case '\016': case '\021': getc(fp_in); break; case '3': /* graphics mode - should quit! */ case '7': case 'G': case 'V': case 'Y': case 'Z': error(FATAL, "graphics mode is not implemented"); break; default: error(FATAL, "missing case for escape o%o\n", ch); break; } /* End switch */ } /* End of escape */ /*****************************************************************************/ vmot(n) int n; /* move this far vertically */ { /* * * Move vertically n units from where we are. * */ vpos += n; } /* End of vmot */ /*****************************************************************************/ vgoto(n) int n; /* new vertical position */ { /* * * Moves to absolute vertical position n. * */ vpos = n; } /* End of vgoto */ /*****************************************************************************/ hmot(n) int n; /* move this horizontally */ { /* * * Moves horizontally n units from our current position. * */ hpos += n * advance; if ( hpos < leftmargin ) hpos = leftmargin; } /* End of hmot */ /*****************************************************************************/ hgoto(n) int n; /* go to this horizontal position */ { /* * * Moves to absolute horizontal position n. * */ hpos = n; } /* End of hgoto */ /*****************************************************************************/ changefont(name) char *name; { /* * * Changes the current font. Used to get in and out of auto underscore and bold * printing. * */ endline(); fprintf(fp_out, "%s f\n", name); } /* End of changefont */ /*****************************************************************************/ startline() { /* * * Called whenever we want to be certain we're ready to start pushing characters * into an open string on the stack. If stringcount is positive we've already * started, so there's nothing to do. The first string starts in column 1. * */ if ( stringcount < 1 ) { putc('(', fp_out); stringstart = lastx = hpos; lasty = vpos; lasthmi = hmi; lastc = -1; prevx = -1; stringcount = 1; } /* End if */ } /* End of startline */ /*****************************************************************************/ endline() { /* * * Generates a call to the PostScript procedure that processes the text on the * the stack - provided stringcount is positive. * */ if ( stringcount > 0 ) fprintf(fp_out, ")%d %d %d t\n", stringstart, lasty, lasthmi); stringcount = 0; } /* End of endline */ /*****************************************************************************/ endstring() { /* * * Takes the string we've been working on and adds it to the output file. Called * when we need to adjust our horizontal position before starting a new string. * Also called from endline() when we're done with the current line. * */ if ( stringcount > 0 ) { fprintf(fp_out, ")%d(", stringstart); lastx = stringstart = hpos; stringcount++; } /* End if */ } /* End of endstring */ /*****************************************************************************/ oput(ch) int ch; /* next output character */ { /* * * Responsible for adding all printing characters from the input file to the * open string on top of the stack. The only other characters that end up in * that string are the quotes required for special characters. Reverse printing * mode hasn't been tested but it should be close. hpos and lastx should disagree * each time (except after startline() does something), and that should force a * call to endstring() for every character. * */ if ( stringcount > 100 ) /* don't put too much on the stack */ endline(); if ( vpos != lasty ) endline(); if ( advance == -1 ) /* for reverse printing - move first */ hmot(hmi); startline(); if ( lastc != ch || hpos != prevx ) { if ( lastx != hpos ) endstring(); if ( ch == '\\' || ch == '(' || ch == ')' ) putc('\\', fp_out); putc(ch, fp_out); lastc = ch; prevx = hpos; lastx += lasthmi; } /* End if */ if ( advance != -1 ) hmot(hmi); markedpage = TRUE; } /* End of oput */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014230735640407550057030057030000020015370522633075500002100000000000post.src/postdmd 0707070014230735651006440057030057030000010015060522627503500003000000001317post.src/postdmd/README DMD bitmap to PostScript translator. Much of the code came from abm, which was written by Guy Riddle. By default 6 byte patterns are used to encode the output bitmap. Use the -b option to change the pattern size. Bitmaps are unpacked one scanline at a time and re-encoded in a format that looks like, bytes patterns count where bytes and count are decimal integers and patterns is a series of hex digits. Bytes is the number of bytes represented by the hex pattern, and count is the number of additional times the pattern should be repeated. For example, 2 FFFF 4 5 FFFFFFFFFF 1 10 FFFFFFFFFFFFFFFFFFFF 0 all represent 10 consecutive bytes of ones. Scanlines are terminated by a 0 on a line by itself. 0707070014230732611006400057030057030000010015760522633075500003400000003714post.src/postdmd/postdmd.mk MAKE=/bin/make MAKEFILE=postdmd.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=$(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=postdmd.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o all : postdmd install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp postdmd $(POSTBIN)/postdmd @chmod 755 $(POSTBIN)/postdmd @chgrp $(GROUP) $(POSTBIN)/postdmd @chown $(OWNER) $(POSTBIN)/postdmd cp postdmd.ps $(POSTLIB)/postdmd.ps @chmod 644 $(POSTLIB)/postdmd.ps @chgrp $(GROUP) $(POSTLIB)/postdmd.ps @chown $(OWNER) $(POSTLIB)/postdmd.ps cp postdmd.1 $(MAN1DIR)/postdmd.1 @chmod 644 $(MAN1DIR)/postdmd.1 @chgrp $(GROUP) $(MAN1DIR)/postdmd.1 @chown $(OWNER) $(MAN1DIR)/postdmd.1 clean : rm -f *.o clobber : clean rm -f postdmd postdmd : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postdmd $(OFILES) postdmd.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o : @cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ postdmd.1 >XXX.1; \ mv XXX.1 postdmd.1 0707070014230735671006440057030057030000010015400522627503500003300000050035post.src/postdmd/postdmd.c /* * * postdmd - PostScript translator for DMD bitmap files. * * A simple program that can be used to print DMD bitmaps on PostScript printers. * Much of the code was borrowed from abm, which was written by Guy Riddle. * * Although the program supports two different input bitmap formats, by far the * most important is the Eighth (and Ninth) Edition bitfile format. A bitmap in * the bitfile format begins with a 10 byte header with the first two bytes set to * zero. The next 8 bytes set the x and y coordinates of the bitmap's origin and * corner (ie. the upper left and lower right corners). The compressed raster data * follows the header and consists of control bytes followed an appropriate number * of data bytes. Control bytes (ie. n) less than 127 means read the next 2*n bytes * of raster data directly from the input file, while if n is larger than 128 we * read two bytes from the input file and replicate the bytes n-128 times. After * each scan line is recovered it's exclusive-or'd with the preceeding line to * generate the real raster data. * * After each raster line is recovered postdmd encodes it in a slightly different * format that's designed to be unpacked by a PostScript procedure that's defined * in the prologue. By default no exclusive-or'ing is done and packing of pattern * data can be based on any number of bytes rather than just the next two bytes. * By default 6 byte patterns are used, but any number can be selected with the -b * option. A non-positive argument (eg. -b0) disables all pattern encoding. Larger * patterns increase the size of the output file, but reduce the work load that's * forced on the PostScript interpreter. The default choices I've made (ie. 6 byte * patterns and no exclusive-or'ing) do a decent balancing job across currently * available PostScript printers. Larger patterns (eg. -b16) increase the output * file size, but may be appropriate if you're running at a high baud rate (eg. * 19.2KB), while smaller patter size (eg. -b4) may help if you've got a printer * with a fast processor (eg. a PS-810). * * The encoding produced by the program (and decoded on the printer) looks like, * * bytes patterns count * * where bytes and count are decimal integers and patterns is a hex string. Bytes * is the number of bytes represented by the hex patterns and count is the number * of additional times the patterns should be repeated. For example, * * 2 FFFF 4 * 5 FFFFFFFFFF 1 * 10 FFFFFFFFFFFFFFFFFFFF 0 * * all represent 10 consecutive bytes of ones. Scanlines are terminated by a 0 on * a line by itself. * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following PostScript procedures * are defined in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how this program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects * to find the current page number on the stack. * * bitmap * * v8format flip scanlength scanlines bitmap - * * Prints the bitmap that's read from standard input. The bitmap consists * of scanlines lines, each of which includes scanlength pixels. If * v8format is true the picture is assumed to be an Eighth Edition bitmap, * and the exclusive-or'ing will be done on the printer. * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable declarations */ char *optnames = "a:b:c:fm:n:o:p:ux:y:A:C:E:J:L:P:DI"; char *prologue = POSTDMD; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int bbox[2] = {0, 0}; /* upper right coordinates only */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ int bytespp = 6; /* bytes per pattern - on output */ int flip = FALSE; /* ones complement the bitmap */ int v8undo = TRUE; /* xor'ing done on host if TRUE */ int v8format = FALSE; /* for Eighth Edition bitmaps */ int page = 0; /* last page we worked on */ int printed = 0; /* and the number of pages printed */ int patterns; /* 16 bit patterns per scan line */ int scanlines; /* lines in the bitmap */ int patcount = 0; /* should be patterns * scanlines */ char *raster = NULL; /* next raster line */ char *prevrast = NULL; /* and the previous one - v8format */ char *rptr; /* next free byte in raster */ char *eptr; /* one past the last byte in raster */ FILE *fp_in = NULL; /* read from this file */ FILE *fp_out = stdout; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that translates DMD bitmap files into PostScript. There can * be more than one bitmap per file, but none can be split across input files. * Each bitmap goes on a page by itself. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* really just for error messages */ init_signals(); /* sets up interrupt handling */ header(); /* PostScript header comments */ options(); /* handle the command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Make sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ /* * * Reads and processes the command line options. Added the -P option so arbitrary * PostScript code can be passed through. Expect it could be useful for changing * definitions in the prologue for which options have not been defined. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'b': /* bytes per pattern */ bytespp = atoi(optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'f': /* ones complement - sort of */ flip = TRUE; break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'u': /* don't undo Eighth Edition bitmaps */ v8undo = FALSE; break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding - unnecessary */ fontencoding = optarg; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); /* unnecessary */ fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { /* followed by stuff for multiple pages */ if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } /* End of setup */ /*****************************************************************************/ arguments() { FILE *fp; /* next input file */ /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll process stdin. * */ if ( argc < 1 ) bitmap(stdin); else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp = stdin; else if ( (fp = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); bitmap(fp); if ( fp != stdin ) fclose(fp); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with all the input files, so mark the end of the pages with a TRAILER * comment, make sure the last page prints, and add things like the PAGES comment * that can only be determined after all the input files have been read. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, (bbox[0]*72+100)/100, (bbox[1]*72+100)/100); fprintf(stdout, "%s %d\n", PAGES, printed); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct provided it's not NULL. Accounting is * requested using the -A or -J options. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ bitmap(fp) FILE *fp; /* next input file */ { int count; /* pattern repeats this many times */ long total; /* expect this many patterns */ /* * * Reads all the bitmaps from the next input file, translates each one into * PostScript, and arranges to have one bitmap printed on each page. Multiple * bitmaps per input file work. * */ fp_in = fp; /* everyone reads from this file */ while ( dimensions() == TRUE ) { patcount = 0; total = scanlines * patterns; bbox[0] = MAX(bbox[0], patterns*16); /* for BoundingBox comment */ bbox[1] = MAX(bbox[1], scanlines); redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%s ", (v8format == TRUE && v8undo == FALSE) ? "true" : "false"); fprintf(fp_out, "%s ", (flip == TRUE) ? "true" : "false"); fprintf(fp_out, "%d %d bitmap\n", patterns * 16, scanlines); while ( patcount != total && (count = getc(fp)) != EOF ) { addrast(count); patcount += (count & 0177); if ( patcount % patterns == 0 ) putrast(); } /* End while */ if ( debug == ON ) fprintf(stderr, "patterns = %d, scanlines = %d, patcount = %d\n", patterns, scanlines, patcount); if ( total != patcount ) error(FATAL, "bitmap format error"); if ( fp_out == stdout ) printed++; fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); } /* End while */ } /* End of bitmap */ /*****************************************************************************/ dimensions() { int ox, oy; /* coordinates of the origin */ int cx, cy; /* and right corner of the bitmap */ int i; /* loop index */ /* * * Determines the dimensions and type of the next bitmap. Eighth edition bitmaps * have a zero in the first 16 bits. If valid dimensions are read TRUE is returned * to the caller. Changed so the check of whether we're done (by testing scanlines * or patterns) comes before the malloc(). * */ if ( (scanlines = getint()) == 0 ) { ox = getint(); oy = getint(); cx = getint(); cy = getint(); scanlines = cy - oy; patterns = (cx - ox + 15) / 16; v8format = TRUE; } else patterns = getint(); if ( scanlines <= 0 || patterns <= 0 ) /* done - don't do the malloc() */ return(FALSE); if ( raster != NULL ) free(raster); if ( prevrast != NULL ) free(prevrast); if ( (rptr = raster = (char *) malloc(patterns * 2)) == NULL ) error(FATAL, "no memory"); if ( (prevrast = (char *) malloc(patterns * 2)) == NULL ) error(FATAL, "no memory"); for ( i = 0; i < patterns * 2; i++ ) *(prevrast+i) = 0377; eptr = rptr + patterns * 2; return(TRUE); } /* End of dimensions */ /*****************************************************************************/ addrast(count) int count; /* repeat count for next pattern */ { int size; /* number of bytes in next pattern */ int l, h; /* high and low bytes */ int i, j; /* loop indices */ /* * * Reads the input file and adds the appropriate number of bytes to the output * raster line. If count has bit 7 on, one 16 bit pattern is read and repeated * count & 0177 times. If bit 7 is off, count is the number of patterns read from * fp_in - each one repeated once. * */ if ( count & 0200 ) { size = 1; count &= 0177; } else { size = count; count = 1; } /* End else */ for ( i = size; i > 0; i-- ) { if ( (l = getc(fp_in)) == EOF || (h = getc(fp_in)) == EOF ) return; for ( j = count; j > 0; j-- ) { *rptr++ = l; *rptr++ = h; } /* End for */ } /* End for */ } /* End of addrast */ /*****************************************************************************/ putrast() { char *p1, *p2; /* starting and ending patterns */ int n; /* set to bytes per pattern */ int i; /* loop index */ /* * * Takes the scanline that's been saved in *raster, encodes it according to the * value that's been assigned to bytespp, and writes the result to *fp_out. Each * line in the output bitmap is terminated by a 0 on a line by itself. * */ n = (bytespp <= 0) ? 2 * patterns : bytespp; if ( v8format == TRUE && v8undo == TRUE ) for ( i = 0; i < patterns * 2; i++ ) *(raster+i) = (*(prevrast+i) ^= *(raster+i)); for ( p1 = raster, p2 = raster + n; p1 < eptr; p1 = p2 ) if ( patncmp(p1, n) == TRUE ) { while ( patncmp(p2, n) == TRUE ) p2 += n; p2 += n; fprintf(fp_out, "%d ", n); for ( i = 0; i < n; i++, p1++ ) fprintf(fp_out, "%.2X", ((int) *p1) & 0377); fprintf(fp_out, " %d\n", (p2 - p1) / n); } else { while ( p2 < eptr && patncmp(p2, n) == FALSE ) p2 += n; if ( p2 > eptr ) p2 = eptr; fprintf(fp_out, "%d ", p2 - p1); while ( p1 < p2 ) fprintf(fp_out, "%.2X", ((int) *p1++) & 0377); fprintf(fp_out, " 0\n"); } /* End else */ fprintf(fp_out, "0\n"); rptr = raster; } /* End of putrast */ /*****************************************************************************/ patncmp(p1, n) char *p1; /* first patterns starts here */ int n; /* and extends this many bytes */ { char *p2; /* address of the second pattern */ /* * * Compares the two n byte patterns *p1 and *(p1+n). FALSE is returned if they're * different or extend past the end of the current raster line. * */ p2 = p1 + n; for ( ; n > 0; n--, p1++, p2++ ) if ( p2 >= eptr || *p1 != *p2 ) return(FALSE); return(TRUE); } /* End of patncmp */ /*****************************************************************************/ getint() { int h, l; /* high and low bytes */ /* * * Reads the next two bytes from *fp_in and returns the resulting integer. * */ if ( (l = getc(fp_in)) == EOF || (h = getc(fp_in)) == EOF ) return(-1); return((h & 0377) << 8 | (l & 0377)); } /* End of getint */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014230732621006400057030057030000010016100522633075500003300000007146post.src/postdmd/postdmd.1 .ds dQ /usr/lib/postscript .TH POSTDMD 1 .SH NAME .B postdmd \- PostScript translator for .SM DMD bitmap files .SH SYNOPSIS \*(mBpostdmd\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B postdmd translates .SM DMD bitmap .IR files , as produced by .BR dmdps , or .I files written in the Ninth Edition .BR bitfile (9.5) format into PostScript and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-b num Pack the bitmap in the output file using .I num byte patterns. A value of 0 turns off all packing of the output file. By default .I num is 6. .TP .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-f Flip the sense of the bits in .I files before printing the bitmaps. .TP .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which by default is located at the center of each page. The default magnification is 1.0. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP .OP \-u Disables much of the unpacking for Eighth Edition bitmap files. Usually results in smaller output files that take longer to print. Not a recommended option. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed at the center of the page, with positive x to the right and positive y up the page. Positive .I num moves everything right. The default offset is 0 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves everything up the page. The default offset is 0. .TP .TP .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/postdmd.ps . .PP Three options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include .I string in the output file; .I string must be legitimate PostScript. .TP .OP \-R action Requests special .I action (e.g., .MR manualfeed ) on a per page or global basis. The .I action string can be given as .IR request, .IM request : page\f1\|, or .IM request : page : file\f1\|. If .I page is omitted or given as 0, the request applies to all pages. If .I file is omitted, the request lookup is done in .MR \*(dQ/ps.requests . .PP Only one bitmap is printed on each logical page, and each of the input .I files must contain complete descriptions of at least one bitmap. Decreasing the pattern size using the .OP \-b option may help throughput on printers with fast processors (e.g., \s-1PS\s+1-810), while increasing the pattern size will often be the right move on older models (.e.g, \s-1PS\s+1-800). .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .br .ne 4v .SH FILES .MW \*(dQ/postdmd.ps .br .MW \*(dQ/forms.ps .br .MW \*(dQ/ps.requests .SH SEE ALSO .BR dpost (1), .BR postdaisy (1), .BR postio (1), .BR postmd (1), .BR postprint (1), .BR postreverse (1), .BR posttek (1) 0707070014230735711006440057030057030000010015150522627503500003400000005002post.src/postdmd/postdmd.ps % % Version 3.3.2 prologue for DMD bitmap files. % /#copies 1 store /aspectratio 1 def /formsperpage 1 def /landscape false def /magnification 1 def /margin 0 def /orientation 0 def /rotation 1 def /screenres 100 def /xoffset 0 def /yoffset 0 def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if pagedimensions xcenter ycenter translate orientation rotation mul rotate xoffset inch yoffset inch translate magnification dup aspectratio mul scale /height height margin sub def /width width margin sub def } def /pagedimensions { useclippath { /pagebbox [clippath pathbbox newpath] def } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /pagesetup {/page exch def} bind def /bitmap { /scanlines exch def /scanlength exch def /flip exch def /v8format exch def /bytelength scanlength 8 idiv def /picstr bytelength string def /lpicstr bytelength string def /bytelength bytelength 1 sub def gsave % First the overall scaling. height scanlines div width scanlength div min 72 screenres div min dup scale % Followed by the one for the unit square. scanlength neg 2 div scanlines neg 2 div translate scanlength scanlines scale v8format {getv8bitmap} {getbitmap} ifelse grestore } bind def /getbitmap { scanlength scanlines flip [scanlength 0 0 scanlines neg 0 scanlines] { 0 { currentfile token pop dup 0 eq {pop pop exit} if /charcount exch def picstr 1 index charcount getinterval /repl exch def currentfile repl readhexstring pop pop charcount add currentfile token pop { picstr 1 index repl putinterval charcount add } repeat } loop picstr } imagemask } bind def /getv8bitmap { scanlength scanlines flip not [scanlength 0 0 scanlines neg 0 scanlines] { 0 { currentfile token pop dup 0 eq {pop pop exit} if /charcount exch def picstr 1 index charcount getinterval /repl exch def currentfile repl readhexstring pop pop charcount add currentfile token pop { picstr 1 index repl putinterval charcount add } repeat } loop 0 0 picstr { exch lpicstr exch get xor lpicstr exch 2 index exch put 1 add dup } forall pop pop lpicstr } imagemask } bind def /done {/lastpage where {pop lastpage} if} def 0707070014230101030407550057030057030000020322170522633075700002100000000000post.src/postgif 0707070014230102111006400057030057030000010225450522633075700003300000005276post.src/postgif/postgif.1 .ds dQ /usr/lib/postscript .TH POSTGIF 1 .SH NAME .B postgif \- PostScript translator for .SM GIF files .SH SYNOPSIS \*(mBpostgif\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B postgif translates Graphics Interchange Format (\s-1GIF\s+1) .I files into PostScript and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-f Flip the sense of the bits in .I files before printing the pixmaps. .TP .OP \-g Generate picture in gray instead of color .TP .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which by default is located at the center of each page. The default magnification is 1.0. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed at the center of the page, with positive x to the right and positive y up the page. Positive .I num moves everything right. The default offset is 0 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves everything up the page. The default offset is 0. .TP .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/postgif.ps . .PP Two options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include .I string in the output file; .I string must be legitimate PostScript. .PP Only one pixmap is printed on each logical page, and each of the input .I files must contain complete descriptions of at least one pixmap. .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .br .ne 1i .SH FILES .MW \*(dQ/postgif.ps .br .MW \*(dQ/forms.ps .SH SEE ALSO .BR dpost (1), .BR postdaisy (1), .BR postdmd (1), .BR postio (1), .BR postmd (1), .BR postprint (1), .BR postreverse (1), .BR posttek (1), .BR psencoding (1) 0707070014230077041006400057030057030000010311160522633075700003400000003720post.src/postgif/postgif.mk MAKE=/bin/make MAKEFILE=postgif.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=$(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=postgif.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o all : postgif install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp postgif $(POSTBIN)/postgif @chmod 755 $(POSTBIN)/postgif @chgrp $(GROUP) $(POSTBIN)/postgif @chown $(OWNER) $(POSTBIN)/postgif cp postgif.ps $(POSTLIB)/postgif.ps @chmod 644 $(POSTLIB)/postgif.ps @chgrp $(GROUP) $(POSTLIB)/postgif.ps @chown $(OWNER) $(POSTLIB)/postgif.ps cp postgif.1 $(MAN1DIR)/postgif.1 @chmod 644 $(MAN1DIR)/postgif.1 @chgrp $(GROUP) $(MAN1DIR)/postgif.1 @chown $(OWNER) $(MAN1DIR)/postgif.1 clean : rm -f *.o clobber : clean rm -f postgif postgif : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postgif $(OFILES) -lm postgif.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o : @cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ postgif.1 >XXX.1; \ mv XXX.1 postgif.1 0707070014230101061006440057030057030000010322000522627503600003300000044005post.src/postgif/postgif.c #include <stdio.h> #include <string.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" #include "gen.h" #include "path.h" #include "ext.h" #define dbprt if (debug) fprintf char *optnames = "a:c:fglm:n:o:p:x:y:C:E:DG:IL:P:"; char *prologue = POSTGIF; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ int page = 0; /* last page we worked on */ int printed = 0; /* and the number of pages printed */ extern char *malloc(); extern void free(); extern double atof(), pow(); unsigned char ibuf[BUFSIZ]; unsigned char *cmap, *gcmap, *lcmap; unsigned char *gmap, *ggmap, *lgmap; unsigned char *pmap; double gamma; float cr = 0.3, cg = 0.59, cb = 0.11; int maplength, gmaplength, lmaplength; int scrwidth, scrheight; int gcolormap, lcolormap; int bitperpixel, background; int imageleft, imagetop; int imagewidth, imageheight; int interlaced, lbitperpixel; int gray = 0; int gammaflag = 0; int negative = 0; int terminate = 0; int codesize, clearcode, endcode, curstblsize, pmindex, byteinibuf, bitsleft; int prefix[4096], suffix[4096], cstbl[4096]; int bburx = -32767, bbury = -32767; FILE *fp_in = NULL; FILE *fp_out = stdout; char * allocate(size) int size; { char *p; if ((p = malloc(size)) == NULL) error(FATAL, "not enough memory"); return(p); } void puthex(c, fp) unsigned char c; FILE *fp; { static char hextbl[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; putc(hextbl[(c >> 4) & 017], fp); putc(hextbl[c & 017], fp); } void setcolormap(bp) int bp; { int i, entries = 1, scale = 1; unsigned char *p, *q; for (i = 0; i < bp; i++) entries *= 2; for (i = 0; i < 8 - bp; i++) scale *= 2; gcmap = (unsigned char *) allocate(entries*3); ggmap = (unsigned char *) allocate(entries); gmaplength = entries; for (i = 0, p = gcmap, q = ggmap; i < 256; i += scale, p += 3, q++) { if (negative) { *p = 255 - i; p[1] = *p; p[2] = *p; *q = *p; } else { *p = i; p[1] = i; p[2] = i; *q = i; } } if (gammaflag) for (i = 0, p = gcmap; i < 256; i += scale, p += 3) { *p = (unsigned char) (pow((double) *p/256.0, gamma)*256); p[1] = *p; p[2] = *p; } dbprt(stderr,"default color map:\n"); for (i = 0; i < entries*3; i += 3) dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]); } void readgcolormap(bp) int bp; { int i, entries = 1; unsigned char *p, *q; for (i = 0; i < bp; i++) entries *= 2; gcmap = (unsigned char *) allocate(entries*3); ggmap = (unsigned char *) allocate(entries); gmaplength = entries; fread(gcmap, sizeof(*gcmap), entries*3, fp_in); if (negative) for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = 255 - *p; for (i = 0, p = gcmap, q = ggmap; i < entries; i++, p += 3, q++) *q = cr*(int)p[0] + cg*(int)p[1] + cb*(int)p[2] + 0.5; if (gammaflag) for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = (unsigned char) (pow((double) *p/256.0, gamma)*256); dbprt(stderr,"global color map:\n"); for (i = 0; i < entries*3; i += 3) dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]); } void readlcolormap(bp) int bp; { int i, entries = 1; unsigned char *p, *q; for (i = 0; i < bp; i++) entries *= 2; lcmap = (unsigned char *) allocate(entries*3); lgmap = (unsigned char *) allocate(entries); lmaplength = entries; fread(lcmap, sizeof(*lcmap), entries*3, fp_in); if (negative) for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = 255 - *p; for (i = 0, p = lcmap, q = lgmap; i < entries; i++, p += 3, q++) *q = cr*(int)p[0] + cg*(int)p[1] + cb*(int)p[2] + 0.5; if (gammaflag) for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = (unsigned char) (pow((double) *p/256.0, gamma)*256); dbprt(stderr,"local color map:\n"); for (i = 0; i < entries*3; i += 3) dbprt(stderr, "%d, %d, %d\n", lcmap[i], lcmap[i+1], lcmap[i+2]); } void initstbl() { int i, entries = 1, *p, *s; for (i = 0; i < codesize; i++) entries *= 2; clearcode = entries; endcode = clearcode + 1; for (i = 0, p = prefix, s = suffix; i <= endcode; i++, p++, s++) { *p = endcode; *s = i; } curstblsize = endcode + 1; pmindex = 0; byteinibuf = 0; bitsleft = 0; } int nextbyte() { static ibufindex; if (byteinibuf) { byteinibuf--; ibufindex++; } else { fread(ibuf, sizeof(*ibuf), 1, fp_in); byteinibuf = ibuf[0]; dbprt(stderr, "byte count: %d\n", byteinibuf); if (byteinibuf) fread(ibuf, sizeof(*ibuf), byteinibuf, fp_in); else error(FATAL, "encounter zero byte count block before end code"); ibufindex = 0; byteinibuf--; ibufindex++; } return(ibuf[ibufindex-1]); } int masktbl[25] = { 0, 01, 03, 07, 017, 037, 077, 0177, 0377, 0777, 01777, 03777, 07777, 017777, 037777, 077777, 0177777, 0377777, 0777777, 01777777, 03777777, 07777777, 017777777, 037777777, 077777777 }; int getcode() { int cs, c; static int oldc; if (curstblsize < 4096) cs = cstbl[curstblsize]; else cs = 12; while (bitsleft < cs) { oldc = (oldc & masktbl[bitsleft]) | ((nextbyte() & 0377) << bitsleft); bitsleft += 8; } c = oldc & masktbl[cs]; oldc = oldc >> cs; bitsleft -= cs; /* dbprt(stderr, "code: %d %d %d\n", curstblsize, cs, c); */ return(c); } void putcode(c) int c; { if (prefix[c] != endcode) { putcode(prefix[c]); pmap[pmindex] = suffix[c]; pmindex++; } else { pmap[pmindex] = suffix[c]; pmindex++; } } int firstof(c) int c; { while (prefix[c] != endcode) c = prefix[c]; return(suffix[c]); } void writeimage() { int i, j, k; dbprt(stderr, "pmindex: %d\n", pmindex); fputs("save\n", fp_out); fprintf(fp_out, "/codestr %d string def\n", imagewidth); if (!gray) { fprintf(fp_out, "/colortbl currentfile %d string readhexstring\n", maplength*3); for (i = 0; i < maplength; i++) puthex(cmap[i], fp_out); fputs("\n", fp_out); for (i = maplength ; i < maplength*2; i++) puthex(cmap[i], fp_out); fputs("\n", fp_out); for (i = maplength*2 ; i < maplength*3; i++) puthex(cmap[i], fp_out); fputs("\npop def\n", fp_out); fprintf(fp_out, "/graytbl currentfile %d string readhexstring\n", maplength); for (i = 0; i < maplength; i++) puthex(gmap[i], fp_out); fputs("\npop def\n", fp_out); } fprintf(fp_out, "%s %d %d %d %d gifimage\n", gray ? "true" : "false", imagewidth, imageheight, scrwidth - imageleft - imagewidth, scrheight - imagetop - imageheight); if (gray) { if (interlaced) { int *iltbl; iltbl = (int *) allocate(imageheight*sizeof(int)); j = 0; for (i = 0; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass1: %d\n", j); for (i = 4; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass2: %d\n", j); for (i = 2; i < imageheight; i += 4) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass3: %d\n", j); for (i = 1; i < imageheight; i += 2) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass4: %d\n", j); for (i = 0; i < imageheight; i++) { k = iltbl[i]; for (j = 0; j < imagewidth; j++, k++) puthex(gmap[pmap[k]], fp_out); fputs("\n", fp_out); } } else { for (i = 0, k = 0; i < imageheight; i++) { for (j = 0; j < imagewidth; j++, k++) puthex(gmap[pmap[k]], fp_out); fputs("\n", fp_out); } } } else { if (interlaced) { int *iltbl; iltbl = (int *) allocate(imageheight*sizeof(int)); j = 0; for (i = 0; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass1: %d\n", j); for (i = 4; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass2: %d\n", j); for (i = 2; i < imageheight; i += 4) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass3: %d\n", j); for (i = 1; i < imageheight; i += 2) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass4: %d\n", j); for (i = 0; i < imageheight; i++) { k = iltbl[i]; for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out); fputs("\n", fp_out); } } else { for (i = 0, k = 0; i < imageheight; i++) { for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out); fputs("\n", fp_out); } } } fputs("restore\n", fp_out); } void readimage() { int bytecount, zerobytecount = 0; int code, oldcode; fread(ibuf, sizeof(*ibuf), 9, fp_in); imageleft = ibuf[0] + 256*ibuf[1]; imagetop = ibuf[2] + 256*ibuf[3]; imagewidth = ibuf[4] + 256*ibuf[5]; imageheight = ibuf[6] + 256*ibuf[7]; lcolormap = ibuf[8] & 0200; interlaced = ibuf[8] & 0100; lbitperpixel = (ibuf[8] & 07) + 1; dbprt(stderr, "imageleft: %d\n", imageleft); dbprt(stderr, "imagetop: %d\n", imagetop); dbprt(stderr, "imagewidth: %d\n", imagewidth); dbprt(stderr, "imgaeheight: %d\n", imageheight); dbprt(stderr, "lcolormap: %d\n", lcolormap ? 1 : 0); dbprt(stderr, "interlaced: %d\n", interlaced ? 1 : 0); dbprt(stderr, "lbitperpixel: %d\n", lbitperpixel); if (lcolormap) { readlcolormap(lbitperpixel); cmap = lcmap; gmap = lgmap; maplength = lmaplength; } dbprt(stderr, "start reading raster data\n"); fread(ibuf, sizeof(*ibuf), 1, fp_in); codesize = ibuf[0]; dbprt(stderr, "codesize: %d\n", codesize); pmap = (unsigned char *) allocate(imagewidth*imageheight); initstbl(); while ((code = getcode()) != endcode) { if (code == clearcode) { curstblsize = endcode + 1; code = getcode(); putcode(code); oldcode = code; } else if (code < curstblsize) { putcode(code); prefix[curstblsize] = oldcode; suffix[curstblsize] = firstof(code); curstblsize++; oldcode = code; } else { if (code != curstblsize) error(FATAL, "code out of order"); prefix[curstblsize] = oldcode; suffix[curstblsize] = firstof(oldcode); curstblsize++; putcode(curstblsize-1); oldcode = code; } } dbprt(stderr, "finish reading raster data\n"); /* read the rest of the raster data */ do { fread(ibuf, sizeof(*ibuf), 1, fp_in); bytecount = ibuf[0]; dbprt(stderr, "byte count: %d\n", bytecount); if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in); else zerobytecount = 1; } while (!zerobytecount); writeimage(); if (lcolormap) { cmap = gcmap; gmap = ggmap; maplength = gmaplength; free(lcmap); free(lgmap); } } void readextensionblock() { int functioncode, bytecount, zerobytecount = 0; fread(ibuf, sizeof(*ibuf), 1, fp_in); functioncode = ibuf[0]; dbprt(stderr, "function code: %d\n", functioncode); do { fread(ibuf, sizeof(*ibuf), 1, fp_in); bytecount = ibuf[0]; dbprt(stderr, "byte count: %d\n", bytecount); if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in); else zerobytecount = 1; } while (!zerobytecount); } void writebgscr() { fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fputs("/saveobj save def\n", fp_out); fprintf(fp_out, "%s: %d %d %d %d\n", "%%PageBoundingBox", 0, 0, scrwidth, scrheight); if (scrwidth > bburx) bburx = scrwidth; if (scrheight > bbury) bbury = scrheight; fprintf(fp_out, "%d %d gifscreen\n", scrwidth, scrheight); } void writeendscr() { if ( fp_out == stdout ) printed++; fputs("showpage\n", fp_out); fputs("saveobj restore\n", fp_out); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); } void redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } void readgif() { int i, j, k; for (i = 0, j = 1, k = 0; i < 13; i++) { for (; k < j; k++) cstbl[k] = i; j *= 2; } fread(ibuf, sizeof(*ibuf), 6, fp_in); dbprt(stderr, "%.6s\n", ibuf); if (strncmp((char *)ibuf, "GIF87a", 6) != 0) { fread(ibuf, sizeof(*ibuf), 122, fp_in); fread(ibuf, sizeof(*ibuf), 6, fp_in); dbprt(stderr, "%.6s\n", ibuf); if (strncmp((char *)ibuf, "GIF87a", 6) != 0) error(FATAL, "wrong GIF signature"); } fread(ibuf, sizeof(*ibuf), 7, fp_in); scrwidth = ibuf[0] + 256*ibuf[1]; scrheight = ibuf[2] + 256*ibuf[3]; gcolormap = ibuf[4] & 0200; bitperpixel = (ibuf[4] & 07) + 1; background = ibuf[5]; dbprt(stderr, "scrwidth: %d\n", scrwidth); dbprt(stderr, "scrheight: %d\n", scrheight); dbprt(stderr, "gcolormap: %d\n", gcolormap ? 1 : 0); dbprt(stderr, "bitperpixel: %d\n", bitperpixel); dbprt(stderr, "background: %d\n", background); if (ibuf[6] != 0) error(FATAL, "wrong screen descriptor"); if (gcolormap) readgcolormap(bitperpixel); else setcolormap(bitperpixel); redirect(++page); writebgscr(); cmap = gcmap; gmap = ggmap; maplength = gmaplength; do { fread(ibuf, sizeof(*ibuf), 1, fp_in); if (ibuf[0] == ',') readimage(); else if (ibuf[0] == ';') terminate = 1; else if (ibuf[0] == '!') readextensionblock(); else error(FATAL, "wrong image separator character or wrong GIF terminator"); } while (!terminate); writeendscr(); free(gcmap); free(ggmap); } void init_signals() { if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } signal(SIGTERM, interrupt); } void header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } void options() { int ch; /* return value from getopt() */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'f': negative = TRUE; break; case 'g': gray = TRUE; break; case 'l': fprintf(stdout, "/alignment true def\n"); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding - unnecessary */ fontencoding = optarg; break; case 'D': /* debug flag */ debug = ON; break; case 'G': gammaflag = ON; gamma = atof(optarg); break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } } argc -= optind; /* get ready for non-option args */ argv += optind; } void setup() { /*setencoding(fontencoding);*/ fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { /* followed by stuff for multiple pages */ if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } void arguments() { if ( argc < 1 ) { fp_in = stdin; readgif(); } else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); readgif(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } } } void done() { fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, bburx, bbury); fprintf(stdout, "%s %d\n", PAGES, printed); } main(agc, agv) int agc; char *agv[]; { argc = agc; argv = agv; prog_name = argv[0]; init_signals(); header(); options(); setup(); arguments(); done(); exit(0); } 0707070014230101071006440057030057030000010322300522627503600003400000043614post.src/postgif/Opostgif.c #include <stdio.h> #include <string.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" #include "gen.h" #include "path.h" #include "ext.h" #define dbprt if (debug) fprintf char *optnames = "a:c:fglm:n:o:p:x:y:C:DG:IL:P:"; char *prologue = POSTGIF; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ int page = 0; /* last page we worked on */ int printed = 0; /* and the number of pages printed */ extern char *malloc(); extern void free(); extern double atof(), pow(); unsigned char ibuf[BUFSIZ]; unsigned char *cmap, *gcmap, *lcmap; unsigned char *gmap, *ggmap, *lgmap; unsigned char *pmap; double gamma; float cr = 0.3, cg = 0.59, cb = 0.11; int maplength, gmaplength, lmaplength; int scrwidth, scrheight; int gcolormap, lcolormap; int bitperpixel, background; int imageleft, imagetop; int imagewidth, imageheight; int interlaced, lbitperpixel; int gray = 0; int gammaflag = 0; int negative = 0; int terminate = 0; int codesize, clearcode, endcode, curstblsize, pmindex, byteinibuf, bitsleft; int prefix[4096], suffix[4096], cstbl[4096]; int bburx = -32767, bbury = -32767; FILE *fp_in = NULL; FILE *fp_out = stdout; char * allocate(size) int size; { char *p; if ((p = malloc(size)) == NULL) error(FATAL, "not enough memory"); return(p); } void puthex(c, fp) unsigned char c; FILE *fp; { static char hextbl[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; putc(hextbl[(c >> 4) & 017], fp); putc(hextbl[c & 017], fp); } void setcolormap(bp) int bp; { int i, entries = 1, scale = 1; unsigned char *p, *q; for (i = 0; i < bp; i++) entries *= 2; for (i = 0; i < 8 - bp; i++) scale *= 2; gcmap = (unsigned char *) allocate(entries*3); ggmap = (unsigned char *) allocate(entries); gmaplength = entries; for (i = 0, p = gcmap, q = ggmap; i < 256; i += scale, p += 3, q++) { if (negative) { *p = 255 - i; p[1] = *p; p[2] = *p; *q = *p; } else { *p = i; p[1] = i; p[2] = i; *q = i; } } if (gammaflag) for (i = 0, p = gcmap; i < 256; i += scale, p += 3) { *p = (unsigned char) (pow((double) *p/256.0, gamma)*256); p[1] = *p; p[2] = *p; } dbprt(stderr,"default color map:\n"); for (i = 0; i < entries*3; i += 3) dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]); } void readgcolormap(bp) int bp; { int i, entries = 1; unsigned char *p, *q; for (i = 0; i < bp; i++) entries *= 2; gcmap = (unsigned char *) allocate(entries*3); ggmap = (unsigned char *) allocate(entries); gmaplength = entries; fread(gcmap, sizeof(*gcmap), entries*3, fp_in); if (negative) for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = 255 - *p; for (i = 0, p = gcmap, q = ggmap; i < entries; i++, p += 3, q++) *q = cr*p[0] + cg*p[1] + cb*p[2] + 0.5; if (gammaflag) for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = (unsigned char) (pow((double) *p/256.0, gamma)*256); dbprt(stderr,"global color map:\n"); for (i = 0; i < entries*3; i += 3) dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]); } void readlcolormap(bp) int bp; { int i, entries = 1; unsigned char *p, *q; for (i = 0; i < bp; i++) entries *= 2; lcmap = (unsigned char *) allocate(entries*3); lgmap = (unsigned char *) allocate(entries); lmaplength = entries; fread(lcmap, sizeof(*lcmap), entries*3, fp_in); if (negative) for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = 255 - *p; for (i = 0, p = lcmap, q = lgmap; i < entries; i++, p += 3, q++) *q = cr*p[0] + cg*p[1] + cb*p[2] + 0.5; if (gammaflag) for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = (unsigned char) (pow((double) *p/256.0, gamma)*256); dbprt(stderr,"local color map:\n"); for (i = 0; i < entries*3; i += 3) dbprt(stderr, "%d, %d, %d\n", lcmap[i], lcmap[i+1], lcmap[i+2]); } void initstbl() { int i, entries = 1, *p, *s; for (i = 0; i < codesize; i++) entries *= 2; clearcode = entries; endcode = clearcode + 1; for (i = 0, p = prefix, s = suffix; i <= endcode; i++, p++, s++) { *p = endcode; *s = i; } curstblsize = endcode + 1; pmindex = 0; byteinibuf = 0; bitsleft = 0; } int nextbyte() { static ibufindex; if (byteinibuf) { byteinibuf--; ibufindex++; } else { fread(ibuf, sizeof(*ibuf), 1, fp_in); byteinibuf = ibuf[0]; dbprt(stderr, "byte count: %d\n", byteinibuf); if (byteinibuf) fread(ibuf, sizeof(*ibuf), byteinibuf, fp_in); else error(FATAL, "encounter zero byte count block before end code"); ibufindex = 0; byteinibuf--; ibufindex++; } return(ibuf[ibufindex-1]); } int masktbl[25] = { 0, 01, 03, 07, 017, 037, 077, 0177, 0377, 0777, 01777, 03777, 07777, 017777, 037777, 077777, 0177777, 0377777, 0777777, 01777777, 03777777, 07777777, 017777777, 037777777, 077777777 }; int getcode() { int cs, c; static int oldc; if (curstblsize < 4096) cs = cstbl[curstblsize]; else cs = 12; while (bitsleft < cs) { oldc = (oldc & masktbl[bitsleft]) | ((nextbyte() & 0377) << bitsleft); bitsleft += 8; } c = oldc & masktbl[cs]; oldc = oldc >> cs; bitsleft -= cs; /* dbprt(stderr, "code: %d %d %d\n", curstblsize, cs, c); */ return(c); } void putcode(c) int c; { if (prefix[c] != endcode) { putcode(prefix[c]); pmap[pmindex] = suffix[c]; pmindex++; } else { pmap[pmindex] = suffix[c]; pmindex++; } } int firstof(c) int c; { while (prefix[c] != endcode) c = prefix[c]; return(suffix[c]); } void writeimage() { int i, j, k; dbprt(stderr, "pmindex: %d\n", pmindex); fputs("save\n", fp_out); fprintf(fp_out, "/codestr %d string def\n", imagewidth); if (!gray) { fprintf(fp_out, "/colortbl currentfile %d string readhexstring\n", maplength*3); for (i = 0; i < maplength; i++) puthex(cmap[i], fp_out); fputs("\n", fp_out); for (i = maplength ; i < maplength*2; i++) puthex(cmap[i], fp_out); fputs("\n", fp_out); for (i = maplength*2 ; i < maplength*3; i++) puthex(cmap[i], fp_out); fputs("\npop def\n", fp_out); fprintf(fp_out, "/graytbl currentfile %d string readhexstring\n", maplength); for (i = 0; i < maplength; i++) puthex(gmap[i], fp_out); fputs("\npop def\n", fp_out); } fprintf(fp_out, "%s %d %d %d %d gifimage\n", gray ? "true" : "false", imagewidth, imageheight, scrwidth - imageleft - imagewidth, scrheight - imagetop - imageheight); if (gray) { if (interlaced) { int *iltbl; iltbl = (int *) allocate(imageheight*sizeof(int)); j = 0; for (i = 0; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass1: %d\n", j); for (i = 4; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass2: %d\n", j); for (i = 2; i < imageheight; i += 4) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass3: %d\n", j); for (i = 1; i < imageheight; i += 2) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass4: %d\n", j); for (i = 0; i < imageheight; i++) { k = iltbl[i]; for (j = 0; j < imagewidth; j++, k++) puthex(gmap[pmap[k]], fp_out); fputs("\n", fp_out); } } else { for (i = 0, k = 0; i < imageheight; i++) { for (j = 0; j < imagewidth; j++, k++) puthex(gmap[pmap[k]], fp_out); fputs("\n", fp_out); } } } else { if (interlaced) { int *iltbl; iltbl = (int *) allocate(imageheight*sizeof(int)); j = 0; for (i = 0; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass1: %d\n", j); for (i = 4; i < imageheight; i += 8) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass2: %d\n", j); for (i = 2; i < imageheight; i += 4) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass3: %d\n", j); for (i = 1; i < imageheight; i += 2) { iltbl[i] = j; j += imagewidth; } dbprt(stderr, "pass4: %d\n", j); for (i = 0; i < imageheight; i++) { k = iltbl[i]; for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out); fputs("\n", fp_out); } } else { for (i = 0, k = 0; i < imageheight; i++) { for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out); fputs("\n", fp_out); } } } fputs("restore\n", fp_out); } void readimage() { int bytecount, zerobytecount = 0; int code, oldcode; fread(ibuf, sizeof(*ibuf), 9, fp_in); imageleft = ibuf[0] + 256*ibuf[1]; imagetop = ibuf[2] + 256*ibuf[3]; imagewidth = ibuf[4] + 256*ibuf[5]; imageheight = ibuf[6] + 256*ibuf[7]; lcolormap = ibuf[8] & 0200; interlaced = ibuf[8] & 0100; lbitperpixel = (ibuf[8] & 07) + 1; dbprt(stderr, "imageleft: %d\n", imageleft); dbprt(stderr, "imagetop: %d\n", imagetop); dbprt(stderr, "imagewidth: %d\n", imagewidth); dbprt(stderr, "imgaeheight: %d\n", imageheight); dbprt(stderr, "lcolormap: %d\n", lcolormap ? 1 : 0); dbprt(stderr, "interlaced: %d\n", interlaced ? 1 : 0); dbprt(stderr, "lbitperpixel: %d\n", lbitperpixel); if (lcolormap) { readlcolormap(lbitperpixel); cmap = lcmap; gmap = lgmap; maplength = lmaplength; } dbprt(stderr, "start reading raster data\n"); fread(ibuf, sizeof(*ibuf), 1, fp_in); codesize = ibuf[0]; dbprt(stderr, "codesize: %d\n", codesize); pmap = (unsigned char *) allocate(imagewidth*imageheight); initstbl(); while ((code = getcode()) != endcode) { if (code == clearcode) { curstblsize = endcode + 1; code = getcode(); putcode(code); oldcode = code; } else if (code < curstblsize) { putcode(code); prefix[curstblsize] = oldcode; suffix[curstblsize] = firstof(code); curstblsize++; oldcode = code; } else { if (code != curstblsize) error(FATAL, "code out of order"); prefix[curstblsize] = oldcode; suffix[curstblsize] = firstof(oldcode); curstblsize++; putcode(curstblsize-1); oldcode = code; } } dbprt(stderr, "finish reading raster data\n"); /* read the rest of the raster data */ do { fread(ibuf, sizeof(*ibuf), 1, fp_in); bytecount = ibuf[0]; dbprt(stderr, "byte count: %d\n", bytecount); if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in); else zerobytecount = 1; } while (!zerobytecount); writeimage(); if (lcolormap) { cmap = gcmap; gmap = ggmap; maplength = gmaplength; free(lcmap); free(lgmap); } } void readextensionblock() { int functioncode, bytecount, zerobytecount = 0; fread(ibuf, sizeof(*ibuf), 1, fp_in); functioncode = ibuf[0]; dbprt(stderr, "function code: %d\n", functioncode); do { fread(ibuf, sizeof(*ibuf), 1, fp_in); bytecount = ibuf[0]; dbprt(stderr, "byte count: %d\n", bytecount); if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in); else zerobytecount = 1; } while (!zerobytecount); } void writebgscr() { fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fputs("/saveobj save def\n", fp_out); fprintf(fp_out, "%s: %d %d %d %d\n", "%%PageBoundingBox", 0, 0, scrwidth, scrheight); if (scrwidth > bburx) bburx = scrwidth; if (scrheight > bbury) bbury = scrheight; fprintf(fp_out, "%d %d gifscreen\n", scrwidth, scrheight); } void writeendscr() { if ( fp_out == stdout ) printed++; fputs("showpage\n", fp_out); fputs("saveobj restore\n", fp_out); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); } void redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } void readgif() { int i, j, k; for (i = 0, j = 1, k = 0; i < 13; i++) { for (; k < j; k++) cstbl[k] = i; j *= 2; } fread(ibuf, sizeof(*ibuf), 6, fp_in); dbprt(stderr, "%.6s\n", ibuf); if (strncmp(ibuf, "GIF87a", 6) != 0) { fread(ibuf, sizeof(*ibuf), 122, fp_in); fread(ibuf, sizeof(*ibuf), 6, fp_in); dbprt(stderr, "%.6s\n", ibuf); if (strncmp(ibuf, "GIF87a", 6) != 0) error(FATAL, "wrong GIF signature"); } fread(ibuf, sizeof(*ibuf), 7, fp_in); scrwidth = ibuf[0] + 256*ibuf[1]; scrheight = ibuf[2] + 256*ibuf[3]; gcolormap = ibuf[4] & 0200; bitperpixel = (ibuf[4] & 07) + 1; background = ibuf[5]; dbprt(stderr, "scrwidth: %d\n", scrwidth); dbprt(stderr, "scrheight: %d\n", scrheight); dbprt(stderr, "gcolormap: %d\n", gcolormap ? 1 : 0); dbprt(stderr, "bitperpixel: %d\n", bitperpixel); dbprt(stderr, "background: %d\n", background); if (ibuf[6] != 0) error(FATAL, "wrong screen descriptor"); if (gcolormap) readgcolormap(bitperpixel); else setcolormap(bitperpixel); redirect(++page); writebgscr(); cmap = gcmap; gmap = ggmap; maplength = gmaplength; do { fread(ibuf, sizeof(*ibuf), 1, fp_in); if (ibuf[0] == ',') readimage(); else if (ibuf[0] == ';') terminate = 1; else if (ibuf[0] == '!') readextensionblock(); else error(FATAL, "wrong image separator character or wrong GIF terminator"); } while (!terminate); writeendscr(); free(gcmap); free(ggmap); } void init_signals() { int interrupt(); /* signal handler */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } signal(SIGTERM, interrupt); } void header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } void options() { int ch; /* return value from getopt() */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'f': negative = TRUE; break; case 'g': gray = TRUE; break; case 'l': fprintf(stdout, "/alignment true def\n"); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'G': gammaflag = ON; gamma = atof(optarg); break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } } argc -= optind; /* get ready for non-option args */ argv += optind; } void setup() { fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { /* followed by stuff for multiple pages */ if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } void arguments() { if ( argc < 1 ) { fp_in = stdin; readgif(); } else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); readgif(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } } } void done() { fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, bburx, bbury); fprintf(stdout, "%s %d\n", PAGES, printed); } main(agc, agv) int agc; char *agv[]; { argc = agc; argv = agv; prog_name = argv[0]; init_signals(); header(); options(); setup(); arguments(); done(); exit(0); } 0707070014230101101006440057030057030000010322450522627503600003400000004347post.src/postgif/postgif.ps % % Version 3.3.2 prologue for GIF pixmap files. % /#copies 1 store /aspectratio 1 def /formsperpage 1 def /landscape false def /magnification 1 def /margin 0 def /orientation 0 def /rotation 1 def /xoffset 0 def /yoffset 0 def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if pagedimensions xcenter ycenter translate orientation rotation mul rotate xoffset inch yoffset inch translate magnification dup aspectratio mul scale /height height margin sub def /width width margin sub def } def /pagedimensions { useclippath { /pagebbox [clippath pathbbox newpath] def } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /pagesetup {/page exch def} bind def /done {/lastpage where {pop lastpage} if} def /alignment false def /gifscreen { % scrwidth scrheight $ 2 copy alignment { 100 dup dtransform exch 100 exch div abs exch 100 exch div abs 2 copy scale /height exch height exch div def /width exch width exch div def } if height exch div exch width exch div 2 copy lt { pop } { exch pop } ifelse alignment { cvi } if dup scale neg 2 div exch neg 2 div exch translate } def /gifimage { % gray imagewidth imageheight xorigin yorigin $ translate 2 copy scale /imageheight exch def /imagewidth exch def /gray exch def imagewidth imageheight 8 [imagewidth 0 0 imageheight neg 0 imageheight] gray { { currentfile codestr readhexstring pop } image } { /colorimage where { pop /picstr imagewidth 3 mul string def { currentfile codestr readhexstring pop pop 0 1 imagewidth 1 sub { picstr exch dup 3 mul exch colortbl exch codestr exch get 3 mul 3 getinterval putinterval } for picstr } false 3 colorimage } { { currentfile codestr readhexstring pop pop 0 1 imagewidth 1 sub { codestr exch dup graytbl exch codestr exch get get put } for codestr } image } ifelse } ifelse } def 0707070014231405030407550057030057030000021222660522633076100002000000000000post.src/postio 0707070014231405041006440057030057030000011222670522627503600002700000001622post.src/postio/README Serial communications program for PostScript printers. Runs as a single read/write process (by default). Use the -R2 option or set splitme to TRUE (file postio.c) to get separate read and write processes. Although not the default, we recommend using separate read and write processes. Sends occasional status queries (control Ts) while transmitting files. Use the -q option or set quiet (file postio.c) to TRUE to disable status queries. Datakit connections are supported on System V and Ninth Edition systems. The syntax (for connecting to a Datakit destination) varies. Check the SYSV and V9 versions of setupline() in file ifdef.c. Set DKHOST and DKSTREAMS to TRUE in postio.mk for streams based DKHOST support. When DKSTREAMS is TRUE postio.mk uses "dknetty" as the stream module. Settings like DKSTREAMS=dkty select a different stream module and may be required for full Datakit support on some systems. 0707070014231405051006440057030057030000011223000522627503600003000000056437post.src/postio/ifdef.c /* * * Conditionally compiled routines for setting up and reading the line. Things * were getting out of hand with all the ifdefs, and even though this defeats * part of the purpose of conditional complilation directives, I think it's easier * to follow this way. Thanks to Alan Buckwalter for the System V DKHOST code. * * postio now can be run as separate read and write processes, but requires that * you write a procedure called resetline() and perhaps modify readline() some. * I've already tested the code on System V and it seems to work. Ninth Edition * and BSD code may be missing. * * By request I've changed the way some of the setupline() procedures (eg. in the * System V implementation) handle things when no line has been given. If line is * NULL the new setupline() procedures try to continue, assuming whoever called * postio connected stdout to the printer. Things will only work if we can read * and write stdout! * */ #include <stdio.h> #include <ctype.h> #include <fcntl.h> #include <signal.h> #include <sys/types.h> #include <errno.h> #include "ifdef.h" /* conditional header file inclusion */ #include "gen.h" /* general purpose definitions */ FILE *fp_ttyi, *fp_ttyo; char *ptr = mesg; extern int window_size; /*****************************************************************************/ #ifdef SYSV setupline() { struct termio termio; /* * * Line initialization for SYSV. For now if no line is given (ie. line == NULL ) * we continue on as before using stdout as ttyi and ttyo. Doesn't work when we're * running in interactive mode or forcing stuff that comes back from the printer * to stdout. Both cases are now caught by a test that's been added to routine * initialize(). The change is primarily for the version of lp that's available * with SVR3.2. * */ #ifdef DKHOST if ( line != NULL && *line != '/' ) { if ( strncmp(line, "DK:", 3) == 0 ) line += 3; dkhost_connect(); #ifdef DKSTREAMS if ( ioctl(ttyi, I_PUSH, DKSTREAMS) == -1 ) error(FATAL, "ioctl error - %s", DKSTREAMS); if ( ioctl(ttyi, I_PUSH, "ldterm") == -1 ) error(FATAL, "ioctl error - ldterm"); #endif } else #endif if ( line == NULL ) ttyi = fileno(stdout); else if ( (ttyi = open(line, O_RDWR)) == -1 ) error(FATAL, "can't open %s", line); if ( (ttyo = dup(ttyi)) == -1 ) error(FATAL, "can't dup file descriptor for %s", line); if ( stopbits == 1 ) stopbits = 0; else stopbits = CSTOPB; if ( fcntl(ttyi, F_SETFL, O_NDELAY) == -1 ) error(FATAL, "fcntl error - F_SETFL"); if ( ioctl(ttyi, TCGETA, &termio) == -1 ) error(FATAL, "ioctl error - TCGETA"); termio.c_iflag = IXON | IGNCR; termio.c_oflag = 0; termio.c_cflag = HUPCL | CREAD | CS8 | stopbits | baudrate; termio.c_lflag = 0; termio.c_cc[VMIN] = termio.c_cc[VTIME] = 0; if ( ioctl(ttyi, TCSETA, &termio) == -1 ) error(FATAL, "ioctl error - TCSETA"); if ( ioctl(ttyi, TCFLSH, 2) == -1 ) error(FATAL, "ioctl error - TCFLSH"); fp_ttyi = fdopen(ttyi, "r"); } /* End of setupline */ /*****************************************************************************/ resetline() { int flags; /* for turning O_NDELAY off */ struct termio termio; /* so we can reset flow control */ /* * * Only used if we're running the program as separate read and write processes. * Called from split() after the initial connection has been made and returns * TRUE if two processes should work. Don't know if the O_NDELAY stuff is really * needed, but setting c_cc[VMIN] to 1 definitely is. If we leave it be (as a 0) * the read in readline() won't block! * */ if ( (flags = fcntl(ttyi, F_GETFL, 0)) == -1 ) error(FATAL, "fcntl error - F_GETFL"); flags &= ~O_NDELAY; if ( fcntl(ttyi, F_SETFL, flags) == -1 ) error(FATAL, "fcntl error - F_SETFL"); if ( ioctl(ttyi, TCGETA, &termio) == -1 ) error(FATAL, "ioctl error - TCGETA"); termio.c_iflag &= ~IXANY; termio.c_iflag |= IXON | IXOFF; termio.c_cc[VMIN] = 1; termio.c_cc[VTIME] = 0; if ( ioctl(ttyi, TCSETA, &termio) == -1 ) error(FATAL, "ioctl error - TCSETA"); return(TRUE); } /* End of resetline */ /*****************************************************************************/ setupstdin(mode) int mode; /* what to do with stdin settings */ { struct termio termio; static int saved = FALSE; static struct termio oldtermio; /* * * Save (mode = 0), reset (mode = 1), or restore (mode = 2) the tty settings for * stdin. Expect something like raw mode with no echo will be set up. Explicit * code to ensure blocking reads probably isn't needed because blocksize is set * to 1 when we're in interactive mode, but I've included it anyway. * */ if ( interactive == TRUE ) switch ( mode ) { case 0: if ( isatty(0) != 1 ) error(FATAL, "stdin not a terminal - can't run interactive mode"); if ( ioctl(0, TCGETA, &oldtermio) == -1 ) error(FATAL, "can't save terminal settings"); saved = TRUE; break; case 1: termio = oldtermio; termio.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL); termio.c_cc[VMIN] = 1; termio.c_cc[VTIME] = 0; ioctl(0, TCSETA, &termio); break; case 2: if ( saved == TRUE ) ioctl(0, TCSETA, &oldtermio); break; } /* End switch */ } /* End of setupstdin */ /*****************************************************************************/ readline() { int n; /* read() return value */ int ch; /* for interactive mode */ static int tries = 0; /* consecutive times read returned 0 */ /* * * Reads characters coming back from the printer on ttyi up to a newline (or EOF) * or until no more characters are available. Characters are put in mesg[], the * string is terminated with '\0' when we're done with a line and TRUE is returned * to the caller. If complete line wasn't available FALSE is returned. Interactive * mode should loop here forever, except during start(), echoing characters to * stdout. If it happens to leave FALSE should be returned. The non-blocking read * gets us out until split() is called. * * Some users (apparently just on 3B2 DKHOST systems) have had problems with the * two process implementation that's forced me to kludge things up some. When a * printer (on those systems) is turned off while postio is transmitting files * the write process hangs in writeblock() (postio.c) - it's typically in the * middle of a write() call, while the read() call (below) continually returns 0. * In the original code readline() returned FALSE when read() returned 0 and we * get into a loop that never ends - because the write process is hung. In the * one process implementation having read return 0 is legitimate because the line * is opened for no delay, but with two processes the read() blocks and a return * value of 0 should never occur. From my point of view the real problem is that * the write() call hangs on 3B2 DKHOST systems and apparently doesn't anywhere * else. If the write returned anything less than or equal to 0 writeblock() would * shut things down. The kludge I've implemented counts the number of consecutive * times read() returns a 0 and if it exceeds a limit (100) the read process will * shut things down. In fact one return of 0 from read() when we're in the two * process mode is undoubtedly sufficient and no counting should be necessary!!! * Moving the check to getstatus() should also work and is probably where things * belong. * */ if ( interactive == FALSE ) { while ( (n = read(ttyi, ptr, 1)) != 0 ) { if ( n < 0 ) if ( errno == EINTR ) continue; else error(FATAL, "error reading %s", line); tries = 0; if ( *ptr == '\n' || *ptr == '\004' || ptr >= endmesg ) { *(ptr+1) = '\0'; if ( *ptr == '\004' ) strcpy(ptr, "%%[ status: endofjob ]%%\n"); ptr = mesg; return(TRUE); } /* End if */ ptr++; } /* End while */ if ( canread == TRUE && canwrite == FALSE ) /* read process kludge */ if ( ++tries > 100 ) error(FATAL, "printer appears to be offline - shutting down"); return(FALSE); } /* End if */ if ( canwrite == TRUE ) /* don't block during start() */ return(FALSE); while ( (ch = getc(fp_ttyi)) != EOF ) putc(ch, stdout); return(FALSE); } /* End of readline */ #endif /*****************************************************************************/ #ifdef V9 #include <ipc.h> char tbuf[256]; /* temporary input buffer */ char *nptr = tbuf; /* next character comes from here */ char *eptr = tbuf; /* one past the last character in tbuf */ setupline() { struct sgttyb sgtty; struct ttydevb ttydev; /* for setting up the line */ static struct tchars tchar = { '\377', /* interrupt */ '\377', /* quit */ '\021', /* start output */ '\023', /* stop output */ '\377', /* end-of-file */ '\377' /* input delimiter */ }; /* * * Line initialization for V9. * */ if ( line == NULL ) { ttyi = ttyo = 1; return; } /* End if */ alarm(120); /* watch for hanging opens */ if ( line[0] == '/' ) { if ( (ttyi = open(line, O_RDWR)) == -1 ) error(FATAL, "can't open %s", line); } else if ((ttyi = ipcopen(ipcpath(line, "dk", 0), "")) < 0) { sleep(5); /* wait for Datakit to hangup */ if ((ttyi = ipcopen(ipcpath(line, "dk", 0), "")) < 0) { fprintf(stderr, "%s", errstr); error(FATAL, "can't ipcopen %s", line); } } alarm(0); if ( (ttyo = dup(ttyi)) == -1 ) error(FATAL, "can't dup file descriptor for %s", line); if ( ioctl(ttyi, FIOPUSHLD, &tty_ld) == -1 ) error(FATAL, "ioctl error - FIOPUSHLD"); if ( ioctl(ttyi, TIOCGDEV, &ttydev) == -1 ) error(FATAL, "ioctl error - TIOCGDEV"); if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCGETP"); sgtty.sg_flags &= ~ECHO; sgtty.sg_flags &= ~CRMOD; sgtty.sg_flags |= CBREAK; ttydev.ispeed = baudrate; ttydev.ospeed = baudrate; if ( ioctl(ttyi, TIOCSDEV, &ttydev) == -1 ) error(FATAL, "ioctl error - TIOCSDEV"); if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCSETP"); if ( ioctl(ttyi, TIOCSETC, &tchar) == -1 ) error(FATAL, "ioctl error - TIOCSETC"); fp_ttyi = fdopen(ttyi, "r"); } /* End of setupline */ /*****************************************************************************/ resetline() { struct sgttyb sgtty; /* * * Only used if we're running the program as separate read and write processes. * Called from split() after the initial connection has been made and returns * TRUE if two processes should work. Haven't tested or even compiled the stuff * for separate read and write processes on Ninth Edition systems - no guarantees * even though we return TRUE! * */ if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCGETP"); sgtty.sg_flags |= TANDEM; if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCSETP"); return(TRUE); } /* End of resetline */ /*****************************************************************************/ setupstdin(mode) int mode; /* what to do with stdin settings */ { struct sgttyb sgtty; static int saved = FALSE; static struct sgttyb oldsgtty; /* * * Save (mode = 0), reset (mode = 1), or restore (mode = 2) the tty settings for * stdin. Expect something like raw mode with no echo will be set up. Need to make * sure interrupt and quit still work - they're the only good way to exit when * we're running interactive mode. I haven't tested or even compiled this code * so there are no guarantees. * */ if ( interactive == TRUE ) switch ( mode ) { case 0: if ( ioctl(0, TIOCGETP, &oldsgtty) == -1 ) error(FATAL, "can't save terminal settings"); saved = TRUE; break; case 1: sgtty = oldsgtty; sgtty.sg_flags &= ~ECHO; sgtty.sg_flags |= CBREAK; ioctl(0, TIOCSETP, &sgtty); break; case 2: if ( saved == TRUE ) ioctl(0, TIOCSETP, &oldsgtty); break; } /* End switch */ } /* End of setupstdin */ /*****************************************************************************/ readline() { int n; /* read() return value */ int ch; /* for interactive mode */ /* * * Reads characters coming back from the printer on ttyi up to a newline (or EOF) * and transfers each line to the mesg[] array. Everything available on ttyi is * initially stored in tbuf[] and a line at a time is transferred from there to * mesg[]. The string in mesg[] is terminated with a '\0' and TRUE is returned to * the caller when we find a newline, EOF, or reach the end of the mesg[] array. * If nothing is available on ttyi we return FALSE if a single process is being * used for reads and writes, while in the two process implementation we force a * one character read. Interactive mode loops here forever, except during start(), * echoing everything that comes back on ttyi to stdout. The performance of a * simple getc/putc loop for interactive mode was unacceptable when run under mux * and has been replaced by more complicated code. When layers wasn't involved * the getc/putc loop worked well. * */ if ( interactive == FALSE ) { while ( 1 ) { while ( nptr < eptr ) { /* grab characters from tbuf */ *ptr = *nptr++; if ( *ptr == '\r' ) continue; if ( *ptr == '\n' || *ptr == '\004' || ptr >= endmesg ) { *(ptr+1) = '\0'; if ( *ptr == '\004' ) strcpy(ptr, "%%[ status: endofjob ]%%\n"); ptr = mesg; return(TRUE); } /* End if */ ++ptr; } /* End for */ nptr = eptr = tbuf; if ( ioctl(ttyi, FIONREAD, &n) < 0 ) if ( errno == EINTR ) continue; else error(FATAL, "ioctl error - FIONREAD"); if ( n <= 0 ) if ( canwrite == TRUE ) return(FALSE); n = ((n < 1) ? 1 : ((n < sizeof(tbuf)) ? n : sizeof(tbuf))); if ( (n = read(ttyi, tbuf, n)) < 0 ) if ( errno == EINTR ) continue; else error(FATAL, "error reading line %s", line); else eptr = nptr + n; } /* End while */ } /* End if */ if ( canwrite == TRUE ) /* don't block during start() */ return(FALSE); while ( 1 ) { /* only interactive mode gets here */ if ( ioctl(ttyi, FIONREAD, &n) < 0 ) error(FATAL, "ioctl error - FIONREAD"); n = ((n < 1) ? 1 : ((n < sizeof(tbuf)) ? n : sizeof(tbuf))); if ( (n = read(ttyi, tbuf, n)) < 0 ) error(FATAL, "error reading line %s", line); else if ( n == 0 ) /* should not happen */ error(FATAL, "end of file in interactive mode"); if ( write(1, tbuf, n) != n ) error(FATAL, "error writing to stdout"); } /* End while */ return(FALSE); } /* End of readline */ #endif /*****************************************************************************/ #ifdef BSD4_2 setupline() { struct sgttyb sgtty; static struct tchars tchar = { '\377', /* interrupt */ '\377', /* quit */ '\021', /* start output */ '\023', /* stop output */ '\377', /* end-of-file */ '\377' /* input delimiter */ }; long lmodes; int disc = NTTYDISC; /* * * Line initialization for BSD4_2. As in the System V code, if no line is given * (ie. line == NULL) we continue on as before using stdout as ttyi and ttyo. * */ if ( line == NULL ) ttyi = fileno(stdout); else if ( (ttyi = open(line, O_RDWR)) == -1 ) error(FATAL, "can't open %s", line); if ( (ttyo = dup(ttyi)) == -1 ) error(FATAL, "can't dup file descriptor for %s", line); if (ioctl(ttyi, TIOCSETD, &disc) == -1 ) error(FATAL, "ioctl error - TIOCSETD"); if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCGETP"); if ( ioctl(ttyi, TIOCLGET, &lmodes) == -1 ) error(FATAL, "ioctl error - TIOCLGET"); sgtty.sg_flags &= ~ECHO; sgtty.sg_flags &= ~CRMOD; sgtty.sg_flags |= CBREAK; sgtty.sg_ispeed = baudrate; sgtty.sg_ospeed = baudrate; lmodes |= LDECCTQ; if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCSETP"); if ( ioctl(ttyi, TIOCSETC, &tchar) == -1 ) error(FATAL, "ioctl error - TIOCSETC"); if ( ioctl(ttyi, TIOCLSET, &lmodes) == -1 ) error(FATAL, "ioctl error - TIOCLSET"); fp_ttyi = fdopen(ttyi, "r"); } /* End of setupline */ /*****************************************************************************/ resetline() { struct sgttyb sgtty; /* * * Only used if we're running the program as separate read and write processes. * Called from split() after the initial connection has been made and returns * TRUE if two processes should work. Haven't tested or even compiled the stuff * for separate read and write processes on Berkeley systems - no guarantees * even though we return TRUE! * */ if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCGETP"); sgtty.sg_flags |= TANDEM; if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 ) error(FATAL, "ioctl error - TIOCSETP"); return(TRUE); } /* End of resetline */ /*****************************************************************************/ setupstdin(mode) int mode; /* what to do with stdin settings */ { struct sgttyb sgtty; static int saved = FALSE; static struct sgttyb oldsgtty; /* * * Save (mode = 0), reset (mode = 1), or restore (mode = 2) the tty settings for * stdin. Expect something like raw mode with no echo will be set up. Need to make * sure interrupt and quit still work - they're the only good way to exit when * we're running interactive mode. I haven't tested or even compiled this code * so there are no guarantees. * */ if ( interactive == TRUE ) switch ( mode ) { case 0: if ( isatty(0) != 1 ) error(FATAL, "stdin not a terminal - can't run interactive mode"); if ( ioctl(0, TIOCGETP, &oldsgtty) == -1 ) error(FATAL, "can't save terminal settings"); saved = TRUE; break; case 1: sgtty = oldsgtty; sgtty.sg_flags &= ~ECHO; sgtty.sg_flags |= CBREAK; ioctl(0, TIOCSETP, &sgtty); break; case 2: if ( saved == TRUE ) ioctl(0, TIOCSETP, &oldsgtty); break; } /* End switch */ } /* End of setupstdin */ /*****************************************************************************/ readline() { int n; /* read() return value */ int ch; /* for interactive mode */ /* * * Reads characters coming back from the printer on ttyo up to a newline (or EOF) * or until no more characters are available. Characters are put in mesg[], the * string is terminated with '\0' when we're done with a line and TRUE is returned * to the caller. If complete line wasn't available FALSE is returned. Interactive * mode should loop here forever, except during start(), echoing characters to * stdout. If it happens to leave FALSE should be returned. Probably should read * everything available on ttyi into a temporary buffer and work from there rather * than reading one character at a time. * */ if ( interactive == FALSE ) { while ( 1 ) { if ( ioctl(ttyi, FIONREAD, &n) < 0 ) if ( errno == EINTR ) continue; else error(FATAL, "ioctl error - FIONREAD"); if ( n <= 0 ) if ( canwrite == TRUE ) return(FALSE); else n = 1; for ( ; n > 0; n-- ) { /*if ( read(ttyi, ptr, 1) < 0 )*/ if ( (*ptr = getc(fp_ttyi)) == EOF ) if ( errno == EINTR ) continue; else error(FATAL, "error reading %s", line); if ( *ptr == '\r' ) continue; if ( *ptr == '\n' || *ptr == '\004' || ptr >= endmesg ) { *(ptr+1) = '\0'; if ( *ptr == '\004' ) strcpy(ptr, "%%[ status: endofjob ]%%\n"); ptr = mesg; return(TRUE); } /* End if */ ++ptr; } /* End for */ } /* End while */ } /* End if */ if ( canwrite == TRUE ) /* don't block during start() */ return(FALSE); while ( (ch = getc(fp_ttyi)) != EOF ) putc(ch, stdout); return(FALSE); } /* End of readline */ /*****************************************************************************/ /* @(#)strspn.c 1.2 */ /*LINTLIBRARY*/ /* * Return the number of characters in the maximum leading segment * of string which consists solely of characters from charset. */ int strspn(string, charset) char *string; register char *charset; { register char *p, *q; for(q=string; *q != '\0'; ++q) { for(p=charset; *p != '\0' && *p != *q; ++p) ; if(*p == '\0') break; } return(q-string); } /* @(#)strpbrk.c 1.2 */ /*LINTLIBRARY*/ /* * Return ptr to first occurance of any character from `brkset' * in the character string `string'; NULL if none exists. */ char * strpbrk(string, brkset) register char *string, *brkset; { register char *p; do { for(p=brkset; *p != '\0' && *p != *string; ++p) ; if(*p != '\0') return(string); } while(*string++); return((char*)0); } /* @(#)strtok.c 1.2 */ /* 3.0 SID # 1.2 */ /*LINTLIBRARY*/ /* * uses strpbrk and strspn to break string into tokens on * sequentially subsequent calls. returns NULL when no * non-separator characters remain. * `subsequent' calls are calls with first argument NULL. */ extern int strspn(); extern char *strpbrk(); char * strtok(string, sepset) char *string, *sepset; { register char *p, *q, *r; static char *savept; /*first or subsequent call*/ p = (string == (char*)0)? savept: string; if(p == 0) /* return if no tokens remaining */ return((char*)0); q = p + strspn(p, sepset); /* skip leading separators */ if(*q == '\0') /* return if no tokens remaining */ return((char*)0); if((r = strpbrk(q, sepset)) == (char*)0) /* move past token */ savept = 0; /* indicate this is last token */ else { *r = '\0'; savept = ++r; } return(q); } #endif /*****************************************************************************/ #ifdef DKHOST #ifndef DKSTREAMS short dkrmode[3] = {DKR_TIME, 0, 0}; #endif dkhost_connect() { int ofd; /* for saving and restoring stderr */ int dfd; int retrytime = 5; /* * * Tries to connect to a Datakit destination. The extra stuff I've added to save * and later restore stderr is primarily for our spooling setup at Murray Hill. * postio is usually called with stderr directed to a file that will be returned * to the user when the job finishes printing. Problems encountered by dkdial(), * like busy messages, go to stderr but don't belong in the user's mail. They'll * be temporarily directed to the log file. After we've connected stderr will be * restored. * */ if ( *line == '\0' ) error(FATAL, "incomplete Datakit line"); if ( fp_log != NULL && fp_log != stderr ) { /* redirect dkdial errors */ ofd = dup(2); close(2); dup(fileno(fp_log)); } /* End if */ while ( (dfd = ttyi = dkdial(line)) < 0 ) { if ( retrytime < 0 ) error(FATAL, "can't connect to %s", line); sleep(retrytime++); if ( retrytime > 60 ) retrytime = 60; } /* End while */ if ( fp_log != NULL && fp_log != stderr ) { /* restore stderr */ close(2); dup(ofd); close(ofd); } /* End if */ #ifndef DKSTREAMS if ( ioctl(ttyi, DIOCRMODE, dkrmode) == -1 ) error(FATAL, "ioctl error - DIOCRMODE"); #ifdef DIOURPWD if ( window_size > 0 ) { short dkparm[3]; dkparm[0] = dkminor(ttyi); dkparm[1] = 1; dkparm[2] = window_size; if ( ioctl(ttyi, DIOURPWD, dkparm) < 0 || ioctl(ttyi, DIOCFLUSH, 0) < 0 ) error(NON_FATAL, "WSA failed"); } /* End if */ #endif line = dtnamer(dkminor(ttyi)); if ( (ttyi = open(line, O_RDWR)) == -1 ) error(FATAL, "can't open %s", line); close(dfd); #endif } /* End of dkhost_connect */ #endif /*****************************************************************************/ 0707070014231405061006440057030057030000011222050522627503600003000000002561post.src/postio/ifdef.h /* * * Conditional compilation definitions needed in ifdef.c and postio.c. * */ #ifdef SYSV #include <termio.h> #ifdef DKSTREAMS #include <sys/stream.h> #include <sys/stropts.h> #endif #endif #ifdef V9 #include <sys/filio.h> #include <sys/ttyio.h> extern int tty_ld; #endif #ifdef BSD4_2 #include <sgtty.h> #include <sys/time.h> #include <errno.h> #define FD_ZERO(s) (s) = 0 #define FD_SET(n,s) (s) |= 1 << (n) extern int errno; #endif #ifdef DKHOST #include <dk.h> #include <sysexits.h> extern char *dtnamer(); extern int dkminor(); #endif /* * * External variable declarations - most (if not all) are defined in postio.c and * needed by the routines in ifdef.c. * */ extern char *line; /* printer is on this line */ extern int ttyi; /* input */ extern int ttyo; /* and output file descriptors */ extern FILE *fp_log; /* just for DKHOST stuff */ extern char mesg[]; /* exactly what came back on ttyi */ extern char *endmesg; /* one in front of last free slot in mesg */ extern int next; /* next character goes in mesg[next] */ extern short baudrate; /* printer is running at this speed */ extern int stopbits; /* and expects this many stop bits */ extern int interactive; /* TRUE for interactive mode */ extern int whatami; /* a READ or WRITE process - or both */ extern int canread; /* allows reads */ extern int canwrite; /* and writes if TRUE */ 0707070014231405071006440057030057030000011223600522627503600003100000015777post.src/postio/postio.1 .TH POSTIO 1 "DWB 3.2" .SH NAME .B postio \- serial interface for PostScript printers .SH SYNOPSIS \*(mBpostio\f1 .OP \-l line .OP "" options [] .OP "" files [] .SH DESCRIPTION .B postio sends .I files to the PostScript printer attached to .IR line . If no .I files are specified the standard input is sent. The first group of .I options should be sufficient for most applications: .TP 0.75i .OP \-b speed Transmit data over .I line at baud rate .I speed. Recognized baud rates are 1200, 2400, 4800, 9600, and 19200. The default .I speed is 9600 baud. .TP .OP \-c Do not send .MR ^C s (interrupts) to the printer, which means .B postio does not force a busy printer into the idle state. .TP .OP \-l line Connect to printer attached to .IR line . In most cases there is no default and .B postio must be able to read and write .IR line . If .I line does not begin with .MW / it is treated as a Datakit destination. .TP .OP \-q Prevents status queries while .I files are being sent to the printer. When status queries are disabled a dummy message is appended to the log file before each block is transmitted. .TP .OP \-B num Set internal buffer size for reading and writing .I files to .I num bytes (default is 2048 bytes). .TP .OP \-D Enable debug mode. Guarantees that everything read on .I line will be added to the log file (standard error by default). .TP .OP \-L file Data received on .I line gets put in .IR file . The default log .I file is standard error. Printer or status messages that do not indicate a change in state are not normally written to .I file but can be forced out using the .OP \-D option. .TP .OP \-P string Send .I string to the printer before any of the input files. The default .I string is simple PostScript code that disables timeouts. .TP .OP \-R num Run .B postio as a single process if .I num is 1 or as separate read and write processes if .I num is 2. By default .B postio runs as a single process. .PP The next two .I options are provided for users who expect to run .B postio on their own. Neither is suitable for use in spooler interface programs: .TP 0.35i .OP \-i Run the program in interactive mode. Any .I files are sent first and followed by the standard input. Forces separate read and write processes and overrides many other options. To exit interactive mode use your interrupt or quit character. To get a friendly interactive connection with the printer type .MW executive on a line by itself. .TP .OP \-t Data received on .I line and not recognized as printer or status information is written to the standard output. Forces separate read and write processes. Convenient if you have a PostScript program that will be returning useful data to the host. .PP The last option is not generally recommended and should only be used if all else fails to provide a reliable connection: .TP 0.35i .OP \-S Slow the transmission of data to the printer. Severely limits throughput, runs as a single process, disables the .OP \-q option, limits the internal buffer size to 1024 bytes, can use an excessive amount of .SM CPU time, and does nothing in interactive mode. .PP Best performance is usually obtained by using a large internal buffer .OP -B "" ) ( and by running the program as separate read and write processes .OP \-R2 "" ). ( Inability to fork the additional process causes .B postio to continue as a single read/write process. When one process is used, only data sent to the printer is flow-controlled. .PP The options are not all mutually exclusive. The .OP \-i option always wins, selecting its own settings for whatever is needed to run interactive mode, independent of anything else found on the command line. Interactive mode runs as separate read and write processes and few of the other .I options accomplish anything in the presence of the .OP \-i option. The .OP \-t option needs a reliable two way connection to the printer and therefore tries to force separate read and write processes. The .OP \-S option relies on the status query mechanism, so .OP \-q is disabled and the program runs as a single process. .PP In most cases .B postio starts by making a connection to .I line and then attempts to force the printer into the .SM IDLE state by sending an appropriate sequence of .MW ^T (status query), .MW ^C (interrupt), and .MW ^D (end of job) characters. When the printer goes .SM IDLE .I files are transmitted along with an occasional .MW ^T (unless the .OP \-q option was used). After all the .I files are sent the program waits until it is reasonably sure the job is complete. Printer generated error messages received at any time except while establishing the initial connection (or when running interactive mode) cause .B postio to exit with a non-zero status. In addition to being added to the log file, printer error messages are also echoed to standard error. .SH EXAMPLES Run as a single process at 9600 baud and send .I file1 and .I file2 to the printer attached to .MR /dev/tty01 : .EX postio -l /dev/tty01 \f2file1 file2 .EE Same as above except two processes are used, the internal buffer is set to 4096 bytes, and data returned by the printer gets put in file .MR log : .EX postio -R2 -B4096 -l/dev/tty01 -Llog \f2file1 file2 .EE Establish an interactive connection with the printer at Datakit destination .MR my/printer : .EX postio -i -l my/printer .EE Send file .MW program to the printer connected to .MR /dev/tty22 , recover any data in file .MR results , and put log messages in file .MR log : .EX postio -t -l /dev/tty22 -L log program >results .EE .SH DIAGNOSTICS A 0 exit status is returned if the files ran successfully. System errors (e.g., ``can't open the line'') set the low order bit in the exit status, while PostScript errors set bit 1. An exit status of 2 usually means the printer detected a PostScript error in the input .IR files . .SH WARNINGS .PP The input .I files are handled as a single PostScript job. Sending several different jobs, each with their own internal end of job mark .RM ( ^D ) is not guaranteed to work properly. .B postio may quit before all the jobs have completed and could be restarted before the last one finishes. .PP All the capabilities described above may not be available on every machine or even across the different versions of .SM UNIX that are currently supported by the program. For example, the code needed to connect to a Datakit destination may only work on System\ V and may require that the .SM DKHOST software package be available at compile time. .PP There may be no default .I line so using .OP \-l option is strongly recommended. If omitted .B postio may attempt to connect to the printer using the standard output. If Datakit is involved the .OP \-b may be ineffective and attempts by .B postio to flow control data in both directions may not work. The .OP \-q option can help if the printer is connected to \s-1RADIAN\s+1. The .OP \-S option is not generally recommended and should only be used if all else fails to establish a reliable connection. .SH SEE ALSO .BR buildtables (1), .BR dpost (1), .BR postdaisy (1), .BR postdmd (1), .BR postmd (1), .BR postprint (1), .BR postreverse (1), .BR posttek (1), .BR printfont (1) 0707070014231405101006440057030057030000011224000522627503600003100000107251post.src/postio/postio.c /* * * postio - RS-232 serial interface for PostScript printers * * A simple program that manages input and output for PostScript printers. Much * has been added and changed from early versions of the program, but the basic * philosophy is still the same. Don't send real data until we're certain we've * connected to a PostScript printer that's in the idle state and try to hold the * connection until the job is completely done. It's more work than you might * expect is necessary, but should provide a reasonably reliable spooler interface * that can return error indications to the caller via the program's exit status. * * I've added code that will let you split the program into separate read/write * processes. Although it's not the default it should be useful if you have a file * that will be returning useful data from the printer. The two process stuff was * laid down on top of the single process code and both methods still work. The * implementation isn't as good as it could be, but didn't require many changes * to the original program (despite the fact that there are now many differences). * * By default the program still runs as a single process. The -R2 option forces * separate read and write processes after the intial connection is made. If you * want that as the default initialize splitme (below) to TRUE. In addition the * -t option that's used to force stuff not recognized as status reports to stdout * also tries to run as two processes (by setting splitme to TRUE). It will only * work if the required code (ie. resetline() in ifdef.c) has been implemented * for your Unix system. I've only tested the System V code. * * Code needed to support interactive mode has also been added, although again it's * not as efficient as it could be. It depends on the system dependent procedures * resetline() and setupstdin() (file ifdef.c) and for now is only guaranteed to * work on System V. Can be requested using the -i option. * * Quiet mode (-q option) is also new, but was needed for some printers connected * to RADIAN. If you're running in quiet mode no status requests will be sent to * the printer while files are being transmitted (ie. in send()). * * The program expects to receive printer status lines that look like, * * %%[ status: idle; source: serial 25 ]%% * %%[ status: waiting; source: serial 25 ]%% * %%[ status: initializing; source: serial 25 ]%% * %%[ status: busy; source: serial 25 ]%% * %%[ status: printing; source: serial 25 ]%% * %%[ status: PrinterError: out of paper; source: serial 25 ]%% * %%[ status: PrinterError: no paper tray; source: serial 25 ]%% * * although this list isn't complete. Sending a '\024' (control T) character forces * the return of a status report. PostScript errors detected on the printer result * in the immediate transmission of special error messages that look like, * * %%[ Error: undefined; OffendingCommand: xxx ]%% * %%[ Flushing: rest of job (to end-of-file) will be ignored ]%% * * although we only use the Error and Flushing keywords. Finally conditions, like * being out of paper, result in other messages being sent back from the printer * over the communications line. Typical PrinterError messages look like, * * %%[ PrinterError: out of paper; source: serial 25 ]%% * %%[ PrinterError: paper jam; source: serial 25 ]%% * * although we only use the PrinterError keyword rather than trying to recognize * all possible printer errors. * * The implications of using one process and only flow controlling data going to * the printer are obvious. Job transmission should be reliable, but there can be * data loss in stuff sent back from the printer. Usually that only caused problems * with jobs designed to run on the printer and return useful data back over the * communications line. If that's the kind of job you're sending call postio with * the -t option. That should force the program to split into separate read and * write processes and everything not bracketed by "%%[ " and " ]%%" strings goes * to stdout. In otherwords the data you're expecting should be separated from the * status stuff that goes to the log file (or stderr). The -R2 option does almost * the same thing (ie. separate read and write processes), but everything that * comes back from the printer goes to the log file (stderr by default) and you'll * have to separate your data from any printer messages. * * A typical command line might be, * * postio -l /dev/tty01 -b 9600 -L log file1 file2 * * where -l selects the line, -b sets the baud rate, and -L selects the printer * log file. Since there's no default line, at least not right now, you'll always * need to use the -l option, and if you don't choose a log file stderr will be * used. If you have a program that will be returning data the command line might * look like, * * postio -t -l/dev/tty01 -b9600 -Llog file >results * * Status stuff goes to file log while the data you're expecting back from the * printer gets put in file results. * */ #include <stdio.h> #include <ctype.h> #include <fcntl.h> #include <signal.h> #include <sys/types.h> #include <errno.h> #include "ifdef.h" /* conditional compilation stuff */ #include "gen.h" /* general purpose definitions */ #include "postio.h" /* some special definitions */ char **argv; /* global so everyone can use them */ int argc; char *prog_name = ""; /* really just for error messages */ int x_stat = 0; /* program exit status */ int debug = OFF; /* debug flag */ int ignore = OFF; /* what's done for FATAL errors */ char *line = NULL; /* printer is on this tty line */ short baudrate = BAUDRATE; /* and running at this baud rate */ Baud baudtable[] = BAUDTABLE; /* converts strings to termio values */ int stopbits = 1; /* number of stop bits */ int tostdout = FALSE; /* non-status stuff goes to stdout? */ int quiet = FALSE; /* no status queries in send() if TRUE */ int interactive = FALSE; /* interactive mode */ char *postbegin = POSTBEGIN; /* preceeds all the input files */ int useslowsend = FALSE; /* not recommended! */ int sendctrlC = TRUE; /* interrupt with ctrl-C when BUSY */ int window_size = -1; /* for Datakit - use -w */ char *block = NULL; /* input file buffer */ int blocksize = BLOCKSIZE; /* and its size in bytes */ int head = 0; /* block[head] is the next character */ int tail = 0; /* one past the last byte in block[] */ int splitme = FALSE; /* into READ and WRITE processes if TRUE */ int whatami = READWRITE; /* a READ or WRITE process - or both */ int canread = TRUE; /* allow reads */ int canwrite = TRUE; /* and writes if TRUE */ int otherpid = -1; /* who gets signals if greater than 1 */ int joinsig = SIGTRAP; /* reader gets this when writing is done */ int writedone = FALSE; /* and then sets this to TRUE */ char mesg[MESGSIZE]; /* exactly what came back on ttyi */ char sbuf[MESGSIZE]; /* for parsing the message */ int next = 0; /* next character goes in mesg[next] */ char *mesgptr = NULL; /* printer message starts here in mesg[] */ char *endmesg = NULL; /* as far as readline() can go in mesg[] */ Status status[] = STATUS; /* for converting status strings */ int nostatus = NOSTATUS; /* default getstatus() return value */ int currentstate = NOTCONNECTED; /* what's happening START, SEND, or DONE */ int ttyi = 0; /* input */ int ttyo = 2; /* and output file descriptors */ FILE *fp_log = stderr; /* log file for stuff from the printer */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that manages input and output for PostScript printers. Can run * as a single process or as separate read/write processes. What's done depends on * the value assigned to splitme when split() is called. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* really just for error messages */ init_signals(); /* sets up interrupt handling */ options(); /* get command line options */ initialize(); /* must be done after options() */ start(); /* make sure the printer is ready */ split(); /* into read/write processes - maybe */ arguments(); /* then send each input file */ done(); /* wait until the printer is finished */ cleanup(); /* make sure the write process stops */ exit(x_stat); /* everything probably went OK */ } /* End of main */ /*****************************************************************************/ init_signals() { void interrupt(); /* handles them if we catch signals */ /* * * Makes sure we handle interrupts. The proper way to kill the program, if * necessary, is to do a kill -15. That forces a call to interrupt(), which in * turn tries to reset the printer and then exits with a non-zero status. If the * program is running as two processes, sending SIGTERM to either the parent or * child should clean things up. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_sig */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ char *optnames = "b:cil:qs:tw:B:L:P:R:SDI"; extern char *optarg; /* used by getopt() */ extern int optind; /* * * Reads and processes the command line options. The -R2, -t, and -i options all * force separate read and write processes by eventually setting splitme to TRUE * (check initialize()). The -S option is not recommended and should only be used * as a last resort! * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'b': /* baud rate string */ baudrate = getbaud(optarg); break; case 'c': /* no ctrl-C's */ sendctrlC = FALSE; break; case 'i': /* interactive mode */ interactive = TRUE; break; case 'l': /* printer line */ line = optarg; break; case 'q': /* no status queries - for RADIAN? */ quiet = TRUE; break; case 's': /* use 2 stop bits - for UNISON? */ if ( (stopbits = atoi(optarg)) < 1 || stopbits > 2 ) stopbits = 1; break; case 't': /* non-status stuff goes to stdout */ tostdout = TRUE; break; case 'w': /* Datakit window size */ window_size = atoi(optarg); break; case 'B': /* set the job buffer size */ if ( (blocksize = atoi(optarg)) <= 0 ) blocksize = BLOCKSIZE; break; case 'L': /* printer log file */ if ( (fp_log = fopen(optarg, "w")) == NULL ) { fp_log = stderr; error(NON_FATAL, "can't open log file %s", optarg); } /* End if */ break; case 'P': /* initial PostScript code */ postbegin = optarg; break; case 'R': /* run as one or two processes */ if ( atoi(optarg) == 2 ) splitme = TRUE; else splitme = FALSE; break; case 'S': /* slow and kludged up version of send */ useslowsend = TRUE; break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ getbaud(rate) char *rate; /* string representing the baud rate */ { int i; /* for looking through baudtable[] */ /* * * Called from options() to convert a baud rate string into an appropriate termio * value. *rate is looked up in baudtable[] and if it's found, the corresponding * value is returned to the caller. * */ for ( i = 0; baudtable[i].rate != NULL; i++ ) if ( strcmp(rate, baudtable[i].rate) == 0 ) return(baudtable[i].val); error(FATAL, "don't recognize baud rate %s", rate); } /* End of getbaud */ /*****************************************************************************/ initialize() { /* * * Initialization, a few checks, and a call to setupline() (file ifdef.c) to open * and configure the communications line. Settings for interactive mode always * take precedence. The setupstdin() call with an argument of 0 saves the current * terminal settings if interactive mode has been requested - otherwise nothing's * done. Unbuffering stdout (via the setbuf() call) isn't really needed on System V * since it's flushed whenever terminal input is requested. It's more efficient if * we buffer the stdout (on System V) but safer (for other versions of Unix) if we * include the setbuf() call. * */ whatami = READWRITE; /* always run start() as one process */ canread = canwrite = TRUE; if ( tostdout == TRUE ) /* force separate read/write processes */ splitme = TRUE; if ( interactive == TRUE ) { /* interactive mode settings always win */ quiet = FALSE; tostdout = FALSE; splitme = TRUE; blocksize = 1; postbegin = NULL; useslowsend = FALSE; nostatus = INTERACTIVE; setbuf(stdout, NULL); } /* End if */ if ( useslowsend == TRUE ) { /* last resort only - not recommended */ quiet = FALSE; splitme = FALSE; if ( blocksize > 1024 ) /* don't send too much all at once */ blocksize = 1024; } /* End if */ if ( tostdout == TRUE && fp_log == stderr ) fp_log = NULL; if ( line == NULL && (interactive == TRUE || tostdout == TRUE) ) error(FATAL, "a printer line must be supplied - use the -l option"); if ( (block = malloc(blocksize)) == NULL ) error(FATAL, "no memory"); endmesg = mesg + sizeof mesg - 2; /* one byte from last position in mesg */ setupline(); /* configure the communications line */ setupstdin(0); /* save current stdin terminal settings */ } /* End of initialize */ /*****************************************************************************/ start() { /* * * Tries to put the printer in the IDLE state before anything important is sent. * Run as a single process no matter what has been assigned to splitme. Separate * read and write processes, if requested, will be created after we're done here. * */ logit("printer startup\n"); currentstate = START; clearline(); while ( 1 ) switch ( getstatus(1) ) { case IDLE: case INTERACTIVE: if ( postbegin != NULL && *postbegin != '\0' ) Write(ttyo, postbegin, strlen(postbegin)); clearline(); return; case BUSY: if ( sendctrlC == TRUE ) { Write(ttyo, "\003", 1); Rest(1); } /* End if */ break; case WAITING: case ERROR: case FLUSHING: Write(ttyo, "\004", 1); Rest(1); break; case PRINTERERROR: Rest(15); break; case DISCONNECT: error(FATAL, "Disconnected - printer may be offline"); break; case ENDOFJOB: case UNKNOWN: clearline(); break; default: Rest(1); break; } /* End switch */ } /* End of start */ /*****************************************************************************/ split() { int pid; void interrupt(); /* * * If splitme is TRUE we fork a process, make the parent handle reading, and let * the child take care of writing. resetline() (file ifdef.c) contains all the * system dependent code needed to reset the communications line for separate * read and write processes. For now it's expected to return TRUE or FALSE and * that value controls whether we try the fork. I've only tested the two process * stuff for System V. Other versions of resetline() may just be dummy procedures * that always return FALSE. If the fork() failed previous versions continued as * a single process, although the implementation wasn't quite right, but I've now * decided to quit. The main reason is a Datakit channel may be configured to * flow control data in both directions, and if we run postio over that channel * as a single process we likely will end up in deadlock. * */ if ( splitme == TRUE ) if ( resetline() == TRUE ) { pid = getpid(); signal(joinsig, interrupt); if ( (otherpid = fork()) == -1 ) error(FATAL, "can't fork"); else if ( otherpid == 0 ) { whatami = WRITE; nostatus = WRITEPROCESS; otherpid = pid; setupstdin(1); } else whatami = READ; } else if ( interactive == TRUE || tostdout == TRUE ) error(FATAL, "can't create two process - check resetline()"); else error(NON_FATAL, "running as a single process - check resetline()"); canread = (whatami & READ) ? TRUE : FALSE; canwrite = (whatami & WRITE) ? TRUE : FALSE; } /* End of split */ /*****************************************************************************/ arguments() { int fd_in; /* next input file */ /* * * Makes sure all the non-option command line arguments are processed. If there * aren't any arguments left when we get here we'll send stdin. Input files are * only read and sent to the printer if canwrite is TRUE. Checking it here means * we won't have to do it in send(). If interactive mode is TRUE we'll stay here * forever sending stdin when we run out of files - exit with a break. Actually * the loop is bogus and used at most once when we're in interactive mode because * stdin is in a pseudo raw mode and the read() in readblock() should never see * the end of file. * */ if ( canwrite == TRUE ) do /* loop is for interactive mode */ if ( argc < 1 ) send(fileno(stdin), "pipe.end"); else { while ( argc > 0 ) { if ( (fd_in = open(*argv, O_RDONLY)) == -1 ) error(FATAL, "can't open %s", *argv); send(fd_in, *argv); close(fd_in); argc--; argv++; } /* End while */ } /* End else */ while ( interactive == TRUE ); } /* End of arguments */ /*****************************************************************************/ send(fd_in, name) int fd_in; /* next input file */ char *name; /* and it's pathname */ { /* * * Sends file *name to the printer. There's nothing left here that depends on * sending and receiving status reports, although it can be reassuring to know * the printer is responding and processing our job. Only the writer gets here * in the two process implementation, and in that case split() has reset nostatus * to WRITEPROCESS and that's what getstatus() always returns. For now we accept * the IDLE state and ENDOFJOB as legitimate and ignore the INITIALIZING state. * */ if ( interactive == FALSE ) logit("sending file %s\n", name); currentstate = SEND; if ( useslowsend == TRUE ) { slowsend(fd_in); return; } /* End if */ while ( readblock(fd_in) ) switch ( getstatus(0) ) { case IDLE: case BUSY: case WAITING: case PRINTING: case ENDOFJOB: case PRINTERERROR: case UNKNOWN: case NOSTATUS: case WRITEPROCESS: case INTERACTIVE: writeblock(); break; case ERROR: fprintf(stderr, "%s", mesg); /* for csw */ error(USER_FATAL, "PostScript Error"); break; case FLUSHING: error(USER_FATAL, "Flushing Job"); break; case DISCONNECT: error(FATAL, "Disconnected - printer may be offline"); break; } /* End switch */ } /* End of send */ /*****************************************************************************/ done() { int sleeptime = 15; /* for 'out of paper' etc. */ /* * * Tries to stay connected to the printer until we're reasonably sure the job is * complete. It's the only way we can recover error messages or data generated by * the PostScript program and returned over the communication line. Actually doing * it correctly for all possible PostScript jobs is more difficult that it might * seem. For example if we've sent several jobs, each with their own EOF mark, then * waiting for ENDOFJOB won't guarantee all the jobs have completed. Even waiting * for IDLE isn't good enough. Checking for the WAITING state after all the files * have been sent and then sending an EOF may be the best approach, but even that * won't work all the time - we could miss it or might not get there. Even sending * our own special PostScript job after all the input files has it's own different * set of problems, but probably could work (perhaps by printing a fake status * message or just not timing out). Anyway it's probably not worth the trouble so * for now we'll quit if writedone is TRUE and we get ENDOFJOB or IDLE. * * If we're running separate read and write processes the reader gets here after * after split() while the writer goes to send() and only gets here after all the * input files have been transmitted. When they're both here the writer sends the * reader signal joinsig and that forces writedone to TRUE in the reader. At that * point the reader can begin looking for an indication of the end of the job. * The writer hangs around until the reader kills it (usually in cleanup()) sending * occasional status requests. * */ if ( canwrite == TRUE ) logit("waiting for end of job\n"); currentstate = DONE; writedone = (whatami == READWRITE) ? TRUE : FALSE; while ( 1 ) { switch ( getstatus(1) ) { case WRITEPROCESS: if ( writedone == FALSE ) { sendsignal(joinsig); Write(ttyo, "\004", 1); writedone = TRUE; sleeptime = 1; } /* End if */ Rest(sleeptime++); break; case WAITING: Write(ttyo, "\004", 1); Rest(1); sleeptime = 15; break; case IDLE: case ENDOFJOB: if ( writedone == TRUE ) { logit("job complete\n"); return; } /* End if */ break; case BUSY: case PRINTING: case INTERACTIVE: sleeptime = 15; break; case PRINTERERROR: Rest(sleeptime++); break; case ERROR: fprintf(stderr, "%s", mesg); /* for csw */ error(USER_FATAL, "PostScript Error"); return; case FLUSHING: error(USER_FATAL, "Flushing Job"); return; case DISCONNECT: error(FATAL, "Disconnected - printer may be offline"); return; default: Rest(1); break; } /* End switch */ if ( sleeptime > 60 ) sleeptime = 60; } /* End while */ } /* End of done */ /*****************************************************************************/ cleanup() { int w; /* * * Only needed if we're running separate read and write processes. Makes sure the * write process is killed after the read process has successfully finished with * all the jobs. sendsignal() returns a -1 if there's nobody to signal so things * work when we're running a single process. * */ while ( sendsignal(SIGKILL) != -1 && (w = wait((int *)0)) != otherpid && w != -1 ) ; } /* End of cleanup */ /*****************************************************************************/ readblock(fd_in) int fd_in; /* current input file */ { static long blocknum = 1; /* * * Fills the input buffer with the next block, provided we're all done with the * last one. Blocks from fd_in are stored in array block[]. head is the index * of the next byte in block[] that's supposed to go to the printer. tail points * one past the last byte in the current block. head is adjusted in writeblock() * after each successful write, while head and tail are reset here each time * a new block is read. Returns the number of bytes left in the current block. * Read errors cause the program to abort. The fake status message that's put out * in quiet mode is only so you can look at the log file and know something's * happening - take it out if you want. * */ if ( head >= tail ) { /* done with the last block */ if ( (tail = read(fd_in, block, blocksize)) == -1 ) error(FATAL, "error reading input file"); if ( quiet == TRUE && tail > 0 ) /* put out a fake message? */ logit("%%%%[ status: busy; block: %d ]%%%%\n", blocknum++); head = 0; } /* End if */ return(tail - head); } /* End of readblock */ /*****************************************************************************/ writeblock() { int count; /* bytes successfully written */ /* * * Called from send() when it's OK to send the next block to the printer. head * is adjusted after the write, and the number of bytes that were successfully * written is returned to the caller. * */ if ( (count = write(ttyo, &block[head], tail - head)) == -1 ) error(FATAL, "error writing to %s", line); else if ( count == 0 ) error(FATAL, "printer appears to be offline"); head += count; return(count); } /* End of writeblock */ /*****************************************************************************/ getstatus(t) int t; /* sleep time after sending '\024' */ { int gotline = FALSE; /* value returned by readline() */ int state = nostatus; /* representation of the current state */ int mesgch; /* to restore mesg[] when tostdout == TRUE */ static int laststate = NOSTATUS; /* last state recognized */ /* * * Looks for things coming back from the printer on the communications line, parses * complete lines retrieved by readline(), and returns an integer representation * of the current printer status to the caller. If nothing was available a status * request (control T) is sent to the printer and nostatus is returned to the * caller (provided quiet isn't TRUE). Interactive mode either never returns from * readline() or returns FALSE. * */ if ( canread == TRUE && (gotline = readline()) == TRUE ) { state = parsemesg(); if ( state != laststate || state == UNKNOWN || mesgptr != mesg || debug == ON ) logit("%s", mesg); if ( tostdout == TRUE && currentstate != START ) { mesgch = *mesgptr; *mesgptr = '\0'; fprintf(stdout, "%s", mesg); fflush(stdout); *mesgptr = mesgch; /* for ERROR in send() and done() */ } /* End if */ return(laststate = state); } /* End if */ if ( (quiet == FALSE || currentstate != SEND) && (tostdout == FALSE || currentstate == START) && interactive == FALSE ) { if ( Write(ttyo, "\024", 1) != 1 ) error(FATAL, "printer appears to be offline"); if ( t > 0 ) Rest(t); } /* End if */ return(nostatus); } /* End of getstatus */ /*****************************************************************************/ parsemesg() { char *e; /* end of printer message in mesg[] */ char *key, *val; /* keyword/value strings in sbuf[] */ char *p; /* for converting to lower case etc. */ int i; /* where *key was found in status[] */ /* * * Parsing the lines that readline() stores in mesg[] is messy, and what's done * here isn't completely correct nor as fast as it could be. The general format * of lines that come back from the printer (assuming no data loss) is: * * str%%[ key: val; key: val; key: val ]%%\n * * where str can be most anything not containing a newline and printer reports * (eg. status or error messages) are bracketed by "%%[ " and " ]%%" strings and * end with a newline. Usually we'll have the string or printer report but not * both. For most jobs the leading string will be empty, but could be anything * generated on a printer and returned over the communications line using the * PostScript print operator. I'll assume PostScript jobs are well behaved and * never bracket their messages with "%%[ " and " ]%%" strings that delimit status * or error messages. * * Printer reports consist of one or more key/val pairs, and what we're interested * in (status or error indications) may not be the first pair in the list. In * addition we'll sometimes want the value associated with a keyword (eg. when * key = status) and other times we'll want the keyword (eg. when key = Error or * Flushing). The last pair isn't terminated by a semicolon and a value string * often contains many space separated words and it can even include colons in * meaningful places. I've also decided to continue converting things to lower * case before doing the lookup in status[]. The isupper() test is for Berkeley * systems. * */ if ( *(mesgptr = find("%%[ ", mesg)) != '\0' && *(e = find(" ]%%", mesgptr+4)) != '\0' ) { strcpy(sbuf, mesgptr+4); /* don't change mesg[] */ sbuf[e-mesgptr-4] = '\0'; /* ignore the trailing " ]%%" */ for ( key = strtok(sbuf, " :"); key != NULL; key = strtok(NULL, " :") ) { if ( (val = strtok(NULL, ";")) != NULL && strcmp(key, "status") == 0 ) key = val; for ( ; *key == ' '; key++ ) ; /* skip any leading spaces */ for ( p = key; *p; p++ ) /* convert to lower case */ if ( *p == ':' ) { *p = '\0'; break; } else if ( isupper(*p) ) *p = tolower(*p); for ( i = 0; status[i].state != NULL; i++ ) if ( strcmp(status[i].state, key) == 0 ) return(status[i].val); } /* End for */ } else if ( strcmp(mesg, "CONVERSATION ENDED.\n") == 0 ) return(DISCONNECT); return(mesgptr == '\0' ? nostatus : UNKNOWN); } /* End of parsemesg */ /*****************************************************************************/ char *find(str1, str2) char *str1; /* look for this string */ char *str2; /* in this one */ { char *s1, *s2; /* can't change str1 or str2 too fast */ /* * * Looks for *str1 in string *str2. Returns a pointer to the start of the substring * if it's found or to the end of string str2 otherwise. * */ for ( ; *str2 != '\0'; str2++ ) { for ( s1 = str1, s2 = str2; *s1 != '\0' && *s1 == *s2; s1++, s2++ ) ; if ( *s1 == '\0' ) break; } /* End for */ return(str2); } /* End of find */ /*****************************************************************************/ clearline() { /* * * Reads characters from the input line until nothing's left. Don't do anything if * we're currently running separate read and write processes. * */ if ( whatami == READWRITE ) while ( readline() != FALSE ) ; } /* End of clearline */ /*****************************************************************************/ sendsignal(sig) int sig; /* this goes to the other process */ { /* * * Sends signal sig to the other process if we're running as separate read and * write processes. Returns the result of the kill if there's someone else to * signal or -1 if we're running alone. * */ if ( whatami != READWRITE && otherpid > 1 ) return(kill(otherpid, sig)); return(-1); } /* End of sendsignal */ /*****************************************************************************/ void interrupt(sig) int sig; /* signal that we caught */ { /* * * Caught a signal - all except joinsig cause the program to quit. joinsig is the * signal sent by the writer to the reader after all the jobs have been transmitted. * Used to tell the read process when it can start looking for the end of the job. * */ signal(sig, SIG_IGN); if ( sig != joinsig ) { x_stat |= FATAL; if ( canread == TRUE ) if ( interactive == FALSE ) error(NON_FATAL, "signal %d abort", sig); else error(NON_FATAL, "quitting"); quit(sig); } /* End if */ writedone = TRUE; signal(joinsig, interrupt); } /* End of interrupt */ /*****************************************************************************/ logit(mesg, a1, a2, a3) char *mesg; /* control string */ unsigned a1, a2, a3; /* and possible arguments */ { /* * * Simple routine that's used to write a message to the log file. * */ if ( mesg != NULL && fp_log != NULL ) { fprintf(fp_log, mesg, a1, a2, a3); fflush(fp_log); } /* End if */ } /* End of logit */ /*****************************************************************************/ error(kind, mesg, a1, a2, a3) int kind; /* FATAL or NON_FATAL error */ char *mesg; /* error message control string */ unsigned a1, a2, a3; /* control string arguments */ { FILE *fp_err; /* * * Called when we've run into some kind of program error. First *mesg is printed * using the control string arguments a?. If kind is FATAL and we're not ignoring * errors the program will be terminated. If mesg is NULL or *mesg is the NULL * string nothing will be printed. * */ fp_err = (fp_log != NULL) ? fp_log : stderr; if ( mesg != NULL && *mesg != '\0' ) { fprintf(fp_err, "%s: ", prog_name); fprintf(fp_err, mesg, a1, a2, a3); putc('\n', fp_err); } /* End if */ x_stat |= kind; if ( kind != NON_FATAL && ignore == OFF ) quit(SIGTERM); } /* End of error */ /*****************************************************************************/ quit(sig) int sig; { int w; /* * * Makes sure everything is properly cleaned up if there's a signal or FATAL error * that should cause the program to terminate. The sleep by the write process is * to help give the reset sequence a chance to reach the printer before we break * the connection - primarily for printers connected to Datakit. There's a very * slight chance the reset sequence that's sent to the printer could get us stuck * here. Simplest solution is don't bother to send it - everything works without it. * Flushing ttyo would be better, but means yet another system dependent procedure * in ifdef.c! I'll leave things be for now. * * Obscure problem on PS-810 turbos says wait a bit after sending an interrupt. * Seem to remember the printer getting into a bad state immediately after the * top was opened when the toner light was on. A sleep after sending the ctrl-C * seemed to fix things. * */ signal(sig, SIG_IGN); ignore = ON; while ( sendsignal(sig) != -1 && (w = wait((int *)0)) != otherpid && w != -1 ) ; setupstdin(2); if ( currentstate != NOTCONNECTED ) { if ( sendctrlC == TRUE ) { Write(ttyo, "\003", 1); Rest(1); /* PS-810 turbo problem?? */ } /* End if */ Write(ttyo, "\004", 1); } /* End if */ alarm(0); /* prevents sleep() loop on V9 systems */ Rest(2); exit(x_stat); } /* End of quit */ /*****************************************************************************/ Rest(t) int t; { /* * * Used to replace sleep() calls. Only needed if we're running the program as * a read and write process and don't want to have the read process sleep. Most * sleeps are in the code because of the non-blocking read used by the single * process implementation. Probably should be a macro. * */ if ( t > 0 && canwrite == TRUE ) sleep(t); } /* End of Rest */ /*****************************************************************************/ Read(fd, buf, n) int fd; char *buf; int n; { int count; /* * * Used to replace some of the read() calls. Only needed if we're running separate * read and write processes. Should only be used to replace read calls on ttyi. * Always returns 0 to the caller if the process doesn't have its READ flag set. * Probably should be a macro. * */ if ( canread == TRUE ) { if ( (count = read(fd, buf, n)) == -1 && errno == EINTR ) count = 0; } else count = 0; return(count); } /* End of Read */ /*****************************************************************************/ Write(fd, buf, n) int fd; char *buf; int n; { int count; /* * * Used to replace some of the write() calls. Again only needed if we're running * separate read and write processes. Should only be used to replace write calls * on ttyo. Always returns n to the caller if the process doesn't have its WRITE * flag set. Should also probably be a macro. * */ if ( canwrite == TRUE ) { if ( (count = write(fd, buf, n)) == -1 && errno == EINTR ) count = n; } else count = n; return(count); } /* End of Write */ /*****************************************************************************/ 0707070014231405111006440057030057030000011225200522627503600003100000015154post.src/postio/postio.h /* * * POSTBEGIN, if it's not NULL, is some PostScript code that's sent to the printer * before any of the input files. It's not terribly important since the same thing * can be accomplished in other ways, but this approach is convenient. POSTBEGIN * is initialized so as to disable job timeouts. The string can also be set on the * command line using the -P option. * */ #define POSTBEGIN "statusdict /waittimeout 0 put\n" /* * * The following help determine where postio is when it's running - either in the * START, SEND, or DONE states. Primarily controls what's done in getstatus(). * RADIAN occasionally had problems with two way conversations. Anyway this stuff * can be used to prevent status queries while we're transmitting a job. Enabled * by the -q option. * */ #define NOTCONNECTED 0 #define START 1 #define SEND 2 #define DONE 3 /* * * Previous versions of postio only ran as a single process. That was (and still * is) convenient, but meant we could only flow control one direction. Data coming * back from the printer occasionally got lost, but that didn't often hurt (except * for lost error messages). Anyway I've added code that lets you split the program * into separate read and write processes, thereby helping to prevent data loss in * both directions. It should be particularly useful when you're sending a job that * you expect will be returning useful data over the communications line. * * The next three definitions control what's done with data on communications line. * The READ flag means the line can be read, while the WRITE flag means it can be * written. When we're running as a single process both flags are set. I tried to * overlay the separate read/write process code on what was there and working for * one process. The implementation isn't as good as it could be, but should be * safe. The single process version still works, and remains the default. * */ #define READ 1 #define WRITE 2 #define READWRITE 3 /* * * Messages generated on the printer and returned over the communications line * look like, * * %%[ status: idle; source: serial 25 ]%% * %%[ status: waiting; source: serial 25 ]%% * %%[ status: initializing; source: serial 25 ]%% * %%[ status: busy; source: serial 25 ]%% * %%[ status: printing; source: serial 25 ]%% * %%[ status: PrinterError: out of paper; source: serial 25 ]%% * %%[ status: PrinterError: no paper tray; source: serial 25 ]%% * * %%[ PrinterError: out of paper; source: serial 25 ]%% * %%[ PrinterError: no paper tray; source: serial 25 ]%% * * %%[ Error: undefined; OffendingCommand: xxx ]%% * %%[ Flushing: rest of job (to end-of-file) will be ignored ]%% * * although the list isn't meant to be complete. * * The following constants are used to classify the recognized printer states. * readline() reads complete lines from ttyi and stores them in array mesg[]. * getstatus() looks for the "%%[ " and " ]%%" delimiters that bracket printer * messages and if found it tries to parse the enclosed message. After the lookup * one of the following numbers is returned as an indication of the existence or * content of the printer message. The return value is used in start(), send(), * and done() to figure out what's happening and what can be done next. * */ #define BUSY 0 /* processing data already sent */ #define WAITING 1 /* printer wants more data */ #define PRINTING 2 /* printing a page */ #define IDLE 3 /* ready to start the next job */ #define ENDOFJOB 4 /* readline() builds this up on EOF */ #define PRINTERERROR 5 /* PrinterError - eg. out of paper */ #define ERROR 6 /* some kind of PostScript error */ #define FLUSHING 7 /* throwing out the rest of the job */ #define INITIALIZING 8 /* printer is booting */ #define DISCONNECT 9 /* from Datakit! */ #define UNKNOWN 10 /* in case we missed anything */ #define NOSTATUS 11 /* no response from the printer */ #define WRITEPROCESS 12 /* dummy states for write process */ #define INTERACTIVE 13 /* and interactive mode */ /* * * An array of type Status is used, in getstatus(), to figure out the printer's * current state. Just helps convert strings representing the current state into * integer codes that other routines use. * */ typedef struct { char *state; /* printer's current status */ int val; /* value returned by getstatus() */ } Status; /* * * STATUS is used to initialize an array of type Status that translates the ASCII * strings returned by the printer into appropriate codes that can be used later * on in the program. getstatus() converts characters to lower case, so if you * add any entries make them lower case and put them in before the UNKNOWN entry. * The lookup terminates when we get a match or when an entry with a NULL state * is found. * */ #define STATUS \ \ { \ "busy", BUSY, \ "waiting", WAITING, \ "printing", PRINTING, \ "idle", IDLE, \ "endofjob", ENDOFJOB, \ "printererror", PRINTERERROR, \ "error", ERROR, \ "flushing", FLUSHING, \ "initializing", INITIALIZING, \ NULL, UNKNOWN \ } /* * * The baud rate can be set on the command line using the -b option. If you omit * it BAUDRATE will be used. * */ #define BAUDRATE B9600 /* * * An array of type Baud is used, in routine getbaud(), to translate ASCII strings * into termio values that represent the requested baud rate. * */ typedef struct { char *rate; /* string identifying the baud rate */ short val; /* and its termio.h value */ } Baud; /* * * BAUDTABLE initializes the array that's used to translate baud rate requests * into termio values. It needs to end with an entry that has NULL assigned to * the rate field. * */ #define BAUDTABLE \ \ { \ "9600", B9600, \ "B9600", B9600, \ "19200", EXTA, \ "19.2", EXTA, \ "B19200", EXTA, \ "EXTA", EXTA, \ "1200", B1200, \ "B1200", B1200, \ "2400", B2400, \ "B2400", B2400, \ "B4800", B4800, \ "4800", B4800, \ "38400", EXTB, \ "38.4", EXTB, \ "B38400", EXTB, \ "EXTB", EXTB, \ NULL, B9600 \ } /* * * A few miscellaneous definitions. BLOCKSIZE is the default size of the buffer * used for reading the input files (changed with the -B option). MESGSIZE is the * size of the character array used to store printer status lines - don't make it * too small! * */ #define BLOCKSIZE 2048 #define MESGSIZE 512 /* * * Some of the non-integer valued functions used in postio.c. * */ char *find(); char *malloc(); char *strtok(); 0707070014231402051006400057030057030000011227430522633076100003200000004703post.src/postio/postio.mk MAKE=/bin/make MAKEFILE=postio.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) DKLIB=-ldk DKHOST=FALSE DKSTREAMS=FALSE # # Need dk.h and libdk.a for Datakit support on System V. We recommend you put # them in standard places. If it's not possible define DKHOSTDIR (below) and # try uncommenting the following lines: # # DKHOSTDIR=/usr # CFLAGS=$(CFLGS) -D$(SYSTEM) -I$(COMMONDIR) -I$(DKHOSTDIR)/include # EXTRA=-Wl,-L$(DKHOSTDIR)/lib # HFILES=postio.h\ ifdef.h\ $(COMMONDIR)/gen.h OFILES=postio.o\ ifdef.o\ slowsend.o all : postio install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi cp postio $(POSTBIN)/postio @chmod 755 $(POSTBIN)/postio @chgrp $(GROUP) $(POSTBIN)/postio @chown $(OWNER) $(POSTBIN)/postio cp postio.1 $(MAN1DIR)/postio.1 @chmod 644 $(MAN1DIR)/postio.1 @chgrp $(GROUP) $(MAN1DIR)/postio.1 @chown $(OWNER) $(MAN1DIR)/postio.1 clean : rm -f *.o clobber : clean rm -f postio postio :: @CFLAGS="$(CFLAGS)"; export CFLAGS; \ DKLIB=" "; export DKLIB; \ if [ "$(SYSTEM)" != V9 ]; \ then \ if [ "$(DKHOST)" = TRUE ]; then \ if [ "$(DKSTREAMS)" != FALSE ]; then \ if [ "$(DKSTREAMS)" = TRUE ]; \ then CFLAGS="$$CFLAGS -DDKSTREAMS=\\\"dknetty\\\""; \ else CFLAGS="$$CFLAGS -DDKSTREAMS=\\\"$(DKSTREAMS)\\\""; \ fi; \ fi; \ CFLAGS="$$CFLAGS -DDKHOST"; export CFLAGS; \ DKLIB=-ldk; export DKLIB; \ SYSTEM=SYSV; export SYSTEM; \ fi; \ else DKLIB=-lipc; export DKLIB; \ fi; \ CFLAGS="$$CFLAGS -D$$SYSTEM"; export CFLAGS; \ $(MAKE) -e -f $@.mk compile compile : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postio $(OFILES) $(EXTRA) $(DKLIB) postio.o : $(HFILES) slowsend.o : postio.h $(COMMONDIR)/gen.h ifdef.o : ifdef.h $(COMMONDIR)/gen.h changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^DKLIB=.*'DKLIB=$(DKLIB)'" \ -e "s'^DKHOST=.*'DKHOST=$(DKHOST)'" \ -e "s'^DKSTREAMS=.*'DKSTREAMS=$(DKSTREAMS)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014231405131006440057030057030000011225400522627503700003300000006206post.src/postio/slowsend.c /* * * Stuff that slows the transmission of jobs to PostScript printers. ONLY use it * if you appear to be having trouble with flow control. The idea is simple - only * send a significant amount of data when we're certain the printer is in the * WAITING state. Depends on receiving status messages and only works when the * program is run as a single process. What's done should stop printer generated * XOFFs - provided our input buffer (ie. blocksize) is sufficiently small. Was * originally included in the postio.tmp directory, but can now be requested with * the -S option. Considered eliminating this code, but some printers still depend * on it. In particular Datakit connections made using Datakit PVCs and DACUs seem * to have the most problems. Much of the new stuff that was added can't work when * you use this code and will be automatically disabled. * */ #include <stdio.h> #include "gen.h" #include "postio.h" extern char *block; extern int blocksize; extern int head; extern int tail; extern char *line; extern char mesg[]; extern int ttyo; /*****************************************************************************/ slowsend(fd_in) int fd_in; /* next input file */ { /* * * A slow version of send() that's very careful about when data is sent to the * printer. Should help prevent overflowing the printer's input buffer, provided * blocksize is sufficiently small (1024 should be safe). It's a totally kludged * up routine that should ONLY be used if you have constant transmission problems. * There's really no way it will be able to drive a printer much faster that about * six pages a minute, even for the simplest jobs. Get it by using the -S option. * */ while ( readblock(fd_in) ) switch ( getstatus(0) ) { case WAITING: writeblock(blocksize); break; case BUSY: case IDLE: case PRINTING: writeblock(30); break; case NOSTATUS: case UNKNOWN: break; case PRINTERERROR: sleep(30); break; case ERROR: fprintf(stderr, "%s", mesg); /* for csw */ error(FATAL, "PostScript Error"); break; case FLUSHING: error(FATAL, "Flushing Job"); break; case DISCONNECT: error(FATAL, "Disconnected - printer may be offline"); break; default: sleep(2); break; } /* End switch */ } /* End of send */ /*****************************************************************************/ static writeblock(num) int num; /* most bytes we'll write */ { int count; /* bytes successfully written */ /* * * Called from send() when it's OK to send the next block to the printer. head * is adjusted after the write, and the number of bytes that were successfully * written is returned to the caller. * */ if ( num > tail - head ) num = tail - head; if ( (count = write(ttyo, &block[head], num)) == -1 ) error(FATAL, "error writing to %s", line); else if ( count == 0 ) error(FATAL, "printer appears to be offline"); head += count; return(count); } /* End of writeblock */ /*****************************************************************************/ 0707070014231405141006440057030057030000011225440522627503700003600000003377post.src/postio/postio.mk.old MAKE=/bin/make MAKEFILE=postio.mk SYSTEM=V9 VERSION=3.3.1 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript COMMONDIR=../common DKLIB=-lipc CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -D$(SYSTEM) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) # # Need dk.h and libdk.a for Datakit support on System V. We recommend you put # them in standard places. If it's not possible define DKHOSTDIR (below) and # try uncommenting the following lines: # # DKHOSTDIR=/usr # CFLAGS=$(CFLGS) -D$(SYSTEM) -I$(COMMONDIR) -I$(DKHOSTDIR)/include # EXTRA=-Wl,-L$(DKHOSTDIR)/lib # HFILES=postio.h\ ifdef.h\ $(COMMONDIR)/gen.h OFILES=postio.o\ ifdef.o\ slowsend.o all : postio install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi cp postio $(POSTBIN)/postio @chmod 755 $(POSTBIN)/postio @chgrp $(GROUP) $(POSTBIN)/postio @chown $(OWNER) $(POSTBIN)/postio cp postio.1 $(MAN1DIR)/postio.1 @chmod 644 $(MAN1DIR)/postio.1 @chgrp $(GROUP) $(MAN1DIR)/postio.1 @chown $(OWNER) $(MAN1DIR)/postio.1 clean : rm -f *.o clobber : clean rm -f postio postio : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postio $(OFILES) $(EXTRA) $(DKLIB) postio.o : $(HFILES) slowsend.o : postio.h $(COMMONDIR)/gen.h ifdef.o : ifdef.h $(COMMONDIR)/gen.h changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^CFLGS=.*'CFLGS=$(CFLGS)'" \ -e "s'^DKLIB=.*'DKLIB=$(DKLIB)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014230006040407550057030057030000020074410522633076300002000000000000post.src/postmd 0707070014230006051006440057030057030000010074420522627503700002700000002320post.src/postmd/README A program that displays a matrix as a gray scale image on PostScript printers. May be useful if you have a large matrix and want a simple way to look for patterns. Expect a 600x600 matrix is an optimistic upper limit on a 300 dpi printers using 5 shades of gray and 8.5x11 inch paper. Matrix elements are a series of floating point numbers arranged in the input file in row major order. By default each matrix is assumed to be square and the number of rows (and columns) is set to the square root of the number of elements in the input file. White space, including newlines, is not used to determine the matrix dimensions. Each matrix element is mapped into an integer in the range 0 to 255 (254 by default) and PostScript's image operator maps that integer into a gray scale appropriate for the printer. The mapping from floating point matrix elements to integers is controlled by an interval list and grayscale map. The default interval list is "-1,0,1" which partitions the real line into 7 regions. The default grayscale map gets darker as the regions move from left to right along the real line. The -i option changes the interval list and the -g option modifies the grayscale mapping. Check the man page for more details. 0707070014230004201006400057030057030000010063100522633076300003100000016617post.src/postmd/postmd.1 .ds dQ /usr/lib/postscript .TH POSTMD 1 "DWB 3.2" .SH NAME .B postmd \- matrix display program for PostScript printers .SH SYNOPSIS \*(mBpostmd\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B postmd reads a series of floating point numbers from .IR files , translates them into a PostScript gray scale image, and writes the results on the standard output. In a typical application the numbers might be the elements of a large matrix, written in row major order, while the printed image could help locate patterns in the matrix. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-b num Pack the bitmap in the output file using .I num byte patterns. A value of 0 turns off all packing of the output file. By default .I num is 6. .TP .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-d dimen Sets the default matrix dimensions for all input .I files to .IR dimen . The .I dimen string can be given as rows or rows\^\(mu\^columns. If columns is omitted it will be set to rows. By default .B postmd assumes each matrix is square and sets the number of rows and columns to the square root of the number of elements in each input file. .TP .OP \-g list .I list is a comma- or space-separated string of integers, each lying between 0 and 255 inclusive, that assigns PostScript gray scales to the regions of the real line selected by the .OP \-i option. 255 corresponds to white and 0 to black. .B postmd assigns a default gray scale that omits white (i.e., 255) and gets darker as the regions move from left to right along the real line. .TP .OP \-i list .I list is a comma- or space-separated string of .I N floating point numbers that partition the real line into .RI 2 N +1 regions. The .I list must be given in increasing numerical order. The partitions are used to map floating point numbers read from the input .I files into gray scale integers that are assigned automatically by .B postmd or arbitrarily selected using the .OP \-g option. The default interval .I list is ``\*(mB\-1,0,1\fP'' which partions the real line into 7 regions. .TP .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which by default is located at the center of each page. The default magnification is 1.0. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP .OP \-w window .I window is a comma- or space-separated list of four positive integers that select the upper left and lower right corners of a submatrix from each of the input .IR files . Row and column indices start at 1 in the upper left corner and the numbers in the input .I files are assumed to be written in row major order. By default the entire matrix is displayed. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed at the center of the page, with positive x to the right and positive y up the page. Positive .I num moves everything right. The default offset is 0 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves everything up the page. The default offset is 0. .TP .OP \-E name Set the character encoding for text fonts to .IR name . Requesting .I name means include file .MI \*(dQ/ name .enc \f1. A nonexistent encoding file is silently ignored. The default selects file .MR \*(dQ/Default.enc . .TP .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/postmd.ps . .PP Three options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include .I string in the output file; .I string must be legitimate PostScript. .TP .OP \-R action Requests special .I action (e.g., .MR manualfeed ) on a per page or global basis. The .I action string can be given as .IR request , .IM request : page\f1\|, or .IM request : page : file\f1\|. If .I page is omitted or given as 0, the request applies to all pages. If .I file is omitted, the request lookup is done in .MR \*(dQ/ps.requests . .PP Only one matrix is displayed on each logical page, and each of the input .I files must contain complete descriptions of exactly one matrix. Matrix elements are floating point numbers arranged in row major order in each input file. White space, including newlines, is not used to determine matrix dimensions. By default .B postmd assumes each matrix is square and sets the number of rows and columns to the square root of the number of elements in the input file. Supplying default dimensions on the command line using the .OP \-d option overrides this default behavior, and in that case the dimensions apply to all input .IR files . .PP An optional header can be supplied with each input file and is used to set the matrix dimensions, the partition of the real line, the gray scale map, and a window into the matrix. The header consists of keyword/value pairs, each on a separate line. It begins on the first line of each input file and ends with the first unrecognized string, which should be the first matrix element. Values set in the header take precedence, but only apply to the current input file. Recognized header keywords are .MR dimension , .MR interval , .MR grayscale , and .MR window . The syntax of the value string that follows each keyword parallels what is accepted by the .OP \-d , .OP \-i , .OP \-g , and .OP \-w options. .SH EXAMPLES For example, suppose .I file initially contains the 1000 numbers in a 20\(mu50 matrix. Then the command line: .EX postmd -d20x50 -i"-100 100" -g0,128,254,128,0 \f2file .EE and prepending the header, .EX dimension 20x50 interval -100.0 .100e+3 grayscale 0 128 254 128 0 .EE to .I file and typing the command line: .EX postmd \f2file .EE produce exactly the same output. The interval list partitions the real line into five regions and the gray scale list maps numbers less than \-100 or greater than 100 into 0 (i.e., black), numbers equal to \-100 or 100 into 128 (i.e., 50 percent black), and numbers between \-100 and 100 into 254 (i.e., almost white). .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .SH WARNINGS The largest matrix that can be adequately displayed is a function of the interval and gray scale lists, the printer resolution, and the paper size. A 600\(mu600 matrix is an optimistic upper bound for a two element interval list (i.e. five regions) using 8.5\(mu11 inch paper on a 300 dpi printer. .PP Using white (i.e., 255) in a gray scale list is not recommended and will not show up in the legend and bar graph that .B postmd displays below each image. .SH FILES .MW \*(dQ/postmd.ps .br .MW \*(dQ/forms.ps .br .MW \*(dQ/ps.requests .SH SEE ALSO .BR dpost (1), .BR postdaisy (1), .BR postdmd (1), .BR postio (1), .BR postprint (1), .BR postreverse (1), .BR posttek (1), .BR psencoding (1) 0707070014230006071006440057030057030000010111200522627503700003100000103300post.src/postmd/postmd.c /* * * postmd - matrix display program for PostScript printers. * * A simple program that can be used to display a matrix as a gray scale image on * a PostScript printer using the image operator. Much of the code was borrowed * from postdmd, the bitmap display program DMD screen dumps. May help if you have * a large matix (of floating point numbers) and want a simple way to look for * patterns. * * Matrix elements are a series of floating point numbers arranged in the input * file in row major order. The actual matrix elements can be preceeded by a simple * header that sets things like the matrix dimensions, interval list, and possibly * a window into the matrix that we'll use for display. The dimension statement is * perhaps the most important. If present it determines the number of rows and * columns in the matrix. For example, either of the following defines a 50x50 * matrix, * * dimension 50 * dimension 50x50 * * If no dimension statement appears in the input file, the matrix is assumed to * be square, and the number of rows (and columns) is set to the square root of * the number of elements in the input file. * * Each matrix element is mapped into an integer in the range 0 to 255 (actually * 254) and PostScript's image operator then maps that number into a gray scale * appropriate for the particular printer. The mapping from the floating point * matrix elements to integers is accomplished using an interval list that can be * set using the -i option. The format of the interval string is, * * num1,num2,num3,...,numn * * where each num is a floating point number. The list must be given in increasing * numerical order. A list of n numbers partitions the real line into 2n+1 regions * given as, * * region1 element < num1 * region2 element = num1 * region3 element < num2 * region4 element = num2 * . * . * . * region2n element = numn * region2n+1 element > numn * * Every number in a region is mapped one integer in the range 0 to 254, and that * number, when displayed on a printer using the image operator, prints as a square * filled with a gray shade that reflects the integer that was chosen. 0 maps to * black and 255 maps to white (which by default will not be used). * * The default gray scale gets darker as the region number increases, but can be * changed by supplying a gray scale list with the -g option or in the optional * matrix header. The color map is again a comman or space separated list that * looks like, * * color1,color2, ... ,color2n+1 * * where color1 applies to region 1 and color2n+1 applies to region2n+1. Each * number in the list should be an integer between 0 and 255. If less than 2n+1 * colors are given default assignments will be used for missing regions. * * The size of the matrix that we can display reasonably well is a function of the * number of elements in the interval list, paper size, and printer resolution. * For example a 300dpi printer using 8.5x11 inch paper gives us an image area of * about 2400x2400 pixels. An interval list of two numbers generates five separate * regions and will therefore need that many different shades of gray. Since we're * not using white we'll need to partion our image area into 4x4 pixel squares, * and that means a 600x600 matrix is about as big as we can go. In practice that's * optimistic, but the argument illustrates some of the limitations. * * A submatrix can be selected to display by windowing into the matrix. The window * list can be given using the -w option or can be set in the optional header that * can preceed each matrix. The list should be a comma or space separated list * that looks like, * * lower-column, lower-row, upper-column, upper-row * * where each element in the list must be a positive integer. Rows and columns in * the input matrix start at 1. The dimension of the displayed window will be from * lower-column to upper-column and from lower-row to upper-row inclusive. * * The encoding produced by the program is essentially identical to what's done * by postdmd. See the comments at the beginning of that program if you need more * details. The prologue also shares much of the same code. * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following PostScript procedures * are defined in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how this program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects * to find the current page number on the stack. * * bitmap * * columns rows bitmap - * * Prints the image that's read as a hex string from standard input. The * image consists of rows lines, each of which includes columns elements. * Eight bits per pixel are used to encode the matrix elements. * * labelmatrix * * matrixname matrixlimits labelmatrix - * * Prints string matrixname just below the lower left corner of the image * and prints string martixlimits near the lower right corner. Outlines * the entire image with a (one pixel wide) box and then draws tick marks * along the top and left sides of the image. One tick mark is printed * for every ten elements. * * legend * * n1 ... nN N c1 m1 ... cM mM total regions legend - * * Prints the legend as a bar graph below the matrix image. n1 ... nN are * strings that represent the interval list. c1 m1 ... cm mM are pairs * that consist of a region's color and the statistics count. Actually * the c's are trivial procedures that just leave a one character string * on the stack when they're executed by image - which is the way the * bar graph is drawn. * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable declarations */ #include "postmd.h" /* special matrix display definitions */ char *optnames = "a:b:c:d:g:i:m:n:o:p:w:x:y:A:C:E:J:L:P:R:DI"; char *prologue = POSTMD; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ char *temp_dir = TEMPDIR; /* temp directory for copying stdin */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ int bytespp = 6; /* bytes per pattern - on output */ int dostats = ON; /* permanent statistics flag */ int nxtstat = ON; /* and the one for the next matrix */ char *interval = DFLTILIST; /* string representations of the interval */ char *colormap = NULL; /* color map */ char *window = NULL; /* and window lists */ char *matrixname = "pipe.end"; /* name for the next plot */ Ilist ilist[128]; /* active interval list and color map */ int next = 0; /* one past the last element in ilist[] */ int regions; /* an index assigned to the last region */ int wlist[4]; /* upper left and lower right corners */ int page = 0; /* last page we worked on */ int printed = 0; /* and the number of pages printed */ int dfltrows = 0; /* default rows */ int dfltcols = 0; /* and columns - changed by -d option */ int rows; /* real number of rows */ int columns; /* and columns in the matrix */ int patcount = 0; /* will be set to columns * rows */ double element; /* next matrix element */ char *raster = NULL; /* next raster line */ char *rptr; /* next free byte in raster */ char *eptr; /* one past the last byte in raster */ FILE *fp_in = stdin; /* read from this file */ FILE *fp_out = stdout; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * Bitmap display program for matrices. Only one matrix is allowed per input file, * and each one will be displayed on a page by itself. Input files consist of an * optional header followed by floating point numbers that represent the matrix * elements - in row major order. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* really just for error messages */ init_signals(); /* sets up interrupt handling */ header(); /* PostScript header comments */ options(); /* handle the command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Make sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); signal(SIGFPE, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ /* * * Reads and processes the command line options. Added the -P option so arbitrary * PostScript code can be passed through. Expect it could be useful for changing * definitions in the prologue for which options have not been defined. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'b': /* bytes per pattern - on output */ bytespp = atoi(optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'd': /* default matrix dimensions */ sscanf(optarg, "%dx%d", &dfltrows, &dfltcols); break; case 'g': /* set the colormap (ie. grayscale) */ colormap = optarg; break; case 'i': /* matrix element interval list */ interval = optarg; break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'w': /* set the window */ window = optarg; break; case 'x': /* shift things horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding */ fontencoding = optarg; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } /* End of setup */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll process stdin. * */ if ( argc < 1 ) matrix(); else { /* at least one argument is left */ while ( argc > 0 ) { matrixname = *argv; if ( strcmp(*argv, "-") == 0 ) { fp_in = stdin; matrixname = "pipe.end"; } else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); matrix(); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with all the input files, so mark the end of the pages, make sure the * last page is printed, and restore the initial environment. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %d\n", PAGES, printed); if ( temp_file != NULL ) unlink(temp_file); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct provided it's not NULL. Accounting * is requested using the -A or -J options. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ matrix() { int count; /* pattern repeats this many times */ long total; /* expect this many patterns */ /* * * Reads a matrix from *fp_in, translates it into a PostScript gray scale image, * and writes the result on stdout. For now only one matrix is allowed per input * file. Matrix elements are floating point numbers arranged in row major order * in the input file. In addition each input file may contain an optional header * that defines special things like the dimension of the matrix, a window into * the matrix that will be displayed, and an interval list. * * If we're reading from stdin we first make a copy in a temporary file so we can * can properly position ourselves after we've looked for the header. Originally * wasn't always making a copy of stdin, but I've added a few things to what's * accepted in the header and this simplifies the job. An alternative would be * to always require a header and mark the end of it by some string. Didn't like * that approach much - may fix things up later. * */ if ( fp_in == stdin ) /* make a copy so we can seek etc. */ copystdin(); rows = dfltrows; /* new dimensions for the next matrix */ columns = dfltcols; buildilist(interval); /* build the default ilist[] */ addcolormap(colormap); /* add the colormap - if not NULL */ setwindow(window); /* and setup the initial matrix window */ nxtstat = dostats; /* want statistics? */ getheader(); /* matrix dimensions at the very least */ dimensions(); /* make sure we have the dimensions etc. */ patcount = 0; total = rows * columns; eptr = rptr + (wlist[2] - wlist[0] + 1); redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%d %d bitmap\n", wlist[2] - wlist[0] + 1, wlist[3] - wlist[1] + 1); while ( patcount != total && fscanf(fp_in, "%f", &element) != EOF ) { if ( inwindow() ) *rptr++ = mapfloat(element); if ( ++patcount % columns == 0 ) if ( inrange() ) putrow(); } /* End while */ if ( total != patcount ) error(FATAL, "matrix format error"); labelmatrix(); if ( fp_out == stdout ) printed++; fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); } /* End of matrix */ /*****************************************************************************/ copystdin() { int fd_out; /* for the temporary file */ int fd_in; /* for stdin */ int buf[512]; /* buffer for reads and writes */ int count; /* number of bytes put in buf */ /* * * If we're reading the matrix from stdin and the matrix dimension isn't set by * a dimension statement at the beginning of the file we'll copy stdin to a * temporary file and reset *fp_in so reads come from the temp file. Simplifies * reading the header (if present), but is expensive. * */ if ( temp_file != NULL ) /* been here already */ unlink(temp_file); if ( (temp_file = tempnam(temp_dir, "post")) == NULL ) error(FATAL, "can't generate temp file name"); if ( (fd_out = creat(temp_file, 0660)) == -1 ) error(FATAL, "can't create %s", temp_file); fd_in = fileno(stdin); while ( (count = read(fd_in, buf, sizeof(buf))) > 0 ) if ( write(fd_out, buf, count) != count ) error(FATAL, "error writing to %s", temp_file); close(fd_out); if ( (fp_in = fopen(temp_file, "r")) == NULL ) error(FATAL, "can't open %s", temp_file); } /* End of copystdin */ /*****************************************************************************/ getheader() { char buf[512]; /* temporary string space */ char *cmap = NULL; /* remember header colormap list */ long pos; /* for seeking back to first element */ /* * * Looks for the optional header information at the beginning of the input file, * reads it if it's there, and sets *fp_in to be just past the header. That should * be the beginning of the matrix element list. The recognized header keywords are * dimension, interval, colormap (or grayscale), window, name, and statistics. All * are optional, but may be useful in a spooling environment when the user doesn't * doesn't actually run the translator. * * The dimension statement specifies the number of rows and columns. For example * either of the following two lines define a 50 by 50 element matrix, * * dimension 50 * dimension 50x50 * * The first integer is the number of rows and the second, if given, is the number * of columns. If columns are missing from the dimension statement we assume the * matrix is square. * * interval can be used to redefine the interval list used for mapping floating * point numbers into integers in the range 0 to 254. The string following the * interval keyword has the same format as the -i option. For example to set the * interval list to -1, 0, and 1 you can add the line, * * interval -1,0,1 * * The numbers are floats given in increasing order, and separated by commas or * blanks. The last interval list in a header takes precedence. * * colormap can be used to redefine the grayscale list. The string following * the colormap keyword has the same format as the -g option. For example * * colormap 0,50,100,150,200,250 * or grayscale 0,50,100,150,200,250 * * The window keyword can be used to select a submatrix. The numbers following * window are the upper left and lower right matix coordinates. May not be * implemented yet but shouldn't be difficult. For example * * window 10 10 40 40 * * selects the submatrix with corners at (10, 10) and (40, 40). The edges of the * window are included in the display. * * The name keyword can be used to define the title of the display. For example, * * name Plot Of Matrix 1 * * prints the string "Plot Of Matrix 1" at the top of the page. Everything up to * the next newline is taken as the name string. * */ pos = ftell(fp_in); while ( fscanf(fp_in, "%s", buf) != EOF ) { if ( strncmp(buf, "dimension", strlen("dimension")) == 0 ) fscanf(fp_in, "%dx%d", &rows, &columns); else if ( strncmp(buf, "window", strlen("window")) == 0 ) { fgets(buf, sizeof(buf), fp_in); setwindow(buf); } else if ( strncmp(buf, "name", strlen("name")) == 0 ) { fgets(buf, sizeof(buf), fp_in); matrixname = savestring(buf); } else if ( strncmp(buf, "colormap", strlen("colormap")) == 0 ) { fgets(buf, sizeof(buf), fp_in); cmap = savestring(buf); } else if ( strncmp(buf, "grayscale", strlen("grayscale")) == 0 ) { fgets(buf, sizeof(buf), fp_in); cmap = savestring(buf); } else if ( strncmp(buf, "interval", strlen("interval")) == 0 ) { fgets(buf, sizeof(buf), fp_in); buildilist(buf); } else if ( strncmp(buf, "statistics", strlen("statistics")) == 0 ) { fscanf(fp_in, "%s", buf); if ( strcmp(buf, "on") == 0 || strcmp(buf, "ON") == 0 ) nxtstat = ON; else nxtstat = OFF; } else break; pos = ftell(fp_in); } /* End while */ addcolormap(cmap); /* must happen last */ fseek(fp_in, pos, 0); /* back to the start of the matrix */ } /* End of getheader */ /*****************************************************************************/ dimensions() { char buf[100]; /* temporary storage for the elements */ long count = 0; /* number of elements in the matrix */ long pos; /* matrix elements start here */ /* * * Need to know the dimensions of the matrix before we can go any farther. If * rows and columns are still 0 we'll read the entire input file, starting from * the current position, count the number of elements, take the square root of it, * and use it as the number of rows and columns. Then we seek back to the start * of the real matrix, make sure columns is set, and allocate enough memory for * storing each raster line. After we're certain we've got the number of rows and * columns we check the window coordinates, and if they're not legitimate they're * reset to cover the entire matrix. * */ if ( rows == 0 ) { pos = ftell(fp_in); while ( fscanf(fp_in, "%s", buf) != EOF ) count++; rows = sqrt((double) count); fseek(fp_in, pos, 0); } /* End if */ if ( columns <= 0 ) columns = rows; if ( raster != NULL ) free(raster); if ( (rptr = raster = malloc(columns)) == NULL ) error(FATAL, "no memory"); eptr = rptr + columns; if ( rows <= 0 || columns <= 0 ) error(FATAL, "bad matrix dimensions"); if ( wlist[0] > wlist[2] || wlist[1] > wlist[3] ) { wlist[0] = wlist[1] = 1; wlist[2] = columns; wlist[3] = rows; } /* End if */ } /* End of dimensions */ /*****************************************************************************/ buildilist(list) char *list; /* use this as the interval list */ { static char *templist = NULL; /* a working copy of the list */ char *ptr; /* next number in *templist */ int i; /* loop index - for checking the list */ /* * * Reads string *list and builds up the ilist[] that will be used in the next * matrix. Since strtok() modifies the string it's parsing we make a copy first. * The format of the interval list is described in detail in the comments at the * beginning of this program. Basically consists of a comma or space separated * list of floating point numbers that must be given in increasing numerical order. * The list determines how floating point numbers are mapped into integers in the * range 0 to 254. * */ if ( templist != NULL ) /* free the space used by the last list */ free(templist); while ( isascii(*list) && isspace(*list) ) list++; for ( ptr = list, regions = 3; *ptr != '\0'; ptr++ ) { if ( *ptr == ',' || *ptr == '/' || isspace(*ptr) ) regions += 2; while ( isascii(*ptr) && isspace(*ptr) ) ptr++; } /* End for */ next = 0; templist = savestring(list); ptr = strtok(templist, ",/ \t\n"); while ( ptr != NULL ) { ilist[next].count = 0; ilist[next++].color = 254 * (regions - 1 - next) / (regions - 1); ilist[next].val = atof(ptr); ilist[next].count = 0; ilist[next++].color = 254 * (regions - 1 - next) / (regions - 1); ptr = strtok(NULL, ",/ \t\n"); } /* End while */ ilist[next].count = 0; ilist[next].color = 254 * (regions - 1 - next) / (regions - 1); if ( next == 0 ) /* make sure we have a list */ error(FATAL, "missing interval list"); for ( i = 3; i < next; i += 2 ) /* that's in increasing numerical order */ if ( ilist[i].val <= ilist[i-2].val ) error(FATAL, "bad interval list"); } /* End of buildilist */ /*****************************************************************************/ addcolormap(list) char *list; /* use this color map */ { static char *templist = NULL; /* a working copy of the color list */ char *ptr; /* next color in *templist */ int i = 0; /* assigned to this region in ilist[] */ /* * * Assigns the integers in *list to the color field for the regions defined in * ilist[]. Assumes ilist[] has already been setup. * */ if ( list != NULL ) { if ( templist != NULL ) free(templist); templist = savestring(list); ptr = strtok(templist, ",/ \t\n"); while ( ptr != NULL ) { ilist[i++].color = atoi(ptr) % 256; ptr = strtok(NULL, ",/ \t\n"); } /* End while */ } /* End if */ } /* End of addcolormap */ /*****************************************************************************/ setwindow(list) char *list; /* corners of window into the matrix */ { static char *templist = NULL; /* a working copy of the window list */ char *ptr; /* next window coordinate in *templist */ int i = 0; /* assigned to this region in wlist[] */ /* * * Sets up an optional window into the matrix. * */ wlist[0] = wlist[1] = 1; wlist[2] = wlist[3] = 0; if ( list != NULL ) { if ( templist != NULL ) free(templist); templist = savestring(list); ptr = strtok(templist, ",/ \t\n"); while ( ptr != NULL ) { wlist[i++] = atoi(ptr); ptr = strtok(NULL, ",/ \t\n"); } /* End while */ } /* End if */ } /* End of setwindow */ /*****************************************************************************/ inwindow() { int r; /* row of the patcount element */ int c; /* column of the patcount element */ /* * * Checks if the patcount element of the matrix is in the window. * */ r = (patcount/columns) + 1; c = (patcount%columns) + 1; return((c >= wlist[0]) && (r >= wlist[1]) && (c <= wlist[2]) && (r <= wlist[3])); } /* End of inwindow */ /*****************************************************************************/ inrange() { /* * * Checks if the current row lies in the window. Used right before we output the * raster lines. * */ return(((patcount/columns) >= wlist[1]) && ((patcount/columns) <= wlist[3])); } /* End of inrange */ /*****************************************************************************/ mapfloat(element) double element; /* floating point matrix element */ { int i; /* loop index */ /* * * Maps element into an integer in the range 0 to 255, and returns the result to * the caller. Mapping is done using the color map that was saved in ilist[]. Also * updates the count field for the region that contains element - not good! * */ for ( i = 1; i < next && ilist[i].val < element; i += 2 ) ; if ( i > next || element < ilist[i].val ) i--; ilist[i].count++; return(ilist[i].color); } /* End of mapfloat */ /*****************************************************************************/ putrow() { char *p1, *p2; /* starting and ending columns */ int n; /* set to bytes per pattern */ int i; /* loop index */ /* * * Takes the scanline that's been saved in *raster, encodes it according to the * value that's been assigned to bytespp, and writes the result to *fp_out. Each * line in the output bitmap is terminated by a 0 on a line by itself. * */ n = (bytespp <= 0) ? columns : bytespp; for ( p1 = raster, p2 = raster + n; p1 < eptr; p1 = p2 ) if ( patncmp(p1, n) == TRUE ) { while ( patncmp(p2, n) == TRUE ) p2 += n; p2 += n; fprintf(fp_out, "%d ", n); for ( i = 0; i < n; i++, p1++ ) fprintf(fp_out, "%.2X", ((int) *p1) & 0377); fprintf(fp_out, " %d\n", (p2 - p1) / n); } else { while ( p2 < eptr && patncmp(p2, n) == FALSE ) p2 += n; if ( p2 > eptr ) p2 = eptr; fprintf(fp_out, "%d ", p2 - p1); while ( p1 < p2 ) fprintf(fp_out, "%.2X", ((int) *p1++) & 0377); fprintf(fp_out, " 0\n"); } /* End else */ fprintf(fp_out, "0\n"); rptr = raster; } /* End of putrow */ /*****************************************************************************/ labelmatrix() { int total; /* number of elements in the window */ int i; /* loop index */ /* * * Responsible for generating the PostScript calls that label the matrix, generate * the legend, and print the matrix name. * */ fprintf(fp_out, "(%s) ((%d, %d) to (%d, %d)) labelmatrix\n", matrixname, wlist[0], wlist[1], wlist[2], wlist[3]); total = (wlist[2] - wlist[0] + 1) * (wlist[3] - wlist[1] + 1); if ( nxtstat == OFF ) for ( i = 0; i < regions; i++ ) ilist[i].count = 0; for ( i = 1; i < next; i += 2 ) fprintf(fp_out, "(%g) ", ilist[i].val); fprintf(fp_out, "%d ", (regions - 1) / 2); for ( i = regions - 1; i >= 0; i-- ) fprintf(fp_out, "{(\\%.3o)} %d ", ilist[i].color, ilist[i].count); fprintf(fp_out, "%d %d legend\n", total, regions); } /* End of labelmatrix */ /*****************************************************************************/ patncmp(p1, n) char *p1; /* first patterns starts here */ int n; /* and extends this many bytes */ { char *p2; /* address of the second pattern */ /* * * Compares the two n byte patterns *p1 and *(p1+n). FALSE if returned is they're * different or extend past the end of the current raster line. * */ p2 = p1 + n; for ( ; n > 0; n--, p1++, p2++ ) if ( p2 >= eptr || *p1 != *p2 ) return(FALSE); return(TRUE); } /* End of patncmp */ /*****************************************************************************/ char *savestring(str) char *str; /* save this string */ { char *ptr = NULL; /* at this address */ /* * * Copies string *str to a permanent place and returns the address to the caller. * */ if ( str != NULL && *str != '\0' ) { if ( (ptr = malloc(strlen(str) + 1)) == NULL ) error(FATAL, "no memory available for string %s", str); strcpy(ptr, str); } /* End if */ return(ptr); } /* End of savestring */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014230006101006440057030057030000010112200522627503700003100000004462post.src/postmd/postmd.h /* * * An interval list used to map matrix elements into integers in the range 0 to * 254 representing shades of gray on a PostScript printer. The list can be given * using the -i option or can be set in the optional header that can preceed each * matrix. The list should be a comma or space separated list that looks like, * * num1,num2, ... ,numn * * where each num is a floating point number. The list must be given in increasing * numerical order. The n numbers in the list partion the real line into 2n+1 * regions given by, * * region1 element < num1 * region2 element = num1 * region3 element < num2 * region4 element = num3 * . . * . . * . . * region2n element = numn * region2n+1 element > numn * * Every number in a given region is mapped into an integer in the range 0 to 254 * and that number, when displayed on a PostScript printer using the image operator, * prints as a square filled with a gray scale that reflects the integer that was * chosen. 0 maps to black and 255 white (that's why 255 is normally omitted). * * The shades of gray chosen by the program are normally generated automatically, * but can be reassigned using the -g option or by including a grayscale line in * the optional header. The grayscale list is comma or space separated list of * integers between 0 and 255 that's used to map individual regions into arbitray * shade of gray, thus overriding the default choice made in the program. The list * should look like, * * color1,color2, ... ,color2n+1 * * where color1 applies to region1 and color2n+1 applies to region2n+1. If less * than 2n+1 numbers are given the default assignments will be used for the missing * regions. Each color must be an integer in the range 0 to 255. * * The default interval list is given below. The default grayscale maps 254 (almost * white) into the first region and 0 (black) into the last. * */ #define DFLTILIST "-1,0,1" /* * * The active interval list is built from an interval string and stored in an array * whose elements are of type Ilist. * */ typedef struct { double val; /* only valid in kind is ENDPOINT */ int color; /* gray scale color */ long count; /* statistics for each region */ } Ilist; /* * * Non-integer function declarations. * */ char *savestring(); 0707070014230004311006400057030057030000010063340522633076300003200000004021post.src/postmd/postmd.mk MAKE=/bin/make MAKEFILE=postmd.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=postmd.h\ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=postmd.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o\ $(COMMONDIR)/tempnam.o all : postmd install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp postmd $(POSTBIN)/postmd @chmod 755 $(POSTBIN)/postmd @chgrp $(GROUP) $(POSTBIN)/postmd @chown $(OWNER) $(POSTBIN)/postmd cp postmd.ps $(POSTLIB)/postmd.ps @chmod 644 $(POSTLIB)/postmd.ps @chgrp $(GROUP) $(POSTLIB)/postmd.ps @chown $(OWNER) $(POSTLIB)/postmd.ps cp postmd.1 $(MAN1DIR)/postmd.1 @chmod 644 $(MAN1DIR)/postmd.1 @chgrp $(GROUP) $(MAN1DIR)/postmd.1 @chown $(OWNER) $(MAN1DIR)/postmd.1 clean : rm -f *.o clobber : clean rm -f postmd postmd : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postmd $(OFILES) -lm postmd.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o\ $(COMMONDIR)/tempnam.o : @cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ postmd.1 >XXX.1; \ mv XXX.1 postmd.1 0707070014230006121006440057030057030000010112400522627503700003200000007404post.src/postmd/postmd.ps % % Version 3.3.2 prologue for matrix display files. % /#copies 1 store /aspectratio 1 def /font /Helvetica def /formsperpage 1 def /landscape false def /magnification 1 def /margin 10 def /orientation 0 def /rotation 1 def /size 9 def /statspace 1.6 def /ticklength .06 def /tickspacing 10 def /xoffset 0 def /yoffset 0 def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /show {show} bind def % so later references don't bind /stringwidth {stringwidth} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if pagedimensions height width lt { /statspace statspace height width div mul def /size size height width div mul def /ticklength ticklength height width div mul def } if /height height margin sub statspace inch sub ticklength inch sub size 6 mul sub def /width width margin sub ticklength inch sub def xcenter ycenter translate orientation rotation mul rotate xoffset inch yoffset inch translate 0 height 2 div height width min 2 div sub translate 0 statspace inch 2 div translate magnification dup aspectratio mul scale 0 setlinewidth } def /pagedimensions { useclippath { /pagebbox [clippath pathbbox newpath] def } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /pagesetup {/page exch def} bind def /bitmap { /scanlines exch def /scanlength exch def /picstr scanlength string def gsave height scanlines div width scanlength div min /scaling exch def scaling scaling scale scanlength neg 2 div scanlines neg 2 div translate scanlength scanlines scale getbitmap grestore } bind def /getbitmap { scanlength scanlines 8 [scanlength 0 0 scanlines neg 0 scanlines] { 0 { currentfile token pop dup 0 eq {pop pop exit} if /charcount exch def picstr 1 index charcount getinterval /repl exch def currentfile repl readhexstring pop pop charcount add currentfile token pop { picstr 1 index repl putinterval charcount add } repeat } loop picstr } image } bind def /labelmatrix { /matrixlimits exch def /matrixname exch def gsave scaling scaling scale font findfont size scaling div scalefont setfont scanlength neg 2 div scanlines 2 div translate 0 scanlines size 1.5 mul scaling div add neg moveto matrixname show scanlength scanlines size 1.5 mul scaling div add neg moveto matrixlimits stringwidth pop neg 0 rmoveto matrixlimits show newpath 0 0 moveto scanlength 0 rlineto 0 scanlines neg rlineto scanlength neg 0 rlineto closepath stroke scanlength tickspacing idiv 1 add tickspacing 0 ticks scanlines tickspacing idiv 1 add 0 tickspacing neg ticks grestore } bind def /ticks { /dy exch def /dx exch def /tl ticklength inch scaling div def newpath 0 0 moveto { gsave dx 0 eq {tl neg 0} {0 tl} ifelse rlineto stroke grestore dx dy rmoveto } repeat } bind def /legend { /regions exch def /total exch def gsave width height min 2 div neg dup size 2 mul sub translate 0 statspace inch neg translate gsave regions { gsave total div statspace inch size 2 mul sub mul size 2 mul add width height min regions div exch scale 1 1 8 [1 0 0 1 0 0] 5 -1 roll image grestore width height min regions div 0 translate } repeat grestore width height min size 1.5 mul neg translate font findfont size scalefont setfont dup dup add 1 add width height min exch div /interval exch def { interval neg 0 translate interval 2 div neg 0 translate dup stringwidth pop 2 div neg 0 moveto show interval 2 div neg 0 translate } repeat grestore } bind def /done {/lastpage where {pop lastpage} if} def 0707070014231310730407550057030057030000021027660522633077100002500000000000post.src/postreverse 0707070014231307551006400057030057030000011031220522633077000004400000003131post.src/postreverse/postreverse.mk MAKE=/bin/make MAKEFILE=postreverse.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=postreverse.h\ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=postreverse.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/tempnam.o all : postreverse install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi cp postreverse $(POSTBIN)/postreverse @chmod 755 $(POSTBIN)/postreverse @chgrp $(GROUP) $(POSTBIN)/postreverse @chown $(OWNER) $(POSTBIN)/postreverse cp postreverse.1 $(MAN1DIR)/postreverse.1 @chmod 644 $(MAN1DIR)/postreverse.1 @chgrp $(GROUP) $(MAN1DIR)/postreverse.1 @chown $(OWNER) $(MAN1DIR)/postreverse.1 clean : rm -f *.o clobber : clean rm -f postreverse postreverse : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o postreverse $(OFILES) postreverse.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/tempnam.o : @cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE) 0707070014231310751006440057030057030000011027670522627503700003400000000555post.src/postreverse/README A simple program that reverses the pages in PostScript files that conform to Adobe's Version 1.0 or Version 2.0 file structuring conventions. postrevese also handles a small class of files that violate page independence (eg. output from dpost) and can be used with all the translators in this package. The output can be conforming even if the input file wasn't. 0707070014231310761006440057030057030000011030420522627503700004300000000604post.src/postreverse/postreverse.h /* * * An array of type Pages is used to keep track of the starting and ending byte * offsets for the pages we've been asked to print. * */ typedef struct { long start; /* page starts at this byte offset */ long stop; /* and ends here */ int empty; /* dummy page if TRUE */ } Pages; /* * * Some of the non-integer functions in postreverse.c. * */ char *copystdin(); 0707070014231310771006440057030057030000011030600522627504000004300000040407post.src/postreverse/postreverse.c /* * * postreverse - reverse the page order in certain PostScript files. * * Page reversal relies on being able to locate sections of a document using file * structuring comments defined by Adobe (ie. the 1.0 and now 2.0 conventions) and * a few I've added. Among other things a minimally conforming document, according * to the 1.0 conventions, * * 1) Marks the end of the prologue with an %%EndProlog comment. * * 2) Starts each page with a %%Page: comment. * * 3) Marks the end of all the pages %%Trailer comment. * * 4) Obeys page independence (ie. pages can be arbitrarily rearranged). * * The most important change (at least for this program) that Adobe made in going * from the 1.0 to the 2.0 structuring conventions was in the prologue. They now * say the prologue should only define things, and the global initialization that * was in the prologue (1.0 conventions) should now come after the %%EndProlog * comment but before the first %%Page: comment and be bracketed by %%BeginSetup * and %%EndSetup comments. So a document that conforms to Adobe's 2.0 conventions, * * 1) Marks the end of the prologue (only definitions) with %%EndProlog. * * 2) Brackets global initialization with %%BeginSetup and %%EndSetup comments * which come after the prologue but before the first %Page: comment. * * 3) Starts each page with a %%Page: comment. * * 4) Marks the end of all the pages with a %%Trailer comment. * * 5) Obeys page independence. * * postreverse can handle documents that follow the 1.0 or 2.0 conventions, but has * also been extended slightly so it works properly with the translators (primarily * dpost) supplied with this package. The page independence requirement has been * relaxed some. In particular definitions exported to the global environment from * within a page should be bracketed by %%BeginGlobal and %%EndGlobal comments. * postreverse pulls them out of each page and inserts them in the setup section * of the document, immediately before it writes the %%EndProlog (for version 1.0) * or %%EndSetup (for version 2.0) comments. * * In addition postreverse accepts documents that choose to mark the end of each * page with a %%EndPage: comment, which from a translator's point of view is often * a more natural approach. Both page boundary comments (ie. Page: and %%EndPage:) * are also accepted, but be warned that everything between consecutive %%EndPage: * and %%Page: comments will be ignored. * * So a document that will reverse properly with postreverse, * * 1) Marks the end of the prologue with %%EndProlog. * * 2) May have a %%BeginSetup/%%EndSetup comment pair before the first %%Page: * comment that brackets any global initialization. * * 3) Marks the start of each page with a %%Page: comment, or the end of each * page with a %%EndPage: comment. Both page boundary comments are allowed. * * 4) Marks the end of all the pages with a %%Trailer comment. * * 5) Obeys page independence or violates it to a rather limited extent and * marks the violations with %%BeginGlobal and %%EndGlobal comments. * * If no file arguments are given postreverse copies stdin to a temporary file and * then processes that file. That means the input is read three times (rather than * two) whenever we handle stdin. That's expensive, and shouldn't be too difficult * to fix, but I haven't gotten around to it yet. * */ #include <stdio.h> #include <signal.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for temporary directory */ #include "ext.h" /* external variable declarations */ #include "postreverse.h" /* a few special definitions */ int page = 1; /* current page number */ int forms = 1; /* forms per page in the input file */ char *temp_dir = TEMPDIR; /* temp directory for copying stdin */ Pages pages[1000]; /* byte offsets for all pages */ int next_page = 0; /* next page goes here */ long start; /* starting offset for next page */ long endoff = -1; /* offset where TRAILER was found */ int noreverse = FALSE; /* don't reverse pages if TRUE */ char *endprolog = ENDPROLOG; /* occasionally changed to ENDSETUP */ double version = 3.3; /* of the input file */ int ignoreversion = FALSE; /* ignore possible forms.ps problems */ char buf[2048]; /* line buffer for input file */ FILE *fp_in; /* stuff is read from this file */ FILE *fp_out = stdout; /* and written here */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that reverses the pages in specially formatted PostScript * files. Will work with all the translators in this package, and should handle * any document that conforms to Adobe's version 1.0 or 2.0 file structuring * conventions. Only one input file is allowed, and it can either be a named (on * the command line) file or stdin. * */ argc = agc; /* other routines may want them */ argv = agv; prog_name = argv[0]; /* just for error messages */ init_signals(); /* sets up interrupt handling */ options(); /* first get command line options */ arguments(); /* then process non-option arguments */ done(); /* and clean things up */ exit(x_stat); /* not much could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Makes sure we handle interrupts properly. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ options() { int ch; /* return value from getopt() */ char *optnames = "n:o:rvT:DI"; extern char *optarg; /* used by getopt() */ extern int optind; /* * * Reads and processes the command line options. The -r option (ie. the one that * turns page reversal off) is really only useful if you want to take dpost output * and produce a page independent output file. In that case global definitions * made within pages and bracketed by %%BeginGlobal/%%EndGlobal comments will be * moved into the prologue or setup section of the document. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'n': /* forms per page */ if ( (forms = atoi(optarg)) <= 0 ) error(FATAL, "illegal forms request %s", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'r': /* don't reverse the pages */ noreverse = TRUE; break; case 'v': /* ignore possible forms.ps problems */ ignoreversion = TRUE; break; case 'T': /* temporary file directory */ temp_dir = optarg; break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't understand the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c\n", ch); break; } /* End switch */ } /* End while */ argc -= optind; /* get ready for non-option args */ argv += optind; } /* End of options */ /*****************************************************************************/ arguments() { char *name; /* name of the input file */ /* * * postreverse only handles one input file at a time, so if there's more than one * argument left when we get here we'll quit. If none remain we copy stdin to a * temporary file and process that file. * */ if ( argc > 1 ) /* can't handle more than one file */ error(FATAL, "too many arguments"); if ( argc == 0 ) /* copy stdin to a temporary file */ name = copystdin(); else name = *argv; if ( (fp_in = fopen(name, "r")) == NULL ) error(FATAL, "can't open %s", name); reverse(); } /* End of arguments */ /*****************************************************************************/ done() { /* * * Cleans things up after we've finished reversing the pages in the input file. * All that's really left to do is remove the temp file, provided we used one. * */ if ( temp_file != NULL ) unlink(temp_file); } /* End of done */ /*****************************************************************************/ char *copystdin() { int fd_out; /* for the temporary file */ int fd_in; /* for stdin */ int count; /* number of bytes put in buf[] */ /* * * Copies stdin to a temporary file and returns the pathname of that file to the * caller. It's an expensive way of doing things, because it means we end up * reading the input file three times - rather than just twice. Could probably be * fixed by creating the temporary file on the fly as we read the file the first * time. * */ if ( (temp_file = tempnam(temp_dir, "post")) == NULL ) error(FATAL, "can't generate temp file name"); if ( (fd_out = creat(temp_file, 0660)) == -1 ) error(FATAL, "can't open %s", temp_file); fd_in = fileno(stdin); while ( (count = read(fd_in, buf, sizeof(buf))) > 0 ) if ( write(fd_out, buf, count) != count ) error(FATAL, "error writing to %s", temp_file); close(fd_out); return(temp_file); } /* End of copystdin */ /*****************************************************************************/ reverse() { /* * * Begins by looking for the ENDPROLOG comment in the input file. Everything up to * that comment is copied to the output file. If the comment isn't found the entire * input file is copied and moreprolog() returns FALSE. Otherwise readpages() reads * the rest of the input file and remembers (in pages[]) where each page starts and * ends. In addition everything bracketed by %%BeginGlobal and %%EndGlobal comments * is immediately added to the new prologue (or setup section) and ends up being * removed from the individual pages. When readpages() finds the TRAILER comment * or gets to the end of the input file we go back to the pages[] array and use * the saved offsets to write the pages out in reverse order. Finally everything * from the TRAILER comment to the end of the input file is copied to the output * file. * */ if ( moreprolog(ENDPROLOG) == TRUE ) { readpages(); writepages(); trailer(); } /* End if */ } /* End of reverse */ /*****************************************************************************/ moreprolog(str) char *str; /* copy everything up to this string */ { int len; /* length of FORMSPERPAGE string */ int vlen; /* length of VERSION string */ /* * * Looks for string *str at the start of a line and copies everything up to that * string to the output file. If *str isn't found the entire input file will end * up being copied to the output file and FALSE will be returned to the caller. * The first call (made from reverse()) looks for ENDPROLOG. Any other call comes * from readpages() and will be looking for the ENDSETUP comment. * */ len = strlen(FORMSPERPAGE); vlen = strlen(VERSION); while ( fgets(buf, sizeof(buf), fp_in) != NULL ) { if ( strcmp(buf, str) == 0 ) return(TRUE); else if ( strncmp(buf, FORMSPERPAGE, len) == 0 ) forms = atoi(&buf[len+1]); else if ( strncmp(buf, VERSION, vlen) == 0 ) version = atof(&buf[vlen+1]); fprintf(fp_out, "%s", buf); } /* End while */ return(FALSE); } /* End of moreprolog */ /*****************************************************************************/ readpages() { int endpagelen; /* length of ENDPAGE */ int pagelen; /* and PAGE strings */ int sawendpage = TRUE; /* ENDPAGE equivalent marked last page */ int gotpage = FALSE; /* TRUE disables BEGINSETUP stuff */ /* * * Records starting and ending positions of the requested pages (usually all of * them), puts global definitions in the prologue, and remembers where the TRAILER * was found. * * Page boundaries are marked by the strings PAGE, ENDPAGE, or perhaps both. * Application programs will normally find one or the other more convenient, so * in most cases only one kind of page delimiter will be found in a particular * document. * */ pages[0].start = ftell(fp_in); /* first page starts after ENDPROLOG */ endprolog = ENDPROLOG; endpagelen = strlen(ENDPAGE); pagelen = strlen(PAGE); while ( fgets(buf, sizeof(buf), fp_in) != NULL ) if ( buf[0] != '%' ) continue; else if ( strncmp(buf, ENDPAGE, endpagelen) == 0 ) { if ( in_olist(page++) == ON ) { pages[next_page].empty = FALSE; pages[next_page++].stop = ftell(fp_in); } /* End if */ pages[next_page].start = ftell(fp_in); sawendpage = TRUE; gotpage = TRUE; } else if ( strncmp(buf, PAGE, pagelen) == 0 ) { if ( sawendpage == FALSE && in_olist(page++) == ON ) { pages[next_page].empty = FALSE; pages[next_page++].stop = ftell(fp_in) - strlen(buf); } /* End if */ pages[next_page].start = ftell(fp_in) - strlen(buf); sawendpage = FALSE; gotpage = TRUE; } else if ( gotpage == FALSE && strcmp(buf, BEGINSETUP) == 0 ) { fprintf(fp_out, "%s", endprolog); fprintf(fp_out, "%s", BEGINSETUP); moreprolog(ENDSETUP); endprolog = ENDSETUP; } else if ( strcmp(buf, BEGINGLOBAL) == 0 ) { moreprolog(ENDGLOBAL); } else if ( strcmp(buf, TRAILER) == 0 ) { if ( sawendpage == FALSE ) pages[next_page++].stop = ftell(fp_in) - strlen(buf); endoff = ftell(fp_in); break; } /* End if */ } /* End of readpages */ /*****************************************************************************/ writepages() { int i, j, k; /* loop indices */ /* * * Goes through the pages[] array, usually from the bottom up, and writes out all * the pages. Documents that print more than one form per page cause things to get * a little more complicated. Each physical page has to have its subpages printed * in the correct order, and we have to build a few dummy subpages for the last * (and now first) sheet of paper, otherwise things will only occasionally work. * */ fprintf(fp_out, "%s", endprolog); if ( noreverse == FALSE ) /* fill out the first page */ for ( i = (forms - next_page % forms) % forms; i > 0; i--, next_page++ ) pages[next_page].empty = TRUE; else forms = next_page; /* turns reversal off in next loop */ for ( i = next_page - forms; i >= 0; i -= forms ) for ( j = i, k = 0; k < forms; j++, k++ ) if ( pages[j].empty == TRUE ) { if ( ignoreversion == TRUE || version > 3.1 ) { fprintf(fp_out, "%s 0 0\n", PAGE); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s 0 0\n", ENDPAGE); } else { fprintf(fp_out, "%s 0 0\n", PAGE); fprintf(fp_out, "save showpage restore\n"); fprintf(fp_out, "%s 0 0\n", ENDPAGE); } /* End else */ } else copypage(pages[j].start, pages[j].stop); } /* End of writepages */ /*****************************************************************************/ copypage(start, stop) long start; /* starting from this offset */ long stop; /* and ending here */ { /* * * Copies the page beginning at offset start and ending at stop to the output * file. Global definitions are skipped since they've already been added to the * prologue. * */ fseek(fp_in, start, 0); while ( ftell(fp_in) < stop && fgets(buf, sizeof(buf), fp_in) != NULL ) if ( buf[0] == '%' && strcmp(buf, BEGINGLOBAL) == 0 ) while ( fgets(buf, sizeof(buf), fp_in) != NULL && strcmp(buf, ENDGLOBAL) != 0 ) ; else fprintf(fp_out, "%s", buf); } /* End of copypage */ /*****************************************************************************/ trailer() { /* * * Makes sure everything from the TRAILER string to EOF is copied to the output * file. * */ if ( endoff > 0 ) { fprintf(fp_out, "%s", TRAILER); fseek(fp_in, endoff, 0); while ( fgets(buf, sizeof(buf), fp_in) != NULL ) fprintf(fp_out, "%s", buf); } /* End if */ } /* End of trailer */ /*****************************************************************************/ 0707070014231311001006440057030057030000011030440522627504000004300000004523post.src/postreverse/postreverse.1 .TH POSTREVERSE 1 .SH NAME .B postreverse \- reverse the page order in a PostScript file .SH SYNOPSIS \*(mBpostreverse\f1 .OP "" options [] .OP "" file [] .SH DESCRIPTION .B postreverse reverses the page order in files that conform to Adobe's Version 1.0 or Version 2.0 PostScript file structuring conventions, and writes the results on the standard output. Only one input .I file is allowed and if no .I file is specified, the standard input is read. The following .I options are understood: .TP 0.75i .OP \-o list Select pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-r Do not reverse the pages in .IR file . .TP .OP \-T dir Use .I dir as the temporary file directory when reading from the standard input. By default .I dir is set to .MR /tmp . .PP .B postreverse can handle a limited class of files that violate page independence, provided all global definitions are bracketed by .MW %%BeginGlobal and .MW %%EndGlobal comments. In addition, files that mark the end of each page with .MW "%%EndPage:\ label\ ordinal" comments will also reverse properly, provided the prologue and trailer sections can be located. If .B postreverse fails to find an .MW %%EndProlog or .MW %%EndSetup comment the entire .I file is copied, unmodified, to the standard output. .PP Since global definitions are pulled out of individual pages and put in the prologue, the output file can be minimally conforming, even if the input .I file was not. .SH EXAMPLES Select pages 1 to 100 from .I file and reverse the pages: .EX postreverse -o1-100 \f2file .EE Print four logical pages on each physical page and reverse all the pages: .EX postprint -n4 \f2file\fP | postreverse .EE Produce a minimally conforming file from output generated by dpost without reversing the pages: .EX dpost \f2file\fP | postreverse -r .EE .SH DIAGNOSTICS A 0 exit status is returned if .I file was successfully processed. .SH BUGS No attempt has been made to deal with redefinitions of global variables or procedures. If standard input is used, the input .I file will be read three times before being reversed. .SH SEE ALSO .BR dpost (1), .BR postdaisy(1), .BR postdmd(1), .BR postio(1), .BR postmd(1), .BR postprint(1), .BR posttek(1), .BR psencoding (1) 0707070014230550050407550057030057030000021527470522633077300002100000000000post.src/posttek 0707070014230547611006400057030057030000011527400522633077200003400000003736post.src/posttek/posttek.mk MAKE=/bin/make MAKEFILE=posttek.mk SYSTEM=V9 VERSION=3.3.2 GROUP=bin OWNER=bin MAN1DIR=/tmp POSTBIN=/usr/bin/postscript POSTLIB=/usr/lib/postscript COMMONDIR=../common CFLGS=-O LDFLGS=-s CFLAGS=$(CFLGS) -I$(COMMONDIR) LDFLAGS=$(LDFLGS) HFILES=posttek.h\ $(COMMONDIR)/comments.h\ $(COMMONDIR)/ext.h\ $(COMMONDIR)/gen.h\ $(COMMONDIR)/path.h OFILES=posttek.o\ $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o all : posttek install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp posttek $(POSTBIN)/posttek @chmod 755 $(POSTBIN)/posttek @chgrp $(GROUP) $(POSTBIN)/posttek @chown $(OWNER) $(POSTBIN)/posttek cp posttek.ps $(POSTLIB)/posttek.ps @chmod 644 $(POSTLIB)/posttek.ps @chgrp $(GROUP) $(POSTLIB)/posttek.ps @chown $(OWNER) $(POSTLIB)/posttek.ps cp posttek.1 $(MAN1DIR)/posttek.1 @chmod 644 $(MAN1DIR)/posttek.1 @chgrp $(GROUP) $(MAN1DIR)/posttek.1 @chown $(OWNER) $(MAN1DIR)/posttek.1 clean : rm -f *.o clobber : clean rm -f posttek posttek : $(OFILES) $(CC) $(CFLAGS) $(LDFLAGS) -o posttek $(OFILES) posttek.o : $(HFILES) $(COMMONDIR)/glob.o\ $(COMMONDIR)/misc.o\ $(COMMONDIR)/request.o : @cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@` changes : @trap "" 1 2 3 15; \ sed \ -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \ -e "s'^VERSION=.*'VERSION=$(VERSION)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ posttek.1 >XXX.1; \ mv XXX.1 posttek.1 0707070014230550071006440057030057030000011527770522627504000003000000000153post.src/posttek/README Tektronix 4014 to PostScript translator. Much of the code was borrowed from the 5620 Tektronix emulator. 0707070014230550101006440057030057030000011527620522627504000003300000007416post.src/posttek/posttek.h /* * * Tektronix 4014 control codes. * */ #define NUL '\000' #define SOH '\001' #define STX '\002' #define ETX '\003' #define EOT '\004' #define ENQ '\005' #define ACK '\006' #define BEL '\007' #define BS '\010' #define HT '\011' #define NL '\012' #define VT '\013' #define FF '\014' #define CR '\015' #define SO '\016' #define SI '\017' #define DLE '\020' #define DC1 '\021' #define DC2 '\022' #define DC3 '\023' #define DC4 '\024' #define NAK '\025' #define SYN '\026' #define ETB '\027' #define CAN '\030' #define EM '\031' #define SUB '\032' #define ESC '\033' #define FS '\034' #define GS '\035' #define RS '\036' #define US '\037' #define DEL '\177' /* * * A few definitions used to classify the different tektronix states. OUTMODED * is returned by control() and esc(), and typically means the state has changed. * */ #define OUTMODED -1 #define ALPHA 0 #define GIN 1 #define GRAPH 2 #define POINT 3 #define SPECIALPOINT 4 #define INCREMENTAL 5 #define RESET 6 #define EXIT 7 /* * * The pen state, either UP or DOWN, controls whether vectors are drawn. * */ #define UP 0 #define DOWN 1 /* * * Coordinates of the upper right corner of the screen - almost the real screen * dimensions. * */ #define TEKXMAX 4096 #define TEKYMAX 3120 /* * * The size of the spot in SPECIALPOINT mode is controlled by a non-linear * function that has a domain that consists of the integers from 040 to 0175. * The next definition is used to initialize the special point mode intensity * array that implements the function. Data came from table F-6 in the tektronix * 4014 manual. * */ #define INTENSITY \ \ { \ 14, 16, 17, 19, 20, 22, 23, 25, \ 28, 31, 34, 38, 41, 44, 47, 50, \ 56, 62, 69, 75, 81, 88, 94,100, \ 56, 62, 69, 75, 81, 88, 94,100, \ 0, 1, 1, 1, 1, 1, 1, 2, \ 2, 2, 2, 2, 3, 3, 3, 3, \ 4, 4, 4, 5, 5, 5, 6, 6, \ 7, 8, 9, 10, 11, 12, 12, 13, \ 14, 16, 17, 19, 20, 22, 23, 25, \ 28, 31, 34, 38, 41, 44, 47, 50, \ 56, 62, 69, 75, 81, 88, 94,100, \ 56, 62, 69, 75, 81, 88, 94,100, \ } /* * * The next two definitions give the height and width of characters in the four * different sizes available on tektronix terminals. TEKFONT is the default index * into CHARHEIGHT and CHARWIDTH. * */ #define CHARHEIGHT {88, 82, 53, 48} #define CHARWIDTH {56, 51, 34, 31} #define TEKFONT 2 /* * * The entries defined in STYLES are passed on to the PostScript operator setdash. * They're used to implement the different tektronix line styles. Belongs in the * prologue! * */ #define STYLES \ \ { \ "[]", \ "[.5 2]", \ "[.5 2 4 2]", \ "[4 4]", \ "[8 4]", \ "[]" \ } /* * * Variables of type Point are used to keep track of the cursor position. * */ typedef struct { int x; int y; } Point; /* * * An array of type Fontmap helps convert font names requested by users into * legitimate PostScript names. The array is initialized using FONTMAP, which must * end with an entry that has NULL defined as its name field. * */ typedef struct { char *name; /* user's font name */ char *val; /* corresponding PostScript name */ } Fontmap; #define FONTMAP \ \ { \ "R", "Courier", \ "I", "Courier-Oblique", \ "B", "Courier-Bold", \ "CO", "Courier", \ "CI", "Courier-Oblique", \ "CB", "Courier-Bold", \ "CW", "Courier", \ "PO", "Courier", \ "courier", "Courier", \ "cour", "Courier", \ "co", "Courier", \ NULL, NULL \ } /* * * Some of the non-integer valued functions in posttek.c. * */ char *get_font(); 0707070014230550111006440057030057030000011530000522627504000003300000064244post.src/posttek/posttek.c /* * * posttek - PostScript translator for tektronix 4014 files * * A program that can be used to translate tektronix 4014 files into PostScript. * Most of the code was borrowed from the tektronix 4014 emulator that was written * for DMDs. Things have been cleaned up some, but there's still plently that * could be done. * * The PostScript prologue is copied from *prologue before any of the input files * are translated. The program expects that the following PostScript procedures * are defined in that file: * * setup * * mark ... setup - * * Handles special initialization stuff that depends on how the program * was called. Expects to find a mark followed by key/value pairs on the * stack. The def operator is applied to each pair up to the mark, then * the default state is set up. * * pagesetup * * page pagesetup - * * Does whatever is needed to set things up for the next page. Expects * to find the current page number on the stack. * * v * * mark dx1 dy1 ... dxn dyn x y v mark * * Draws the vector described by the numbers on the stack. The top two * numbers are the starting point. The rest are relative displacements * from the preceeding point. Must make sure we don't put too much on * the stack! * * t * * x y string t - * * Prints the string that's on the top of the stack starting at point * (x, y). * * p * * x y p - * * Marks the point (x, y) with a circle whose radius varies with the * current intensity setting. * * i * * percent focus i - * * Changes the size of the circle used to mark individual points to * percent of maximum for focused mode (focus=1) or defocused mode * (focus=0). The implementation leaves much to be desired! * * l * * mark array l mark * * Set the line drawing mode according to the description given in array. * The arrays that describe the different line styles are declared in * STYLES (file posttek.h). The array really belongs in the prologue! * * w * * n w - * * Adjusts the line width for vector drawing. Used to select normal (n=0) * or defocused (n=1) mode. * * f * * size f - * * Changes the size of the font that's used to print characters in alpha * mode. size is the tektronix character width and is used to choose an * appropriate point size in the current font. * * done * * done * * Makes sure the last page is printed. Only needed when we're printing * more than one page on each sheet of paper. * * The default line width is zero, which forces lines to be one pixel wide. That * works well on 'write to black' engines but won't be right for 'write to white' * engines. The line width can be changed using the -w option, or you can change * the initialization of linewidth in the prologue. * * Many default values, like the magnification and orientation, are defined in * the prologue, which is where they belong. If they're changed (by options), an * appropriate definition is made after the prologue is added to the output file. * The -P option passes arbitrary PostScript through to the output file. Among * other things it can be used to set (or change) values that can't be accessed by * other options. * */ #include <stdio.h> #include <signal.h> #include <fcntl.h> #include "comments.h" /* PostScript file structuring comments */ #include "gen.h" /* general purpose definitions */ #include "path.h" /* for the prologue */ #include "ext.h" /* external variable definitions */ #include "posttek.h" /* control codes and other definitions */ char *optnames = "a:c:f:m:n:o:p:w:x:y:A:C:E:J:L:P:R:DI"; char *prologue = POSTTEK; /* default PostScript prologue */ char *formfile = FORMFILE; /* stuff for multiple pages per sheet */ int formsperpage = 1; /* page images on each piece of paper */ int copies = 1; /* and this many copies of each sheet */ int charheight[] = CHARHEIGHT; /* height */ int charwidth[] = CHARWIDTH; /* and width arrays for tek characters */ int tekfont = TEKFONT; /* index into charheight[] and charwidth[] */ char intensity[] = INTENSITY; /* special point intensity array */ char *styles[] = STYLES; /* description of line styles */ int linestyle = 0; /* index into styles[] */ int linetype = 0; /* 0 for normal, 1 for defocused */ int dispmode = ALPHA; /* current tektronix state */ int points = 0; /* points making up the current vector */ int characters = 0; /* characters waiting to be printed */ int pen = UP; /* just for point plotting */ int margin = 0; /* left edge - ALPHA state */ Point cursor; /* should be current cursor position */ Fontmap fontmap[] = FONTMAP; /* for translating font names */ char *fontname = "Courier"; /* use this PostScript font */ int page = 0; /* page we're working on */ int printed = 0; /* printed this many pages */ FILE *fp_in; /* read from this file */ FILE *fp_out = stdout; /* and write stuff here */ FILE *fp_acct = NULL; /* for accounting data */ /*****************************************************************************/ main(agc, agv) int agc; char *agv[]; { /* * * A simple program that can be used to translate tektronix 4014 files into * PostScript. Most of the code was taken from the DMD tektronix 4014 emulator, * although things have been cleaned up some. * */ argv = agv; /* so everyone can use them */ argc = agc; prog_name = argv[0]; /* just for error messages */ init_signals(); /* sets up interrupt handling */ header(); /* PostScript header comments */ options(); /* handle the command line options */ setup(); /* for PostScript */ arguments(); /* followed by each input file */ done(); /* print the last page etc. */ account(); /* job accounting data */ exit(x_stat); /* nothing could be wrong */ } /* End of main */ /*****************************************************************************/ init_signals() { /* * * Make sure we handle interrupts. * */ if ( signal(SIGINT, interrupt) == SIG_IGN ) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); } else { signal(SIGHUP, interrupt); signal(SIGQUIT, interrupt); } /* End else */ signal(SIGTERM, interrupt); } /* End of init_signals */ /*****************************************************************************/ header() { int ch; /* return value from getopt() */ int old_optind = optind; /* for restoring optind - should be 1 */ /* * * Scans the option list looking for things, like the prologue file, that we need * right away but could be changed from the default. Doing things this way is an * attempt to conform to Adobe's latest file structuring conventions. In particular * they now say there should be nothing executed in the prologue, and they have * added two new comments that delimit global initialization calls. Once we know * where things really are we write out the job header, follow it by the prologue, * and then add the ENDPROLOG and BEGINSETUP comments. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) if ( ch == 'L' ) prologue = optarg; else if ( ch == '?' ) error(FATAL, ""); optind = old_optind; /* get ready for option scanning */ fprintf(stdout, "%s", CONFORMING); fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND); fprintf(stdout, "%s %s\n", PAGES, ATEND); fprintf(stdout, "%s", ENDCOMMENTS); if ( cat(prologue) == FALSE ) error(FATAL, "can't read %s", prologue); fprintf(stdout, "%s", ENDPROLOG); fprintf(stdout, "%s", BEGINSETUP); fprintf(stdout, "mark\n"); } /* End of header */ /*****************************************************************************/ options() { int ch; /* value returned by getopt() */ /* * * Reads and processes the command line options. Added the -P option so arbitrary * PostScript code can be passed through. Expect it could be useful for changing * definitions in the prologue for which options have not been defined. * */ while ( (ch = getopt(argc, argv, optnames)) != EOF ) { switch ( ch ) { case 'a': /* aspect ratio */ fprintf(stdout, "/aspectratio %s def\n", optarg); break; case 'c': /* copies */ copies = atoi(optarg); fprintf(stdout, "/#copies %s store\n", optarg); break; case 'f': /* use this PostScript font */ fontname = get_font(optarg); fprintf(stdout, "/font /%s def\n", fontname); break; case 'm': /* magnification */ fprintf(stdout, "/magnification %s def\n", optarg); break; case 'n': /* forms per page */ formsperpage = atoi(optarg); fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg); fprintf(stdout, "/formsperpage %s def\n", optarg); break; case 'o': /* output page list */ out_list(optarg); break; case 'p': /* landscape or portrait mode */ if ( *optarg == 'l' ) fprintf(stdout, "/landscape true def\n"); else fprintf(stdout, "/landscape false def\n"); break; case 'w': /* line width */ fprintf(stdout, "/linewidth %s def\n", optarg); break; case 'x': /* shift horizontally */ fprintf(stdout, "/xoffset %s def\n", optarg); break; case 'y': /* and vertically on the page */ fprintf(stdout, "/yoffset %s def\n", optarg); break; case 'A': /* force job accounting */ case 'J': if ( (fp_acct = fopen(optarg, "a")) == NULL ) error(FATAL, "can't open accounting file %s", optarg); break; case 'C': /* copy file straight to output */ if ( cat(optarg) == FALSE ) error(FATAL, "can't read %s", optarg); break; case 'E': /* text font encoding */ fontencoding = optarg; break; case 'L': /* PostScript prologue file */ prologue = optarg; break; case 'P': /* PostScript pass through */ fprintf(stdout, "%s\n", optarg); break; case 'R': /* special global or page level request */ saverequest(optarg); break; case 'D': /* debug flag */ debug = ON; break; case 'I': /* ignore FATAL errors */ ignore = ON; break; case '?': /* don't know the option */ error(FATAL, ""); break; default: /* don't know what to do for ch */ error(FATAL, "missing case for option %c", ch); break; } /* End switch */ } /* End while */ argc -= optind; argv += optind; } /* End of options */ /*****************************************************************************/ char *get_font(name) char *name; /* name the user asked for */ { int i; /* for looking through fontmap[] */ /* * * Called from options() to map a user's font name into a legal PostScript name. * If the lookup fails *name is returned to the caller. That should let you choose * any PostScript font. * */ for ( i = 0; fontmap[i].name != NULL; i++ ) if ( strcmp(name, fontmap[i].name) == 0 ) return(fontmap[i].val); return(name); } /* End of get_font */ /*****************************************************************************/ setup() { /* * * Handles things that must be done after the options are read but before the * input files are processed. * */ writerequest(0, stdout); /* global requests eg. manual feed */ setencoding(fontencoding); fprintf(stdout, "setup\n"); if ( formsperpage > 1 ) { if ( cat(formfile) == FALSE ) error(FATAL, "can't read %s", formfile); fprintf(stdout, "%d setupforms\n", formsperpage); } /* End if */ fprintf(stdout, "%s", ENDSETUP); } /* End of setup */ /*****************************************************************************/ arguments() { /* * * Makes sure all the non-option command line arguments are processed. If we get * here and there aren't any arguments left, or if '-' is one of the input files * we'll process stdin. * */ if ( argc < 1 ) statemachine(fp_in = stdin); else { /* at least one argument is left */ while ( argc > 0 ) { if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); statemachine(fp_in); if ( fp_in != stdin ) fclose(fp_in); argc--; argv++; } /* End while */ } /* End else */ } /* End of arguments */ /*****************************************************************************/ done() { /* * * Finished with all the input files, so mark the end of the pages with a TRAILER * comment, make sure the last page prints, and add things like the PAGES comment * that can only be determined after all the input files have been read. * */ fprintf(stdout, "%s", TRAILER); fprintf(stdout, "done\n"); fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname); fprintf(stdout, "%s %d\n", PAGES, printed); } /* End of done */ /*****************************************************************************/ account() { /* * * Writes an accounting record to *fp_acct provided it's not NULL. Accounting * is requested using the -A or -J options. * */ if ( fp_acct != NULL ) fprintf(fp_acct, " print %d\n copies %d\n", printed, copies); } /* End of account */ /*****************************************************************************/ statemachine(fp) FILE *fp; /* used to set fp_in */ { /* * * Controls the translation of the next input file. Tektronix states (dispmode) * are typically changed in control() and esc(). * */ redirect(-1); /* get ready for the first page */ formfeed(); dispmode = RESET; while ( 1 ) switch ( dispmode ) { case RESET: reset(); break; case ALPHA: alpha(); break; case GIN: gin(); break; case GRAPH: graph(); break; case POINT: case SPECIALPOINT: point(); break; case INCREMENTAL: incremental(); break; case EXIT: formfeed(); return; } /* End switch */ } /* End of statemachine */ /*****************************************************************************/ reset() { /* * * Called to reset things, typically only at the beginning of each input file. * */ tekfont = -1; home(); setfont(TEKFONT); setmode(ALPHA); } /* End of reset */ /*****************************************************************************/ alpha() { int c; /* next character */ int x, y; /* cursor will be here when we're done */ /* * * Takes care of printing characters in the current font. * */ if ( (c = nextchar()) == OUTMODED ) return; if ( (c < 040) && ((c = control(c)) <= 0) ) return; x = cursor.x; /* where the cursor is right now */ y = cursor.y; switch ( c ) { case DEL: return; case BS: if ((x -= charwidth[tekfont]) < margin) x = TEKXMAX - charwidth[tekfont]; break; case NL: y -= charheight[tekfont]; break; case CR: x = margin; break; case VT: if ((y += charheight[tekfont]) >= TEKYMAX) y = 0; break; case HT: case ' ': default: if ( characters++ == 0 ) fprintf(fp_out, "%d %d (", cursor.x, cursor.y); switch ( c ) { case '(': case ')': case '\\': putc('\\', fp_out); default: putc(c, fp_out); } /* End switch */ x += charwidth[tekfont]; move(x, y); break; } /* End switch */ if (x >= TEKXMAX) { x = margin; y -= charheight[tekfont]; } /* End if */ if (y < 0) { y = TEKYMAX - charheight[tekfont]; x -= margin; margin = (TEKXMAX/2) - margin; if ((x += margin) > TEKXMAX) x -= margin; } /* End if */ if ( y != cursor.y || x != cursor.x ) text(); move(x, y); } /* End of alpha */ /*****************************************************************************/ graph() { int c; /* next character */ int b; /* for figuring out loy */ int x, y; /* next point in the vector */ static int hix, hiy; /* upper */ static int lox, loy; /* and lower part of the address */ static int extra; /* for extended addressing */ /* * * Handles things when we're in GRAPH, POINT, or SPECIALPOINT mode. * */ if ((c = nextchar()) < 040) { control(c); return; } /* End if */ if ((c & 0140) == 040) { /* new hiy */ hiy = c & 037; do if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED)) return; while (c == 0); } /* End if */ if ((c & 0140) == 0140) { /* new loy */ b = c & 037; do if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED)) return; while (c == 0); if ((c & 0140) == 0140) { /* no, it was extra */ extra = b; loy = c & 037; do if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED)) return; while (c == 0); } else loy = b; } /* End if */ if ((c & 0140) == 040) { /* new hix */ hix = c & 037; do if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED)) return; while (c == 0); } /* End if */ lox = c & 037; /* this should be lox */ if (extra & 020) margin = TEKXMAX/2; x = (hix<<7) | (lox<<2) | (extra & 03); y = (hiy<<7) | (loy<<2) | ((extra & 014)>>2); if ( points > 100 ) { /* don't put too much on the stack */ draw(); points = 1; } /* End if */ if ( points++ ) fprintf(fp_out, "%d %d\n", cursor.x - x, cursor.y - y); move(x, y); /* adjust the cursor */ } /* End of graph */ /*****************************************************************************/ point() { int c; /* next input character */ /* * * Special point mode permits gray scaling by varying the size of the stored * point, which is controlled by an intensity character that preceeds each point * address. * */ if ( dispmode == SPECIALPOINT ) { if ( (c = nextchar()) < 040 || c > 0175 ) return(control(c)); fprintf(fp_out, "%d %d i\n", intensity[c - ' '], c & 0100); } /* End if */ graph(); draw(); } /* End of point */ /*****************************************************************************/ incremental() { int c; /* for the next few characters */ int x, y; /* cursor position when we're done */ /* * * Handles incremental plot mode. It's entered after the RS control code and is * used to mark points relative to our current position. It's typically followed * by one or two bytes that set the pen state and are used to increment the * current position. * */ if ( (c = nextchar()) == OUTMODED ) return; if ( (c < 040) && ((c = control(c)) <= 0) ) return; x = cursor.x; /* where we are right now */ y = cursor.y; if ( c & 060 ) pen = ( c & 040 ) ? UP : DOWN; if ( c & 04 ) y++; if ( c & 010 ) y--; if ( c & 01 ) x++; if ( c & 02 ) x--; move(x, y); if ( pen == DOWN ) { points = 1; draw(); } /* End if */ } /* End of incremental */ /*****************************************************************************/ gin() { /* * * All we really have to do for GIN mode is make sure it's properly ended. * */ control(nextchar()); } /* End of gin */ /*****************************************************************************/ control(c) int c; /* check this control character */ { /* * * Checks character c and does special things, like mode changes, that depend * not only on the character, but also on the current state. If the mode changed * becuase of c, OUTMODED is returned to the caller. In all other cases the * return value is c or 0, if c doesn't make sense in the current mode. * */ switch ( c ) { case BEL: return(0); case BS: case HT: case VT: return(dispmode == ALPHA ? c : 0); case CR: if ( dispmode != ALPHA ) { setmode(ALPHA); ungetc(c, fp_in); return(OUTMODED); } else return(c); case FS: if ( (dispmode == ALPHA) || (dispmode == GRAPH) ) { setmode(POINT); return(OUTMODED); } /* End if */ return(0); case GS: if ( (dispmode == ALPHA) || (dispmode == GRAPH) ) { setmode(GRAPH); return(OUTMODED); } /* End if */ return(0); case NL: ungetc(CR, fp_in); return(dispmode == ALPHA ? c : 0); case RS: if ( dispmode != GIN ) { setmode(INCREMENTAL); return(OUTMODED); } /* End if */ return(0); case US: if ( dispmode == ALPHA ) return(0); setmode(ALPHA); return(OUTMODED); case ESC: return(esc()); case OUTMODED: return(c); default: return(c < 040 ? 0 : c); } /* End switch */ } /* End of control */ /*****************************************************************************/ esc() { int c; /* next input character */ int ignore; /* skip it if nonzero */ /* * * Handles tektronix escape code. Called from control() whenever an ESC character * is found in the input file. * */ do { c = nextchar(); ignore = 0; switch ( c ) { case CAN: return(0); case CR: ignore = 1; break; case ENQ: setmode(ALPHA); return(OUTMODED); case ETB: return(0); case FF: formfeed(); setmode(ALPHA); return(OUTMODED); case FS: if ( (dispmode == INCREMENTAL) || ( dispmode == GIN) ) return(0); setmode(SPECIALPOINT); return(OUTMODED); case SI: case SO: return(0); case SUB: setmode(GIN); return(OUTMODED); case OUTMODED: return(OUTMODED); case '8': case '9': case ':': case ';': setfont(c - '8'); return(0); default: if ( c == '?' && dispmode == GRAPH ) return(DEL); if ( (c<'`') || (c>'w') ) break; c -= '`'; if ( (c & 010) != linetype ) fprintf(fp_out, "%d w\n", (linetype = (c & 010))/010); if ( ((c + 1) & 7) >= 6 ) break; if ( (c + 1) & 7 ) if ( (c & 7) != linestyle ) { linestyle = c & 7; setmode(dispmode); fprintf(fp_out, "%s l\n", styles[linestyle]); } /* End if */ return(0); } /* End switch */ } while (ignore); return(0); } /* End of esc */ /*****************************************************************************/ move(x, y) int x, y; /* move the cursor here */ { /* * * Moves the cursor to the point (x, y). * */ cursor.x = x; cursor.y = y; } /* End of move */ /*****************************************************************************/ setmode(mode) int mode; /* this should be the new mode */ { /* * * Makes sure the current mode is properly ended and then sets dispmode to mode. * */ switch ( dispmode ) { case ALPHA: text(); break; case GRAPH: draw(); break; case INCREMENTAL: pen = UP; break; } /* End switch */ dispmode = mode; } /* End of setmode */ /*****************************************************************************/ home() { /* * * Makes sure the cursor is positioned at the upper left corner of the page. * */ margin = 0; move(0, TEKYMAX); } /* End of home */ /*****************************************************************************/ setfont(newfont) int newfont; /* use this font next */ { /* * * Generates the call to the procedure that's responsible for changing the * tektronix font (really just the size). * */ if ( newfont != tekfont ) { setmode(dispmode); fprintf(fp_out, "%d f\n", charwidth[newfont]); } /* End if */ tekfont = newfont; } /* End of setfont */ /*****************************************************************************/ text() { /* * * Makes sure any text we've put on the stack is printed. * */ if ( dispmode == ALPHA && characters > 0 ) fprintf(fp_out, ") t\n"); characters = 0; } /* End of text */ /*****************************************************************************/ draw() { /* * * Called whenever we need to draw a vector or plot a point. Nothing will be * done if points is 0 or if it's 1 and we're in GRAPH mode. * */ if ( points > 1 ) /* it's a vector */ fprintf(fp_out, "%d %d v\n", cursor.x, cursor.y); else if ( points == 1 && dispmode != GRAPH ) fprintf(fp_out, "%d %d p\n", cursor.x, cursor.y); points = 0; } /* End of draw */ /*****************************************************************************/ formfeed() { /* * * Usually called when we've finished the last page and want to get ready for the * next one. Also used at the beginning and end of each input file, so we have to * be careful about exactly what's done. * */ setmode(dispmode); /* end any outstanding text or graphics */ if ( fp_out == stdout ) /* count the last page */ printed++; fprintf(fp_out, "cleartomark\n"); fprintf(fp_out, "showpage\n"); fprintf(fp_out, "saveobj restore\n"); fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed); if ( ungetc(getc(fp_in), fp_in) == EOF ) redirect(-1); else redirect(++page); fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1); fprintf(fp_out, "/saveobj save def\n"); fprintf(fp_out, "mark\n"); writerequest(printed+1, fp_out); fprintf(fp_out, "%d pagesetup\n", printed+1); fprintf(fp_out, "%d f\n", charwidth[tekfont]); fprintf(fp_out, "%s l\n", styles[linestyle]); home(); } /* End of formfeed */ /*****************************************************************************/ nextchar() { int ch; /* next input character */ /* * * Reads the next character from the current input file and returns it to the * caller. When we're finished with the file dispmode is set to EXIT and OUTMODED * is returned to the caller. * */ if ( (ch = getc(fp_in)) == EOF ) { setmode(EXIT); ch = OUTMODED; } /* End if */ return(ch); } /* End of nextchar */ /*****************************************************************************/ redirect(pg) int pg; /* next page we're printing */ { static FILE *fp_null = NULL; /* if output is turned off */ /* * * If we're not supposed to print page pg, fp_out will be directed to /dev/null, * otherwise output goes to stdout. * */ if ( pg >= 0 && in_olist(pg) == ON ) fp_out = stdout; else if ( (fp_out = fp_null) == NULL ) fp_out = fp_null = fopen("/dev/null", "w"); } /* End of redirect */ /*****************************************************************************/ 0707070014230550141006400057030057030000011527430522633077300003300000006774post.src/posttek/posttek.1 .ds dQ /usr/lib/postscript .TH POSTTEK 1 "DWB 3.2" .SH NAME .B posttek \- PostScript translator for Tektronix 4014 files .SH SYNOPSIS \*(mBposttek\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B posttek translates Tektronix 4014 graphics .I files into PostScript and writes the results on the standard output. If no .I files are specified, or if .OP \- is one of the input .IR files , the standard input is read. The following .I options are understood: .TP 0.75i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP .OP \-f name Print text using font .IR name . Any PostScript font can be used, although the best results will only be obtained with constant width fonts. The default font is Courier. .TP .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which by default is located at the center of each page. The default magnification is 1.0. .TP .OP \-n num Print .I num logical pages on each piece of paper, where .I num can be any positive integer. By default .I num is set to 1. .TP .OP \-o list Print pages whose numbers are given in the comma-separated .IR list . The list contains single numbers .I N and ranges .IR N1\-\|N2 . A missing .I N1 means the lowest numbered page, a missing .I N2 means the highest. .TP .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBlandscape\fP. .TP .OP \-w num Set the line width used for graphics to .I num points, where a point is approximately 1/72 of an inch. By default .I num is set to 0 points, which forces lines to be one pixel wide. .TP .OP \-x num Translate the origin .I num inches along the positive x axis. The default coordinate system has the origin fixed at the center of the page, with positive x to the right and positive y up the page. Positive .I num moves everything right. The default offset is 0.0 inches. .TP .OP \-y num Translate the origin .I num inches along the positive y axis. Positive .I num moves everything up the page. The default offset is 0.0. .TP .OP \-E name Set the character encoding for text fonts to .IR name . Requesting .I name means include file .MI \*(dQ/ name .enc \f1. A nonexistent encoding file is silently ignored. The default selects file .MR \*(dQ/Default.enc . .TP .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/posttek.ps . .PP Three options allow insertion of arbitrary PostScript at controlled points in the translation process: .TP 0.75i .OP \-C file Copy .I file to the output file; .I file must contain legitimate PostScript. .TP .OP \-P string Include. .I string in the output file; .I string must be legitimate PostScript. .TP .OP \-R action Requests special .I action (e.g., .MR manualfeed ) on a per page or global basis. The .I action string can be given as .IR request, .IM request : page\f1\|, or .IM request : page : file\f1\|. If .I page is omitted or given as 0, the request applies to all pages. If .I file is omitted, the request lookup is done in .MR \*(dQ/ps.requests . .SH DIAGNOSTICS A 0 exit status is returned if .I files were successfully processed. .SH BUGS The default line width is too small for write-white print engines, like the one used by the \s-1PS\s+1-2400. .br .ne 4v .SH FILES .MW \*(dQ/posttek.ps .br .MW \*(dQ/forms.ps .br .MW \*(dQ/ps.requests .SH SEE ALSO .BR dpost (1), .BR postdaisy(1), .BR postdmd(1), .BR postio(1), .BR postmd(1), .BR postprint(1), .BR postreverse(1), .BR psencoding (1) 0707070014230550131006440057030057030000011530100522627504000003400000004530post.src/posttek/posttek.ps % % Version 3.3.2 prologue for tektronix 4014 files. % /#copies 1 store /aspectratio 1 def /fixlinewidth true def /font /Courier def /formsperpage 1 def /landscape true def /linewidth 0 def /magnification 1 def /margin 10 def /orientation 0 def /rotation 1 def /screenheight 3120 def /screenwidth 4150 def /spotsize 1 def /xoffset 0 def /yoffset 0 def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /kshow {kshow} bind def % so later references don't bind /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if pagedimensions /scaling height margin sub screenheight div width margin sub screenwidth div min def xcenter ycenter translate orientation rotation mul rotate xoffset inch yoffset inch translate magnification dup aspectratio mul scale scaling scaling scale screenwidth 2 div neg screenheight 2 div neg translate tietodevicespace linewidth scaling div setlinewidth 1 setlinecap newpath } def /pagedimensions { useclippath { /pagebbox [clippath pathbbox newpath] def } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /pagesetup {/page exch def} bind def /tietodevicespace { fixlinewidth linewidth 0 gt and linewidth 1 lt and { /moveto { 2 copy /Y exch def /X exch def transform round exch round exch itransform moveto } bind def /lineto { 2 copy /Y exch def /X exch def transform round exch round exch itransform lineto } bind def /rlineto {Y add exch X add exch lineto} bind def /v V 0 get bind def } if } def /V [{moveto counttomark 2 idiv {rlineto} repeat stroke}] def /v V 0 get bind def /p {newpath spotsize 0 360 arc fill} bind def /l {{scaling div} forall counttomark array astore 0 setdash} bind def /w {linewidth 0 eq {.3} {linewidth} ifelse mul linewidth add scaling div setlinewidth} bind def /i {3 mul 4 sub -100 div mul .5 add /spotsize exch def} bind def /f {/charwidth exch def font findfont charwidth .6 div scalefont setfont} bind def /t { 3 1 roll moveto currentpoint { pop pop exch charwidth add exch moveto currentpoint } 4 -1 roll kshow pop pop } bind def /done {/lastpage where {pop lastpage} if} def 0707070014230265710407550057030057030000020677160522633077500002300000000000post.src/printfont 0707070014230265721006440057030057030000010677500522627504000004000000016641post.src/printfont/printfont.ps % % Formatted font dump. Assumes all fonts include valid FontBBox arrays. % /#copies 1 store /aspectratio 1 def /landscape false def /magnification 1 def /margin 10 def /orientation 0 def /rotation 1 def /xoffset 0 def /yoffset 0 def /axescount 0 def /charwidth false def /graynotdef 0.85 def /hireslinewidth 0.2 def /longnames false def /maxsize 6.0 def /minsize 4.5 def /numbercell true def /radix 16 def /labelfont /Helvetica def /labelspace 36 def /zerocell 0 def /roundpage true def /useclippath true def /pagebbox [0 0 612 792] def /inch {72 mul} def /min {2 copy gt {exch} if pop} def /max {2 copy lt {exch} if pop} def /LLx {0 get} bind def /LLy {1 get} bind def /URx {2 get} bind def /URy {3 get} bind def /BBoxHeight {dup URy exch LLy sub} bind def /BBoxWidth {dup URx exch LLx sub} bind def /setup { /graylevels [1 0 0] def /scratchstring 512 string def /Product statusdict begin /product where {pop product}{(Unknown)} ifelse end def /Resolution 0 72 dtransform dup mul exch dup mul add sqrt cvi def /Version /version where {pop version}{(???)} ifelse def landscape {/orientation 90 orientation add def} if pagedimensions xcenter ycenter translate orientation rotation mul rotate width 2 div neg height 2 div translate xoffset inch yoffset inch neg translate margin dup neg translate 0 labelspace .75 mul neg translate magnification dup aspectratio mul scale 0 0 transform round exch round exch itransform translate currentdict /linewidth known not { /linewidth Resolution 400 le {0}{hireslinewidth} ifelse def } if } def /pagedimensions { useclippath { /pagebbox [clippath pathbbox newpath] def roundpage currentdict /roundpagebbox known and {roundpagebbox} if } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def } def /CharSetup { /chcode exch def /chname Encoding chcode get def /chstring ( ) dup 0 chcode put def /chknown true def graylevels 0 1 put % initial cell fill graylevels 1 0 put % cell text graylevels 2 0 put % cell border FontDict /CharStrings known { FontDict /CharStrings get chname known not { /chknown false def graylevels 0 0 put graylevels 1 1 put } if } if chname /.notdef eq { /chknown false def graylevels 0 graynotdef put graylevels 1 graynotdef put } if /chwid chknown {FontDict 1 scalefont setfont chstring stringwidth pop} {0} ifelse def } bind def /CellSetup { /gridwidth width margin 2 mul sub def /gridheight height labelspace sub margin 2 mul sub def /cellwidth gridwidth radix div def /cellheight gridheight Entries radix div ceiling div def cellwidth cellheight dtransform truncate exch truncate exch idtransform /cellheight exch def /cellwidth exch def labelfont findfont 1 scalefont setfont /LabelBBox currentfont /FontBBox get TransformBBox def LabelBBox 2 0 Encoding { scratchstring cvs stringwidth pop 2 copy lt {exch} if pop } forall put /CellLabelSize cellheight .20 mul cellwidth .90 mul LabelBBox BestFit minsize max maxsize min def zerocell CellOrigin cellheight add neg exch neg exch translate } bind def /FontSetup { FontName findfont 1 scalefont setfont /BBox currentfont /FontBBox get TransformBBox def /PointSize cellheight .5 mul cellwidth .8 mul BBox BestFit def BBox {PointSize mul} forall BBox astore pop /xorigin cellwidth BBox BBoxWidth sub 2 div BBox LLx sub def /yorigin cellheight BBox BBoxHeight sub 2 div BBox LLy sub def } bind def /BestFit { /bbox exch def bbox BBoxWidth div exch bbox BBoxHeight div min } bind def /TransformBBox { % font bbox to user space aload pop currentfont /FontMatrix get dtransform 4 2 roll currentfont /FontMatrix get dtransform 4 2 roll 4 array astore % should build user space bbox if all zeros } bind def /CellOrigin { dup exch radix mod cellwidth mul exch radix idiv 1 add neg cellheight mul } bind def /CellOutline { newpath CellOrigin moveto cellwidth 0 rlineto 0 cellheight rlineto cellwidth neg 0 rlineto closepath } bind def /LabelCell { gsave chcode CellOrigin translate linewidth .5 mul setlinewidth labelfont findfont CellLabelSize scalefont setfont numbercell { cellwidth .025 mul cellheight .05 mul moveto chcode radix scratchstring cvrs show } if charwidth chknown and { /wid chwid 0.0005 add scratchstring cvs 0 5 getinterval def cellwidth wid stringwidth pop 1.10 mul sub cellheight .05 mul moveto wid show } if longnames chknown not or { cellwidth .025 mul cellheight LabelBBox URy CellLabelSize mul sub .05 sub moveto Encoding chcode get scratchstring cvs show } if axescount 1 ge chknown and { % gsave/grestore if not last newpath xorigin yorigin translate BBox LLx 0 moveto % baseline BBox URx 0 lineto stroke axescount 2 ge { % vertical through current origin 0 BBox LLy moveto 0 BBox URy lineto stroke } if axescount 3 ge { % vertical through next origin chwid PointSize mul BBox LLy dtransform round exch round exch idtransform moveto 0 BBox BBoxHeight rlineto stroke %chwid PointSize mul BBox URy lineto stroke } if } if grestore } bind def /PlaceChar { FontName findfont PointSize scalefont setfont chcode CellOrigin moveto xorigin yorigin rmoveto ( ) dup 0 chcode put show } bind def /LabelPage { labelfont findfont labelspace .75 mul .75 mul 18 min scalefont setfont 0 labelspace .75 mul .25 mul moveto FontName scratchstring cvs show labelfont findfont labelspace .25 mul .75 mul 9 min scalefont setfont 0 gridheight neg moveto 0 labelspace .25 mul .75 mul neg rmoveto Product show ( Version ) show Version show ( \() show Resolution scratchstring cvs show (dpi\)) show gridwidth gridheight neg moveto 0 labelspace .25 mul .75 mul neg rmoveto (size=, ) stringwidth pop neg 0 rmoveto PointSize cvi scratchstring cvs stringwidth pop neg 0 rmoveto (gray=, ) stringwidth pop neg 0 rmoveto graynotdef scratchstring cvs stringwidth pop neg 0 rmoveto (linewidth=) stringwidth pop neg 0 rmoveto linewidth scratchstring cvs stringwidth pop neg 0 rmoveto (size=) show PointSize cvi scratchstring cvs show (, ) show (gray=) show graynotdef scratchstring cvs show (, ) show (linewidth=) show linewidth scratchstring cvs show } bind def % % Formatted dump of the encoded characters in a single font. % /PrintFont { /saveobj save def /FontName exch def /FontDict FontName findfont def /Encoding FontDict /Encoding get def /Entries Encoding length def CellSetup FontSetup LabelPage zerocell 1 Entries 1 sub { CharSetup graylevels 0 get setgray chcode CellOutline fill graylevels 1 get setgray LabelCell PlaceChar graylevels 2 get setgray linewidth setlinewidth chcode CellOutline stroke } for showpage saveobj restore } bind def % % Dump of all ROM and disk fonts - in alphabetical order. % /AllFonts { /AllFontNames FontDirectory maxlength array def AllFontNames 0 0 put FontDirectory {pop AllFontNames Insert} forall /filenameforall where { pop (fonts/*) {(fonts/) search pop pop pop AllFontNames Insert} 200 string filenameforall } if 1 1 AllFontNames 0 get { AllFontNames exch get cvn PrintFont } for } bind def /Insert { % name in a sorted list /List exch def /Name exch 128 string cvs def /Slot 1 def List 0 get { Name List Slot get le {exit} if /Slot Slot 1 add def } repeat List 0 get -1 Slot { dup List exch get List 3 1 roll exch 1 add exch put } for List Slot Name put List 0 List 0 get 1 add put } bind def 0707070014230265731006440057030057030000010677340522627504000004000000005147post.src/printfont/printfont.sh # # Formatted dump of encoded characters in one or more PostScript fonts. # Arguments should be PostScript font names or the word all, which dumps # all ROM and disk based fonts. # POSTLIB=/usr/lib/postscript PROLOGUE=$POSTLIB/printfont.ps OPTIONS= COPYFILE= MODE=portrait FONTENCODING=Default NONCONFORMING="%!PS" ENDPROLOG="%%EndProlog" BEGINSETUP="%%BeginSetup" ENDSETUP="%%EndSetup" TRAILER="%%Trailer" SETUP=setup while [ -n "$1" ]; do case $1 in -a) shift; OPTIONS="$OPTIONS /axescount $1 def";; -a*) OPTIONS="$OPTIONS /axescount `echo $1 | sed s/-a//` def";; -b) shift; OPTIONS="$OPTIONS /radix $1 def";; -b*) OPTIONS="$OPTIONS /radix `echo $1 | sed s/-b//` def";; -c) shift; OPTIONS="$OPTIONS /#copies $1 store";; -c*) OPTIONS="$OPTIONS /#copies `echo $1 | sed s/-c//` store";; -f) shift; OPTIONS="$OPTIONS /labelfont /$1 def";; -f*) OPTIONS="$OPTIONS /labelfont /`echo $1 | sed s/-f//` def";; -g) shift; OPTIONS="$OPTIONS /graynotdef $1 def";; -g*) OPTIONS="$OPTIONS /graynotdef `echo $1 | sed s/-g//` def";; -p) shift; MODE=$1;; -p*) MODE=`echo $1 | sed s/-p//`;; -q) OPTIONS="$OPTIONS /longnames false def /charwidth false def";; -m) shift; OPTIONS="$OPTIONS /magnification $1 def";; -m*) OPTIONS="$OPTIONS /magnification `echo $1 | sed s/-m//` def";; -v) OPTIONS="$OPTIONS /longnames true def /charwidth true def";; -w) shift; OPTIONS="$OPTIONS /linewidth $1 def";; -w*) OPTIONS="$OPTIONS /linewidth `echo $1 | sed s/-w//` def";; -x) shift; OPTIONS="$OPTIONS /xoffset $1 def";; -x*) OPTIONS="$OPTIONS /xoffset `echo $1 | sed s/-x//` def";; -y) shift; OPTIONS="$OPTIONS /yoffset $1 def";; -y*) OPTIONS="$OPTIONS /yoffset `echo $1 | sed s/-y//` def";; -z) shift; OPTIONS="$OPTIONS /zerocell $1 def";; -z*) OPTIONS="$OPTIONS /zerocell `echo $1 | sed s/-z//` def";; -C) shift; COPYFILE="$COPYFILE $1";; -C*) COPYFILE="$COPYFILE `echo $1 | sed s/-C//`";; -E) shift; FONTENCODING=$1;; -E*) FONTENCODING=`echo $1 | sed s/-E//`;; -L) shift; PROLOGUE=$1;; -L*) PROLOGUE=`echo $1 | sed s/-L//`;; -*) echo "$0: illegal option $1" >&2; exit 1;; *) break;; esac shift done case "$MODE" in l*) OPTIONS="$OPTIONS /landscape true def";; *) OPTIONS="$OPTIONS /landscape false def";; esac echo $NONCONFORMING cat $PROLOGUE echo $ENDPROLOG echo $BEGINSETUP cat ${COPYFILE:-/dev/null} echo $OPTIONS case "$FONTENCODING" in /*) cat $FONTENCODING;; ?*) cat ${POSTLIB}/${FONTENCODING}.enc 2>/dev/null esac echo $SETUP echo $ENDSETUP for i do case "$i" in all) echo AllFonts;; /*) echo "$i PrintFont";; ?*) echo "/$i PrintFont";; esac done echo $TRAILER 0707070014230265631006400057030057030000010672360522633077400004000000003045post.src/printfont/printfont.mk MAKE=/bin/make MAKEFILE=printfont.mk OWNER=bin GROUP=bin MAN1DIR=/tmp MAN5DIR=/usr/man/p_man/man5 POSTLIB=/usr/lib/postscript POSTBIN=/usr/bin/postscript all : printfont install : all @if [ ! -d "$(POSTBIN)" ]; then \ mkdir $(POSTBIN); \ chmod 755 $(POSTBIN); \ chgrp $(GROUP) $(POSTBIN); \ chown $(OWNER) $(POSTBIN); \ fi @if [ ! -d "$(POSTLIB)" ]; then \ mkdir $(POSTLIB); \ chmod 755 $(POSTLIB); \ chgrp $(GROUP) $(POSTLIB); \ chown $(OWNER) $(POSTLIB); \ fi cp printfont $(POSTBIN)/printfont @chmod 755 $(POSTBIN)/printfont @chgrp $(GROUP) $(POSTBIN)/printfont @chown $(OWNER) $(POSTBIN)/printfont cp printfont.ps $(POSTLIB)/printfont.ps @chmod 644 $(POSTLIB)/printfont.ps @chgrp $(GROUP) $(POSTLIB)/printfont.ps @chown $(OWNER) $(POSTLIB)/printfont.ps cp printfont.1 $(MAN1DIR)/printfont.1 @chmod 644 $(MAN1DIR)/printfont.1 @chgrp $(GROUP) $(MAN1DIR)/printfont.1 @chown $(OWNER) $(MAN1DIR)/printfont.1 clean : clobber : clean rm -f printfont printfont : printfont.sh sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" printfont.sh >printfont @chmod 755 printfont changes : @trap "" 1 2 3 15; \ sed \ -e "s'^OWNER=.*'OWNER=$(OWNER)'" \ -e "s'^GROUP=.*'GROUP=$(GROUP)'" \ -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \ -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \ -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \ -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \ $(MAKEFILE) >XXX.mk; \ mv XXX.mk $(MAKEFILE); \ sed \ -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \ printfont.1 >XXX.1; \ mv XXX.1 printfont.1 0707070014230265751006400057030057030000010672500522633077500003700000010150post.src/printfont/printfont.1 .ds dQ /usr/lib/postscript .TH PRINTFONT 1 "DWB 3.2" .SH NAME .B printfont \- font listing program for PostScript printers .SH SYNOPSIS \*(mBprintfont\f1 .OP "" options [] .OP "" files [] .SH DESCRIPTION .B printfont builds a PostScript program that prints character set tables for one or more PostScript fonts. The program is written on the standard output, and when sent to a PostScript printer usually prints a 16\(mu16 table that shows the available (encoded) characters in each font. The following .I options are understood: .TP 1.0i .OP \-a num Set the character cell axes mode to .IR num . 0 disables axes printing, 1 draws a baseline, 2 adds a vertical line through the character origin, and 3 adds a vertical line through the next character origin. The default is 0. .TP 1.0i .OP \-b num Print each table in base .IR num . The base determines the number of rows and columns in the table. It also affects the character code placed in the lower left corner of each cell. The default is 16 (hexadecimal). .TP 1.0i .OP \-c num Print .I num copies of each page. By default only one copy is printed. .TP 1.0i .OP \-f name Use font .I name for labeling the tables. The default font is Helvetica. .TP 1.0i .OP \-g num Use .I num as the gray level for marking cells not currently assigned to characters. The gray level should fall between 0 (black) and 1 (white). The default is 0.85. .TP 1.0i .OP \-m num Magnify each logical page by the factor .IR num . Pages are scaled uniformly about the origin, which is located near the upper left corner of each page. The default is 1.0. .TP 1.0i .OP \-p mode Print .I files in either \*(mBportrait\fP or \*(mBlandscape\fP .IR mode . Only the first character of .I mode is significant. The default .I mode is \*(mBportrait\fP. .TP 1.0i .OP \-v Completely label each character cell. The full character name goes in the upper left corner and the character width (at point size 1) goes in the lower right corner. .TP 1.0i .OP \-w num Set the line width to .I num points, where a point is approximately 1/72 of an inch. A line width of 0 means 1 pixel. The default line width is resolution dependent. .TP 1.0i .OP \-x num Translate the origin .I num inches along the x axis. Positive .I num shifts the table to the right. The default offset is 0. .TP 1.0i .OP \-y num Translate the origin .I num inches along the y axis. Positive .I num shifts the table up the page. The default offset is 0. .TP 1.0i .OP \-C file Copy .I file to the output file; .B file must contain legitimate PostScript. .TP 1.0i .OP \-E name Set the character encoding for text fonts to .IR name . Requesting .I name means include file .MI \*(dQ/ name .enc \f1. A nonexistent encoding file is silently ignored. The default selects file .MR \*(dQ/Default.enc . .TP 1.0i .OP \-L file Use .I file as the PostScript prologue. .br The default is .MR \*(dQ/printfont.ps . .PP Arguments should be PostScript .I font names or the word .MR all , which means the full set of .SM ROM and disk based fonts available on a printer. .B printfont prints one font table per page. Each page is labeled with the .I font name, the printer product name and interpreter version number, and the gray level, linewidth, and printer resolution. .PP Black cells are used to mark characters listed in the font's .MW Encoding array but missing from its .MW CharStrings dictionary. They usually indicate an incomplete font or a mistake in the .MW Encoding array. The check is skipped if the font doesn't include a .MW CharStrings dictionary. .br .ne 4v .SH EXAMPLES Print the characters available in the Times-Roman, Symbol and ZapfDingbats fonts: .EX printfont Times-Roman Symbol ZapfDingbats | lp ... .EE Print a baseline under each character and fully label the cells: .EX printfont -a1 -v Times-Roman Symbol ZapfDingbats | lp ... .EE Dump all the fonts available on a printer using the Latin1 character encoding: .EX printfont -ELatin1 all | lp ... .EE .SH WARNINGS Printing a single table can take several minutes. Dumping all available fonts can tie a printer up for an hour or more. .SH FILES .MW \*(dQ/printfont.ps .br .MW \*(dQ/*.enc .SH SEE ALSO buildtables(1), dpost(1), postio(1), psencoding(1), trofftable(1) 0707070014230643060407550057030057030000021712370522627504100001700000000000post.src/tests 0707070014230643071006440057030057030000011714700522627504100002700000112244post.src/tests/postmd1 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.5602721e+08 .1143984e+09 -.6207247e+08 .0000000e+00 .0000000e+00 -.1149580e+09 .2301959e+09 -.1138958e+09 .0000000e+00 .0000000e+00 -.5853962e+08 .1144553e+09 -.5355661e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2468074e+08 .1401407e+07 .2608215e+08 .0000000e+00 .0000000e+00 -.5473053e+06 -.2402412e+07 -.1855106e+07 .0000000e+00 .0000000e+00 .2522804e+08 .1001005e+07 -.2422704e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.5219836e+08 .1123168e+09 -.6715163e+08 .0000000e+00 .0000000e+00 -.1138958e+09 .2284693e+09 -.1110422e+09 .0000000e+00 .0000000e+00 -.6060955e+08 .1126212e+09 -.4850979e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2391785e+08 .3480520e+07 .2739837e+08 .0000000e+00 .0000000e+00 -.1855106e+07 -.5966605e+07 -.4111499e+07 .0000000e+00 .0000000e+00 .2577296e+08 .2486086e+07 -.2328688e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.4569685e+08 .1058615e+09 -.8114649e+08 .0000000e+00 .0000000e+00 -.1110422e+09 .2277521e+09 -.1023531e+09 .0000000e+00 .0000000e+00 -.6383463e+08 .1075339e+09 -.3707416e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2260163e+08 .8226099e+07 .3082772e+08 .0000000e+00 .0000000e+00 -.4111499e+07 -.1410188e+08 -.9990385e+07 .0000000e+00 .0000000e+00 .2671312e+08 .5875785e+07 -.2083734e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.5644212e+08 .1144553e+09 -.6060955e+08 .0000000e+00 .0000000e+00 -.1149657e+09 .2301010e+09 -.1139830e+09 .0000000e+00 .0000000e+00 -.5811705e+08 .1144933e+09 -.5493231e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2477196e+08 .1001005e+07 .2577296e+08 .0000000e+00 .0000000e+00 -.3648702e+06 -.1601608e+07 -.1236738e+07 .0000000e+00 .0000000e+00 .2513683e+08 .6006029e+06 -.2453622e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.5355661e+08 .1126212e+09 -.6383463e+08 .0000000e+00 .0000000e+00 -.1139830e+09 .2279620e+09 -.1114623e+09 .0000000e+00 .0000000e+00 -.5916407e+08 .1128241e+09 -.5140673e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2422704e+08 .2486086e+07 .2671312e+08 .0000000e+00 .0000000e+00 -.1236738e+07 -.3977737e+07 -.2740999e+07 .0000000e+00 .0000000e+00 .2546378e+08 .1491651e+07 -.2397213e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.4850979e+08 .1075339e+09 -.7261747e+08 .0000000e+00 .0000000e+00 -.1114623e+09 .2249648e+09 -.1047203e+09 .0000000e+00 .0000000e+00 -.6060164e+08 .1086488e+09 -.4323591e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2328688e+08 .5875785e+07 .2916266e+08 .0000000e+00 .0000000e+00 -.2740999e+07 -.9401256e+07 -.6660257e+07 .0000000e+00 .0000000e+00 .2602787e+08 .3525471e+07 -.2250240e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.5685856e+08 .1144933e+09 -.5916407e+08 .0000000e+00 .0000000e+00 -.1149703e+09 .2300441e+09 -.1140353e+09 .0000000e+00 .0000000e+00 -.5769602e+08 .1145123e+09 -.5632545e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2486317e+08 .6006029e+06 .2546378e+08 .0000000e+00 .0000000e+00 -.1824351e+06 -.8008039e+06 -.6183688e+06 .0000000e+00 .0000000e+00 .2504561e+08 .2002010e+06 -.2484541e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.5493231e+08 .1128241e+09 -.6060164e+08 .0000000e+00 .0000000e+00 -.1140353e+09 .2276577e+09 -.1117143e+09 .0000000e+00 .0000000e+00 -.5773604e+08 .1129256e+09 -.5438769e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2453622e+08 .1491651e+07 .2602787e+08 .0000000e+00 .0000000e+00 -.6183688e+06 -.1988868e+07 -.1370500e+07 .0000000e+00 .0000000e+00 .2515459e+08 .4972171e+06 -.2465738e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.5140673e+08 .1086488e+09 -.6456189e+08 .0000000e+00 .0000000e+00 -.1117143e+09 .2232924e+09 -.1061407e+09 .0000000e+00 .0000000e+00 -.5745266e+08 .1092063e+09 -.4987112e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2397213e+08 .3525471e+07 .2749760e+08 .0000000e+00 .0000000e+00 -.1370500e+07 -.4700628e+07 -.3330128e+07 .0000000e+00 .0000000e+00 .2534262e+08 .1175157e+07 -.2416747e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2468074e+08 .2531926e+08 .0000000e+00 .0000000e+00 .0000000e+00 -.5473053e+06 -.5473053e+06 .0000000e+00 .0000000e+00 .0000000e+00 .2522804e+08 -.2477196e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.1087220e+08 .0000000e+00 .0000000e+00 .0000000e+00 .2174439e+08 .2174439e+08 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.1087220e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2468074e+08 .1401407e+07 .2608215e+08 .0000000e+00 .0000000e+00 -.5473053e+06 -.2402412e+07 -.1855106e+07 .0000000e+00 .0000000e+00 .2522804e+08 .1001005e+07 -.2422704e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.2183162e+08 -.1095942e+08 .0000000e+00 .0000000e+00 .2174439e+08 .4366323e+08 .2191884e+08 .0000000e+00 .0000000e+00 -.1087220e+08 -.2183162e+08 -.1095942e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2391785e+08 .3480520e+07 .2739837e+08 .0000000e+00 .0000000e+00 -.1855106e+07 -.5966605e+07 -.4111499e+07 .0000000e+00 .0000000e+00 .2577296e+08 .2486086e+07 -.2328688e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1095942e+08 -.2213817e+08 -.1117875e+08 .0000000e+00 .0000000e+00 .2191884e+08 .4427633e+08 .2235749e+08 .0000000e+00 .0000000e+00 -.1095942e+08 -.2213817e+08 -.1117875e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2260163e+08 .8226099e+07 .3082772e+08 .0000000e+00 .0000000e+00 -.4111499e+07 -.1410188e+08 -.9990385e+07 .0000000e+00 .0000000e+00 .2671312e+08 .5875785e+07 -.2083734e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1117875e+08 -.2289026e+08 -.1171152e+08 .0000000e+00 .0000000e+00 .2235749e+08 .4578053e+08 .2342304e+08 .0000000e+00 .0000000e+00 -.1117875e+08 -.2289026e+08 -.1171152e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2477196e+08 .2522804e+08 .0000000e+00 .0000000e+00 .0000000e+00 -.3648702e+06 -.3648702e+06 .0000000e+00 .0000000e+00 .0000000e+00 .2513683e+08 -.2486317e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.1087220e+08 .0000000e+00 .0000000e+00 .0000000e+00 .2174439e+08 .2174439e+08 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.1087220e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2477196e+08 .1001005e+07 .2577296e+08 .0000000e+00 .0000000e+00 -.3648702e+06 -.1601608e+07 -.1236738e+07 .0000000e+00 .0000000e+00 .2513683e+08 .6006029e+06 -.2453622e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.2183162e+08 -.1095942e+08 .0000000e+00 .0000000e+00 .2174439e+08 .4366323e+08 .2191884e+08 .0000000e+00 .0000000e+00 -.1087220e+08 -.2183162e+08 -.1095942e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2422704e+08 .2486086e+07 .2671312e+08 .0000000e+00 .0000000e+00 -.1236738e+07 -.3977737e+07 -.2740999e+07 .0000000e+00 .0000000e+00 .2546378e+08 .1491651e+07 -.2397213e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1095942e+08 -.2213817e+08 -.1117875e+08 .0000000e+00 .0000000e+00 .2191884e+08 .4427633e+08 .2235749e+08 .0000000e+00 .0000000e+00 -.1095942e+08 -.2213817e+08 -.1117875e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2328688e+08 .5875785e+07 .2916266e+08 .0000000e+00 .0000000e+00 -.2740999e+07 -.9401256e+07 -.6660257e+07 .0000000e+00 .0000000e+00 .2602787e+08 .3525471e+07 -.2250240e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1117875e+08 -.2289026e+08 -.1171152e+08 .0000000e+00 .0000000e+00 .2235749e+08 .4578053e+08 .2342304e+08 .0000000e+00 .0000000e+00 -.1117875e+08 -.2289026e+08 -.1171152e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2486317e+08 .2513683e+08 .0000000e+00 .0000000e+00 .0000000e+00 -.1824351e+06 -.1824351e+06 .0000000e+00 .0000000e+00 .0000000e+00 .2504561e+08 -.2495439e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.1087220e+08 .0000000e+00 .0000000e+00 .0000000e+00 .2174439e+08 .2174439e+08 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.1087220e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2486317e+08 .6006029e+06 .2546378e+08 .0000000e+00 .0000000e+00 -.1824351e+06 -.8008039e+06 -.6183688e+06 .0000000e+00 .0000000e+00 .2504561e+08 .2002010e+06 -.2484541e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1087220e+08 -.2183162e+08 -.1095942e+08 .0000000e+00 .0000000e+00 .2174439e+08 .4366323e+08 .2191884e+08 .0000000e+00 .0000000e+00 -.1087220e+08 -.2183162e+08 -.1095942e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2453622e+08 .1491651e+07 .2602787e+08 .0000000e+00 .0000000e+00 -.6183688e+06 -.1988868e+07 -.1370500e+07 .0000000e+00 .0000000e+00 .2515459e+08 .4972171e+06 -.2465738e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1095942e+08 -.2213817e+08 -.1117875e+08 .0000000e+00 .0000000e+00 .2191884e+08 .4427633e+08 .2235749e+08 .0000000e+00 .0000000e+00 -.1095942e+08 -.2213817e+08 -.1117875e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.2397213e+08 .3525471e+07 .2749760e+08 .0000000e+00 .0000000e+00 -.1370500e+07 -.4700628e+07 -.3330128e+07 .0000000e+00 .0000000e+00 .2534262e+08 .1175157e+07 -.2416747e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 -.1117875e+08 -.2289026e+08 -.1171152e+08 .0000000e+00 .0000000e+00 .2235749e+08 .4578053e+08 .2342304e+08 .0000000e+00 .0000000e+00 -.1117875e+08 -.2289026e+08 -.1171152e+08 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .0000000e+00 .1000000e+01 0707070014230643101006440057030057030000011716100522627504100003000000063512post.src/tests/postbgi1 7B+@J@\6556I 03 09-23-84 22.961 frame no. 01 MH9220,M158,DREXLER +BCD1@@`G+BxBu 0.1+BCD1AN@@@@`G@@@G+CtBu 0.2+DMCD1AO@@@@`G@@@G+EBBu 0.3+E\CD1AN@@@@`G@@@G+FPBu 0.4+FjCD1AN@@@@`G@@@G+G_Bu 0.5+GxCD1AN@@@@`G@@@G+HmBu 0.6+IFCD1AN@@@@`G@@@G+I{Bu 0.7+JTCD1AN@@@@`G@@@G+KIBu 0.8+KbCD1AN@@@@`G@@@G+LWBu 0.9+LpCD1AO@@@@`G@@@G+MeBu 1.0+HXB] X+BCD1`G@@+BmB}-1.0+BCD1@@A``G@@@G@@+BmDQ-0.8+BDd1@@A``G@@@G@@+BmEq-0.6+BFD1@@A``G@@@G@@+BmGQ-0.4+BGd1@@A``G@@@G@@+BmHq-0.2+BID1@@A``G@@@G@@+BmJK 0.0+BJd1@@A``G@@@G@@+BmKk 0.2+BLD1@@A``G@@@G@@+BmMK 0.4+BMd1@@A``G@@@G@@+BmNj 0.6+BOD1@@A``G@@@G@@+BmPJ 0.8+BPd1@@A``G@@@G@@+BmQj 1.0+BYJ] Y+BN~1ANBnAO@@ANbnANdZANdZANbnAN@@ANBnAODZ% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 02 MH9220,M158,DREXLER +BCD1@@`J+BxBm107A+CNBw-1+BCD1CT@@@@`G@@@GA|@@@@`G@@@GAX@@@@`G@@@GAD@@@@`G@@@G@x@@@@`G@@@G@o@@@@`G@@@G@h@@@@`G@@@G@d@@@@`G@@@G@a@@@@`J@@@J7B+MwBm107A+NMBw07B+HXBX X+BCD1`G@@+BmB}-1.0+BCD1@@A``G@@@G@@+BmDQ-0.8+BDd1@@A``G@@@G@@+BmEq-0.6+BFD1@@A``G@@@G@@+BmGQ-0.4+BGd1@@A``G@@@G@@+BmHq-0.2+BID1@@A``G@@@G@@+BmJK 0.0+BJd1@@A``G@@@G@@+BmKk 0.2+BLD1@@A``G@@@G@@+BmMK 0.4+BMd1@@A``G@@@G@@+BmNj 0.6+BOD1@@A``G@@@G@@+BmPJ 0.8+BPd1@@A``G@@@G@@+BmQj 1.0+BYJ] Y+BN~1CTBnA|@@AXbnADdZ@xdZ@obn@h@@@dBn@aDZ% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 03 MH9220,M158,DREXLER +BN~1CTBnA|@@AXbnADdZ@xdZ@obn@h@@@dBn@aDZ% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 04 MH9220,M158,DREXLER 7C+EWQhEXAMPLE OF A POLAR PLOT+J_Hr1@@`G+J_Hr1B@@@@@`G@@@G7B+LEHb 0.4+L_Hr1B@@@@@`G@@@G+NEHb 0.8+KmHJREAL AXES+J_Hr1`G@@+J_Hr1@@B@`G@@@G@@+JLJX 0.4+J_Jr1@@B@`G@@@G@@+JLLX 0.8+J_Lr1@@B@`G@@@G@@+JLNX 1.2+J_Nr1@@A`G@@@G@@+JLPX 1.6+IyL@IMAG AXES+B_Hr1@@`G+BXHb 1.6+B_Hr1B@@@@@`G@@@G+DFHb 1.2+D_Hr1B@@@@@`G@@@G+FFHb 0.8+F_Hr1B@@@@@`G@@@G+HFHb 0.4+H_Hr1B@@@@@`G@@@G+F^HJ +J_Dr1`G@@+JLDk 0.8+J_Dr1@@B@`G@@@G@@+JLFY 0.4+J_Fr1@@B@`G@@@G@@+IyFq +JdHm1@@@K@J@@@@`K`J@@+JiHr1@J@B@I@C@J@E@H@E@I@G@G@H@G@H@E@J@E@J@C@K+KmIr1@@@J@J@@@@`J`J@@+KrIw1@C@K@A@L@@@M`B@L`C@M`D@L`E@M`G@L`H@L`I@K+KJKk1@@@J@K@@@@`J`K@@+KPKp1`K@J`L@J`L@H`N@H`O@F`O@F`P@D`Q@C`Q@A`Q@@+HxLc1@@@J@K@@@@`J`K@@+H~Lh1`R`B`R`C`Q`E`R`F`Q`G`P`I`P`K`O`K`N`M`M`O+FWKQ1@@@J@J@@@@`J`J@@+F\KV1`L`O`K`P`J`R`H`R`G`R`F`T`D`S`B`T`A`T@A`T+E[HY1@@@J@J@@@@`J`J@@+E`H^1@B`T@D`T@F`S@G`S@H`R@J`Q@K`P@L`P@M`N@N`M+FrEm1@@@J@J@@@@`J`J@@+FwEr1@O`L@P`J@P`I@Q`H@R`F@Q`D@R`C@R`B@Q@@@Q@A+I[Dx1@@@J@J@@@@`J`J@@+I`D}1@Q@C@P@D@O@E@O@G@N@G@L@I@L@J@K@J@I@K@H@L+K\FF1@@@J@J@@@@`J`J@@+KaFK1@G@L@E@L@D@M@C@L@B@M@@@L`A@L`C@L`C@K`E@J+KeG}1@@@J@J@@@@`J`J@@+KjHB1`E@J`G@H`G@H`I@F`H@F`J@D`I@C`J@B`J@A@J@@+JdHm1@@@K@J@@@@`K`J@@% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 05 MH9220,M158,DREXLER 7C+EESHTHE USE OF CURVE AND GRAF+B_CD1@@`G7B+BXBu 0.0+B_CD1AM@@@@`G@@@G+CSBu 1.0+ClCD1AM@@@@`G@@@G+D_Bu 2.0+DyCD1AM@@@@`G@@@G+ElBu 3.0+FFCD1AL@@@@`G@@@G+FyBu 4.0+GRCD1AM@@@@`G@@@G+HFBu 5.0+H_CD1AM@@@@`G@@@G+IRBu 6.0+IlCD1AL@@@@`G@@@G+J_Bu 7.0+JxCD1AM@@@@`G@@@G+KlBu 8.0+LECD1AM@@@@`G@@@G+LyBu 9.0+MRCD1AM@@@@`G@@@G+MBu 10.0+GzB]X LABEL+B_CD1`G@@+BMB} 0.0+B_CD1@@A``G@@@G@@+BMDK 1.0+B_Dd1@@A``G@@@G@@+BMEk 2.0+B_FD1@@A``G@@@G@@+BMGK 3.0+B_Gd1@@A``G@@@G@@+BMHk 4.0+B_ID1@@A``G@@@G@@+BMJK 5.0+B_Jd1@@A``G@@@G@@+BMKk 6.0+B_LD1@@A``G@@@G@@+BMMK 7.0+B_Md1@@A``G@@@G@@+BMNj 8.0+B_OD1@@A``G@@@G@@+BMPJ 9.0+B_Pd1@@A``G@@@G@@+BMQd 10.0+AyIY LABEL+B^CC1@@OBLB@@@@oBlB@@+B_CD1@@O@L@@@@@o@l@@@+BaCF1@@N|K|@@@@n|k|@@+BbCI1@@@J@J@@@@`J`J@@+BgCN1@H@J@G@I@H@J@H@I@G@J@H@J@H@I@G@J@H@I@H@J+CoDi1@@@J@J@@@@`J`J@@+CtDn1@G@I@H@J@H@J@G@I@H@J@H@I@G@J@H@J@H@I@G@J+D{FI1@@@J@K@@@@`J`K@@+E@FN1@H@I@H@J@G@J@H@I@H@J@H@I@G@J@H@J@H@I@G@J+FHGi1@@@J@J@@@@`J`J@@+FMGn1@H@I@H@J@G@J@H@I@H@J@G@I@H@J@H@I@G@J@H@J+GUII1@@@J@J@@@@`J`J@@+GZIN1@H@I@G@J@H@I@H@J@G@J@H@I@H@J@G@I@H@J@H@J+HbJh1@@@K@J@@@@`K`J@@+HgJn1@G@I@H@J@H@I@G@J@H@J@H@I@G@J@H@I@H@J@G@J+InLH1@@@K@J@@@@`K`J@@+IsLN1@H@I@H@J@G@I@H@J@H@I@G@J@H@J@H@I@G@J@H@I+J{Mh1@@@K@J@@@@`K`J@@+K@Mm1@H@J@G@J@H@I@H@J@G@I@H@J@H@J@G@I@H@J@H@I+LHOH1@@@J@J@@@@`J`J@@+LMOM1@G@J@H@J@H@I@H@J@G@I@H@J@H@J@G@I@H@J@H@I+MTPh1@@@J@K@@@@`J`K@@+MZPm1@G@J@H@I@H@J@G@J@H@I@H@J@G@I@H@J@H@J+NYQ1@@@J@K@@@@`J`K@@+BdB1`B@C@@@E@B@C@F@@@B`C@@`E`B`C`F@@+CKCC1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+CqCK1`B@B@@@F@B@B@E@@@C`B@@`F`C`B`E@@+DXCX1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+D~Cj1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+EdD@1`B@C@@@E@B@B@E@@@C`B@@`E`C`C`E@@+FKD[1`C@C@@@E@C@C@E@@@B`C@@`E`B`C`E@@+FqD|1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+GWEa1`B@B@@@E@B@C@E@@@C`C@@`E`C`B`E@@+G~FJ1`C@C@@@E@C@B@E@@@B`B@@`E`B`C`E@@+HdFy1`B@B@@@E@B@C@E@@@C`C@@`E`C`B`E@@+IJGl1`B@C@@@E@B@B@F@@@B`B@@`E`B`C`F@@+IqHd1`C@C@@@E@C@B@E@@@B`B@@`E`B`C`E@@+JWIa1`B@C@@@E@B@B@E@@@C`B@@`E`C`C`E@@+J~Jc1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+KdKi1`C@C@@@E@C@C@E@@@C`C@@`E`C`C`E@@+LJLu1`B@B@@@E@B@C@E@@@C`C@@`E`C`B`E@@+LqNE1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+MWOZ1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+M}Ps1`B@C@@@E@B@C@E@@@C`C@@`E`C`C`E@@+N\Q1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+BgCD1@H@@@G@@@H@@@H@@@G@A@H@@@H@@@G@@@H@@@H@A@G@@@H@@@H@A@G@A@H@@@H@A@G@A@H@A@H@A@G@A@H@B@H@A@G@B@H@A@H@B@H@B@G@B@H@C@H@B@G@C@H@C@H@C@G@C@H@C@H@D@G@D@H@D@H@D@G@E@H@D@H@E@G@F@H@E@H@F@G@F@H@F@H@F@G@G@H@G+H_D|1@H@H@G@G@H@H@H@H@G@I@H@I@H@I@G@J@H@I@H@K@G@J@H@K@H@K@G@L@H@L@H@L@G@M@H@M@H@M@G@N@H@O@H@N@G@P@H@O@H@P@G@P@H@Q@H@R@G@Q@H@S@H@R@G@S@H@T@H@T@H@T@G@V@H@U@H@V@G@W@H@W@H@W@G@X@H@Y@H@Y@G@Z@H@Z@H@[@G@[@H@\+NWQg1@H@]+BwQZTHREE CURVES ON THE SAME AXIS SYSTEM HAVING+D}PjDIFFERENT MARKER TYPES% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 06 MH9220,M158,DREXLER 7C+D@I]XGRAF WITH A GRID+LcCo1@G@@7B+LsCh 0.0+LcCo1@@Ag@G@@`G@@+LsD| 0.1+LcEV1@@Af@G@@`G@@+LsFc 0.2+LcF|1@@Af@G@@`G@@+LsHI 0.3+LcHb1@@Ag@G@@`G@@+LsIo 0.4+LcJI1@@Af@G@@`G@@+LsKV 0.5+LcKo1@@Af@G@@`G@@+LsL| 0.6+LcMU1@@Ag@G@@`G@@+LsNb 0.7+LcN|1@@Af@G@@`G@@+LsPI 0.8+LcPb1@@Af@G@@`G@@+LsQo 0.9+LcRH1@@Ag@G@@`G@@+LsSU 1.0+MKJBX AXIS IS GRAF TYPE+LcCo1@@`G+LnC_1`E@@+LcCc1@@@@@@`I@@@@@B@B+L^Cc1@@@@`A@@@@@@@A@@+LXCc1`A@@`A@@`A`B@@`D@A`B@A`A@A@@@A@A@A@B@@@D`A@B`A@@+LcCo1b@@@@@`G@@@G+JzC_1`E@@+JpCc1`A@@`A@@`A`B@@`D@A`B@A`A@A@@@A@A@A@B@@@D`A@B`A@@+JjCc1@@@@`A@@@@@@@A@@+JeCc1`B@@`A@@`A`A@@`C@A`A@A@@@B@@@@`D`D@@+JcCo1a@@@@`G@@@G+HwCc1`B@@`A@@`A`B@@`D@A`B@A`A@B@@@@@A@A@B@@@D`A@B@@@@+HpCc1@@@@`A@@@@@@@A@@+HkCc1`B@@`A@@@@`B@@`D@@`B@A`A@B@@@A@A@@@B@@@D@@@B`A@@+HdCo1b@@@@@`G@@@G+FwCc1`B@@`A@@@@`B@@`D@@`B@A`A@B@@@A@A@@@B@@@D@@@B`A@@+FqCc1@@@@`B@@@@@@@B@@+FlCc1`C@@@@@@`A`A@@`C@A`A@@@@@C@@@@`D`D@@+FdCo1b@@@@@`G@@@G+DuCc1@@@@@@`I@A@@@B@B+DqCc1@@@@`B@@@@@@@B@@+DkCc1`B@@`A@@@@`B@@`D@@`B@A`A@B@@@A@A@@@B@@@D@@@B`A@@+JMCJ1@C`H@@@B+JMCO1@@@A@@`F`D`H@@@B+IsCK1@F@@+IzCO1@A@A`D`N`E@N@@`A+InCO1@A@A`I`N@A@B+InCD1@A`B`I@N@@`A+I`CB1@B@@+I`CP1@@`N`B@@+IbCP1`D@@+IZCM1`A@B`A@A`C@@`B`A@@`B@@`A@@`B@B`A@C@@@B`A@@`B@@@@@@`B`B`B`C@@`B@B@@@B+IBCB1@B@@+IBCP1@@`N`B@@+IDCP1`D@@+H|CM1`A@B`A@A`D@@`A`A@@`B@@`A@@`B@A`A@D@@@A`A@A`B@@@@`A`B`A`B`D@@`A@B@@@B+H`CJ1`B@@@@@F@F@@@@`A@A`B@@`G`A`C@@`A`D@@`A@B`A@B+HZCO1@@@A@@`N`F@@`A@B@@@B@@@@@@@B@A@A@F@@+HUCI1`C@G@A`A+HGCK1@F@@+HNCO1@A@A`E`N`E@N@A`A+HCCO1@@@A@@`N`F@@`A@B`A@B@@@A@A@B@A@A@F@@+GxCO1@@@A@@`N@@@B+GpCD1@@`B@@@N@@`A+GpCI1@H@@+G]CB1@D@@+G]CO1@@@A@@`N`E@@+GQCJ1@D`H`A@B+GQCO1@@@A@@`F`D`H@A@B+GJCO1@@@A@@`N`E@@`B@B@@@B@@@A@@@B@B@A@E@@+FwCP1@H@@@@`N`H@@+FwCI1@H@@+LcDI1g@@+DdDc1G@@+LcD|1g@@+DdEV1G@@+LcEo1g@@+DdFI1G@@+LcFc1g@@+DdF|1G@@+LcGV1g@@+DdGo1G@@+LcHI1g@@+DdHb1G@@+LcH|1g@@+DdIV1G@@+LcIo1g@@+DdJI1G@@+LcJb1g@@+DdJ|1G@@+LcKV1g@@+DdKo1G@@+LcLI1g@@+DdLb1G@@+LcL|1g@@+DdMU1G@@+LcMo1g@@+DdNI1G@@+LcNb1g@@+DdN|1G@@+LcOU1g@@+DdOo1G@@+LcPH1g@@+DdPb1G@@+LcP|1g@@+DdQU1G@@+LcQo1g@@+DdRH1G@@+LcRb1g@@+DdR|1G@@+LcSU1g@@+KcCo1@@P@+JcSo1@@p@+IcCo1@@P@+HcSo1@@p@+GdCo1@@P@+FdSo1@@p@+EdCo1@@P@+LcCo1g@@@@P@G@@@@p@+GfCz1`v@J`l@J``@J`R@K`D@J@J@J@V@J@_@J@g@K@l@J@m@J@l@J@h@K@b@J@[@J@Q@J@G@K`B@J`K@J`R@J`Y@J`]@K`^@J`_@J`^@J`Y@K`U@J`O@J`H@J`B@K@D@J@K@J@O@J@R@J@U@K@U@J@U@J@S@J@P@K@L@J@H@J@D@J`A@K`E@J`I@J`L@J`M@K`O@J`N@J+HdKo1`N@J`L@J`J@K`G@J`D@J`A@J@B@K@E@J@G@J@I@J@I@K@K@J@I@J@I@J@H@J@F@K@D@J@A@J@@@J`C@K`D@J`E@J`G@J`G@K`F@J`G@J`F@J`D@J`D@K`A@J`A@J@A@J@B@K@D@J@D@J@D@J@E@K@E@J@D@J@D@J@B@J@B@K@A@J@@@J`A@J`B@K`C@J`C@J`C@J+HgSd1`C@K+DsCz1@^@J@h@J@q@J@v@K@v@J@t@J@o@J@g@J@]@K@R@J@F@J`F@J`O@K`X@J``@J`c@J`f@K`e@J`b@J`]@J`X@J`P@K`H@J@@@J@G@J@N@K@S@J@W@J@Y@J@Z@K@Y@J@V@J@R@J@N@J@H@K@C@J`B@J`H@J`K@K`O@J`Q@J`Q@J`R@K`P@J`N@J`K@J`H@K`C@J@@@J+GkKo1@C@J@F@J@J@K@J@J@L@J@M@J@K@K@K@J@H@J@G@J@D@K@A@J`A@J`D@J`E@J`G@K`H@J`H@J`H@J`H@K`G@J`E@J`D@J`A@K@@@J@A@J@C@J@E@J@E@K@E@J@F@J@F@J@E@K@D@J@C@J@B@J@@@K@@@J`B@J`C@J`C@J`D@K`C@J`D@J`D@J`C@K`C@J`A@J`A@J+HWSd1@@@K% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 07 MH9220,M158,DREXLER 7C+ENRhLOG TYPE GRID USING YLOG+B^Ch1@@NALB@@@@nAlB@@+B_Ci1@@ML@@@@@ml@@@+BaCj1@@M}K|@@@@m}k|@@+B_Ci1@@`G7B+BXCZ-1.5+B_Ci1B@@@@@`G@@@G+DLCZ-1.0+D_Ci1B@@@@@`G@@@G+FLCZ-0.5+F_Ci1B@@@@@`G@@@G+HFCZ 0.0+H_Ci1B@@@@@`G@@@G+JFCZ 0.5+J_Ci1B@@@@@`G@@@G+LECZ 1.0+L_Ci1B@@@@@`G@@@G+NECZ 1.5+FlCAX AXIS IS GRAPH TYPE+B_Ci1`J@@+BKCa107A+BACx-2+B_Ci1@@BG`G@@@G@@@@AN`G@@@G@@@@@x`G@@@G@@@@@l`G@@@G@@@@@c`G@@@G@@@@@^`G@@@G@@@@@Z`G@@@G@@@@@W`G@@@G@@@@@U`J@@@J@@7B+BKJa107A+BAJw-1+B_Ji1@@BF`G@@@G@@@@AO`G@@@G@@@@@x`G@@@G@@@@@k`G@@@G@@@@@d`G@@@G@@@@@^`G@@@G@@@@@Z`G@@@G@@@@@W`G@@@G@@@@@T`J@@@J@@7B+BKQa107A+BAQw07B+AtJIY AXIS+C_Ci1@@M+D_Qh1@@m+E_Ci1@@M+F_Qh1@@m+G_Ci1@@M+H_Qh1@@m+I_Ci1@@M+J_Qh1@@m+K_Ci1@@M+L_Qh1@@m+M_Ci1@@M+B_DL1L@@@+N_Dj1l@@@+B_ED1L@@@+N_E[1l@@@+B_Ep1L@@@+N_FB1l@@@+B_FS1L@@@+N_Fc1l@@@+B_Fq1L@@@+N_F~1l@@@+B_GK1L@@@+N_GW1l@@@+B_Gb1L@@@+N_Gl1l@@@+B_Gv1L@@@+N_H@1l@@@+B_HI1L@@@+N_HR1l@@@+B_HZ1L@@@+N_Hb1l@@@+B_Hi1L@@@+N_Hq1l@@@+B_Hx1L@@@+N_H1l@@@+B_IE1L@@@+N_IU1l@@@+B_Ic1L@@@+N_Iq1l@@@+B_I}1L@@@+N_JI1l@@@+B_JT1L@@@+N_J_1l@@@+B_Ji1L@@@+N_KL1l@@@+B_Kj1L@@@+N_LD1l@@@+B_L[1L@@@+N_Lo1l@@@+B_MB1L@@@+N_MS1l@@@+B_Mb1L@@@+N_Mq1l@@@+B_M~1L@@@+N_NK1l@@@+B_NV1L@@@+N_Nb1l@@@+B_Nl1L@@@+N_Nv1l@@@+B_O@1L@@@+N_OI1l@@@+B_OQ1L@@@+N_OZ1l@@@+B_Oa1L@@@+N_Oi1l@@@+B_Op1L@@@+N_Ow1l@@@+B_O~1L@@@+N_PE1l@@@+B_PT1L@@@+N_Pc1l@@@+B_Pp1L@@@+N_P}1l@@@+B_QI1L@@@+N_QT1l@@@+B_Q^1L@@@+B_Ci1@@ML@@@@@ml@@@+I]Ci1@vBG@lAN@_@x@R@l@D@c`I@^`V@Z``@W`g@U`k@R`n@Q`l@P`h@N`b@M`Z@M`Q@L`G@K@B@J@J@J@S@J@X@I@]@H@_@I@_@H@]@G@Z@H@U@G@N@G@I@F@B@G`E@F`J@F`O@E`R@F`U@F`U@E`U@E`S@E`P@E`M@E`H@E`C@D@A@E@E@D@I@D@K@D@N@E@N@D@O@C+H_Oa1@N@D@L@D@J@D@G@C@D@D@A@C`C@D`D@C`G@D`I@C`J@C`J@C`J@C`I@C`G@C`F@C`D@C`B@C@A@C@B@C@D@C@F@B@F@C@G@C@G@B@F@C@F@B@E@C@C@B@B@C@@@B`A@C`B@B`C@B`D@C`E@B`E@B`D@B`E@C`C@B`C@B`B@B@@@B@@@B@A@B@B@B@B@B@C@B@D@B+H\Qf1@C@B+LOCi1`]BG`iAN`p@x`v@l`w@c`t@^`o@Z`f@W`]@U`R@R`F@Q@E@P@P@N@X@M@_@M@d@L@e@K@e@J@b@J@^@J@W@I@P@H@I@I@@@H`G@G`N@H`T@G`W@G`Y@F`Z@G`X@F`V@F`S@E`M@F`I@F`C@E@C@E@G@E@L@E@N@E@Q@E@R@D@Q@E@P@D@N@D@K@D@H@E@D@D@@@C+IXOa1`C@D`G@D`I@D`K@C`L@D`L@C`L@D`J@C`I@D`F@C`D@C`B@C@B@C@C@C@F@C@F@C@H@C@I@C@H@C@H@C@F@C@E@B@D@C@B@C@@@B`B@C`C@B`D@C`E@B`F@C`F@B`E@C`E@B`D@B`C@C`B@B`A@B@A@B@B@C@B@B@C@B@D@B@D@B@D@B@D@B@C@B@B@B@B@B@A@B+HlQf1@@@B% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 08 MH9220,M158,DREXLER 7C+E`QhA POLAR PLOT WITH GRID+H_Jr1@@`G+H_Jr1B@@@@@`G@@@G7B+JFJb 0.5+J_Jr1B@@@@@`G@@@G+LEJb 1.0+L_Jr1B@@@@@`G@@@G+NEJb 1.5+JJJRADIUS+H_Jr1`G@@+H_Jr1@@B@`G@@@G@@+HMLX 0.5+H_Lr1@@B@`G@@@G@@+HMNX 1.0+H_Nr1@@A`G@@@G@@+HMPX 1.5+GyMp +B_Jr1@@`G+BXJb 1.5+B_Jr1B@@@@@`G@@@G+DFJb 1.0+D_Jr1B@@@@@`G@@@G+FFJb 0.5+F_Jr1B@@@@@`G@@@G+E^JJ +H_Dr1`G@@+HMDk 1.5+H_Dr1@@B@`G@@@G@@+HMFY 1.0+H_Fr1@@B@`G@@@G@@+HMHX 0.5+H_Hr1@@B@`G@@@G@@+GyGq +N^J1a`D+L^KD1B@@H+N\KZ1a`N+L\KU1A@R+NYKt1c|`l+LYKg1A}@Z+NSLO1a|`_+LUKx1A{@c+NLLh1az`g+HkJv1E\A+NCMA1aw`o+LILZ1At@t+MxMZ1as`x+LALj1Aq@|+MkMr1c]b@+KxLy1AlAD+M]NH1ajaG+KnMH1AgAK+MMN^1adaO+HiJz1D\Cn+L|Nr1a_aU+KWMc1A\AY+LiOF1aXa\+KJMp1AVA_+LVOX1becD+J|M{1AOAe+L@Oh1aKag+JnNF1AGAj+KjOw1aDal+HeJ}1BzEA+KSPD1`|ap+JONX1@xAs+J{PP1`tau+IN_1@pAv+JbPZ1aWcp+InNe1@hAz+JIPc1`da{+I]Nj1@_A|+IoPi1`[a}+HaJ~1AAEn+ITPn1`Qa+HzNp1@MA+HzPp1`Ia+HhNq1@DB@+H_Pq1@@c+HVNq1`DB@+HDPp1@Ia+HDNp1`MA+GjPn1@Qa+H]J~1aAEn+GOPi1@[a}+GaNj1`_A|+FuPc1@ca{+GPNe1`hAz+F\PZ1AWcp+FN_1`pAv+FCPP1@tau+FoNX1`xAs+EkPD1@|ap+HYJ}1bzEA+ETOw1ACal+FPNF1aHAj+D}Oh1ALag+FBM{1aOAe+DhOX1BecD+EtMp1aVA_+DTOF1AYa\+EgMc1a\AY+DBNr1A_aU+HUJz1d\Cn+CqN^1AdaO+EPMH1agAK+CaNH1AjaG+EFLy1alAD+CSMr1C]b@+D}Lj1aq@|+CFMZ1As`x+DuLZ1at@t+B{MA1Aw`o+HSJv1e]A+BrLh1Az`g+DiKx1a{@c+BkLO1A|`_+DeKg1a}@Z+BeKt1C|`l+DbKU1a@R+BaKZ1B@`N+D`KD1b@@H+B`J1A`D+HRJr1es@@+B`Jd1A@E+D`J`1b@`I+BaJJ1B@@M+DbJN1a`R+BeIo1C|@m+DeI}1a}`[+BkIU1A|@_+DiIk1a{`c+BrH{1Az@h+HSJm1e]a+B{Hb1Aw@p+DuIJ1at`t+CFHJ1As@x+D}Hz1aq`|+CSGr1C]B@+EFHj1alaD+CaG[1AjAH+EPH[1agaK+CqGE1AdAO+HUJi1d\cn+DBFq1A_AV+EgH@1a\aY+DTF^1AYA\+EtGt1aVa_+DhFL1BeCD+FBGh1aOae+D}E{1ALAh+FPG^1aHaj+ETEl1ACAm+HYJg1bzeB+EkE_1@|Aq+FoGL1`xas+FCES1@tAu+FGE1`paw+F\EI1AWCq+GPF~1`hay+FuEA1@cA{+GaFz1`_a}+GODz1@[A~+H]Je1aAem+GjDv1@QA~+HDFs1`Ma+HDDs1@IB@+HVFr1`Db@+H_Dr1@@D@+HhFr1@Db@+HzDs1`IB@+HzFs1@Ma+ITDv1`QA~+HaJe1AAem+IoDz1`[A~+I]Fz1@_a}+JIEA1`dA{+InF~1@hay+JbEI1aWCq+IGE1@paw+J{ES1`tAu+JOGL1@xas+KSE_1`|Aq+HeJg1BzeB+KjEl1aDAm+JnG^1AGaj+L@E{1aKAh+J|Gh1AOae+LVFL1beCD+KJGt1AVa_+LiF^1aXA\+KWH@1A\aY+L|Fq1a_AV+HiJi1D\cn+MMGE1adAO+KnH[1AgaK+M]G[1ajAH+KxHj1AlaD+MkGr1c]B@+LAHz1Aq`|+MxHJ1as@x+LIIJ1At`t+NCHb1aw@p+HkJm1E\a+NLH{1az@h+LUIk1A{`c+NSIU1a|@_+LYI}1A}`[+NYIo1c|@l+L\JN1A`R+N\JJ1a@M+L^J`1B@`I+N^Jd1a@E+HlJr1Es@@+HlJr1`B@F`E@E`F@B`F`B`E`E`B`F@B`G@E`D@F`B@F@B@E@D@B@G+HJr1`A@F`B@F`C@F`D@E`E@D`F@C`F@A`G@A`F`A`F`C`F`C`D`D`D`F`C`F`A`F@@`G@A`F@C`F@D`E@D`E@F`C@F`B@F`A@G@@@F@B@F@C@E@D@D@D@C@F@B@F@A@G+I_Jr1@@@F`A@G`B@F`B@F`C@F`D@E`D@E`D@E`E@D`E@D`F@C`F@C`F@B`F@A`G@A`F@@`G`A`F`A`F`B`F`C`F`C`E`D`E`D`E`E`D`E`C`E`C`F`B`F`B`F`A`G@@`F@@`G@A`F@B`F@B`G@C`E@C`F@D`E@E`E@E`D@E`D@F`C@F`B@F`B@F`B@G@@@F@@@G@@@F@B+HoIt1@F@B@F@B@F@C@E@D@E@D@D@E@D@E@D@F@C@E@B@G@B@F@A@F@@@G+IJr1@@@F`A@F`A@G`B@F`A@F`C@F`B@F`D@F`C@E`D@E`D@E`D@E`E@D`E@D`E@D`F@C`F@C`F@B`F@B`F@B`F@A`F@A`G@A`F@@`G`A`F`A`F`A`F`B`G`B`E`B`F`C`F`C`E`D`E`D`E`D`D`E`D`E`D`E`D`E`C`F`B`F`C`F`B`F`A`F`A`G`A`F@@`F@@`G@A`F+G@Je1@A`F@A`G@B`F@C`F@B`F@C`E@D`F@D`E@D`E@D`D@E`E@E`D@E`C@F`C@F`C@F`C@F`B@F`B@F`A@F`A@G@@@F@@@G@@@F@A@F@A@F@B@F@B@F@C@F@C@F@C@E@C@E@D@E@E@D@D@D@E@D@E@C@F@D@E@B@F@C@F@A@F@B@G@A@F@A@F@@@G+J_Jr1@@@F`A@G`A@F`A@F`A@G`B@F`B@F`B@F`C@F`C@E`C@F`D@E`D@E`D@E`D@E`D@E`E@D`E@D`E@D`F@D`E@C`F@C`F@C`E@B`G@B`F@B`F@B`F@A`G@A`F@@`F@A`G@@`F`A`G`A`F`A`F`A`F`B`G`B`F`B`E`C`F`B`F`D`E`C`E`D`F`D`D`D`E`D`D`E`E`E+F{LB1`C`E`D`E`D`F`C`F`B`E`C`F`B`F`B`F`B`G`A`F`A`F`A`G@@`F@@`G@@`F@A`F@A`G@A`F@B`F@B`F@B`F@C`F@B`F@C`F@D`E@D`E@C`F@E`D@D`E@E`E@D`D@F`D@E`D@E`C@F`C@F`C@E`C@F`B@G`B@F`B@F`A@F`A@G`A@F@@@G@@@F@@@F@A@G@A@F@A+HzHu1@F@A@F@B@G@B@E@C@F@B@F@C@E@D@F@C@E@D@E@D@E@E@D@D@D@E@E@E@C@E@D@F@C@E@C@F@C@F@B@F@B@F@B@F@A@F@A@G@A@F@A@F@@@G+JJr1@@@F`A@F@@@G`A@F`A@F`B@G`A@F`B@F`B@F`C@F`B@F`C@F`C@E`D@F`C@E`D@E`D@E`D@E`D@E`E@D`D@E`E@D`E@D`E@D`F@C`E@D`F@C`E@C`F@B`F@C`F@B`F@B`F@B`G@A`F@A`F@A`G@A`F@@`F@A`G@@`F`A`G@@`F`A`F`A`F`B`G`A`F`B`F`B`F`B+GbMF1`F`C`E`C`F`C`F`C`E`C`E`D`E`D`E`D`E`D`E`E`D`D`D`E`D`E`D`E`D`F`C`E`C`F`C`E`C`F`B`F`C`F`B`F`A`F`B`F`A`G`A`F`A`F`A`G@@`F@@`F@@`G@A`F@A`G@A`F@A`F@B`F@A`G@B`F@C`F@B`F@C`E@C`F@C`F@C`E@D`E@D`E@D`E@D`E@D`E+FmIA1@E`D@E`D@E`E@E`C@E`D@E`D@F`C@F`C@E`C@F`B@F`B@F`C@F`A@G`B@F`A@F`A@F`A@G`A@F@@@G@@@F@@@F@@@G@A@F@A@F@A@G@B@F@B@F@A@F@C@F@B@F@C@E@C@F@C@E@C@F@D@E@C@E@D@E@E@D@D@E@E@D@D@D@E@D@E@D@E@C@F@D@E@C@F@C@F@B@E+JrIs1@C@F@B@F@B@G@A@F@B@F@A@F@A@G@@@F@A@F@@@G+K_Jr1@@@F`A@G@@@F`A@F`A@G`A@F`A@F`B@F`B@G`B@F`B@F`B@F`C@E`C@F`C@F`C@E`C@F`D@E`D@F`C@E`E@E`D@D`D@E`E@E`D@D`E@D`E@D`E@D`E@D`F@C`E@D`F@C`F@C`E@C`F@B`F@C`F@B`F@B`F@B`G@A`F@B`F@A`F@A`G@A`F@@`G@@`F@A`F`A`G@@+HRMq1`F@@`G`A`F`A`F`A`G`B`F`A`F`B`F`B`F`B`F`C`F`B`F`C`E`C`F`C`E`D`F`C`E`D`E`D`E`D`E`D`D`D`E`E`D`E`E`D`D`E`C`E`D`F`D`E`C`F`C`E`C`F`C`F`C`E`B`F`B`F`B`F`B`G`B`F`A`F`A`F`A`G`A`F@@`F`A`G@@`F@@`G@A`F@@`F@A`G+EaJX1@A`F@A`G@A`F@B`F@B`F@B`F@B`F@B`F@C`F@C`F@C`E@C`F@C`F@D`E@D`E@C`E@D`E@E`E@D`E@E`D@D`E@E`D@E`D@E`D@E`C@F`D@E`C@F`D@E`C@F`B@F`C@F`B@F`C@F`B@F`A@G`B@F`A@F`A@F`A@G`A@F`A@G@@@F@@@F@@@G@@@F@A@G@A@F@A@F@A+IEGv1@F@A@G@B@F@A@F@B@F@C@F@B@F@C@E@B@F@C@F@D@E@C@F@D@E@C@E@D@E@D@E@D@D@E@E@D@D@E@D@E@E@E@C@E@D@E@D@E@C@F@C@F@C@E@C@F@C@F@B@F@B@F@B@F@B@F@B@F@A@G@A@F@A@F@A@G@@@F@A@F@@@G+KJr1@@@F`A@G@@@F`A@F`A@G`A@F`A@F`A@G`B@F`A@F`B@F`B@F`C@F`B@F`C@F`B@F`C@F`C@E`D@F`C@E`D@F`C@E`D@E`D@E`D@E`E@E`D@D`E@E`D@D`E@D`E@E`E@D`E@C`F@D`E@D`E@C`F@C`F@C`E@C`F@C`F@B`F@C`F@B`F@B`F@B`F@B`G@A`F@A`F@A+IDNN1`G@A`F@A`F@A`G@@`F@@`G@A`F`A`F@@`G@@`F`A`G`A`F`A`F`A`G`B`F`A`F`B`F`B`F`B`F`B`F`C`F`C`F`B`E`C`F`C`E`D`F`C`E`D`E`D`E`C`E`D`E`E`E`D`E`D`D`E`E`E`D`E`D`E`D`E`D`E`C`E`D`F`C`E`C`F`C`E`C`F`C`F`B`F`C`F`B`F+EKKz1`B`F`B`F`A`F`B`G`A`F`A`F`A`F`A`G@@`F`A`G@@`F@@`G@@`F@A`F@@`G@A`F@A`F@A`G@A`F@B`F@A`G@B`F@B`F@B`F@C`F@B`F@C`F@C`E@C`F@C`F@C`E@D`E@C`F@D`E@D`E@D`E@D`E@E`E@D`D@E`E@E`D@E`D@E`D@E`D@E`D@E`C@F`D@E`C@F`C+FuGm1@E`C@F`C@F`C@F`B@F`B@F`C@F`B@F`A@G`B@F`A@F`B@F`A@G@@@F`A@G`A@F@@@F@@@G@@@F@@@G@A@F@@@F@A@G@A@F@A@F@A@G@B@F@B@F@A@F@B@F@C@F@B@F@C@F@B@E@C@F@C@F@D@E@C@E@C@F@D@E@D@E@D@E@D@E@D@D@E@E@D@D@E@E@E@D@D@D@F+KPHi1@D@E@C@E@D@E@C@F@D@E@C@F@C@F@B@E@C@F@B@F@C@F@B@F@B@F@A@G@B@F@A@F@A@F@A@G@A@F@A@F@@@G@A@F@@@G+L_Jr1@@@F`A@G@@@F`A@F@@@G`A@F`A@F`A@G`B@F`A@F`B@F`B@F`B@F`B@G`B@F`C@E`B@F`C@F`C@F`C@E`C@F`C@F`D@E`C@E`D@F`D@E`D@E`D@E`D@E`D@D`E@E`D@D`E@E`D@D`E@D`E@D`E@D`F@D`E@D`E@C`F@D`E@C`F@C`E@C`F@C`F@B`F@C`F@B`F@C+IuNc1`F@B`F@B`F@A`F@B`F@A`G@B`F@A`F@A`G@A`F@@`F@A`G@@`F@@`G@A`F`A`F@@`G@@`F`A`G`A`F`A`F`A`F`A`G`A`F`B`F`B`F`A`F`B`F`C`F`B`F`B`F`C`F`C`F`C`E`C`F`C`E`C`F`D`E`C`E`D`E`D`E`D`E`D`E`D`E`D`D`E`E`D`D`E`D`E`E`E+EYMT1`D`E`C`E`D`E`D`E`C`F`D`E`C`F`C`E`C`F`C`F`B`F`C`F`B`E`B`F`B`G`B`F`B`F`B`F`A`F`A`G`A`F`A`F`A`G`A`F@@`F`A`G@@`F@@`F@@`G@A`F@@`G@A`F@A`F@A`G@A`F@A`F@A`G@B`F@B`F@B`F@B`F@B`F@B`F@C`F@B`F@C`F@C`E@C`F@C`E+ECHo1@D`F@C`E@D`F@D`E@C`E@D`E@E`E@D`D@D`E@E`E@D`D@E`E@E`D@E`D@E`D@E`D@E`C@E`D@F`C@E`D@F`C@E`C@F`C@F`C@F`B@F`C@F`B@F`B@F`B@F`B@F`B@F`A@G`B@F`A@F`A@F`A@G`A@F@@@G`A@F@@@F@@@G@@@F@@@G@A@F@@@F@A@G@A@F@A@F@A+IPFw1@G@A@F@A@F@B@F@B@F@B@F@B@F@B@F@C@F@B@F@C@F@C@E@C@F@C@E@C@F@C@E@D@E@C@F@D@E@D@E@D@E@D@D@E@E@D@E@E@D@D@D@E@D@E@E@E@C@E@D@E@D@E@C@E@D@F@C@E@C@F@C@F@C@E@C@F@B@F@C@F@B@F@B@F@B@F@B@F@B@F@A@G@B@F@A@F@A@F+L\JK1@A@G@@@F@A@G@@@F@A@F@@@G+LJr1@@@F`A@G@@@F@@@F`A@G`A@F`A@F`A@G`A@F`A@F`B@G`B@F`A@F`B@F`B@F`B@F`C@F`B@F`C@F`B@F`C@F`C@E`C@F`C@E`D@F`C@E`D@F`D@E`C@E`D@E`D@E`D@E`E@E`D@D`D@E`E@E`E@D`D@D`E@D`E@E`E@D`E@C`F@D`E@D`E@C`F@D`E@C`F@C`E@C+JdNq1`F@C`F@C`F@B`F@C`F@B`F@B`F@C`F@B`F@A`F@B`F@B`G@A`F@A`F@A`G@A`F@A`F@A`G@A`F@@`F@@`G@@`F@@`G@@`F@@`F@@`G`A`F`A`G`A`F`A`F`A`F`A`G`A`F`B`F`B`F`A`F`B`F`C`F`B`F`B`F`C`F`B`F`C`F`C`E`C`F`C`E`C`F`D`E`C`F`D+EyN]1`E`D`E`C`E`D`E`E`E`D`D`D`E`D`E`E`D`E`D`D`E`E`D`E`D`E`D`E`D`E`C`E`D`F`C`E`D`F`C`E`C`F`C`F`C`E`B`F`C`F`B`F`C`F`B`F`B`F`B`F`B`F`A`F`B`G`A`F`A`F`A`G`A`F`A`F`A`G@@`F@@`F`A`G@@`F@@`G@A`F@@`G@@`F@A`F@A`G+DBJK1@A`F@A`F@A`G@A`F@B`F@A`F@B`F@B`G@B`F@B`F@C`F@B`F@C`F@B`E@C`F@C`F@C`E@C`F@D`E@C`F@D`E@C`E@D`F@D`E@D`E@D`E@E`D@D`E@D`E@E`D@E`E@D`D@E`D@E`D@E`D@E`D@F`D@E`C@E`D@F`C@E`D@F`C@E`C@F`C@F`B@F`C@F`B@F`C@F`B+F~Fc1@F`B@F`B@F`B@F`B@F`A@G`B@F`A@F`A@F`A@G`A@F`A@G@@@F`A@F@@@G@@@F@@@G@@@F@@@F@A@G@@@F@A@G@A@F@A@F@A@F@A@G@B@F@A@F@B@F@B@F@B@F@B@F@B@F@C@F@B@F@C@F@B@F@C@E@C@F@C@E@D@F@C@E@D@E@C@F@D@E@D@E@D@E@D@E@D@D@D+KbG^1@E@E@E@D@D@E@D@E@E@D@D@E@D@E@D@E@C@F@D@E@D@E@C@F@D@E@C@F@C@E@C@F@C@F@B@F@C@E@B@F@C@F@B@F@B@F@B@G@A@F@B@F@B@F@A@F@A@G@A@F@A@F@A@G@A@F@@@G@@@F@A@F@@@G+M_Jr1@@@F`A@G@@@F@@@F`A@G`A@F@@@F`A@G`B@F`A@F`A@G`B@F`A@F`B@F`B@F`B@F`B@F`B@F`B@F`C@F`B@F`C@F`C@F`C@E`C@F`C@F`C@E`C@F`D@E`C@E`D@F`D@E`D@E`D@E`D@E`D@E`D@D`D@E`E@E`D@D`E@E`E@D`E@D`D@D`E@D`E@D`F@D`E@D`E@C+KQN{1`E@D`F@C`E@D`F@C`F@C`E@C`F@C`F@B`F@C`E@B`F@C`F@B`F@B`F@B`G@B`F@B`F@B`F@A`F@A`G@B`F@A`F@A`G@A`F@A`F@@`G@A`F@@`F@@`G@@`F@@`G@@`F@@`F@@`G`A`F@@`G`A`F`A`F`A`F`A`G`B`F`A`F`A`F`B`F`B`G`B`F`B`F`B`F`B`F`C+FeOY1`F`B`E`C`F`B`F`C`F`C`E`C`F`C`E`D`F`C`E`D`E`C`E`D`F`D`E`D`E`D`E`D`D`D`E`D`E`E`D`D`E`E`D`E`D`D`D`E`E`E`D`E`C`E`D`E`D`F`C`E`D`E`C`F`C`E`D`F`C`F`B`E`C`F`C`F`B`F`C`F`B`F`B`F`B`F`B`F`B`F`B`F`B`F`A`F`A`G+CfKq1`B`F`A`F`A`G@@`F`A`F`A`G@@`F@@`G`A`F@@`F@@`G@A`F@@`F@@`G@A`F@A`G@@`F@A`F@A`G@B`F@A`F@A`F@B`G@B`F@B`F@B`F@B`F@B`F@B`F@C`F@B`F@C`F@C`E@B`F@C`F@D`E@C`F@C`E@D`F@C`E@D`E@D`E@C`E@D`E@E`E@D`E@D`E@D`E@E`D+D|GQ1@D`E@E`D@E`D@E`E@D`D@E`D@E`D@F`D@E`C@E`D@E`C@F`D@E`C@F`C@E`C@F`C@F`C@F`C@E`C@F`B@F`B@F`C@F`B@F`B@G`B@F`A@F`B@F`B@F`A@G`A@F`A@F`A@G`A@F`A@F`A@G@@@F`A@F@@@G@@@F@@@G@@@F@@@F@A@G@@@F@A@F@A@G@A@F@A@F@A+I[Ex1@G@A@F@A@F@B@F@B@F@A@G@B@F@B@F@B@F@C@F@B@E@B@F@C@F@C@F@C@F@C@E@C@F@C@E@C@F@D@E@C@E@D@E@C@F@D@E@D@E@D@D@D@E@E@E@D@E@D@D@E@E@D@D@E@D@E@D@E@D@E@D@E@D@E@D@E@D@E@C@E@D@F@C@E@C@F@C@E@D@F@B@F@C@E@C@F@B@F+MEHu1@C@F@B@F@B@F@B@F@B@F@B@F@B@F@A@G@B@F@A@F@A@F@B@G@A@F@@@F@A@G@A@F@@@G@@@F@A@F@@@G+MJr1@@@F`A@G@@@F@@@F`A@G@@@F`A@F`A@G`A@F`A@F`A@G`B@F`A@F`B@F`A@G`B@F`B@F`B@F`B@F`B@F`C@F`B@F`C@F`B@F`C@E`C@F`C@F`C@E`C@F`D@E`C@F`C@E`D@F`D@E`C@E`D@E`D@E`D@E`D@E`E@E`D@E`D@D`E@E`D@D`E@E`E@D`E@D`D@D`E@E+K|OD1`E@D`E@C`F@D`E@D`E@C`F@D`E@C`E@D`F@C`F@C`E@C`F@C`F@C`F@B`E@C`F@B`F@C`F@B`F@B`F@B`F@B`G@B`F@B`F@A`F@B`F@A`G@A`F@A`F@A`G@A`F@A`F@A`G@@`F@A`G@@`F@@`F@@`G@@`F@@`G@@`F@@`F`A`G@@`F`A`G`A`F`A`F`A`F`A`G`B+GTPI1`F`A`F`B`F`A`G`B`F`B`F`B`F`B`F`B`F`B`F`C`F`B`E`C`F`C`F`C`F`B`E`D`F`C`E`C`F`C`E`D`F`C`E`D`E`D`E`D`E`C`E`D`E`E`E`D`E`D`D`D`E`E`E`D`D`E`D`E`E`E`D`D`D`E`D`E`D`E`D`F`C`E`D`E`C`E`D`F`C`E`C`F`D`E`C`F`B`F+CeMO1`C`F`C`E`C`F`B`F`B`F`C`F`B`F`B`F`B`F`B`F`A`F`B`G`B`F`A`F`A`F`A`G`A`F`A`F`A`G`A`F`A`G@@`F@@`F`A`G@@`F@@`G@@`F@A`F@@`G@@`F@A`F@A`G@A`F@A`G@A`F@A`F@A`F@A`G@B`F@B`F@A`F@B`F@B`G@B`F@B`F@C`F@B`F@B`E@C`F+C_H`1@C`F@C`F@B`F@D`E@C`F@C`E@C`F@D`E@C`F@D`E@C`E@D`E@D`E@D`E@D`E@D`E@E`E@D`E@E`D@D`E@E`D@D`E@E`D@E`D@E`D@E`D@E`D@E`D@E`D@E`C@F`D@E`C@F`D@E`C@F`C@E`C@F`C@F`C@F`C@E`B@F`C@F`B@F`C@F`B@F`B@F`B@F`B@G`A@F`B+GHE]1@F`B@F`A@G`A@F`A@F`B@G`A@F@@@F`A@G`A@F@@@F`A@G@@@F@@@G@@@F@@@F@@@G@A@F@@@G@A@F@@@F@A@G@A@F@A@F@A@G@A@F@B@F@A@F@B@F@A@G@B@F@B@F@B@F@B@F@C@F@B@F@B@E@C@F@C@F@C@F@B@E@C@F@D@F@C@E@C@E@C@F@D@E@D@E@C@F@D+KrFX1@E@D@E@D@E@D@D@D@E@D@E@E@E@D@D@E@E@D@D@E@D@E@E@D@D@E@D@E@D@E@D@E@C@F@D@E@D@E@C@F@C@E@D@E@C@F@C@F@C@E@C@F@C@F@B@F@C@F@B@E@C@F@B@F@B@F@B@G@B@F@B@F@A@F@B@F@A@F@B@G@A@F@A@F@A@G@A@F@A@F@@@G@A@F@@@G@@@F+M~Je1@A@F@@@G+N_Jr1@@@F`A@G@@@F@@@F`A@G@@@F`A@F`A@G`A@F`A@G`A@F`A@F`A@F`B@G`A@F`B@F`B@F`B@F`B@G`B@F`B@F`B@F`B@F`C@F`B@E`C@F`C@F`C@F`C@E`C@F`C@F`C@E`C@F`D@E`C@F`D@E`C@E`D@E`D@E`D@F`D@E`D@D`D@E`E@E`D@E`D@D`E@E`D@E`E@D+LeOJ1`E@D`D@E`E@D`E@D`E@D`E@D`E@D`F@C`E@D`E@D`F@C`E@D`F@C`E@C`F@C`E@C`F@C`F@C`F@C`E@B`F@C`F@B`F@C`F@B`F@B`F@B`F@B`G@B`F@B`F@A`F@B`F@A`G@B`F@A`F@A`G@A`F@A`F@A`G@@`F@A`F@A`G@@`F@@`G@@`F@@`F@@`G@@`F@@`G@@+HEPq1`F`A`F`A`G@@`F`A`G`A`F`A`F`A`F`A`G`B`F`A`F`B`F`A`G`B`F`B`F`B`F`B`F`B`F`B`F`C`F`B`F`C`F`B`E`C`F`C`F`C`E`C`F`C`F`C`E`C`E`D`F`C`E`D`E`D`F`C`E`D`E`D`E`D`E`D`E`D`D`E`E`D`E`D`D`E`E`E`D`D`E`E`D`E`D`E`D`D+CvNe1`D`E`D`F`D`E`D`E`C`E`D`E`C`F`D`E`C`F`C`E`C`F`C`F`C`E`C`F`C`F`C`F`B`F`C`E`B`F`B`F`B`F`B`G`B`F`B`F`B`F`B`F`A`F`B`G`A`F`A`F`A`F`A`G`A`F`A`G`A`F@@`F`A`G@@`F@@`F`A`G@@`F@@`G@A`F@@`G@@`F@A`F@@`G@A`F@A`F+BcI1@A`G@A`F@A`F@A`G@A`F@B`F@A`F@B`G@B`F@B`F@B`F@B`F@B`F@B`F@B`F@C`F@B`F@C`F@C`F@C`E@C`F@C`F@C`E@C`F@C`E@D`F@C`E@D`E@C`F@D`E@D`E@D`E@D`E@D`E@D`E@D`E@E`D@D`E@E`E@D`D@E`E@E`D@D`D@E`D@E`D@E`D@E`D@E`D@F`D+EAEy1@E`D@E`C@F`D@E`C@E`C@F`D@F`C@E`C@F`C@F`C@F`B@E`C@F`C@F`B@F`B@F`C@F`B@F`B@F`B@F`B@G`A@F`B@F`B@F`A@G`A@F`B@F`A@G`A@F`A@F@@@G`A@F`A@F@@@G`A@F@@@G@@@F@@@F@@@G@@@F@@@G@A@F@@@F@A@G@A@F@@@F@A@G@A@F@A@F@B+IkDz1@G@A@F@A@F@B@F@B@G@A@F@B@F@B@F@B@F@B@F@C@F@B@F@B@F@C@E@C@F@B@F@C@F@C@E@C@F@C@E@D@F@C@E@C@F@D@E@C@E@D@F@D@E@D@E@D@E@D@E@D@E@D@D@D@E@D@E@E@D@D@E@E@D@E@D@D@E@E@D@E@D@E@D@E@D@E@D@E@D@E@C@F@D@E@C@E@D@F+MfGi1@C@E@C@F@C@E@C@F@C@F@C@E@C@F@C@F@B@F@C@F@B@F@B@F@B@F@B@F@B@F@B@F@B@F@B@G@A@F@B@F@A@F@A@G@A@F@A@F@A@G@A@F@A@F@@@G@A@F@@@G@@@F@A@F@@@G+DuJP1@@@J@K@@@@`J`K@@+DzJU1AP`I@p`B+FuJE1@@@J@J@@@@`J`J@@+FzJJ1@b@C@Y@F+GpJN1@@@J@J@@@@`J`J@@+GuJS1@S@I@N@K+HQJb1@@@J@J@@@@`J`J@@+HVJg1@I@K@F@L+H`Jy1@@@J@J@@@@`J`J@@+HeJ~1@B@L`A@K+HaKP1@@@J@J@@@@`J`J@@+HfKU1`D@J`F@I+HVKc1@@@J@K@@@@`J`K@@+H\Kh1`I@G`J@F+HDKp1@@@J@J@@@@`J`J@@+HIKu1`K@C`L@A+GmKt1@@@J@J@@@@`J`J@@+GrKy1`M`A`L`D+GSKo1@@@J@K@@@@`J`K@@+GYKt1`M`F`K`H+F{Ka1@@@J@K@@@@`J`K@@+GAKf1`K`K`I`L+FhKJ1@@@J@J@@@@`J`J@@+FmKO1`H`N`E`O+F[Jm1@@@J@J@@@@`J`J@@+F`Jr1`C`Q`A`Q+FVJK1@@@J@K@@@@`J`K@@+F\JP1@A`R@D`Q+F\Ig1@@@K@J@@@@`K`J@@+FaIm1@G`R@I`Q+FlIE1@@@J@J@@@@`J`J@@+FqIJ1@K`O@N`O+GEHg1@@@J@J@@@@`J`J@@+GJHl1@P`L@R`K+GgHP1@@@J@J@@@@`J`J@@+GlHU1@T`H@T`F+HOHB1@@@J@J@@@@`J`J@@+HTHG1@V`C@V@@+H{G1@@@J@J@@@@`J`J@@+I@HD1@V@C@V@F+IgHH1@@@J@K@@@@`J`K@@+IlHM1@V@I@T@K+JQH\1@@@J@K@@@@`J`K@@+JVHa1@S@O@R@Q+JvH{1@@@K@J@@@@`K`J@@+J{IA1@O@S@L@U+KQId1@@@J@J@@@@`J`J@@+KVIi1@J@W@G@X+KbJS1@@@K@J@@@@`K`J@@+KgJX1@D@Z@A@Z+KgKF1@@@K@J@@@@`K`J@@+KlKL1`C@Z`F@Y+K^Kz1@@@J@J@@@@`J`J@@+KcK1`J@Y`L@X+KHLk1@@@J@J@@@@`J`J@@+KMLp1`P@V`S@T+JeMU1@@@J@J@@@@`J`J@@+JjMZ1`U@R`W@O+IyMv1@@@J@J@@@@`J`J@@+I~M{1`Z@L`[@I+IDNK1@@@J@J@@@@`J`J@@+IINP1`\@E`\@B+HKNR1@@@J@K@@@@`J`K@@+HQNW1`]`B`]`E+GRNJ1@@@K@J@@@@`K`J@@+GWNP1`\`J`[`L+F[Mt1@@@K@J@@@@`K`J@@+F`Mz1`Y`Q`W`S+EkMQ1@@@J@J@@@@`J`J@@+EpMV1`T`V`R`Y+EELb1@@@J@J@@@@`J`J@@+EJLg1`N`[`K`]+DkKj1@@@J@K@@@@`J`K@@+DqKo1`H`^`C`_+DaJm1@@@J@J@@@@`J`J@@+DfJr1@@``@E`_+DfIn1@@@J@J@@@@`J`J@@+DkIs1@H`_@M`]+DzHr1@@@J@K@@@@`J`K@@+E@Hw1@P`\@S`Z+E^G|1@@@J@J@@@@`J`J@@+EcHA1@W`W@Y`T+FNGQ1@@@J@K@@@@`J`K@@+FSGV1@]`Q@^`N+GIFr1@@@K@J@@@@`K`J@@+GNFw1@_`I@a`E+HIFc1@@@K@J@@@@`K`J@@+HNFi1@b`B@a@C+ILFe1@@@J@J@@@@`J`J@@+IQFj1@a@G@`@L+JMFx1@@@J@J@@@@`J`J@@+JRF}1@_@O@\@S+KHGZ1@@@J@J@@@@`J`J@@+KMG_1@Z@W@W@Z+KyHK1@@@J@J@@@@`J`J@@+K~HP1@S@\@P@_+L\IF1@@@K@J@@@@`K`J@@+LaIK1@L@a@H@c+LpJI1@@@K@J@@@@`K`J@@+LuJO1@C@c+LsJm1@@@J@J@@@@`J`J@@% 7B+@J@\6556I 03 09-23-84 22.961 frame no. 09 MH9220,M158,DREXLER % 0707070014230643111006440057030057030000011714540522627504100003200000001672post.src/tests/postdaisy1 B 9 This line is u _n _d _e _r _l _i _n _e _. _ This li ne is bb boo oll ldd d... This line is u_uun_nnd_dde_eer_rrl_lli_iin_nne_e e _a_a an_n nd_d d _b_b bo_o ol_l ld_d d._.. This line is S u b Script. This line is S u p e r Script. B 0707070014230643121006440057030057030000011716700522627504100003000000037011post.src/tests/postdmd1 ²²UU²UU²UU²UU²UU²UU²UUUUU;¯»»»UUUU ¯ UUUU¯ÿÿüUUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀ UUUU ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ UUUU @ @ @ @ @ UUUU ¯ UUUU ‚ ?ð ÿ€ ÿ€ ?ñÿ€ U UUU ÀÀ ÌÀà ÀÀÿ§ U UUU á ! !à ‚ € ð€ UUUU €‚ ‚ @ § U UUU ? à ? ÿ§ U UUU D @ @ § UUUU ˆ@ ž@ ž@€ ¦ UUUU ‚ € à x x¡ UUUU ‚ ` ü ¦ UUUU ƒ € x x¡ UUUU ƒ € ¦ UUUU ‚ ` ýH ¦ UUUU Ž@ ž@` ž@ü$ ¦ UUUU @ @ @ ’ ¦ U UUU ¿@ ¿@ ¿@ ð ¤ UUUU € €à €ÿ ¦ UUUU „ ?ð ÿ€ ñ€ 0€¡ UUUU ¯ UUUU ‚ @‚ @‚ @‚ @‚ @ UUUU ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ UUUU ÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUUU ¯ UUî UU ° UU?ÿ€¯ UU ° UU ° UU ° UU ° UU ¯ UU ¯ UUð ¯ UUè ¯ UU° UUà ¯ UUà ¯ UU ° UUà ¯ UUø ¯ UU ° UU ° UU ° UU ° UU ° UU ° UU ¯ UU ¯ UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ¯ UU ¯ UU ° UU ° UU ° UU ° UUÀ ¯ UU ° UUÀ ¯ UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ¯ UU ¯ UU ° UU ° UU ° UU ° UUÀ ¯ UU ° UUÀ ¯ UU ° UU ° UU ° UU ° UU ° UU ° UU ° UU ¯ UU ¯ UU ° UU ° UU ° UU ° UU ° UU ° UU ¯ÿÿüUU ° UU ‚ UU ° UU ° UU ° UU ñøü a€¬ UU òõz|R€¬ UU €¼ UU ôø - ¬ UU ùx € ª UU ƒ ¬ UU ýx¼(€ ª UU üþ UU ƒ P ¬ UU ƒ ` ¬ UU ° UU ° UU ° UU ° UU ®ÿÿŽîîUU ¯ UUUU … x „ à þ~€€ 1€„ ‚ €À ççø ` ‰ UUUU „ À´ ƒ ‚Ð 0 ‚ ~™€‚ P ‚ € (- @ 鑸 P ‰ UUUU „ À 8 „ 0 ‚ $ƒ ° „ @ @ ‚ @ 8 ‰ UUUU ¯ UUUU „ Àƒ ø ü~f€ ð 0ü ÷ø ‚ | €Çæaø À ÿ€ à Š UUUU „ 0 ƒ z½f/@Áè : ƒ x ‚ z «Öbô Ì€ ‚ €à Š UUUU „ 0 ‚ ø ‚ ÀÀ ƒ ÷ø x „ € Ì„ ÿ€€ ‹ UUUU ˆ ø =† ÷ø … € І ÿ€ Œ UUUU ‰ x>Ž ƒà” UUUU † ( ‚ø Å è ÷ø $ƒ €€ 0P € P ÿ€ @ ( ‰ UUUU † À ¿/B€ð ‚ ~™ƒ P ‚ ñRô( @ é P ‰ UUUU „ ÀÀ À €ƒ ü0Æ þ~` ‚ 1† ðáø0 ?Ãa€À çæ ` ‰ UUUU ‰ z Ž ” UUUU Š ü ‚ ü † € ‚ À ‚ `?À UUUU ¯ UUUU ¯ UUUU ƒ ª UUUU ¯ UUUU ƒ (ª UUUU ¯ UUUUø(ƒ Pª UUUUø ® UUUU Pƒ ª UUUUð ® UUUUè ƒ @ª UUUU ¯ UUUUé@ƒ €ª UUUUð ® UUUU €ƒ ª UUUU ¯ UUUU ¯ »»UU ° UU ‚ € À 0ð„ ‚ €À ççø 0 ƒ à‚ ‚ þ~€Œ ÿüUU ‚ @@ PÀ‚ € (- @ 鑸 ƒ ‚Ð 0 ‚ ~™€ UU ‚ Ð ° „ @ @ ‚ @‚ „ 0 ƒ 4 Œ UU ° UU ‚ ƒ €Çæaø À ÿ€ à ‚ Àø ü~f€ ð 0ü ÷ø Ž UU ‚ 3„ «Öbô Ì€ ‚ €à ‚ z½f/@Áè :ƒ x Ž UU ‚ 3ƒ € Ì„ ÿ€€ „ ø‚ ÀÀƒ ÷ø x UU † € І ÿ€ … ø = … ÷ø UU ‡ ƒàŽ x>