diff options
author | wkj <devnull@localhost> | 2004-05-16 07:54:22 +0000 |
---|---|---|
committer | wkj <devnull@localhost> | 2004-05-16 07:54:22 +0000 |
commit | b855148c9b6d28fedfd083d037bcf246f1913d92 (patch) | |
tree | 0075eb6ea37427fa48b78cb937fabc04175cead1 /src/cmd/postscript | |
parent | 61f5c35c9465f0702739b41249a664d409f0482c (diff) | |
download | plan9port-b855148c9b6d28fedfd083d037bcf246f1913d92.tar.gz plan9port-b855148c9b6d28fedfd083d037bcf246f1913d92.tar.bz2 plan9port-b855148c9b6d28fedfd083d037bcf246f1913d92.zip |
Checkpoint.
Diffstat (limited to 'src/cmd/postscript')
74 files changed, 5282 insertions, 131 deletions
diff --git a/src/cmd/postscript/NOTES b/src/cmd/postscript/NOTES new file mode 100644 index 00000000..fb673ce0 --- /dev/null +++ b/src/cmd/postscript/NOTES @@ -0,0 +1,32 @@ + 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. + diff --git a/src/cmd/postscript/README b/src/cmd/postscript/README new file mode 100644 index 00000000..7deebb02 --- /dev/null +++ b/src/cmd/postscript/README @@ -0,0 +1,179 @@ +Stuff appears to work, but it's obviously not well tested. I fully +expect several iterations before things are correct!! Make sure you +can back this out quickly. + +This code supports UTF encoding. Directory dpost.utf is a version that +reads UTF encoded files. Directory dpost is DWB 3.3 source and should be +close to what you're currently using. Main source code changes were in +dpost.utf (files font.h, font.c, and dpost.c). Select either dpost or +dpost.utf in TARGETS in postscript.mk. Both build and install a program +called dpost!! + +dpost.utf is more general and includes code that lets it read either +format. Only catch is troff must tell it (with x E UTF) that the file +is UTF and troff currently doesn't output encoding info, so you're +stuck with two post-processors! + +Added common/rune.h and common/rune.c so code can be compiled elsewere. +Both files are only used by dpost. Remove RUNELIB in commmon/rune.h if +fullrune(), chartorune(), and runetochar() are available on your system. +You will also need to set READING in common/gen.h. It controls how dpost +(from dpost.utf) reads troff output. It should be UTFENCODING on Plan 9 +and ONEBYTE elsewhere. If troff includes encoding hint (x E UTF) then +READING selects the default which sould be ONEBYTE. + +Leave WRITING (in common/gen.h) set to ONEBYTE. It only controls dpost +output and dpost (right now) does not work 100% with UTF.enc. Fix should +be easy, but I don't have time now. + +Other translators passed bytes through so only needed slightly modified +proglogues and a new encoding scheme (psencoding/UTF.enc). It works for +Latin1, but still needs a bit more attention. Prologue changes were easy +and only involved adding lines like, + + /show {show} bind def + /stringwidth {stringwidth} bind def + +Guarantees text procedures used in prologues aren't operators and can be +successfully redefined in UTF.enc. Unbinding means a small but probably +not noticeable speed penalty. You may not want to include those changes +on other system. + +------------- +Major Changes +------------- + +See the VERSION file. + +------------------- +Tuning The Makefile +------------------- + +Source files, man pages, and low level makefiles can all be updated +to reflect settings in postscript.mk in one simple step (described +later). In most cases you only need to edit file postscript.mk. + +First save a copy of file postscript.mk. Then adjust the following +definitions in file postscript.mk: + + 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. + + GROUP group assigned to all installed files + + OWNER owner of everything that's installed + + BINDIR dpost and picpack go here. All other programs go in POSTBIN. + BINDIR must already exist - it will not be created during an + install. + + HOSTDIR hostresident font directory for PostScript printers. Only + used in the font download program. + + FONTDIR width table directory - for troff and most postprocessors + + 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 + 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. CLFGS 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 PostScript + 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. + +------------------- +Updating The Source +------------------- + +Whenever file postscript.mk changes you should update source files, +man pages, and low level makefiles by typing, + + make -f postscript.mk changes + +------------------------ +More System Dependencies +------------------------ + +The package has been compiled and tested on System V and Ninth Edition +Unix Systems and on Sun workstations. Most differences are handled via +the SYSTEM definition in postscript.mk. Problems that remain are: + + SYSV - System V + Use the native compiler if you're on an internal System V UTS + machine. + + V9 - Ninth or Tenth Edition + chown is in /etc and chgrp no longer exists - it's been folded into + the chown command. You may be forced to build a simple chgrp shell + script (put it in your bin) that calls chown. If you're not superuser + set OWNER to your login name and GROUP to your group id. + + BSD4_2 - Sun Workstations + Use the Bourne shell. chown is should be in /usr/etc. Add /usr/etc + to your PATH and export PATH. If you're not superuser set OWNER to + your login name and GROUP to your group id. + +---------------------- +Installing The Package +---------------------- + +To build (but not install) the default package (i.e. everything named by +TARGETS in postscript.mk) type, + + make -f postscript.mk all + +To build and install the package type, + + make -f postscript.mk all install + +After the package is installed use, + + make -f postscript.mk clobber + +to delete binary files and compiled programs from the source directories. + +To select part of the package define TARGETS on the command line. For +example, + + make -f postscript.mk TARGETS="dpost devpost" all install + +builds and installs dpost and the PostScript font tables. Quotes hide +white space from the shell. + diff --git a/src/cmd/postscript/VERSION b/src/cmd/postscript/VERSION new file mode 100644 index 00000000..6fb4722e --- /dev/null +++ b/src/cmd/postscript/VERSION @@ -0,0 +1,372 @@ +------------------------ +Version 3.3.2 7/7/92 +------------------------ + + 1: Added UTF support for Plan 9. Only signigficant source code changes were + in dpost.utf (font.h, font.c, dpost.c). Added common/rune.[hc] so code + can be compiled elsewere. Remove RUNELIB in commmon/rune.h if fullrune(), + chartorune(), and runetochar() are available on your system. Original + DWB 3.3 dpost source is in directory dpost. You should select dpost or + dpost.utf in postscript.mk. Both compile and install a program called + dpost so don't pick both! + + 2: dpost can read old or UTF troff output. Default is whatever is assigned + to READING (file common/gen.h). You get one or the other, unless troff + tells dpost what encoding to use (currently x E UTF). + + 3: Most other translators passed bytes through and so only needed slightly + modified proglogues and a new encoding scheme (psencoding/UTF.enc). It + works for Latin1, but still needs a bit more attention. Prologue changes + were easy and only involved adding lines like, + + /show {show} bind def + /stringwidth {stringwidth} bind def + + Guarantees text procedures used in prologues aren't operators and can be + successfully redefined in UTF.enc. Unbinding means a small but probably + not noticeable speed penalty. You may not want to include those changes + on other system. + + 4: Operator redefinitions means dpost should work in it's own dictionary + (rather than userdict). Not implemented yet, but should be easy. Only + potential problem is with picture inclusion when dpost reads UTF.enc. + +------------------------ +Version 3.3.2 5/15/92 +------------------------ + + 1: postio now outputs all unrecognized status reports - primarly for spooler + accounting purposes. + + 2: The makefiles also enable the selection of alternate stream module names + for streams based DKHOST support in postio. + + 3: dpost now assumes the optional fifth token in a font mounting command + (e.g. x font 2 R /usr/me/font/R) is the full pathname of the font. troff + outputs the pathname when a .fp request contains a third argument that + begins with a / as in .fp 1 R /usr/me/font/R. + + 4: By request Latin1's - character has been changed from minus to the smaller + hyphen character. Added \(dq and \(bs (for " and \ characters) to devpost + and devLatin1 tables. Also added \(!! and \(?? to devpost tables. + + 5: Helvetica-Light and Helvetica-LightOblique tables are included as HL and + HK in devpost and devLatin1, even though fonts aren't generally available. + Also copy H to HM during an install of devpost and devLatin1 tables. + + 6: LH is a horizontally arranged color Lucent logo with text which replaces the AT&T logo. + LV is a vertically arranged monochrome AT&T logo with text. + FA is a horizontally arranged monochrome Lucent logo with text (low res.). + L1 is a monochrome AT&T logo, no text. + LA is a monochrome AT&T text. + + 7: Included L1 and LA outlines in devpost and devLatin1. Adjusted LA scaling + so size of "AT&T" matches what's in LV. Original PostScript came + from Matthijs Melchior. + + 8: Included the "symmetric clippath" version of roundpage.ps as Nroundpage.ps + in directory postscript/psfiles. Move it to roundpage.ps if you want it to + be the default. + + 9: Added a few lines of code to dpost for handling current implementation of + the portrait/landscape mode macros. + +10: The man page for download now documents the -r option and notes that -p + is for Unix 4.0 lp. + +------------------------ +Version 3.3.1 4/30/91 +------------------------ + + 1: buildtables stuff has been cleaned up and is now a user level command. + Uses shell.lib files that are installed with font tables. The devpost + tables were built on a version 47.0 PS-810. The devLatin1 tables were + built on a version 51.7 PS-820. + + 2: The devLatin1 tables provide support for the ISO Latin1 alphabet on + PostScript printers. + + 3: All translators support different text font encoding schemes using the + -E option and *.enc files installed in POSTLIB. The ISO Latin 1 alphabet + is supported with file /usr/lib/postscript/Latin1.enc. + + 4: printfont prints a table of the available (encoded) characters in one + or more PostScript fonts. It also understands the -E option. + + 5: grabit and hardcopy are two new programs that may be of interest to the + more serious PostScript programmer. grabit resembles ==, but produces + output that's usally easier to read. hardcopy redirects output from + PostScript file output operators (or procedures) to paper. It's useful + if you don't have direct access to a printer. + + 6: Prologues and programs are stored together. Other common PostScript files + are now in the psfiles directory. + +------------------------ +Verions 3.3 4/16/90 +------------------------ + + 1: The package is now included in DWB. Version numbers are a bit misleading. + The one in postscript.mk refers to the DWB package. + + 2: dpost (and troff) now read ASCII font tables. makedev and the old binary + format are gone. + + 3: The devpost directory came directly from the DWB package. The font tables + originally distributed with this package are in directory devopost. They + are not installed. If possible we recommend you use the devpost tables. + The old tables can be installed by adding devopost to the TARGETS list in + file postscript.mk. + + 4: dpost recognizes two new fields in font tables. Entries for the full + PostScript font look like, + + fontname Times-Roman + + The fontname field is helps manage host resident fonts, the DocumentFonts + comment, and is used to define font name abbreviations like the ones in + dpost.ps. A font table entry that looks like, + + named in prologue + + disables the runtime abbreviation for the font - dpost assumes it's already + in the prologue. + + 5: Extra font tables included in DWB 3.0's devpost font collection are in + directory devpost.add. They included here, but should probably not be + used. + + 6: Bracket building has been fixed and tested on a wide range of PostScript + printers. It will likely still not work on many clones. Real problem + appears to be with Adobe's braceleftbt character. + + 7: Most of the special tuning code for device emulation has been removed. + Emulation still works, but there may be cases where it's not as good as + earlier versions. + + 8: Several problems with color and reverse video printing have been fixed. + + 9: buildtables directory has been cleanup up. The template files in directory + buildtables/devpost.data were used to build the devpost tables. + +10: postplot and download are two new programs. postplot is for the System V + plot package only. Both were written for the Unix 4.0 lp package. + +11: postgif is also relatively new - it came from Chi Choy. + +12: The translators now rotate clockwise when printing in landscape mode. If + you want the old behavior set ROTATION to -1 in postscript.mk. + +13: forms.ps has been cleaned up some. Better behavior when you print 2 + landscape pages on one sheet. + +14: Handling of Datakit code for System V has been changed some. Makefiles + now expect to find libdk.a and dk.h in standard places (e.g /usr/lib and + /usr/include). Set DKHOST to TRUE in postscript.mk to get Datakit support + on System V. + + If you're stuck and need to have things behave as they did in the past + take a look at file postio/postio.mk. Define DKHOSTDIR and uncomment + three lines and the behavior should be close to what it was. + +15: Picture inclusion and color macros are gone. They're included in the DWB + package, and not here. + +------------------------ +Version 3.2 11/27/89 +------------------------ + + 1: Implemented height and slant requests in dpost. + + 2: Modified the behavior of all translators so save objects are no longer left + on the stack. The original implementation was a mistake and occasionally + (e.g. picture inclusion with forms.ps) resulted in invalid restores. + + 3: Fixed the mistake in the external declaration of mesg in postio/slowsend.c. + + 4: The malloc() call in postdmd (routine dimensions()) is only made if patterns + is positive. + + 5: Changed definition of De in draw.ps so savematrix is loaded with the CTM + whenever De is executed. Original implementation didn't work with forms.ps + because the CTM is changed with each page image. (4/29/89) + + 6: Flush stdout when postio is invoked with the -t option - just convenient + not necessary. (4/30/89) + + 7: Included a man page for the picture inclusion macros - file man/mpictures.5. + (5/6/89) + + 8: Added BoundingBox code to dpost - still needs to go in other translators. + Most of the work is done in common/bbox.c. (5/7/89) + + 9: Fiddled with the bracket building stuff in dpost.ps so things finally look + decent. Was particularly bad on the typesetter. + +10: dpost now generates a PageBoundingBox comment and ps_include.c accepts + the comment. Added -B option to enable/disable the BoundingBox calculations. + -Bon to enable and -Boff to disable. On by default now, but that may change. + Add similar code to the rest of the translators (6/20/89). + +11: Fixed ps_include.c so it properly handles %%BeginGlobal and %%EndGlobal. + Added braces and compare page.start to page.end instead of 0. + +12: Added xymove(hpos, vpos) for \X'PS ...' request - near the end of devcntrl(). + Must output position info for following PostScript. + +13: Added a call to endtext() immediately before the oput() call for \N'...' + requests. Without it spacing often messed up with -e2 but not -e0. + +------------------------ +Version 3.1 11/15/88 +------------------------ + + 1: postio can run as one or two processes (-R option) and can establish an + interactive connection with a postscript printer (-i option). Parsing of + status reports has been improved. The status query mechanism can be disabled + using the -q option. An exit status of 1 implies a system error (eg. can't + open the line) while 2 usually means there was an error in the PostScript + file. By default postio runs as a single process. The -B, -R, and -q options + can be used to speed things up some. A version of the program (previously + supplied in postio.tmp) that can help if you seem to be having flow control + problems can be obtained using the -S option. It's not generally recommended + and should only be used as a last resort! + + 2: Several widthshow encoding schemes have been added to dpost and can reduce + print time by 20% or more. The method used to encode lines of text can be + changed on the command line using the -e option. Level 0 produces output + essentially identical to previous versions of dpost. The default can be + changed by modifying the definition of ENCODING in ./Makefile. At present + only level 0 is thoroughly tested, although level 2 (ie. -e2) may be the + default and is undoubtedly worth a try. + + 3: dpost now supports color selection and reverse video. Access in troff is via + the stand-alone macro package ./macros/color. Examples are, + + .so /usr/lib/macros/color + .CL red "this prints in red" + .CL "white on black" "and this prints white text on a black background" + + The postscript procedures that handle color and reverse video can be found + in ./postscript/color.ps. Additional colors can be added to the colordict + dictionary defined in ./postscript/color.ps. + + 4: The dpost drawing routines have been improved and have been moved from the + prologue (ie. ./postscript/dpost.ps) to ./postscript/draw.ps. That file is + only included if needed. Drawing routines now support the ability to group + a series of drawing commands together as a single path. May be useful for + future versions of pic that wish to fill regions with colors or gray levels. + Access is via the new "x X BeginPath" and "x X DrawPath" device control + commands. In addition there's some complicated PostScript code in file + ./postscript/baseline.ps, that can be used to set text along an arbitrary + curve. It's terribly confusing and I doubt anyone will have the patience to + bother to figure it out. + + 5: A simple picture packing troff preprocessor (picpack) has been included and + the code needed to recover pictures and text has been added to dpost. The + program is designed to supplement to the original picture inclusion mechanism, + and should ONLY be used when absolutely necessary. Using dpost to pull picture + files into a document is strongly recommended and will always be the more + efficient and portable approach. picpack simply provides a way to combine + pictures and text in a single file before dpost is executed. It may help in + a distributed printing environment where the user runs everything through + troff while a spooling daemon (eg. lp) handles the postprocessing. There + are serious disadvantages to this approach, with perhaps the most important + being that troff output files (when picpack is used) will likely result in + files that can no longer be reliably passed through other important post- + processors like proof. + + 6: Code to handle host resident PostScript fonts in dpost has been tested and + finally works. The -H option points dpost to a host resident font directory, + which by default is NULL. Host resident font files stored in that directory + must be assigned a name that corresponds to the one or two character troff + font name. Width tables must also be built (see buildtables/README), the new + binary font files must be installed in /usr/lib/font/devpost, and a mapping + definition from troff's name to the PostScript font name must be added to + ./postscript/dpost.ps. + + 7: The default pattern length in postdmd has been reduced to from 10 to 6 bytes. + Printers with fast processors (eg. PS-810s) often benefit from a further + reduction, while optimal performance on slower printers (eg PS-800s) may + require larger pattern sizes. The pattern length can be set using the -b + option. Increasing the pattern size usually increases the size of the output + file. + + 8: Line drawing in posttek and postbgi includes code that automatically ties + lines to device space coordinates when you select a non-zero width. Helps + eliminate the variation in line thickness that many observed. The default + line width in posttek and postbgi is still 0 (which gets 1 pixel). If you + want a different default change the definition of variable linewidth in files + ./postscript/posttek.ps and ./postscript/postbgi.ps. + + 9: Defocused lines in posttek have been fixed. + +10: postbgi now supports color and can be used to translate most PRISM (color + BGI) jobs. Special device specific tuning needed for many PRISM jobs can be + enabled by using the -P"/prism true" option. Missing pieces (eg. subroutines) + needed for translating PRISM jobs, have also been implemented. + +11: postreverse can reverse the pages in documents that conform to Adobe's 1.0 + or 2.0 file structuring conventions, and it works with all the translators in + this package. The new version is backwards compatible, but files produced by + the new translators should not be passed through old versions of postreverse. + The likely result will be no output at all. If you choose to do a partial + installation put the new postreverse up first! + +12: All translators attempt to conform to Adobe's Version 2.0 file structuring + conventions. dpost output falls short, but only in the interest of efficiency. + Passing dpost output through postreverse (perhaps with the -r option) produces + a minimally conforming PostScript file. + +13: All the translators now support three options that pass arbitrary PostScript + through to the output file. The -P and -C options add a string and the + contents of a file respectively immediately after the prologue. It's assumed + whatever is added is legitimate PostScript - there is no checking. In each + case the added PostScript code becomes part of the job's global environment. + + The -R option can be used to request special action (eg. manualfeed) on a + global or page basis. The argument should be "request", "request:page", or + "request:page:file". If page is given as 0 or omitted the request applies + globally. If file is omitted the lookup is in /usr/lib/postscript/ps.requests. + The collection of recognized requests can be modified or extended by changing + /usr/lib/postscript/ps.requests. + +14: PostScript code (from Johnathan Shopiro) that produces bolder versions of the + Courier fonts has been included in file postscript/fatcourier.ps. The file + can be added to individual prologue files (eg. dpost.ps) or pulled in as + needed using the -C option. + +15: postmd is a new program that can be used to display a large matrix as a gray + scale image. May help if you're looking for patterns in a large matrix. A very + optimistic estimate suggests you can display up to a 600x600 matrix (with five + different shades of gray) on 300dpi printer using 8.5x11 inch paper. + +16: What's available in buildtables has been cleaned up and works well with the + new version of postio. It can be used to have PostScript printers build troff + width tables for both printer and host resident fonts. + +17: The PostScript bind operator has been applied to all procedures that are + expected to be executed more than once. Redefined save and restore procedures + are no longer needed and saverestore.ps is not included in this package. + +18: The bizarre PostScript code used to get to the upper left corner of a page + in old versions of dpost.ps and postprint.ps has been replaced by something + that's at least slightly more comprehensible. All prologues have also been + changed so picture inclusion (eg. including a pic picture that's been run + through troff and dpost) should work better than previous versions. Still + missing (from most translators) is the %%BoundingBox comment and even when + it's put out (by postdmd) only the dimensions are correct - sorry! + +19: The careless mistake in the DKHOST section of postio that some noticed belongs + to me (not Allan Buckwalter) and has now been fixed. + +20: By default all prologues still use the current clipping path to determine page + dimensions, but that behavior can be disabled by setting boolean useclippath + (in each prologue) to false. In that case the page dimensions will be taken + from array pagebbox, which by default is initialized to 8x11 inch paper. The + -P options (in each translator) can change useclippth and pagebbox. + +21: New in the misc directory is sample lp support from Maryann Csaszar and a + simple program that converts host resident font files obtained from a Macintosh + to a format that works on Unix. + diff --git a/src/cmd/postscript/changes b/src/cmd/postscript/changes new file mode 100644 index 00000000..500eda2a --- /dev/null +++ b/src/cmd/postscript/changes @@ -0,0 +1,95 @@ +add mkfile to each directory for plan9. + +common: +add getopt.c to common. +insert #include <sys/types.h> before #include <fcntl.h> for off_t in bbox.c. +comment out strtok(), ftell(), sqrt() atan2() defs in ext.h. +insert #include <sys/types.h> before #include <fcntl.h> for off_t in misc.c. +comment out RUNELIB on #endif line in rune.c +add defined(plan9) in tempnam.c. +change path.h for plan9! + +cropmarks: +add cropmarks.rc to cropmarks. + +download: +move #include <sys/types.h> before #include <fcntl.h> for off_t in download.c. + +dpost: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in dpost.c. +added + #ifdef plan9 + #define isascii(c) ((unsigned char)(c)<=0177) + #endif +after #include <ctype.h> in dpost.c. + +grabit: +add grabit.rc to grabit. + +hardcopy: +add hardcopy.rc to hardcopy. + +postbgi: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in postbgi.c. +added + #ifdef plan9 + #define isascii(c) ((unsigned char)(c)<=0177) + #endif +after #include <ctype.h> in postbgi.c. + +postdaisy: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in postdaisy.c. +added + #ifdef plan9 + #define isascii(c) ((unsigned char)(c)<=0177) + #endif +after #include <ctype.h> in postdaisy.c. + +postdmd: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in postdmd.c. +added + #ifdef plan9 + #define isascii(c) ((unsigned char)(c)<=0177) + #endif +after #include <ctype.h> in postdmd.c. + +postgif: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in postgif.c. +added + #ifdef plan9 + #define isascii(c) ((unsigned char)(c)<=0177) + #endif +after #include <ctype.h> in postgif.c. + +download: +added #include <string.h> in download.c. + +dpost: +added #include <string.h> in draw.c. + +picpack: +added #include <string.h> in picpack.c. + +postmd: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in postmd.c. +added + #ifdef plan9 + #define isascii(c) ((unsigned char)(c)<=0177) + #endif +after #include <ctype.h> in postmd.c. +added #include <string.h> in picpack.c. + +postprint: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in postprint.c. +added + #ifdef plan9 + #define isascii(c) ((unsigned char)(c)<=0177) + #endif +after #include <ctype.h> in postprint.c. + +postreverse: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in postreverse.c. + +posttek: +insert #include <sys/types.h> before #include <fcntl.h> for off_t in posttek.c. + diff --git a/src/cmd/postscript/common/bbox.c b/src/cmd/postscript/common/bbox.c index 7e1f14a5..66a114c2 100644 --- a/src/cmd/postscript/common/bbox.c +++ b/src/cmd/postscript/common/bbox.c @@ -34,6 +34,7 @@ double matrix1[6], matrix2[6]; /*****************************************************************************/ +void cover(x, y) double x, y; @@ -65,7 +66,9 @@ cover(x, y) } /* End of cover */ /*****************************************************************************/ +void resetbbox(); +void writebbox(fp, keyword, slop) FILE *fp; /* the comment is written here */ @@ -117,7 +120,7 @@ writebbox(fp, keyword, slop) } /* End of writebbox */ /*****************************************************************************/ - +void resetbbox(output) int output; @@ -146,7 +149,7 @@ resetbbox(output) } /* End of resetbbox */ /*****************************************************************************/ - +void scale(sx, sy) double sx, sy; @@ -171,7 +174,7 @@ scale(sx, sy) } /* End of scale */ /*****************************************************************************/ - +void translate(tx, ty) double tx, ty; @@ -196,7 +199,7 @@ translate(tx, ty) } /* End of translate */ /*****************************************************************************/ - +void rotate(angle) double angle; @@ -223,6 +226,7 @@ rotate(angle) /*****************************************************************************/ +void concat(m1) double m1[]; diff --git a/src/cmd/postscript/common/common.c b/src/cmd/postscript/common/common.c index 945ef6a0..a58167a6 100644 --- a/src/cmd/postscript/common/common.c +++ b/src/cmd/postscript/common/common.c @@ -209,14 +209,14 @@ endpage(void) { int cat(char *filename) { Biobuf *bfile; - Biobuf *Bfile; + Biobufhdr *Bfile; int n; static char buf[Bsize]; - if ((bfile = Bopen(unsharp(filename), OREAD)) == 0) { + if ((bfile = Bopen(filename, OREAD)) == 0) { return(1); } - Bfile = bfile; + Bfile = bfile; /* &(bfile->Biobufhdr); */ while ((n=Bread(Bfile, buf, Bsize)) > 0) { if (Bwrite(Bstdout, buf, n) != n) break; @@ -240,9 +240,9 @@ galloc(void *ptr, int size, char *perstr) { } static char *errorstrings[] = { - {""}, /* NONE */ - {"WARNING"}, - {"FATAL"} + "", /* NONE */ + "WARNING", + "FATAL" }; char *programname; diff --git a/src/cmd/postscript/common/common.h b/src/cmd/postscript/common/common.h index 62eba08e..2432fe12 100644 --- a/src/cmd/postscript/common/common.h +++ b/src/cmd/postscript/common/common.h @@ -5,6 +5,8 @@ #define RUNEGETGROUP(a) ((a>>8)&0xff) #define RUNEGETCHAR(a) (a&0xff) +#define tempnam safe_tempnam + typedef int BOOLEAN; #define TRUE 1 @@ -38,6 +40,6 @@ BOOLEAN isinstring(void); void startpage(void); void endpage(void); int cat(char *); -int Bgetfield(Biobuf *, int, void *, int); +int Bgetfield(Biobufhdr *, int, void *, int); void *galloc(void *, int, char *); void pagelist(char *); diff --git a/src/cmd/postscript/common/ext.h b/src/cmd/postscript/common/ext.h index e260cee1..c0f7c7a5 100644 --- a/src/cmd/postscript/common/ext.h +++ b/src/cmd/postscript/common/ext.h @@ -28,8 +28,12 @@ extern char *optarg; /* for getopt() */ extern int optind; extern void interrupt(); -//extern char *tempnam(char*,char*); +extern void error(); +extern int cat(); +extern void concat(); + /* + * extern char *tempnam(char*,char*); * extern char *malloc(); * extern char *calloc(); * extern char *strtok(); diff --git a/src/cmd/postscript/common/gen.h b/src/cmd/postscript/common/gen.h index ba8cbbac..dffeb957 100644 --- a/src/cmd/postscript/common/gen.h +++ b/src/cmd/postscript/common/gen.h @@ -7,6 +7,10 @@ #define PROGRAMVERSION "3.3.2" +/* XXX: replace tempnam with something safer, but leaky */ +extern char* safe_tempnam(char*, char*); +#define tempnam safe_tempnam + #define NON_FATAL 0 #define FATAL 1 #define USER_FATAL 2 diff --git a/src/cmd/postscript/common/getopt.c b/src/cmd/postscript/common/getopt.c index cf6619f7..e348cb2f 100644 --- a/src/cmd/postscript/common/getopt.c +++ b/src/cmd/postscript/common/getopt.c @@ -15,7 +15,7 @@ getopt (argc, argv, opts) char **argv, *opts; { static int sp = 1; - register c; + register int c; register char *cp; if (sp == 1) diff --git a/src/cmd/postscript/common/misc.c b/src/cmd/postscript/common/misc.c index 25bd37aa..198a9351 100644 --- a/src/cmd/postscript/common/misc.c +++ b/src/cmd/postscript/common/misc.c @@ -8,6 +8,8 @@ #include <ctype.h> #include <sys/types.h> #include <fcntl.h> +#include <unistd.h> +#include <string.h> #include "gen.h" #include "ext.h" @@ -17,7 +19,9 @@ int nolist = 0; /* number of specified ranges */ int olist[50]; /* processing range pairs */ /*****************************************************************************/ +extern int str_convert(); +void out_list(str) char *str; @@ -53,7 +57,7 @@ out_list(str) } /* End of out_list */ /*****************************************************************************/ - +int in_olist(num) int num; @@ -80,7 +84,7 @@ in_olist(num) } /* End of in_olist */ /*****************************************************************************/ - +void setencoding(name) char *name; @@ -110,7 +114,7 @@ setencoding(name) } /* End of setencoding */ /*****************************************************************************/ - +int cat(file) char *file; @@ -145,6 +149,7 @@ cat(file) /*****************************************************************************/ +int str_convert(str, err) char **str; @@ -173,6 +178,7 @@ str_convert(str, err) /*****************************************************************************/ +void error(kind, mesg, a1, a2, a3) int kind; @@ -191,9 +197,9 @@ error(kind, mesg, a1, a2, a3) fprintf(stderr, "%s: ", prog_name); fprintf(stderr, mesg, a1, a2, a3); if ( lineno > 0 ) - fprintf(stderr, " (line %d)", lineno); + fprintf(stderr, " (line %ld)", lineno); if ( position > 0 ) - fprintf(stderr, " (near byte %d)", position); + fprintf(stderr, " (near byte %ld)", position); putc('\n', stderr); } /* End if */ diff --git a/src/cmd/postscript/common/path.h b/src/cmd/postscript/common/path.h index a3692139..68f8cbf0 100644 --- a/src/cmd/postscript/common/path.h +++ b/src/cmd/postscript/common/path.h @@ -4,29 +4,29 @@ * */ -#define DPOST "#9/sys/lib/postscript/prologues/dpost.ps" -#define POSTBGI "#9/sys/lib/postscript/prologues/postbgi.ps" -#define POSTDAISY "#9/sys/lib/postscript/prologues/postdaisy.ps" -#define POSTDMD "#9/sys/lib/postscript/prologues/postdmd.ps" -#define POSTMD "#9/sys/lib/postscript/prologues/postmd.ps" -#define POSTPLOT "#9/sys/lib/postscript/prologues/postplot.ps" -#define POSTPRINT "#9/sys/lib/postscript/prologues/postprint.ps" -#define POSTNPRINT "#9/sys/lib/postscript/prologues/postnprint.ps" -#define POSTTEK "#9/sys/lib/postscript/prologues/posttek.ps" -#define POSTGIF "#9/sys/lib/postscript/prologues/postgif.ps" +#define DPOST "#9/postscript/prologues/dpost.ps" +#define POSTBGI "#9/postscript/prologues/postbgi.ps" +#define POSTDAISY "#9/postscript/prologues/postdaisy.ps" +#define POSTDMD "#9/postscript/prologues/postdmd.ps" +#define POSTMD "#9/postscript/prologues/postmd.ps" +#define POSTPLOT "#9/postscript/prologues/postplot.ps" +#define POSTPRINT "#9/postscript/prologues/postprint.ps" +#define POSTNPRINT "#9/postscript/prologues/postnprint.ps" +#define POSTTEK "#9/postscript/prologues/posttek.ps" +#define POSTGIF "#9/postscript/prologues/postgif.ps" -#define BASELINE "#9/sys/lib/postscript/prologues/baseline.ps" -#define COLOR "#9/sys/lib/postscript/prologues/color.ps" -#define DRAW "#9/sys/lib/postscript/prologues/draw.ps" -#define FORMFILE "#9/sys/lib/postscript/prologues/forms.ps" -#define SHADEFILE "#9/sys/lib/postscript/prologues/shade.ps" -#define KERNING "#9/sys/lib/postscript/prologues/kerning.ps" -#define REQUESTFILE "#9/sys/lib/postscript/prologues/ps.requests" -#define ROUNDPAGE "#9/sys/lib/postscript/prologues/roundpage.ps" +#define BASELINE "#9/postscript/prologues/baseline.ps" +#define COLOR "#9/postscript/prologues/color.ps" +#define DRAW "#9/postscript/prologues/draw.ps" +#define FORMFILE "#9/postscript/prologues/forms.ps" +#define SHADEFILE "#9/postscript/prologues/shade.ps" +#define KERNING "#9/postscript/prologues/kerning.ps" +#define REQUESTFILE "#9/postscript/prologues/ps.requests" +#define ROUNDPAGE "#9/postscript/prologues/roundpage.ps" -#define ENCODINGDIR "#9/sys/lib/postscript/prologues" -#define HOSTDIR "#9/sys/lib/postscript/font" -#define FONTDIR "#9/sys/lib/troff/font" -#define POSTLIBDIR "#9/sys/lib/postscript/prologues" -#define TEMPDIR "/tmp" +#define ENCODINGDIR "#9/postscript/prologues" +#define HOSTDIR "#9/postscript/font" +#define FONTDIR "#9/troff/font" +#define POSTLIBDIR "#9/postscript/prologues" +#define TEMPDIR "#9/tmp" diff --git a/src/cmd/postscript/common/request.c b/src/cmd/postscript/common/request.c index d8d7dd13..7884b239 100644 --- a/src/cmd/postscript/common/request.c +++ b/src/cmd/postscript/common/request.c @@ -11,8 +11,12 @@ */ #include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> #include "gen.h" /* general purpose definitions */ +#include "ext.h" #include "request.h" /* a few special definitions */ #include "path.h" /* for the default request file */ @@ -22,6 +26,7 @@ char *requestfile = REQUESTFILE; /* default lookup file */ /*****************************************************************************/ +void saverequest(want) char *want; /* grab code for this stuff */ @@ -55,7 +60,9 @@ saverequest(want) } /* End of saverequest */ /*****************************************************************************/ +extern void dumprequest(); +void writerequest(page, fp_out) int page; /* write everything for this page */ @@ -80,6 +87,7 @@ writerequest(page, fp_out) /*****************************************************************************/ +void dumprequest(want, file, fp_out) char *want; /* look for this string */ diff --git a/src/cmd/postscript/common/tempnam.c b/src/cmd/postscript/common/tempnam.c index 529025ed..a759876e 100644 --- a/src/cmd/postscript/common/tempnam.c +++ b/src/cmd/postscript/common/tempnam.c @@ -1,27 +1,62 @@ #include <stdio.h> -#include <errno.h> - -#if defined(V9) || defined(BSD4_2) || defined(plan9) -char *tempnam(char *dir, char *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); +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define nil ((void*)0) + +char* +mkfname(char *tmpdir, char *prefix) +{ + int n; + char *p, *fname; + + if((p = getenv("TMPDIR")) != nil) + goto Mktemp; + if((p = tmpdir) != nil) + goto Mktemp; + p = "/tmp"; + + Mktemp: + n = strlen(p)+1+strlen(prefix)+1+8+1; + if((fname = malloc(n)) == nil) + return nil; + memset(fname, 0, n); + strcat(fname, p); + if((n = strlen(p)) > 0 && p[n-1] != '/') + strcat(fname, "/"); + strcat(fname, prefix); + strcat(fname, ".XXXXXXXX"); + + return fname; +} + +extern int mkstemp(); + +char* +safe_tempnam(char *tmpdir, char *prefix) +{ + int fd; + char *fname; + + if((fname = mkfname(tmpdir, prefix)) == nil) + return nil; + + if((fd = mkstemp(fname)) < 0){ /* XXX: leak fd, fname */ + free(fname); + return nil; } - return(tnm); + return fname; +} + +int +safe_tmpnam(char *fname) +{ + char *p; + + if((p = mkfname(nil, "tmpfile")) == nil) + return -1; + strcpy(fname, p); + free(p); + return mkstemp(fname); } -#endif diff --git a/src/cmd/postscript/config b/src/cmd/postscript/config new file mode 100644 index 00000000..fa9bb278 --- /dev/null +++ b/src/cmd/postscript/config @@ -0,0 +1,12 @@ +# edit ../ps.mk instead +SYSTEM=plan9 +VERSION=3.3.1 + +ROOT= +POSTBIN=$ROOT/$objtype/bin/aux +DKHOST=FALSE +DKSTREAMS=FALSE +ROUNDPAGE=TRUE + +FONTDIR=/sys/lib/troff/font +POSTLIB=/sys/lib/postscript/prologues diff --git a/src/cmd/postscript/download/download.c b/src/cmd/postscript/download/download.c index ab6bdd52..5a6bdf3f 100644 --- a/src/cmd/postscript/download/download.c +++ b/src/cmd/postscript/download/download.c @@ -99,10 +99,10 @@ main(agc, agv) * */ - fp_in = stdin; - argc = agc; /* other routines may want them */ argv = agv; + + fp_in = stdin; prog_name = argv[0]; /* just for error messages */ @@ -244,7 +244,7 @@ readmap() sprintf(path, "%s/%s%s", hostfontdir, mapname, suffix); } else path = mapname; - if ( (fd = open(unsharp(path), 0)) != -1 ) { + if ( (fd = open(path, 0)) != -1 ) { if ( fstat(fd, &sbuf) == -1 ) error(FATAL, "can't fstat %s", path); if ( (stringspace = (char *)malloc(sbuf.st_size + 2)) == NULL ) @@ -303,7 +303,7 @@ readresident() path = buf; } else path = residentfonts; - if ( (fp = fopen(unsharp(path), "r")) != NULL ) { + if ( (fp = fopen(path, "r")) != NULL ) { while ( fscanf(fp, "%s", buf) != EOF ) if ( buf[0] == '%' ) while ( (ch = getc(fp)) != EOF && ch != '\n' ) ; @@ -336,7 +336,7 @@ arguments() fp_temp = NULL; if ( strcmp(*argv, "-") == 0 ) fp_in = stdin; - else if ( (fp_in = fopen(unsharp(*argv), "r")) == NULL ) + else if ( (fp_in = fopen(*argv, "r")) == NULL ) error(FATAL, "can't open %s", *argv); download(); if ( fp_in != stdin ) @@ -449,9 +449,9 @@ copyfonts(list) if ( (path = (char *)malloc(strlen(hostfontdir)+strlen(map[n].file)+2)) == NULL ) error(FATAL, "no memory"); sprintf(path, "%s/%s", hostfontdir, map[n].file); - cat(unsharp(path)); + cat(path); free(path); - } else cat(unsharp(map[n].file)); + } else cat(map[n].file); map[n].downloaded = TRUE; } /* End if */ } /* End while */ diff --git a/src/cmd/postscript/hardcopy/README b/src/cmd/postscript/hardcopy/README new file mode 100644 index 00000000..2ad29065 --- /dev/null +++ b/src/cmd/postscript/hardcopy/README @@ -0,0 +1,11 @@ +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. + diff --git a/src/cmd/postscript/hardcopy/hardcopy.ps b/src/cmd/postscript/hardcopy/hardcopy.ps new file mode 100644 index 00000000..65eb24df --- /dev/null +++ b/src/cmd/postscript/hardcopy/hardcopy.ps @@ -0,0 +1,196 @@ +% +% 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 + diff --git a/src/cmd/postscript/hardcopy/hardcopy.rc b/src/cmd/postscript/hardcopy/hardcopy.rc new file mode 100644 index 00000000..0077aa71 --- /dev/null +++ b/src/cmd/postscript/hardcopy/hardcopy.rc @@ -0,0 +1,70 @@ +#!/bin/rc +# Generate paper output from the data that a PostScript program normally +# sends back to a host computer using file output operators. +# + +POSTLIB=/sys/lib/postscript/prologues +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 (! ~ $#* 0 && ~ $1 -*) { + switch ($1) { + case -c; shift; OPTIONS=$OPTIONS' /#copies '$1' store' + case -c*; OPTIONS=$OPTIONS' /#copies `{echo $1 | sed s/-c//}' store' + + case -f; shift; OPTIONS=$OPTIONS' /font '/$1' def' + case -f*; OPTIONS=$OPTIONS' /font '/`{echo $1 | sed s/-f//}' def' + + case -p; shift; MODE=$1 + case -p*; MODE=`{echo $1 | sed s/-p//} + + case -m; shift; OPTIONS=$OPTIONS' /magnification '$1' def' + case -m*; OPTIONS=$OPTIONS' /magnification '`{echo $1 | sed s/-m//}' def' + + case -s; shift; OPTIONS=$OPTIONS' /pointsize '$1' def' + case -s*; OPTIONS=$OPTIONS' /pointsize '`{echo $1 | sed s/-s//}' def' + + case -x; shift; OPTIONS=$OPTIONS' /xoffset '$1' def' + case -x*; OPTIONS=$OPTIONS' /xoffset '`{echo $1 | sed s/-x//}' def' + + case -y; shift; OPTIONS=$OPTIONS' /yoffset '$1' def' + case -y*; OPTIONS=$OPTIONS' /yoffset '`{echo $1 | sed s/-y//}' def' + + case -L; shift; PROLOGUE=$1 + case -L*; PROLOGUE=`{echo $1 | sed s/-L//} + + case --; + + case -*; echo '$0: illegal option $1' >&2; exit 1 + } + shift +} + +switch ($MODE) { + case l*; OPTIONS=$OPTIONS' /landscape true def' + case *; OPTIONS=$OPTIONS' /landscape false def' +} + +echo $NONCONFORMING +cat $PROLOGUE +echo $ENDPROLOG +echo $BEGINSETUP +echo $OPTIONS +echo $SETUP +echo $ENDSETUP + +cat $* + +echo $TRAILER +echo $DONE diff --git a/src/cmd/postscript/hardcopy/mkfile b/src/cmd/postscript/hardcopy/mkfile new file mode 100644 index 00000000..c6131dba --- /dev/null +++ b/src/cmd/postscript/hardcopy/mkfile @@ -0,0 +1,20 @@ +</$objtype/mkfile + +<../config + +all:V: hardcopy + +installall install:V: $POSTBIN/hardcopy $POSTLIB/hardcopy.ps + +$POSTBIN/hardcopy: hardcopy + cp $prereq $target + +$POSTLIB/hardcopy.ps: hardcopy.ps + cp $prereq $target + +hardcopy: hardcopy.rc + sed 's?^POSTLIB=.*?POSTLIB='$POSTLIB'?' hardcopy.rc >hardcopy + chmod 775 hardcopy + +clean nuke:V: + rm -f hardcopy diff --git a/src/cmd/postscript/mcolor/.cvsignore b/src/cmd/postscript/mcolor/.cvsignore new file mode 100644 index 00000000..0c5af57d --- /dev/null +++ b/src/cmd/postscript/mcolor/.cvsignore @@ -0,0 +1 @@ +tmac.color diff --git a/src/cmd/postscript/mcolor/color.sr b/src/cmd/postscript/mcolor/color.sr new file mode 100644 index 00000000..0a63aad5 --- /dev/null +++ b/src/cmd/postscript/mcolor/color.sr @@ -0,0 +1,45 @@ +.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 +.. diff --git a/src/cmd/postscript/mcolor/mcolor.5 b/src/cmd/postscript/mcolor/mcolor.5 new file mode 100644 index 00000000..bf0181fd --- /dev/null +++ b/src/cmd/postscript/mcolor/mcolor.5 @@ -0,0 +1,60 @@ +.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) diff --git a/src/cmd/postscript/mcolor/mcolor.mk b/src/cmd/postscript/mcolor/mcolor.mk new file mode 100644 index 00000000..aacadcfb --- /dev/null +++ b/src/cmd/postscript/mcolor/mcolor.mk @@ -0,0 +1,53 @@ +# +# 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 + diff --git a/src/cmd/postscript/misc/.cvsignore b/src/cmd/postscript/misc/.cvsignore new file mode 100644 index 00000000..c865cf4e --- /dev/null +++ b/src/cmd/postscript/misc/.cvsignore @@ -0,0 +1,4 @@ +ibmfont +laserbar +macfont +pscrypt diff --git a/src/cmd/postscript/misc/README b/src/cmd/postscript/misc/README new file mode 100644 index 00000000..d17f15da --- /dev/null +++ b/src/cmd/postscript/misc/README @@ -0,0 +1,15 @@ +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. + diff --git a/src/cmd/postscript/misc/ibmfont.c b/src/cmd/postscript/misc/ibmfont.c new file mode 100644 index 00000000..49736d6f --- /dev/null +++ b/src/cmd/postscript/misc/ibmfont.c @@ -0,0 +1,296 @@ +/* + * + * 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; +FILE *fp_out; + +/*****************************************************************************/ + +main(agc, agv) + + int agc; + char *agv[]; + +{ + +/* + * + * IBM PC to Unix font converter. + * + */ + + argc = agc; + argv = agv; + prog_name = argv[0]; + + fp_in = stdin; + fp_out = stdout; + + 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 */ + +/*****************************************************************************/ + diff --git a/src/cmd/postscript/misc/laserbar.1 b/src/cmd/postscript/misc/laserbar.1 new file mode 100644 index 00000000..e845fc9b --- /dev/null +++ b/src/cmd/postscript/misc/laserbar.1 @@ -0,0 +1,41 @@ +.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. diff --git a/src/cmd/postscript/misc/laserbar.c b/src/cmd/postscript/misc/laserbar.c new file mode 100644 index 00000000..2f61c277 --- /dev/null +++ b/src/cmd/postscript/misc/laserbar.c @@ -0,0 +1,166 @@ +/* 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; +} diff --git a/src/cmd/postscript/misc/lp.model b/src/cmd/postscript/misc/lp.model new file mode 100644 index 00000000..966621e3 --- /dev/null +++ b/src/cmd/postscript/misc/lp.model @@ -0,0 +1,66 @@ + +# 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 + diff --git a/src/cmd/postscript/misc/macfont.c b/src/cmd/postscript/misc/macfont.c new file mode 100644 index 00000000..59244a19 --- /dev/null +++ b/src/cmd/postscript/misc/macfont.c @@ -0,0 +1,299 @@ +/* + * + * 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; +FILE *fp_out; + +/*****************************************************************************/ + +main(agc, agv) + + int agc; + char *agv[]; + +{ + +/* + * + * Macintosh to Unix font converter. + * + */ + + argc = agc; + argv = agv; + prog_name = argv[0]; + + fp_in = stdin; + fp_out = stdout; + + 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 */ + +/*****************************************************************************/ + diff --git a/src/cmd/postscript/misc/pscrypt.c b/src/cmd/postscript/misc/pscrypt.c new file mode 100644 index 00000000..1715288b --- /dev/null +++ b/src/cmd/postscript/misc/pscrypt.c @@ -0,0 +1,335 @@ +/* + * + * 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; + +/*****************************************************************************/ + +main(agc, agv) + + int agc; + char *agv[]; + +{ + +/* + * + * Implementation of the encryption/decryption used by eexec and show. + * + */ + + argc = agc; + argv = agv; + + fp_in = stdin; + + 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 */ + +/*****************************************************************************/ + diff --git a/src/cmd/postscript/misc/setbaud.ps b/src/cmd/postscript/misc/setbaud.ps new file mode 100644 index 00000000..93148d0c --- /dev/null +++ b/src/cmd/postscript/misc/setbaud.ps @@ -0,0 +1,9 @@ +% +% Sets baud rate to 9600, options to 0 assuming the password is 0. +% + +serverdict begin + 0 exitserver + statusdict begin + 25 9600 0 setsccbatch + end diff --git a/src/cmd/postscript/mkfile b/src/cmd/postscript/mkfile index 158be819..cf6d3ac5 100644 --- a/src/cmd/postscript/mkfile +++ b/src/cmd/postscript/mkfile @@ -14,7 +14,7 @@ DIRS=\ # postprint\ # postreverse\ # posttek\ -# printfont\ + printfont\ # psencoding\ # psfiles\ # g3p9bit\ diff --git a/src/cmd/postscript/mpictures/.cvsignore b/src/cmd/postscript/mpictures/.cvsignore new file mode 100644 index 00000000..b352e031 --- /dev/null +++ b/src/cmd/postscript/mpictures/.cvsignore @@ -0,0 +1 @@ +tmac.pictures diff --git a/src/cmd/postscript/mpictures/mkfile b/src/cmd/postscript/mpictures/mkfile new file mode 100644 index 00000000..cc4d48c2 --- /dev/null +++ b/src/cmd/postscript/mpictures/mkfile @@ -0,0 +1,18 @@ +</$objtype/mkfile + +<../config + +TMACDIR=/sys/lib/tmac + +all:V: tmac.pictures + +install installall:V: $TMACDIR/tmac.pictures + +clean nuke:V: + rm -f tmac.pictures + +$TMACDIR/tmac.pictures: tmac.pictures + cp $prereq $target + +tmac.pictures : pictures.sr + cp $prereq $target diff --git a/src/cmd/postscript/mpictures/pictures.sr b/src/cmd/postscript/mpictures/pictures.sr new file mode 100644 index 00000000..6ff4f96e --- /dev/null +++ b/src/cmd/postscript/mpictures/pictures.sr @@ -0,0 +1,154 @@ +.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\} +.. diff --git a/src/cmd/postscript/postreverse/.cvsignore b/src/cmd/postscript/postreverse/.cvsignore new file mode 100644 index 00000000..ce6f8746 --- /dev/null +++ b/src/cmd/postscript/postreverse/.cvsignore @@ -0,0 +1 @@ +postreverse diff --git a/src/cmd/postscript/postreverse/README b/src/cmd/postscript/postreverse/README new file mode 100644 index 00000000..d7038ae8 --- /dev/null +++ b/src/cmd/postscript/postreverse/README @@ -0,0 +1,10 @@ + +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. + diff --git a/src/cmd/postscript/postreverse/mkfile b/src/cmd/postscript/postreverse/mkfile new file mode 100644 index 00000000..0e935e80 --- /dev/null +++ b/src/cmd/postscript/postreverse/mkfile @@ -0,0 +1,29 @@ +</$objtype/mkfile + +<../config + +COMMONDIR=../common + +TARG=postreverse + +OFILES=postreverse.$O\ + +HFILES=postreverse.h\ + $COMMONDIR/comments.h\ + $COMMONDIR/ext.h\ + $COMMONDIR/gen.h\ + $COMMONDIR/path.h\ + +BIN=$POSTBIN +LIB=$COMMONDIR/com.a$O + +</sys/src/cmd/mkone + +CC=pcc +LD=pcc +CFLAGS=-c -D$SYSTEM -D_POSIX_SOURCE -I$COMMONDIR -B + +$LIB: + cd $COMMONDIR + mk install + mk clean diff --git a/src/cmd/postscript/postreverse/postreverse.c b/src/cmd/postscript/postreverse/postreverse.c new file mode 100644 index 00000000..d99124d5 --- /dev/null +++ b/src/cmd/postscript/postreverse/postreverse.c @@ -0,0 +1,544 @@ +/* + * + * 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 <sys/types.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; /* 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 */ + + fp_in = stdin; + fp_out = stdout; + + 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 */ + +/*****************************************************************************/ + diff --git a/src/cmd/postscript/postreverse/postreverse.h b/src/cmd/postscript/postreverse/postreverse.h new file mode 100644 index 00000000..edae7a27 --- /dev/null +++ b/src/cmd/postscript/postreverse/postreverse.h @@ -0,0 +1,21 @@ +/* + * + * 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(); + diff --git a/src/cmd/postscript/printfont/mkfile b/src/cmd/postscript/printfont/mkfile new file mode 100644 index 00000000..8ddadb25 --- /dev/null +++ b/src/cmd/postscript/printfont/mkfile @@ -0,0 +1,22 @@ +</$objtype/mkfile + +<../config + +POSTBIN=/rc/bin + +all:V: printfont + +install installall:V: $POSTBIN/printfont $POSTLIB/printfont.ps + +clean nuke:V: + rm -f printfont + +$POSTBIN/printfont: printfont + cp $prereq $target + +$POSTLIB/printfont.ps: printfont.ps + cp $prereq $target + +printfont: printfont.rc + sed 's?^POSTLIB=.*?POSTLIB='$POSTLIB'?' printfont.rc >printfont + chmod 775 printfont diff --git a/src/cmd/postscript/printfont/printfont.ps b/src/cmd/postscript/printfont/printfont.ps new file mode 100644 index 00000000..7a881a4d --- /dev/null +++ b/src/cmd/postscript/printfont/printfont.ps @@ -0,0 +1,321 @@ +% +% 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 + diff --git a/src/cmd/postscript/printfont/printfont.rc b/src/cmd/postscript/printfont/printfont.rc new file mode 100644 index 00000000..266102f9 --- /dev/null +++ b/src/cmd/postscript/printfont/printfont.rc @@ -0,0 +1,105 @@ +#!/bin/rc +# 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=/sys/lib/postscript/prologues +PROLOGUE=$POSTLIB/printfont.ps + +OPTIONS='' +COPYFILE='' +MODE=portrait +FONTENCODING=Default + +NONCONFORMING='%!PS' +ENDPROLOG='%%EndProlog' +BEGINSETUP='%%BeginSetup' +ENDSETUP='%%EndSetup' +TRAILER='%%Trailer' + +SETUP=setup + +while (! ~ $#* 0 && ~ $1 -*) { + switch ($1) { + case -a; shift; OPTIONS=$OPTIONS' /axescount $1 def' + case -a*; OPTIONS=$OPTIONS' /axescount '`{echo $1 | sed s/-a//}' def' + + case -b; shift; OPTIONS=$OPTIONS' /radix '$1' def' + case -b*; OPTIONS=$OPTIONS' /radix '`{echo $1 | sed s/-b//}' def' + + case -c; shift; OPTIONS=$OPTIONS' /#copies '$1' store' + case -c*; OPTIONS=$OPTIONS' /#copies '`{echo $1 | sed s/-c//}' store' + + case -f; shift; OPTIONS=$OPTIONS' /labelfont /'$1' def' + case -f*; OPTIONS=$OPTIONS' /labelfont /'`{echo $1 | sed s/-f//}' def' + + case -g; shift; OPTIONS=$OPTIONS' /graynotdef '$1' def' + case -g*; OPTIONS=$OPTIONS' /graynotdef '`{echo $1 | sed s/-g//}' def' + + case -p; shift; MODE=$1 + case -p*; MODE=`{echo $1 | sed s/-p//} + + case -q; OPTIONS=$OPTIONS' /longnames false def /charwidth false def' + + case -m; shift; OPTIONS=$OPTIONS' /magnification '$1' def' + case -m*; OPTIONS=$OPTIONS' /magnification '`{echo $1 | sed s/-m//}' def' + + case -v; OPTIONS=$OPTIONS' /longnames true def /charwidth true def' + + case -w; shift; OPTIONS=$OPTIONS' /linewidth '$1' def' + case -w*; OPTIONS=$OPTIONS' /linewidth '`{echo $1 | sed s/-w//}' def' + + case -x; shift; OPTIONS=$OPTIONS' /xoffset '$1' def' + case -x*; OPTIONS=$OPTIONS' /xoffset '`{echo $1 | sed s/-x//}' def' + + case -y; shift; OPTIONS=$OPTIONS' /yoffset '$1' def' + case -y*; OPTIONS=$OPTIONS' /yoffset '`{echo $1 | sed s/-y//}' def' + + case -z; shift; OPTIONS=$OPTIONS' /zerocell '$1' def' + case -z*; OPTIONS=$OPTIONS' /zerocell '`{echo $1 | sed s/-z//}' def' + + case -C; shift; COPYFILE=$COPYFILE' '$1 + case -C*; COPYFILE=$COPYFILE' '`{echo $1 | sed s/-C//} + + case -E; shift; FONTENCODING=$1 + case -E*; FONTENCODING=`{echo $1 | sed s/-E//} + + case -L; shift; PROLOGUE=$1 + case -L*; PROLOGUE=`{echo $1 | sed s/-L//} + + case -*; echo $0:' illegal option '$1 >[1=2]; exit 1 + } + shift +} + +switch ($MODE) { +case l*; OPTIONS=$OPTIONS' /landscape true def' +case *; OPTIONS=$OPTIONS' /landscape false def' +} + +echo $NONCONFORMING +cat $PROLOGUE +echo $ENDPROLOG +echo $BEGINSETUP +if (~ $#COPYFILE 0 || ~ $COPYFILE '') COPYFILE=/dev/null +cat $COPYFILE +echo $OPTIONS + +switch ($FONTENCODING) { +case /*; cat $FONTENCODING +case ?*; cat $POSTLIB^/$FONTENCODING^.enc >[2]/dev/null +} + +echo $SETUP +echo $ENDSETUP + +for (i) { + switch ($i) { + case all; echo AllFonts + case /*; echo $i' PrintFont' + case ?*; echo /$i' PrintFont' + } +} + +echo $TRAILER diff --git a/src/cmd/postscript/psencoding/.cvsignore b/src/cmd/postscript/psencoding/.cvsignore new file mode 100644 index 00000000..7f441579 --- /dev/null +++ b/src/cmd/postscript/psencoding/.cvsignore @@ -0,0 +1 @@ +psencoding diff --git a/src/cmd/postscript/psencoding/Latin1.enc b/src/cmd/postscript/psencoding/Latin1.enc new file mode 100644 index 00000000..1e6e60b1 --- /dev/null +++ b/src/cmd/postscript/psencoding/Latin1.enc @@ -0,0 +1,299 @@ +% +% 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 + diff --git a/src/cmd/postscript/psencoding/UTF.enc b/src/cmd/postscript/psencoding/UTF.enc new file mode 100644 index 00000000..234764e3 --- /dev/null +++ b/src/cmd/postscript/psencoding/UTF.enc @@ -0,0 +1,332 @@ +% +% 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 + diff --git a/src/cmd/postscript/psencoding/mkfile b/src/cmd/postscript/psencoding/mkfile new file mode 100644 index 00000000..eaceebdb --- /dev/null +++ b/src/cmd/postscript/psencoding/mkfile @@ -0,0 +1,22 @@ +</$objtype/mkfile + +<../config + +POSTBIN=$ROOT/rc/bin/postscript + +all:V: psencoding + +install installall:V: $POSTBIN/psencoding $POSTLIB/Latin1.enc $POSTLIB/UTF.enc + +clean nuke:V: + rm -f psencoding + +$POSTBIN/psencoding: psencoding + cp $prereq $target + +$POSTLIB/%.enc: %.enc + cp $prereq $target + +psencoding: psencoding.rc + sed 's?^POSTLIB=.*?POSTLIB='$POSTLIB'?' psencoding.rc >psencoding + chmod 775 psencoding diff --git a/src/cmd/postscript/psencoding/psencoding.rc b/src/cmd/postscript/psencoding/psencoding.rc new file mode 100644 index 00000000..c0b6aeff --- /dev/null +++ b/src/cmd/postscript/psencoding/psencoding.rc @@ -0,0 +1,39 @@ +#!/bin/rc +# 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=/sys/lib/postscript/prologues +DEFAULT=Default.enc +CURRENTDEFAULT=Standard + +if (~ $#* 0) { + cd $POSTLIB + for (i in *.enc) { + if (test -f $i -a $i '!=' $DEFAULT) { + NAME=`{echo $i | sed s/\\.enc//} + if (cmp $i $DEFAULT >/dev/null >[2]/dev/null) { + CURRENTDEFAULT=$NAME + } + echo $NAME + } + } + echo Standard + echo Default'='$CURRENTDEFAULT +} +if not { + switch ($1) { + case Default + ; + case Standard + rm -f $POSTLIB/$DEFAULT + case * + if (test -f $POSTLIB/$1.enc) { + rm -f $POSTLIB/$DEFAULT + cp $POSTLIB/$1.enc $POSTLIB/$DEFAULT + } + if not echo unrecognized encoding name $1 >[1=2] + } +} diff --git a/src/cmd/postscript/psfiles/Nroundpage.ps b/src/cmd/postscript/psfiles/Nroundpage.ps new file mode 100644 index 00000000..44a67a6d --- /dev/null +++ b/src/cmd/postscript/psfiles/Nroundpage.ps @@ -0,0 +1,11 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/README b/src/cmd/postscript/psfiles/README new file mode 100644 index 00000000..c1a70140 --- /dev/null +++ b/src/cmd/postscript/psfiles/README @@ -0,0 +1,11 @@ +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. + diff --git a/src/cmd/postscript/psfiles/aps.ps b/src/cmd/postscript/psfiles/aps.ps new file mode 100644 index 00000000..9ba0d309 --- /dev/null +++ b/src/cmd/postscript/psfiles/aps.ps @@ -0,0 +1,127 @@ +% +% 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 + diff --git a/src/cmd/postscript/psfiles/banner.ps b/src/cmd/postscript/psfiles/banner.ps new file mode 100644 index 00000000..d5637416 --- /dev/null +++ b/src/cmd/postscript/psfiles/banner.ps @@ -0,0 +1,40 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/baseline.ps b/src/cmd/postscript/psfiles/baseline.ps new file mode 100644 index 00000000..470047c9 --- /dev/null +++ b/src/cmd/postscript/psfiles/baseline.ps @@ -0,0 +1,156 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/color.ps b/src/cmd/postscript/psfiles/color.ps new file mode 100644 index 00000000..e304cc3a --- /dev/null +++ b/src/cmd/postscript/psfiles/color.ps @@ -0,0 +1,65 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/fatcourier.ps b/src/cmd/postscript/psfiles/fatcourier.ps new file mode 100644 index 00000000..11d71881 --- /dev/null +++ b/src/cmd/postscript/psfiles/fatcourier.ps @@ -0,0 +1,26 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/forms.ps b/src/cmd/postscript/psfiles/forms.ps new file mode 100644 index 00000000..a96fcdae --- /dev/null +++ b/src/cmd/postscript/psfiles/forms.ps @@ -0,0 +1,213 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/mkfile b/src/cmd/postscript/psfiles/mkfile new file mode 100644 index 00000000..ee75ec5a --- /dev/null +++ b/src/cmd/postscript/psfiles/mkfile @@ -0,0 +1,12 @@ +</$objtype/mkfile + +<../config + +all:VQ: + ; + +install installall:V: + cp *.ps ps.* $POSTLIB + +clean nuke:VQ: + ; diff --git a/src/cmd/postscript/psfiles/ps.requests b/src/cmd/postscript/psfiles/ps.requests new file mode 100644 index 00000000..59e2a571 --- /dev/null +++ b/src/cmd/postscript/psfiles/ps.requests @@ -0,0 +1,16 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/roundpage.ps b/src/cmd/postscript/psfiles/roundpage.ps new file mode 100644 index 00000000..68d2d443 --- /dev/null +++ b/src/cmd/postscript/psfiles/roundpage.ps @@ -0,0 +1,30 @@ +% +% 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 + diff --git a/src/cmd/postscript/psfiles/shade.ps b/src/cmd/postscript/psfiles/shade.ps new file mode 100644 index 00000000..47e31679 --- /dev/null +++ b/src/cmd/postscript/psfiles/shade.ps @@ -0,0 +1,52 @@ +% +% 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 diff --git a/src/cmd/postscript/psfiles/unbind.ps b/src/cmd/postscript/psfiles/unbind.ps new file mode 100644 index 00000000..98e6283e --- /dev/null +++ b/src/cmd/postscript/psfiles/unbind.ps @@ -0,0 +1,28 @@ +% +% 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 + diff --git a/src/cmd/postscript/tr2post/Bgetfield.c b/src/cmd/postscript/tr2post/Bgetfield.c index 8922139d..974fce62 100644 --- a/src/cmd/postscript/tr2post/Bgetfield.c +++ b/src/cmd/postscript/tr2post/Bgetfield.c @@ -4,9 +4,6 @@ #include "../common/common.h" #include "tr2post.h" -#undef isspace -#define isspace bisspace - int isspace(Rune r) { @@ -14,7 +11,7 @@ isspace(Rune r) } int -Bskipws(Biobuf *bp) { +Bskipws(Biobufhdr *bp) { int r; char c[UTFmax]; int sindex = 0; @@ -36,13 +33,15 @@ Bskipws(Biobuf *bp) { int asc2dig(char c, int base) { - if (c >= '0' && c <= '9') + if (c >= '0' && c <= '9'){ if (base == 8 && c > '7') return(-1); else return(c - '0'); + } - if (base == 16) + if (base == 16){ if (c >= 'a' && c <= 'f') return(10 + c - 'a'); else if (c >= 'A' && c <= 'F') return(10 + c - 'A'); + } return(-1); } @@ -55,7 +54,7 @@ asc2dig(char c, int base) { */ int -Bgetfield(Biobuf *bp, int type, void *thing, int size) { +Bgetfield(Biobufhdr *bp, int type, void *thing, int size) { int r; Rune R; char c[UTFmax]; diff --git a/src/cmd/postscript/tr2post/chartab.c b/src/cmd/postscript/tr2post/chartab.c index 87ab556b..89bf0ff7 100644 --- a/src/cmd/postscript/tr2post/chartab.c +++ b/src/cmd/postscript/tr2post/chartab.c @@ -120,30 +120,31 @@ findpfn(char *fontname, int insflg) { return(-1); } -char postroffdirname[] = "#9/sys/lib/postscript/troff"; /* "/sys/lib/postscript/troff/"; */ -char troffmetricdirname[] = "#9/sys/lib/troff/font"; /* "/sys/lib/troff/font/devutf/"; */ +char postroffdirname[] = LIBDIR "/postscript/troff"; /* "/sys/lib/postscript/troff/"; */ +char troffmetricdirname[] = LIBDIR "/troff/font"; /* "/sys/lib/troff/font/devutf/"; */ int readpsfontdesc(char *fontname, int trindex) { static char *filename = 0; Biobuf *bfd; - Biobuf *Bfd; + Biobufhdr *Bfd; int warn = 0, errorflg = 0, line =1, rv; int start, end, offset; int startfont, endfont, startchar, endchar, i, pfid; char psfontnam[128]; struct troffont *tp; +/* struct charent *cp[]; */ if (debug) Bprint(Bstderr, "readpsfontdesc(%s,%d)\n", fontname, trindex); filename=galloc(filename, strlen(postroffdirname)+1+strlen(fontname)+1, "readpsfontdesc: cannot allocate memory\n"); sprint(filename, "%s/%s", postroffdirname, fontname); - bfd = Bopen(unsharp(filename), OREAD); + bfd = Bopen(filename, OREAD); if (bfd == 0) { error(WARNING, "cannot open file %s\n", filename); return(0); } - Bfd = bfd; + Bfd = bfd; /* &(bfd->Biobufhdr); */ do { offset = 0; @@ -211,7 +212,7 @@ int readtroffmetric(char *fontname, int trindex) { static char *filename = 0; Biobuf *bfd; - Biobuf *Bfd; + Biobufhdr *Bfd; int warn = 0, errorflg = 0, line =1, rv; struct troffont *tp; struct charent **cp; @@ -225,12 +226,12 @@ readtroffmetric(char *fontname, int trindex) { filename=galloc(filename, strlen(troffmetricdirname)+4+strlen(devname)+1+strlen(fontname)+1, "readtroffmetric():filename"); sprint(filename, "%s/dev%s/%s", troffmetricdirname, devname, fontname); - bfd = Bopen(unsharp(filename), OREAD); + bfd = Bopen(filename, OREAD); if (bfd == 0) { error(WARNING, "cannot open file %s\n", filename); return(0); } - Bfd = bfd; + Bfd = bfd; /* &(bfd->Biobufhdr); */ do { /* deal with the few lines at the beginning of the * troff font metric files. diff --git a/src/cmd/postscript/tr2post/conv.c b/src/cmd/postscript/tr2post/conv.c index 4b7d97f6..ebc1f43d 100644 --- a/src/cmd/postscript/tr2post/conv.c +++ b/src/cmd/postscript/tr2post/conv.c @@ -5,14 +5,14 @@ #include "tr2post.h" void -conv(Biobuf *Bp) { +conv(Biobufhdr *Bp) { long c, n; int r; char special[10]; int save; inputlineno = 1; - if (debug) Bprint(Bstderr, "conv(Biobuf *Bp=0x%x)\n", Bp); + if (debug) Bprint(Bstderr, "conv(Biobufhdr *Bp=0x%x)\n", Bp); while ((r = Bgetrune(Bp)) >= 0) { /* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */ /* Bflush(Bstderr); */ diff --git a/src/cmd/postscript/tr2post/devcntl.c b/src/cmd/postscript/tr2post/devcntl.c index 8b438f76..2566229e 100644 --- a/src/cmd/postscript/tr2post/devcntl.c +++ b/src/cmd/postscript/tr2post/devcntl.c @@ -16,11 +16,11 @@ struct sjt { /* I won't need this if getfields can replace sscanf -extern void picture(Biobuf *); +extern void picture(Biobufhdr *); extern void notavail(char *); void -PSInclude(Biobuf *inp) { +PSInclude(Biobufhdr *inp) { char buf[256]; Bgetfield(inp, 's', buf, 256); @@ -51,7 +51,7 @@ struct sjt specialjumptable[] = { */ void -devcntl(Biobuf *inp) { +devcntl(Biobufhdr *inp) { char cmd[50], buf[256], str[MAXTOKENSIZE], *line; int c, n, linelen; diff --git a/src/cmd/postscript/tr2post/draw.c b/src/cmd/postscript/tr2post/draw.c index 575ec884..0cb368ae 100644 --- a/src/cmd/postscript/tr2post/draw.c +++ b/src/cmd/postscript/tr2post/draw.c @@ -13,7 +13,7 @@ cover(double x, double y) { } void -drawspline(Biobuf *Bp, int flag) { /* flag!=1 connect end points */ +drawspline(Biobufhdr *Bp, int flag) { /* flag!=1 connect end points */ int x[100], y[100]; int i, N; /* @@ -96,7 +96,7 @@ drawspline(Biobuf *Bp, int flag) { /* flag!=1 connect end points */ } void -draw(Biobuf *Bp) { +draw(Biobufhdr *Bp) { int r, x1, y1, x2, y2, i; int d1, d2; diff --git a/src/cmd/postscript/tr2post/pictures.c b/src/cmd/postscript/tr2post/pictures.c index a20b7ade..8d758cbd 100644 --- a/src/cmd/postscript/tr2post/pictures.c +++ b/src/cmd/postscript/tr2post/pictures.c @@ -50,8 +50,8 @@ /* #include "ext.h" */ Biobuf *bfp_pic = NULL; -Biobuf *Bfp_pic; -Biobuf *picopen(char *); +Biobufhdr *Bfp_pic; +Biobufhdr *picopen(char *); #define MAXGETFIELDS 16 char *fields[MAXGETFIELDS]; @@ -63,7 +63,7 @@ extern int picflag; /*****************************************************************************/ void -picture(Biobuf *inp, char *buf) { +picture(Biobufhdr *inp, char *buf) { int poffset; /* page offset */ int indent; /* indent */ int length; /* line length */ @@ -80,7 +80,7 @@ picture(Biobuf *inp, char *buf) { double adjx = 0.5; /* left-right adjustment */ double adjy = 0.5; /* top-bottom adjustment */ double rot = 0; /* rotation in clockwise degrees */ - Biobuf *fp_in; /* for *name */ + Biobufhdr *fp_in; /* for *name */ int i; /* loop index */ /* @@ -195,18 +195,18 @@ picture(Biobuf *inp, char *buf) { * open file *path and return the resulting file pointer to the caller. * */ -Biobuf * +Biobufhdr * picopen(char *path) { /* char name[100]; /* pathnames */ /* long pos; /* current position */ /* long total; /* and sizes - from *fp_pic */ Biobuf *bfp; - Biobuf *Bfp; /* and pointer for the new temp file */ + Biobufhdr *Bfp; /* and pointer for the new temp file */ if ((bfp = Bopen(path, OREAD)) == 0) error(FATAL, "can't open %s\n", path); - Bfp = bfp; + Bfp = bfp; /* &(bfp->Biobufhdr); */ return(Bfp); #ifdef UNDEF if (Bfp_pic != NULL) { @@ -219,7 +219,7 @@ picopen(char *path) { error(FATAL, "can't generate temp file name"); if ( (bfp = Bopen(pictmpname, ORDWR)) == NULL ) error(FATAL, "can't open %s", pictmpname); - Bfp = bfp; + Bfp = &(bfp->Biobufhdr); piccopy(Bfp_pic, Bfp, total); Bseek(Bfp, 0L, 0); return(Bfp); @@ -230,7 +230,7 @@ picopen(char *path) { if ((bfp = Bopen(path, OREAD)) == 0) Bfp = 0; else - Bfp = bfp; + Bfp = &(bfp->Biobufhdr); return(Bfp); #endif } @@ -249,7 +249,7 @@ picopen(char *path) { #ifdef UNDEF void -inlinepic(Biobuf *Bfp, char *buf) { +inlinepic(Biobufhdr *Bfp, char *buf) { char name[100]; /* picture file pathname */ long total; /* and size - both from *buf */ @@ -285,7 +285,7 @@ inlinepic(Biobuf *Bfp, char *buf) { /* *fp_out; and output file pointers */ /* total; number of bytes to be copied */ void -piccopy(Biobuf *Bfp_in, Biobuf *Bfp_out, long total) { +piccopy(Biobufhdr *Bfp_in, Biobufhdr *Bfp_out, long total) { long i; for (i = 0; i < total; i++) diff --git a/src/cmd/postscript/tr2post/ps_include.c b/src/cmd/postscript/tr2post/ps_include.c index af30ff21..27d020a3 100644 --- a/src/cmd/postscript/tr2post/ps_include.c +++ b/src/cmd/postscript/tr2post/ps_include.c @@ -11,8 +11,8 @@ extern int curfontsize; typedef struct {long start, end;} Section; static char *buf; -static void -copy(Biobuf *fin, Biobuf *fout, Section *s) { +static +copy(Biobufhdr *fin, Biobufhdr *fout, Section *s) { int cond; if (s->end <= s->start) return; @@ -57,7 +57,7 @@ copy(Biobuf *fin, Biobuf *fout, Section *s) { /* rot; /* rotation - in clockwise degrees */ void -ps_include(Biobuf *fin, Biobuf *fout, int page_no, int whiteout, +ps_include(Biobufhdr *fin, Biobufhdr *fout, int page_no, int whiteout, int outline, int scaleboth, double cx, double cy, double sx, double sy, double ax, double ay, double rot) { char **strp; diff --git a/src/cmd/postscript/tr2post/readDESC.c b/src/cmd/postscript/tr2post/readDESC.c index 03b8b64d..4dbc193a 100644 --- a/src/cmd/postscript/tr2post/readDESC.c +++ b/src/cmd/postscript/tr2post/readDESC.c @@ -44,19 +44,19 @@ readDESC(void) { char *descnameformat = "%s/dev%s/DESC"; char *descfilename = 0; Biobuf *bfd; - Biobuf *Bfd; + Biobufhdr *Bfd; int i, state = -1; int fontindex = 0; if (debug) Bprint(Bstderr, "readDESC()\n"); descfilename = galloc(descfilename, strlen(descnameformat)+strlen(FONTDIR) - +strlen(devname)+1, "readdesc"); + +strlen(devname), "readdesc"); sprint(descfilename, descnameformat, FONTDIR, devname); - if ((bfd = Bopen(unsharp(descfilename), OREAD)) == 0) { + if ((bfd = Bopen(descfilename, OREAD)) == 0) { error(WARNING, "cannot open file %s\n", descfilename); return(0); } - Bfd = bfd; + Bfd = bfd; /* &(bfd->Biobufhdr); */ while (Bgetfield(Bfd, 's', token, MAXTOKENSIZE) > 0) { for (i=0; i<NDESCTOKS; i++) { diff --git a/src/cmd/postscript/tr2post/tr2post.c b/src/cmd/postscript/tr2post/tr2post.c index d60e0c7a..acfe604d 100644 --- a/src/cmd/postscript/tr2post/tr2post.c +++ b/src/cmd/postscript/tr2post/tr2post.c @@ -23,7 +23,7 @@ Biobuf binp, *bstdout, bstderr; Biobuf *Bstdin, *Bstdout, *Bstderr; int debug = 0; -char tmpfilename[MAXTOKENSIZE]; +char tmpfilename[MAXPATHLEN+1]; char copybuf[BUFSIZ]; @@ -41,20 +41,20 @@ prologues(void) { Bprint(Bstdout, "%s %s\n", PAGES, ATEND); Bprint(Bstdout, "%s", ENDCOMMENTS); - if (cat(unsharp(DPOST))) { + if (cat(DPOST)) { Bprint(Bstderr, "can't read %s\n", DPOST); exits("dpost prologue"); } if (drawflag) { - if (cat(unsharp(DRAW))) { + if (cat(DRAW)) { Bprint(Bstderr, "can't read %s\n", DRAW); exits("draw prologue"); } } if (DOROUND) - cat(unsharp(ROUNDPAGE)); + cat(ROUNDPAGE); Bprint(Bstdout, "%s", ENDPROLOG); Bprint(Bstdout, "%s", BEGINSETUP); @@ -70,19 +70,19 @@ prologues(void) { if (pointsize != 10) Bprint(Bstdout, "/pointsize %d def\n", pointsize); if (xoffset != .25) Bprint(Bstdout, "/xoffset %g def\n", xoffset); if (yoffset != .25) Bprint(Bstdout, "/yoffset %g def\n", yoffset); - cat(unsharp(ENCODINGDIR"/Latin1.enc")); + cat(ENCODINGDIR"/Latin1.enc"); if (passthrough != 0) Bprint(Bstdout, "%s\n", passthrough); Bprint(Bstdout, "setup\n"); if (formsperpage > 1) { - cat(unsharp(FORMFILE)); + cat(FORMFILE); Bprint(Bstdout, "%d setupforms \n", formsperpage); } /* output Build character info from charlib if necessary. */ for (i=0; i<build_char_cnt; i++) { sprint(charlibname, "%s/%s", CHARLIB, build_char_list[i]->name); - if (cat(unsharp(charlibname))) + if (cat(charlibname)) Bprint(Bstderr, "cannot open %s\n", charlibname); } @@ -95,24 +95,26 @@ cleanup(void) { } main(int argc, char *argv[]) { + Biobuf btmp; Biobuf *binp; - Biobuf *Binp; - int i, tot, ifd; + Biobufhdr *Binp; + int i, tot, ifd, fd; char *t; programname = argv[0]; if (Binit(&bstderr, 2, OWRITE) == Beof) { exits("Binit"); } - Bstderr = &bstderr; + Bstderr = &bstderr; /* &bstderr.Biobufhdr; */ - tmpnam(tmpfilename); - if ((bstdout=Bopen(tmpfilename, OWRITE)) == 0) { + bstdout = &btmp; + fd = safe_tmpnam(tmpfilename); + if ((Binit(bstdout, fd, OWRITE)) == Beof) { Bprint(Bstderr, "cannot open temporary file %s\n", tmpfilename); exits("Bopen"); } atexit(cleanup); - Bstdout = bstdout; + Bstdout = bstdout; /* &bstdout->Biobufhdr; */ ARGBEGIN{ case 'a': /* aspect ratio */ @@ -169,7 +171,7 @@ main(int argc, char *argv[]) { Bprint(Bstderr, "Binit of <stdin> failed.\n"); exits("Binit"); } - Binp = binp; + Binp = binp; /* &(binp->Biobufhdr); */ if (debug) Bprint(Bstderr, "using standard input\n"); conv(Binp); Bterm(Binp); @@ -179,7 +181,7 @@ main(int argc, char *argv[]) { Bprint(Bstderr, "cannot open file %s\n", argv[i]); continue; } - Binp = binp; + Binp = binp; /* &(binp->Biobufhdr); */ inputfilename = argv[i]; conv(Binp); Bterm(Binp); @@ -196,7 +198,7 @@ main(int argc, char *argv[]) { Bprint(Bstderr, "Binit of <stdout> failed.\n"); exits("Binit"); } - Bstdout = bstdout; + Bstdout = bstdout; /* &(bstdout->Biobufhdr); */ prologues(); Bflush(Bstdout); tot = 0; i = 0; diff --git a/src/cmd/postscript/tr2post/tr2post.h b/src/cmd/postscript/tr2post/tr2post.h index b07e0b13..68299ccb 100644 --- a/src/cmd/postscript/tr2post/tr2post.h +++ b/src/cmd/postscript/tr2post/tr2post.h @@ -1,6 +1,9 @@ #define MAXSPECHARS 512 #define MAXTOKENSIZE 128 -#define CHARLIB "#9/sys/lib/troff/font/devutf/charlib" +#define CHARLIB FONTDIR "/devutf/charlib" + +/* devname clashes with libc on *BSD */ +#define devname troff_devname extern int debug; extern int fontsize; diff --git a/src/cmd/postscript/tr2post/utils.c b/src/cmd/postscript/tr2post/utils.c index 8f58ea45..e9979ff1 100644 --- a/src/cmd/postscript/tr2post/utils.c +++ b/src/cmd/postscript/tr2post/utils.c @@ -250,7 +250,7 @@ specialout(char *stoken) { } void -graphfunc(Biobuf *bp) { +graphfunc(Biobufhdr *bp) { } long |