Checkpoint.
This commit is contained in:
parent
61f5c35c94
commit
b855148c9b
32
src/cmd/postscript/NOTES
Normal file
32
src/cmd/postscript/NOTES
Normal file
@ -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.
|
||||||
|
|
||||||
179
src/cmd/postscript/README
Normal file
179
src/cmd/postscript/README
Normal file
@ -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.
|
||||||
|
|
||||||
372
src/cmd/postscript/VERSION
Normal file
372
src/cmd/postscript/VERSION
Normal file
@ -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.
|
||||||
|
|
||||||
95
src/cmd/postscript/changes
Normal file
95
src/cmd/postscript/changes
Normal file
@ -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.
|
||||||
|
|
||||||
@ -34,6 +34,7 @@ double matrix1[6], matrix2[6];
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
cover(x, y)
|
cover(x, y)
|
||||||
|
|
||||||
double x, y;
|
double x, y;
|
||||||
@ -65,7 +66,9 @@ cover(x, y)
|
|||||||
} /* End of cover */
|
} /* End of cover */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
void resetbbox();
|
||||||
|
|
||||||
|
void
|
||||||
writebbox(fp, keyword, slop)
|
writebbox(fp, keyword, slop)
|
||||||
|
|
||||||
FILE *fp; /* the comment is written here */
|
FILE *fp; /* the comment is written here */
|
||||||
@ -117,7 +120,7 @@ writebbox(fp, keyword, slop)
|
|||||||
} /* End of writebbox */
|
} /* End of writebbox */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
void
|
||||||
resetbbox(output)
|
resetbbox(output)
|
||||||
|
|
||||||
int output;
|
int output;
|
||||||
@ -146,7 +149,7 @@ resetbbox(output)
|
|||||||
} /* End of resetbbox */
|
} /* End of resetbbox */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
void
|
||||||
scale(sx, sy)
|
scale(sx, sy)
|
||||||
|
|
||||||
double sx, sy;
|
double sx, sy;
|
||||||
@ -171,7 +174,7 @@ scale(sx, sy)
|
|||||||
} /* End of scale */
|
} /* End of scale */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
void
|
||||||
translate(tx, ty)
|
translate(tx, ty)
|
||||||
|
|
||||||
double tx, ty;
|
double tx, ty;
|
||||||
@ -196,7 +199,7 @@ translate(tx, ty)
|
|||||||
} /* End of translate */
|
} /* End of translate */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
void
|
||||||
rotate(angle)
|
rotate(angle)
|
||||||
|
|
||||||
double angle;
|
double angle;
|
||||||
@ -223,6 +226,7 @@ rotate(angle)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
concat(m1)
|
concat(m1)
|
||||||
|
|
||||||
double m1[];
|
double m1[];
|
||||||
|
|||||||
@ -209,14 +209,14 @@ endpage(void) {
|
|||||||
int
|
int
|
||||||
cat(char *filename) {
|
cat(char *filename) {
|
||||||
Biobuf *bfile;
|
Biobuf *bfile;
|
||||||
Biobuf *Bfile;
|
Biobufhdr *Bfile;
|
||||||
int n;
|
int n;
|
||||||
static char buf[Bsize];
|
static char buf[Bsize];
|
||||||
|
|
||||||
if ((bfile = Bopen(unsharp(filename), OREAD)) == 0) {
|
if ((bfile = Bopen(filename, OREAD)) == 0) {
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
Bfile = bfile;
|
Bfile = bfile; /* &(bfile->Biobufhdr); */
|
||||||
while ((n=Bread(Bfile, buf, Bsize)) > 0) {
|
while ((n=Bread(Bfile, buf, Bsize)) > 0) {
|
||||||
if (Bwrite(Bstdout, buf, n) != n)
|
if (Bwrite(Bstdout, buf, n) != n)
|
||||||
break;
|
break;
|
||||||
@ -240,9 +240,9 @@ galloc(void *ptr, int size, char *perstr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *errorstrings[] = {
|
static char *errorstrings[] = {
|
||||||
{""}, /* NONE */
|
"", /* NONE */
|
||||||
{"WARNING"},
|
"WARNING",
|
||||||
{"FATAL"}
|
"FATAL"
|
||||||
};
|
};
|
||||||
|
|
||||||
char *programname;
|
char *programname;
|
||||||
|
|||||||
@ -5,6 +5,8 @@
|
|||||||
#define RUNEGETGROUP(a) ((a>>8)&0xff)
|
#define RUNEGETGROUP(a) ((a>>8)&0xff)
|
||||||
#define RUNEGETCHAR(a) (a&0xff)
|
#define RUNEGETCHAR(a) (a&0xff)
|
||||||
|
|
||||||
|
#define tempnam safe_tempnam
|
||||||
|
|
||||||
typedef int BOOLEAN;
|
typedef int BOOLEAN;
|
||||||
|
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
@ -38,6 +40,6 @@ BOOLEAN isinstring(void);
|
|||||||
void startpage(void);
|
void startpage(void);
|
||||||
void endpage(void);
|
void endpage(void);
|
||||||
int cat(char *);
|
int cat(char *);
|
||||||
int Bgetfield(Biobuf *, int, void *, int);
|
int Bgetfield(Biobufhdr *, int, void *, int);
|
||||||
void *galloc(void *, int, char *);
|
void *galloc(void *, int, char *);
|
||||||
void pagelist(char *);
|
void pagelist(char *);
|
||||||
|
|||||||
@ -28,8 +28,12 @@ extern char *optarg; /* for getopt() */
|
|||||||
extern int optind;
|
extern int optind;
|
||||||
|
|
||||||
extern void interrupt();
|
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 *malloc();
|
||||||
* extern char *calloc();
|
* extern char *calloc();
|
||||||
* extern char *strtok();
|
* extern char *strtok();
|
||||||
|
|||||||
@ -7,6 +7,10 @@
|
|||||||
|
|
||||||
#define PROGRAMVERSION "3.3.2"
|
#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 NON_FATAL 0
|
||||||
#define FATAL 1
|
#define FATAL 1
|
||||||
#define USER_FATAL 2
|
#define USER_FATAL 2
|
||||||
|
|||||||
@ -15,7 +15,7 @@ getopt (argc, argv, opts)
|
|||||||
char **argv, *opts;
|
char **argv, *opts;
|
||||||
{
|
{
|
||||||
static int sp = 1;
|
static int sp = 1;
|
||||||
register c;
|
register int c;
|
||||||
register char *cp;
|
register char *cp;
|
||||||
|
|
||||||
if (sp == 1)
|
if (sp == 1)
|
||||||
|
|||||||
@ -8,6 +8,8 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "gen.h"
|
#include "gen.h"
|
||||||
#include "ext.h"
|
#include "ext.h"
|
||||||
@ -17,7 +19,9 @@ int nolist = 0; /* number of specified ranges */
|
|||||||
int olist[50]; /* processing range pairs */
|
int olist[50]; /* processing range pairs */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
extern int str_convert();
|
||||||
|
|
||||||
|
void
|
||||||
out_list(str)
|
out_list(str)
|
||||||
|
|
||||||
char *str;
|
char *str;
|
||||||
@ -53,7 +57,7 @@ out_list(str)
|
|||||||
} /* End of out_list */
|
} /* End of out_list */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
int
|
||||||
in_olist(num)
|
in_olist(num)
|
||||||
|
|
||||||
int num;
|
int num;
|
||||||
@ -80,7 +84,7 @@ in_olist(num)
|
|||||||
} /* End of in_olist */
|
} /* End of in_olist */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
void
|
||||||
setencoding(name)
|
setencoding(name)
|
||||||
|
|
||||||
char *name;
|
char *name;
|
||||||
@ -110,7 +114,7 @@ setencoding(name)
|
|||||||
} /* End of setencoding */
|
} /* End of setencoding */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
int
|
||||||
cat(file)
|
cat(file)
|
||||||
|
|
||||||
char *file;
|
char *file;
|
||||||
@ -145,6 +149,7 @@ cat(file)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
int
|
||||||
str_convert(str, err)
|
str_convert(str, err)
|
||||||
|
|
||||||
char **str;
|
char **str;
|
||||||
@ -173,6 +178,7 @@ str_convert(str, err)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
error(kind, mesg, a1, a2, a3)
|
error(kind, mesg, a1, a2, a3)
|
||||||
|
|
||||||
int kind;
|
int kind;
|
||||||
@ -191,9 +197,9 @@ error(kind, mesg, a1, a2, a3)
|
|||||||
fprintf(stderr, "%s: ", prog_name);
|
fprintf(stderr, "%s: ", prog_name);
|
||||||
fprintf(stderr, mesg, a1, a2, a3);
|
fprintf(stderr, mesg, a1, a2, a3);
|
||||||
if ( lineno > 0 )
|
if ( lineno > 0 )
|
||||||
fprintf(stderr, " (line %d)", lineno);
|
fprintf(stderr, " (line %ld)", lineno);
|
||||||
if ( position > 0 )
|
if ( position > 0 )
|
||||||
fprintf(stderr, " (near byte %d)", position);
|
fprintf(stderr, " (near byte %ld)", position);
|
||||||
putc('\n', stderr);
|
putc('\n', stderr);
|
||||||
} /* End if */
|
} /* End if */
|
||||||
|
|
||||||
|
|||||||
@ -4,29 +4,29 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DPOST "#9/sys/lib/postscript/prologues/dpost.ps"
|
#define DPOST "#9/postscript/prologues/dpost.ps"
|
||||||
#define POSTBGI "#9/sys/lib/postscript/prologues/postbgi.ps"
|
#define POSTBGI "#9/postscript/prologues/postbgi.ps"
|
||||||
#define POSTDAISY "#9/sys/lib/postscript/prologues/postdaisy.ps"
|
#define POSTDAISY "#9/postscript/prologues/postdaisy.ps"
|
||||||
#define POSTDMD "#9/sys/lib/postscript/prologues/postdmd.ps"
|
#define POSTDMD "#9/postscript/prologues/postdmd.ps"
|
||||||
#define POSTMD "#9/sys/lib/postscript/prologues/postmd.ps"
|
#define POSTMD "#9/postscript/prologues/postmd.ps"
|
||||||
#define POSTPLOT "#9/sys/lib/postscript/prologues/postplot.ps"
|
#define POSTPLOT "#9/postscript/prologues/postplot.ps"
|
||||||
#define POSTPRINT "#9/sys/lib/postscript/prologues/postprint.ps"
|
#define POSTPRINT "#9/postscript/prologues/postprint.ps"
|
||||||
#define POSTNPRINT "#9/sys/lib/postscript/prologues/postnprint.ps"
|
#define POSTNPRINT "#9/postscript/prologues/postnprint.ps"
|
||||||
#define POSTTEK "#9/sys/lib/postscript/prologues/posttek.ps"
|
#define POSTTEK "#9/postscript/prologues/posttek.ps"
|
||||||
#define POSTGIF "#9/sys/lib/postscript/prologues/postgif.ps"
|
#define POSTGIF "#9/postscript/prologues/postgif.ps"
|
||||||
|
|
||||||
#define BASELINE "#9/sys/lib/postscript/prologues/baseline.ps"
|
#define BASELINE "#9/postscript/prologues/baseline.ps"
|
||||||
#define COLOR "#9/sys/lib/postscript/prologues/color.ps"
|
#define COLOR "#9/postscript/prologues/color.ps"
|
||||||
#define DRAW "#9/sys/lib/postscript/prologues/draw.ps"
|
#define DRAW "#9/postscript/prologues/draw.ps"
|
||||||
#define FORMFILE "#9/sys/lib/postscript/prologues/forms.ps"
|
#define FORMFILE "#9/postscript/prologues/forms.ps"
|
||||||
#define SHADEFILE "#9/sys/lib/postscript/prologues/shade.ps"
|
#define SHADEFILE "#9/postscript/prologues/shade.ps"
|
||||||
#define KERNING "#9/sys/lib/postscript/prologues/kerning.ps"
|
#define KERNING "#9/postscript/prologues/kerning.ps"
|
||||||
#define REQUESTFILE "#9/sys/lib/postscript/prologues/ps.requests"
|
#define REQUESTFILE "#9/postscript/prologues/ps.requests"
|
||||||
#define ROUNDPAGE "#9/sys/lib/postscript/prologues/roundpage.ps"
|
#define ROUNDPAGE "#9/postscript/prologues/roundpage.ps"
|
||||||
|
|
||||||
#define ENCODINGDIR "#9/sys/lib/postscript/prologues"
|
#define ENCODINGDIR "#9/postscript/prologues"
|
||||||
#define HOSTDIR "#9/sys/lib/postscript/font"
|
#define HOSTDIR "#9/postscript/font"
|
||||||
#define FONTDIR "#9/sys/lib/troff/font"
|
#define FONTDIR "#9/troff/font"
|
||||||
#define POSTLIBDIR "#9/sys/lib/postscript/prologues"
|
#define POSTLIBDIR "#9/postscript/prologues"
|
||||||
#define TEMPDIR "/tmp"
|
#define TEMPDIR "#9/tmp"
|
||||||
|
|
||||||
|
|||||||
@ -11,8 +11,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "gen.h" /* general purpose definitions */
|
#include "gen.h" /* general purpose definitions */
|
||||||
|
#include "ext.h"
|
||||||
#include "request.h" /* a few special definitions */
|
#include "request.h" /* a few special definitions */
|
||||||
#include "path.h" /* for the default request file */
|
#include "path.h" /* for the default request file */
|
||||||
|
|
||||||
@ -22,6 +26,7 @@ char *requestfile = REQUESTFILE; /* default lookup file */
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
saverequest(want)
|
saverequest(want)
|
||||||
|
|
||||||
char *want; /* grab code for this stuff */
|
char *want; /* grab code for this stuff */
|
||||||
@ -55,7 +60,9 @@ saverequest(want)
|
|||||||
} /* End of saverequest */
|
} /* End of saverequest */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
extern void dumprequest();
|
||||||
|
|
||||||
|
void
|
||||||
writerequest(page, fp_out)
|
writerequest(page, fp_out)
|
||||||
|
|
||||||
int page; /* write everything for this page */
|
int page; /* write everything for this page */
|
||||||
@ -80,6 +87,7 @@ writerequest(page, fp_out)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
dumprequest(want, file, fp_out)
|
dumprequest(want, file, fp_out)
|
||||||
|
|
||||||
char *want; /* look for this string */
|
char *want; /* look for this string */
|
||||||
|
|||||||
@ -1,27 +1,62 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#if defined(V9) || defined(BSD4_2) || defined(plan9)
|
#define nil ((void*)0)
|
||||||
char *tempnam(char *dir, char *pfx) {
|
|
||||||
int pid;
|
|
||||||
unsigned int len;
|
|
||||||
char *tnm, *malloc();
|
|
||||||
static int seq = 0;
|
|
||||||
|
|
||||||
pid = getpid();
|
char*
|
||||||
len = strlen(dir) + strlen(pfx) + 10;
|
mkfname(char *tmpdir, char *prefix)
|
||||||
if ((tnm = malloc(len)) != NULL) {
|
{
|
||||||
sprintf(tnm, "%s", dir);
|
int n;
|
||||||
if (access(tnm, 7) == -1)
|
char *p, *fname;
|
||||||
return(NULL);
|
|
||||||
do {
|
if((p = getenv("TMPDIR")) != nil)
|
||||||
sprintf(tnm, "%s/%s%d%d", dir, pfx, pid, seq++);
|
goto Mktemp;
|
||||||
errno = 0;
|
if((p = tmpdir) != nil)
|
||||||
if (access(tnm, 7) == -1)
|
goto Mktemp;
|
||||||
if (errno == ENOENT)
|
p = "/tmp";
|
||||||
return(tnm);
|
|
||||||
} while (1);
|
Mktemp:
|
||||||
}
|
n = strlen(p)+1+strlen(prefix)+1+8+1;
|
||||||
return(tnm);
|
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 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
|
|
||||||
|
|||||||
12
src/cmd/postscript/config
Normal file
12
src/cmd/postscript/config
Normal file
@ -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
|
||||||
@ -99,10 +99,10 @@ main(agc, agv)
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fp_in = stdin;
|
|
||||||
|
|
||||||
argc = agc; /* other routines may want them */
|
argc = agc; /* other routines may want them */
|
||||||
argv = agv;
|
argv = agv;
|
||||||
|
|
||||||
|
fp_in = stdin;
|
||||||
|
|
||||||
prog_name = argv[0]; /* just for error messages */
|
prog_name = argv[0]; /* just for error messages */
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ readmap()
|
|||||||
sprintf(path, "%s/%s%s", hostfontdir, mapname, suffix);
|
sprintf(path, "%s/%s%s", hostfontdir, mapname, suffix);
|
||||||
} else path = mapname;
|
} else path = mapname;
|
||||||
|
|
||||||
if ( (fd = open(unsharp(path), 0)) != -1 ) {
|
if ( (fd = open(path, 0)) != -1 ) {
|
||||||
if ( fstat(fd, &sbuf) == -1 )
|
if ( fstat(fd, &sbuf) == -1 )
|
||||||
error(FATAL, "can't fstat %s", path);
|
error(FATAL, "can't fstat %s", path);
|
||||||
if ( (stringspace = (char *)malloc(sbuf.st_size + 2)) == NULL )
|
if ( (stringspace = (char *)malloc(sbuf.st_size + 2)) == NULL )
|
||||||
@ -303,7 +303,7 @@ readresident()
|
|||||||
path = buf;
|
path = buf;
|
||||||
} else path = residentfonts;
|
} else path = residentfonts;
|
||||||
|
|
||||||
if ( (fp = fopen(unsharp(path), "r")) != NULL ) {
|
if ( (fp = fopen(path, "r")) != NULL ) {
|
||||||
while ( fscanf(fp, "%s", buf) != EOF )
|
while ( fscanf(fp, "%s", buf) != EOF )
|
||||||
if ( buf[0] == '%' )
|
if ( buf[0] == '%' )
|
||||||
while ( (ch = getc(fp)) != EOF && ch != '\n' ) ;
|
while ( (ch = getc(fp)) != EOF && ch != '\n' ) ;
|
||||||
@ -336,7 +336,7 @@ arguments()
|
|||||||
fp_temp = NULL;
|
fp_temp = NULL;
|
||||||
if ( strcmp(*argv, "-") == 0 )
|
if ( strcmp(*argv, "-") == 0 )
|
||||||
fp_in = stdin;
|
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);
|
error(FATAL, "can't open %s", *argv);
|
||||||
download();
|
download();
|
||||||
if ( fp_in != stdin )
|
if ( fp_in != stdin )
|
||||||
@ -449,9 +449,9 @@ copyfonts(list)
|
|||||||
if ( (path = (char *)malloc(strlen(hostfontdir)+strlen(map[n].file)+2)) == NULL )
|
if ( (path = (char *)malloc(strlen(hostfontdir)+strlen(map[n].file)+2)) == NULL )
|
||||||
error(FATAL, "no memory");
|
error(FATAL, "no memory");
|
||||||
sprintf(path, "%s/%s", hostfontdir, map[n].file);
|
sprintf(path, "%s/%s", hostfontdir, map[n].file);
|
||||||
cat(unsharp(path));
|
cat(path);
|
||||||
free(path);
|
free(path);
|
||||||
} else cat(unsharp(map[n].file));
|
} else cat(map[n].file);
|
||||||
map[n].downloaded = TRUE;
|
map[n].downloaded = TRUE;
|
||||||
} /* End if */
|
} /* End if */
|
||||||
} /* End while */
|
} /* End while */
|
||||||
|
|||||||
11
src/cmd/postscript/hardcopy/README
Normal file
11
src/cmd/postscript/hardcopy/README
Normal file
@ -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.
|
||||||
|
|
||||||
196
src/cmd/postscript/hardcopy/hardcopy.ps
Normal file
196
src/cmd/postscript/hardcopy/hardcopy.ps
Normal file
@ -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
|
||||||
|
|
||||||
70
src/cmd/postscript/hardcopy/hardcopy.rc
Normal file
70
src/cmd/postscript/hardcopy/hardcopy.rc
Normal file
@ -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
|
||||||
20
src/cmd/postscript/hardcopy/mkfile
Normal file
20
src/cmd/postscript/hardcopy/mkfile
Normal file
@ -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
|
||||||
1
src/cmd/postscript/mcolor/.cvsignore
Normal file
1
src/cmd/postscript/mcolor/.cvsignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
tmac.color
|
||||||
45
src/cmd/postscript/mcolor/color.sr
Normal file
45
src/cmd/postscript/mcolor/color.sr
Normal file
@ -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
|
||||||
|
..
|
||||||
60
src/cmd/postscript/mcolor/mcolor.5
Normal file
60
src/cmd/postscript/mcolor/mcolor.5
Normal file
@ -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)
|
||||||
53
src/cmd/postscript/mcolor/mcolor.mk
Normal file
53
src/cmd/postscript/mcolor/mcolor.mk
Normal file
@ -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
|
||||||
|
|
||||||
4
src/cmd/postscript/misc/.cvsignore
Normal file
4
src/cmd/postscript/misc/.cvsignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
ibmfont
|
||||||
|
laserbar
|
||||||
|
macfont
|
||||||
|
pscrypt
|
||||||
15
src/cmd/postscript/misc/README
Normal file
15
src/cmd/postscript/misc/README
Normal file
@ -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.
|
||||||
|
|
||||||
296
src/cmd/postscript/misc/ibmfont.c
Normal file
296
src/cmd/postscript/misc/ibmfont.c
Normal file
@ -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 */
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
41
src/cmd/postscript/misc/laserbar.1
Normal file
41
src/cmd/postscript/misc/laserbar.1
Normal file
@ -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.
|
||||||
166
src/cmd/postscript/misc/laserbar.c
Normal file
166
src/cmd/postscript/misc/laserbar.c
Normal file
@ -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;
|
||||||
|
}
|
||||||
66
src/cmd/postscript/misc/lp.model
Normal file
66
src/cmd/postscript/misc/lp.model
Normal file
@ -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
|
||||||
|
|
||||||
299
src/cmd/postscript/misc/macfont.c
Normal file
299
src/cmd/postscript/misc/macfont.c
Normal file
@ -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 */
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
335
src/cmd/postscript/misc/pscrypt.c
Normal file
335
src/cmd/postscript/misc/pscrypt.c
Normal file
@ -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 */
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
9
src/cmd/postscript/misc/setbaud.ps
Normal file
9
src/cmd/postscript/misc/setbaud.ps
Normal file
@ -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
|
||||||
@ -14,7 +14,7 @@ DIRS=\
|
|||||||
# postprint\
|
# postprint\
|
||||||
# postreverse\
|
# postreverse\
|
||||||
# posttek\
|
# posttek\
|
||||||
# printfont\
|
printfont\
|
||||||
# psencoding\
|
# psencoding\
|
||||||
# psfiles\
|
# psfiles\
|
||||||
# g3p9bit\
|
# g3p9bit\
|
||||||
|
|||||||
1
src/cmd/postscript/mpictures/.cvsignore
Normal file
1
src/cmd/postscript/mpictures/.cvsignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
tmac.pictures
|
||||||
18
src/cmd/postscript/mpictures/mkfile
Normal file
18
src/cmd/postscript/mpictures/mkfile
Normal file
@ -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
|
||||||
154
src/cmd/postscript/mpictures/pictures.sr
Normal file
154
src/cmd/postscript/mpictures/pictures.sr
Normal file
@ -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\}
|
||||||
|
..
|
||||||
1
src/cmd/postscript/postreverse/.cvsignore
Normal file
1
src/cmd/postscript/postreverse/.cvsignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
postreverse
|
||||||
10
src/cmd/postscript/postreverse/README
Normal file
10
src/cmd/postscript/postreverse/README
Normal file
@ -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.
|
||||||
|
|
||||||
29
src/cmd/postscript/postreverse/mkfile
Normal file
29
src/cmd/postscript/postreverse/mkfile
Normal file
@ -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
|
||||||
544
src/cmd/postscript/postreverse/postreverse.c
Normal file
544
src/cmd/postscript/postreverse/postreverse.c
Normal file
@ -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 */
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
21
src/cmd/postscript/postreverse/postreverse.h
Normal file
21
src/cmd/postscript/postreverse/postreverse.h
Normal file
@ -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();
|
||||||
|
|
||||||
22
src/cmd/postscript/printfont/mkfile
Normal file
22
src/cmd/postscript/printfont/mkfile
Normal file
@ -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
|
||||||
321
src/cmd/postscript/printfont/printfont.ps
Normal file
321
src/cmd/postscript/printfont/printfont.ps
Normal file
@ -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
|
||||||
|
|
||||||
105
src/cmd/postscript/printfont/printfont.rc
Normal file
105
src/cmd/postscript/printfont/printfont.rc
Normal file
@ -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
|
||||||
1
src/cmd/postscript/psencoding/.cvsignore
Normal file
1
src/cmd/postscript/psencoding/.cvsignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
psencoding
|
||||||
299
src/cmd/postscript/psencoding/Latin1.enc
Normal file
299
src/cmd/postscript/psencoding/Latin1.enc
Normal file
@ -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
|
||||||
|
|
||||||
332
src/cmd/postscript/psencoding/UTF.enc
Normal file
332
src/cmd/postscript/psencoding/UTF.enc
Normal file
@ -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
|
||||||
|
|
||||||
22
src/cmd/postscript/psencoding/mkfile
Normal file
22
src/cmd/postscript/psencoding/mkfile
Normal file
@ -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
|
||||||
39
src/cmd/postscript/psencoding/psencoding.rc
Normal file
39
src/cmd/postscript/psencoding/psencoding.rc
Normal file
@ -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]
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/cmd/postscript/psfiles/Nroundpage.ps
Normal file
11
src/cmd/postscript/psfiles/Nroundpage.ps
Normal file
@ -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
|
||||||
11
src/cmd/postscript/psfiles/README
Normal file
11
src/cmd/postscript/psfiles/README
Normal file
@ -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.
|
||||||
|
|
||||||
127
src/cmd/postscript/psfiles/aps.ps
Normal file
127
src/cmd/postscript/psfiles/aps.ps
Normal file
@ -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
|
||||||
|
|
||||||
40
src/cmd/postscript/psfiles/banner.ps
Normal file
40
src/cmd/postscript/psfiles/banner.ps
Normal file
@ -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
|
||||||
156
src/cmd/postscript/psfiles/baseline.ps
Normal file
156
src/cmd/postscript/psfiles/baseline.ps
Normal file
@ -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
|
||||||
65
src/cmd/postscript/psfiles/color.ps
Normal file
65
src/cmd/postscript/psfiles/color.ps
Normal file
@ -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
|
||||||
26
src/cmd/postscript/psfiles/fatcourier.ps
Normal file
26
src/cmd/postscript/psfiles/fatcourier.ps
Normal file
@ -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
|
||||||
213
src/cmd/postscript/psfiles/forms.ps
Normal file
213
src/cmd/postscript/psfiles/forms.ps
Normal file
@ -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
|
||||||
12
src/cmd/postscript/psfiles/mkfile
Normal file
12
src/cmd/postscript/psfiles/mkfile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
</$objtype/mkfile
|
||||||
|
|
||||||
|
<../config
|
||||||
|
|
||||||
|
all:VQ:
|
||||||
|
;
|
||||||
|
|
||||||
|
install installall:V:
|
||||||
|
cp *.ps ps.* $POSTLIB
|
||||||
|
|
||||||
|
clean nuke:VQ:
|
||||||
|
;
|
||||||
16
src/cmd/postscript/psfiles/ps.requests
Normal file
16
src/cmd/postscript/psfiles/ps.requests
Normal file
@ -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
|
||||||
30
src/cmd/postscript/psfiles/roundpage.ps
Normal file
30
src/cmd/postscript/psfiles/roundpage.ps
Normal file
@ -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
|
||||||
|
|
||||||
52
src/cmd/postscript/psfiles/shade.ps
Normal file
52
src/cmd/postscript/psfiles/shade.ps
Normal file
@ -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
|
||||||
28
src/cmd/postscript/psfiles/unbind.ps
Normal file
28
src/cmd/postscript/psfiles/unbind.ps
Normal file
@ -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
|
||||||
|
|
||||||
@ -4,9 +4,6 @@
|
|||||||
#include "../common/common.h"
|
#include "../common/common.h"
|
||||||
#include "tr2post.h"
|
#include "tr2post.h"
|
||||||
|
|
||||||
#undef isspace
|
|
||||||
#define isspace bisspace
|
|
||||||
|
|
||||||
int
|
int
|
||||||
isspace(Rune r)
|
isspace(Rune r)
|
||||||
{
|
{
|
||||||
@ -14,7 +11,7 @@ isspace(Rune r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Bskipws(Biobuf *bp) {
|
Bskipws(Biobufhdr *bp) {
|
||||||
int r;
|
int r;
|
||||||
char c[UTFmax];
|
char c[UTFmax];
|
||||||
int sindex = 0;
|
int sindex = 0;
|
||||||
@ -36,13 +33,15 @@ Bskipws(Biobuf *bp) {
|
|||||||
|
|
||||||
int
|
int
|
||||||
asc2dig(char c, int base) {
|
asc2dig(char c, int base) {
|
||||||
if (c >= '0' && c <= '9')
|
if (c >= '0' && c <= '9'){
|
||||||
if (base == 8 && c > '7') return(-1);
|
if (base == 8 && c > '7') return(-1);
|
||||||
else return(c - '0');
|
else return(c - '0');
|
||||||
|
}
|
||||||
|
|
||||||
if (base == 16)
|
if (base == 16){
|
||||||
if (c >= 'a' && c <= 'f') return(10 + c - 'a');
|
if (c >= 'a' && c <= 'f') return(10 + c - 'a');
|
||||||
else if (c >= 'A' && c <= 'F') return(10 + c - 'A');
|
else if (c >= 'A' && c <= 'F') return(10 + c - 'A');
|
||||||
|
}
|
||||||
|
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
@ -55,7 +54,7 @@ asc2dig(char c, int base) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
Bgetfield(Biobuf *bp, int type, void *thing, int size) {
|
Bgetfield(Biobufhdr *bp, int type, void *thing, int size) {
|
||||||
int r;
|
int r;
|
||||||
Rune R;
|
Rune R;
|
||||||
char c[UTFmax];
|
char c[UTFmax];
|
||||||
|
|||||||
@ -120,30 +120,31 @@ findpfn(char *fontname, int insflg) {
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
char postroffdirname[] = "#9/sys/lib/postscript/troff"; /* "/sys/lib/postscript/troff/"; */
|
char postroffdirname[] = LIBDIR "/postscript/troff"; /* "/sys/lib/postscript/troff/"; */
|
||||||
char troffmetricdirname[] = "#9/sys/lib/troff/font"; /* "/sys/lib/troff/font/devutf/"; */
|
char troffmetricdirname[] = LIBDIR "/troff/font"; /* "/sys/lib/troff/font/devutf/"; */
|
||||||
|
|
||||||
int
|
int
|
||||||
readpsfontdesc(char *fontname, int trindex) {
|
readpsfontdesc(char *fontname, int trindex) {
|
||||||
static char *filename = 0;
|
static char *filename = 0;
|
||||||
Biobuf *bfd;
|
Biobuf *bfd;
|
||||||
Biobuf *Bfd;
|
Biobufhdr *Bfd;
|
||||||
int warn = 0, errorflg = 0, line =1, rv;
|
int warn = 0, errorflg = 0, line =1, rv;
|
||||||
int start, end, offset;
|
int start, end, offset;
|
||||||
int startfont, endfont, startchar, endchar, i, pfid;
|
int startfont, endfont, startchar, endchar, i, pfid;
|
||||||
char psfontnam[128];
|
char psfontnam[128];
|
||||||
struct troffont *tp;
|
struct troffont *tp;
|
||||||
|
/* struct charent *cp[]; */
|
||||||
|
|
||||||
if (debug) Bprint(Bstderr, "readpsfontdesc(%s,%d)\n", fontname, trindex);
|
if (debug) Bprint(Bstderr, "readpsfontdesc(%s,%d)\n", fontname, trindex);
|
||||||
filename=galloc(filename, strlen(postroffdirname)+1+strlen(fontname)+1, "readpsfontdesc: cannot allocate memory\n");
|
filename=galloc(filename, strlen(postroffdirname)+1+strlen(fontname)+1, "readpsfontdesc: cannot allocate memory\n");
|
||||||
sprint(filename, "%s/%s", postroffdirname, fontname);
|
sprint(filename, "%s/%s", postroffdirname, fontname);
|
||||||
|
|
||||||
bfd = Bopen(unsharp(filename), OREAD);
|
bfd = Bopen(filename, OREAD);
|
||||||
if (bfd == 0) {
|
if (bfd == 0) {
|
||||||
error(WARNING, "cannot open file %s\n", filename);
|
error(WARNING, "cannot open file %s\n", filename);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
Bfd = bfd;
|
Bfd = bfd; /* &(bfd->Biobufhdr); */
|
||||||
|
|
||||||
do {
|
do {
|
||||||
offset = 0;
|
offset = 0;
|
||||||
@ -211,7 +212,7 @@ int
|
|||||||
readtroffmetric(char *fontname, int trindex) {
|
readtroffmetric(char *fontname, int trindex) {
|
||||||
static char *filename = 0;
|
static char *filename = 0;
|
||||||
Biobuf *bfd;
|
Biobuf *bfd;
|
||||||
Biobuf *Bfd;
|
Biobufhdr *Bfd;
|
||||||
int warn = 0, errorflg = 0, line =1, rv;
|
int warn = 0, errorflg = 0, line =1, rv;
|
||||||
struct troffont *tp;
|
struct troffont *tp;
|
||||||
struct charent **cp;
|
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");
|
filename=galloc(filename, strlen(troffmetricdirname)+4+strlen(devname)+1+strlen(fontname)+1, "readtroffmetric():filename");
|
||||||
sprint(filename, "%s/dev%s/%s", troffmetricdirname, devname, fontname);
|
sprint(filename, "%s/dev%s/%s", troffmetricdirname, devname, fontname);
|
||||||
|
|
||||||
bfd = Bopen(unsharp(filename), OREAD);
|
bfd = Bopen(filename, OREAD);
|
||||||
if (bfd == 0) {
|
if (bfd == 0) {
|
||||||
error(WARNING, "cannot open file %s\n", filename);
|
error(WARNING, "cannot open file %s\n", filename);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
Bfd = bfd;
|
Bfd = bfd; /* &(bfd->Biobufhdr); */
|
||||||
do {
|
do {
|
||||||
/* deal with the few lines at the beginning of the
|
/* deal with the few lines at the beginning of the
|
||||||
* troff font metric files.
|
* troff font metric files.
|
||||||
|
|||||||
@ -5,14 +5,14 @@
|
|||||||
#include "tr2post.h"
|
#include "tr2post.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
conv(Biobuf *Bp) {
|
conv(Biobufhdr *Bp) {
|
||||||
long c, n;
|
long c, n;
|
||||||
int r;
|
int r;
|
||||||
char special[10];
|
char special[10];
|
||||||
int save;
|
int save;
|
||||||
|
|
||||||
inputlineno = 1;
|
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) {
|
while ((r = Bgetrune(Bp)) >= 0) {
|
||||||
/* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */
|
/* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */
|
||||||
/* Bflush(Bstderr); */
|
/* Bflush(Bstderr); */
|
||||||
|
|||||||
@ -16,11 +16,11 @@ struct sjt {
|
|||||||
|
|
||||||
/* I won't need this if getfields can replace sscanf
|
/* I won't need this if getfields can replace sscanf
|
||||||
|
|
||||||
extern void picture(Biobuf *);
|
extern void picture(Biobufhdr *);
|
||||||
extern void notavail(char *);
|
extern void notavail(char *);
|
||||||
|
|
||||||
void
|
void
|
||||||
PSInclude(Biobuf *inp) {
|
PSInclude(Biobufhdr *inp) {
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
Bgetfield(inp, 's', buf, 256);
|
Bgetfield(inp, 's', buf, 256);
|
||||||
@ -51,7 +51,7 @@ struct sjt specialjumptable[] = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
devcntl(Biobuf *inp) {
|
devcntl(Biobufhdr *inp) {
|
||||||
|
|
||||||
char cmd[50], buf[256], str[MAXTOKENSIZE], *line;
|
char cmd[50], buf[256], str[MAXTOKENSIZE], *line;
|
||||||
int c, n, linelen;
|
int c, n, linelen;
|
||||||
|
|||||||
@ -13,7 +13,7 @@ cover(double x, double y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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 x[100], y[100];
|
||||||
int i, N;
|
int i, N;
|
||||||
/*
|
/*
|
||||||
@ -96,7 +96,7 @@ drawspline(Biobuf *Bp, int flag) { /* flag!=1 connect end points */
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
draw(Biobuf *Bp) {
|
draw(Biobufhdr *Bp) {
|
||||||
|
|
||||||
int r, x1, y1, x2, y2, i;
|
int r, x1, y1, x2, y2, i;
|
||||||
int d1, d2;
|
int d1, d2;
|
||||||
|
|||||||
@ -50,8 +50,8 @@
|
|||||||
/* #include "ext.h" */
|
/* #include "ext.h" */
|
||||||
|
|
||||||
Biobuf *bfp_pic = NULL;
|
Biobuf *bfp_pic = NULL;
|
||||||
Biobuf *Bfp_pic;
|
Biobufhdr *Bfp_pic;
|
||||||
Biobuf *picopen(char *);
|
Biobufhdr *picopen(char *);
|
||||||
|
|
||||||
#define MAXGETFIELDS 16
|
#define MAXGETFIELDS 16
|
||||||
char *fields[MAXGETFIELDS];
|
char *fields[MAXGETFIELDS];
|
||||||
@ -63,7 +63,7 @@ extern int picflag;
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void
|
void
|
||||||
picture(Biobuf *inp, char *buf) {
|
picture(Biobufhdr *inp, char *buf) {
|
||||||
int poffset; /* page offset */
|
int poffset; /* page offset */
|
||||||
int indent; /* indent */
|
int indent; /* indent */
|
||||||
int length; /* line length */
|
int length; /* line length */
|
||||||
@ -80,7 +80,7 @@ picture(Biobuf *inp, char *buf) {
|
|||||||
double adjx = 0.5; /* left-right adjustment */
|
double adjx = 0.5; /* left-right adjustment */
|
||||||
double adjy = 0.5; /* top-bottom adjustment */
|
double adjy = 0.5; /* top-bottom adjustment */
|
||||||
double rot = 0; /* rotation in clockwise degrees */
|
double rot = 0; /* rotation in clockwise degrees */
|
||||||
Biobuf *fp_in; /* for *name */
|
Biobufhdr *fp_in; /* for *name */
|
||||||
int i; /* loop index */
|
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.
|
* open file *path and return the resulting file pointer to the caller.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
Biobuf *
|
Biobufhdr *
|
||||||
picopen(char *path) {
|
picopen(char *path) {
|
||||||
/* char name[100]; /* pathnames */
|
/* char name[100]; /* pathnames */
|
||||||
/* long pos; /* current position */
|
/* long pos; /* current position */
|
||||||
/* long total; /* and sizes - from *fp_pic */
|
/* long total; /* and sizes - from *fp_pic */
|
||||||
Biobuf *bfp;
|
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)
|
if ((bfp = Bopen(path, OREAD)) == 0)
|
||||||
error(FATAL, "can't open %s\n", path);
|
error(FATAL, "can't open %s\n", path);
|
||||||
Bfp = bfp;
|
Bfp = bfp; /* &(bfp->Biobufhdr); */
|
||||||
return(Bfp);
|
return(Bfp);
|
||||||
#ifdef UNDEF
|
#ifdef UNDEF
|
||||||
if (Bfp_pic != NULL) {
|
if (Bfp_pic != NULL) {
|
||||||
@ -219,7 +219,7 @@ picopen(char *path) {
|
|||||||
error(FATAL, "can't generate temp file name");
|
error(FATAL, "can't generate temp file name");
|
||||||
if ( (bfp = Bopen(pictmpname, ORDWR)) == NULL )
|
if ( (bfp = Bopen(pictmpname, ORDWR)) == NULL )
|
||||||
error(FATAL, "can't open %s", pictmpname);
|
error(FATAL, "can't open %s", pictmpname);
|
||||||
Bfp = bfp;
|
Bfp = &(bfp->Biobufhdr);
|
||||||
piccopy(Bfp_pic, Bfp, total);
|
piccopy(Bfp_pic, Bfp, total);
|
||||||
Bseek(Bfp, 0L, 0);
|
Bseek(Bfp, 0L, 0);
|
||||||
return(Bfp);
|
return(Bfp);
|
||||||
@ -230,7 +230,7 @@ picopen(char *path) {
|
|||||||
if ((bfp = Bopen(path, OREAD)) == 0)
|
if ((bfp = Bopen(path, OREAD)) == 0)
|
||||||
Bfp = 0;
|
Bfp = 0;
|
||||||
else
|
else
|
||||||
Bfp = bfp;
|
Bfp = &(bfp->Biobufhdr);
|
||||||
return(Bfp);
|
return(Bfp);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ picopen(char *path) {
|
|||||||
|
|
||||||
#ifdef UNDEF
|
#ifdef UNDEF
|
||||||
void
|
void
|
||||||
inlinepic(Biobuf *Bfp, char *buf) {
|
inlinepic(Biobufhdr *Bfp, char *buf) {
|
||||||
char name[100]; /* picture file pathname */
|
char name[100]; /* picture file pathname */
|
||||||
long total; /* and size - both from *buf */
|
long total; /* and size - both from *buf */
|
||||||
|
|
||||||
@ -285,7 +285,7 @@ inlinepic(Biobuf *Bfp, char *buf) {
|
|||||||
/* *fp_out; and output file pointers */
|
/* *fp_out; and output file pointers */
|
||||||
/* total; number of bytes to be copied */
|
/* total; number of bytes to be copied */
|
||||||
void
|
void
|
||||||
piccopy(Biobuf *Bfp_in, Biobuf *Bfp_out, long total) {
|
piccopy(Biobufhdr *Bfp_in, Biobufhdr *Bfp_out, long total) {
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
for (i = 0; i < total; i++)
|
for (i = 0; i < total; i++)
|
||||||
|
|||||||
@ -11,8 +11,8 @@ extern int curfontsize;
|
|||||||
typedef struct {long start, end;} Section;
|
typedef struct {long start, end;} Section;
|
||||||
static char *buf;
|
static char *buf;
|
||||||
|
|
||||||
static void
|
static
|
||||||
copy(Biobuf *fin, Biobuf *fout, Section *s) {
|
copy(Biobufhdr *fin, Biobufhdr *fout, Section *s) {
|
||||||
int cond;
|
int cond;
|
||||||
if (s->end <= s->start)
|
if (s->end <= s->start)
|
||||||
return;
|
return;
|
||||||
@ -57,7 +57,7 @@ copy(Biobuf *fin, Biobuf *fout, Section *s) {
|
|||||||
/* rot; /* rotation - in clockwise degrees */
|
/* rot; /* rotation - in clockwise degrees */
|
||||||
|
|
||||||
void
|
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,
|
int outline, int scaleboth, double cx, double cy, double sx, double sy,
|
||||||
double ax, double ay, double rot) {
|
double ax, double ay, double rot) {
|
||||||
char **strp;
|
char **strp;
|
||||||
|
|||||||
@ -44,19 +44,19 @@ readDESC(void) {
|
|||||||
char *descnameformat = "%s/dev%s/DESC";
|
char *descnameformat = "%s/dev%s/DESC";
|
||||||
char *descfilename = 0;
|
char *descfilename = 0;
|
||||||
Biobuf *bfd;
|
Biobuf *bfd;
|
||||||
Biobuf *Bfd;
|
Biobufhdr *Bfd;
|
||||||
int i, state = -1;
|
int i, state = -1;
|
||||||
int fontindex = 0;
|
int fontindex = 0;
|
||||||
|
|
||||||
if (debug) Bprint(Bstderr, "readDESC()\n");
|
if (debug) Bprint(Bstderr, "readDESC()\n");
|
||||||
descfilename = galloc(descfilename, strlen(descnameformat)+strlen(FONTDIR)
|
descfilename = galloc(descfilename, strlen(descnameformat)+strlen(FONTDIR)
|
||||||
+strlen(devname)+1, "readdesc");
|
+strlen(devname), "readdesc");
|
||||||
sprint(descfilename, descnameformat, FONTDIR, devname);
|
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);
|
error(WARNING, "cannot open file %s\n", descfilename);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
Bfd = bfd;
|
Bfd = bfd; /* &(bfd->Biobufhdr); */
|
||||||
|
|
||||||
while (Bgetfield(Bfd, 's', token, MAXTOKENSIZE) > 0) {
|
while (Bgetfield(Bfd, 's', token, MAXTOKENSIZE) > 0) {
|
||||||
for (i=0; i<NDESCTOKS; i++) {
|
for (i=0; i<NDESCTOKS; i++) {
|
||||||
|
|||||||
@ -23,7 +23,7 @@ Biobuf binp, *bstdout, bstderr;
|
|||||||
Biobuf *Bstdin, *Bstdout, *Bstderr;
|
Biobuf *Bstdin, *Bstdout, *Bstderr;
|
||||||
int debug = 0;
|
int debug = 0;
|
||||||
|
|
||||||
char tmpfilename[MAXTOKENSIZE];
|
char tmpfilename[MAXPATHLEN+1];
|
||||||
char copybuf[BUFSIZ];
|
char copybuf[BUFSIZ];
|
||||||
|
|
||||||
|
|
||||||
@ -41,20 +41,20 @@ prologues(void) {
|
|||||||
Bprint(Bstdout, "%s %s\n", PAGES, ATEND);
|
Bprint(Bstdout, "%s %s\n", PAGES, ATEND);
|
||||||
Bprint(Bstdout, "%s", ENDCOMMENTS);
|
Bprint(Bstdout, "%s", ENDCOMMENTS);
|
||||||
|
|
||||||
if (cat(unsharp(DPOST))) {
|
if (cat(DPOST)) {
|
||||||
Bprint(Bstderr, "can't read %s\n", DPOST);
|
Bprint(Bstderr, "can't read %s\n", DPOST);
|
||||||
exits("dpost prologue");
|
exits("dpost prologue");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drawflag) {
|
if (drawflag) {
|
||||||
if (cat(unsharp(DRAW))) {
|
if (cat(DRAW)) {
|
||||||
Bprint(Bstderr, "can't read %s\n", DRAW);
|
Bprint(Bstderr, "can't read %s\n", DRAW);
|
||||||
exits("draw prologue");
|
exits("draw prologue");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DOROUND)
|
if (DOROUND)
|
||||||
cat(unsharp(ROUNDPAGE));
|
cat(ROUNDPAGE);
|
||||||
|
|
||||||
Bprint(Bstdout, "%s", ENDPROLOG);
|
Bprint(Bstdout, "%s", ENDPROLOG);
|
||||||
Bprint(Bstdout, "%s", BEGINSETUP);
|
Bprint(Bstdout, "%s", BEGINSETUP);
|
||||||
@ -70,19 +70,19 @@ prologues(void) {
|
|||||||
if (pointsize != 10) Bprint(Bstdout, "/pointsize %d def\n", pointsize);
|
if (pointsize != 10) Bprint(Bstdout, "/pointsize %d def\n", pointsize);
|
||||||
if (xoffset != .25) Bprint(Bstdout, "/xoffset %g def\n", xoffset);
|
if (xoffset != .25) Bprint(Bstdout, "/xoffset %g def\n", xoffset);
|
||||||
if (yoffset != .25) Bprint(Bstdout, "/yoffset %g def\n", yoffset);
|
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);
|
if (passthrough != 0) Bprint(Bstdout, "%s\n", passthrough);
|
||||||
|
|
||||||
Bprint(Bstdout, "setup\n");
|
Bprint(Bstdout, "setup\n");
|
||||||
if (formsperpage > 1) {
|
if (formsperpage > 1) {
|
||||||
cat(unsharp(FORMFILE));
|
cat(FORMFILE);
|
||||||
Bprint(Bstdout, "%d setupforms \n", formsperpage);
|
Bprint(Bstdout, "%d setupforms \n", formsperpage);
|
||||||
}
|
}
|
||||||
/* output Build character info from charlib if necessary. */
|
/* output Build character info from charlib if necessary. */
|
||||||
|
|
||||||
for (i=0; i<build_char_cnt; i++) {
|
for (i=0; i<build_char_cnt; i++) {
|
||||||
sprint(charlibname, "%s/%s", CHARLIB, build_char_list[i]->name);
|
sprint(charlibname, "%s/%s", CHARLIB, build_char_list[i]->name);
|
||||||
if (cat(unsharp(charlibname)))
|
if (cat(charlibname))
|
||||||
Bprint(Bstderr, "cannot open %s\n", charlibname);
|
Bprint(Bstderr, "cannot open %s\n", charlibname);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,24 +95,26 @@ cleanup(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
main(int argc, char *argv[]) {
|
main(int argc, char *argv[]) {
|
||||||
|
Biobuf btmp;
|
||||||
Biobuf *binp;
|
Biobuf *binp;
|
||||||
Biobuf *Binp;
|
Biobufhdr *Binp;
|
||||||
int i, tot, ifd;
|
int i, tot, ifd, fd;
|
||||||
char *t;
|
char *t;
|
||||||
|
|
||||||
programname = argv[0];
|
programname = argv[0];
|
||||||
if (Binit(&bstderr, 2, OWRITE) == Beof) {
|
if (Binit(&bstderr, 2, OWRITE) == Beof) {
|
||||||
exits("Binit");
|
exits("Binit");
|
||||||
}
|
}
|
||||||
Bstderr = &bstderr;
|
Bstderr = &bstderr; /* &bstderr.Biobufhdr; */
|
||||||
|
|
||||||
tmpnam(tmpfilename);
|
bstdout = &btmp;
|
||||||
if ((bstdout=Bopen(tmpfilename, OWRITE)) == 0) {
|
fd = safe_tmpnam(tmpfilename);
|
||||||
|
if ((Binit(bstdout, fd, OWRITE)) == Beof) {
|
||||||
Bprint(Bstderr, "cannot open temporary file %s\n", tmpfilename);
|
Bprint(Bstderr, "cannot open temporary file %s\n", tmpfilename);
|
||||||
exits("Bopen");
|
exits("Bopen");
|
||||||
}
|
}
|
||||||
atexit(cleanup);
|
atexit(cleanup);
|
||||||
Bstdout = bstdout;
|
Bstdout = bstdout; /* &bstdout->Biobufhdr; */
|
||||||
|
|
||||||
ARGBEGIN{
|
ARGBEGIN{
|
||||||
case 'a': /* aspect ratio */
|
case 'a': /* aspect ratio */
|
||||||
@ -169,7 +171,7 @@ main(int argc, char *argv[]) {
|
|||||||
Bprint(Bstderr, "Binit of <stdin> failed.\n");
|
Bprint(Bstderr, "Binit of <stdin> failed.\n");
|
||||||
exits("Binit");
|
exits("Binit");
|
||||||
}
|
}
|
||||||
Binp = binp;
|
Binp = binp; /* &(binp->Biobufhdr); */
|
||||||
if (debug) Bprint(Bstderr, "using standard input\n");
|
if (debug) Bprint(Bstderr, "using standard input\n");
|
||||||
conv(Binp);
|
conv(Binp);
|
||||||
Bterm(Binp);
|
Bterm(Binp);
|
||||||
@ -179,7 +181,7 @@ main(int argc, char *argv[]) {
|
|||||||
Bprint(Bstderr, "cannot open file %s\n", argv[i]);
|
Bprint(Bstderr, "cannot open file %s\n", argv[i]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Binp = binp;
|
Binp = binp; /* &(binp->Biobufhdr); */
|
||||||
inputfilename = argv[i];
|
inputfilename = argv[i];
|
||||||
conv(Binp);
|
conv(Binp);
|
||||||
Bterm(Binp);
|
Bterm(Binp);
|
||||||
@ -196,7 +198,7 @@ main(int argc, char *argv[]) {
|
|||||||
Bprint(Bstderr, "Binit of <stdout> failed.\n");
|
Bprint(Bstderr, "Binit of <stdout> failed.\n");
|
||||||
exits("Binit");
|
exits("Binit");
|
||||||
}
|
}
|
||||||
Bstdout = bstdout;
|
Bstdout = bstdout; /* &(bstdout->Biobufhdr); */
|
||||||
prologues();
|
prologues();
|
||||||
Bflush(Bstdout);
|
Bflush(Bstdout);
|
||||||
tot = 0; i = 0;
|
tot = 0; i = 0;
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
#define MAXSPECHARS 512
|
#define MAXSPECHARS 512
|
||||||
#define MAXTOKENSIZE 128
|
#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 debug;
|
||||||
extern int fontsize;
|
extern int fontsize;
|
||||||
|
|||||||
@ -250,7 +250,7 @@ specialout(char *stoken) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
graphfunc(Biobuf *bp) {
|
graphfunc(Biobufhdr *bp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user