[comp.sources.misc] v13i086: lj2ps

lishka@uwslh.slh.wisc.edu (Chris Lishka (relaxing in the Mad-City) ) (07/03/90)

Posting-number: Volume 13, Issue 86
Submitted-by: lishka@uwslh.slh.wisc.edu (Chris Lishka (relaxing in the Mad-City) )
Archive-name: lj2ps/part01

I submit for inclusion in comp.sources.misc the program "lj2ps"
(revision 1.1, release version), a LaserJet to PostScript translator.
lj2ps is able to convert a subset of LaserJet PCL 4 that includes page
motion, page setup, primary font selection, and text.  It is not able
to do macros, position stack commands, graphics (bitmap or
patterns/grayscale), or downloadable fonts.  However, the scanner
*does* recognize all of the PCL 4 commands, and I have added many
hooks for the unimplemented commands.  Therefore, it should not be
too difficult to add in the features you need. 

Included in this distribution is the source for lj2ps, documentation,
a test suite, and a metrics suite.  The source code for lj2ps is
should be very portable, and should run on everything from PC's to
mainframes without much modification (although I have only tried it on
a 4.3BSD Unix system).  Please see the README file (right after the
manifest below) for more information.

I hope you enjoy it!

						.oO Chris Oo.

Christopher Lishka 608-262-4485  "Dad, don't give in to mob mentality!"
Wisconsin State Lab. of Hygiene                                -- Bart Simpson
   lishka@uwslh.slh.wisc.edu     "I'm not, Son.  I'm jumping on the bandwagon."
   uunet!uwvax!uwslh!lishka                                    -- Homer Simpson

 
---- Cut Here and unpack ----
#!/bin/sh
# This is a shell archive (shar 3.21)
# made 06/30/1990 21:08 UTC by lishka@uwslh.slh.wisc.edu
# Source directory /usr/10/src/local/lj2ps/DIST
#
# existing files will NOT be overwritten
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#   9916 -rw-rw-r-- README
#   2518 -rw-r--r-- Makefile
#  73533 -rw-rw-r-- MetricsSuite/DiagRules
#   5279 -rw-rw-r-- MetricsSuite/HorizMove
#  42068 -rw-rw-r-- MetricsSuite/Letters
#  32131 -rw-rw-r-- MetricsSuite/NumbersAndSymbols
#  11972 -rw-rw-r-- MetricsSuite/Spaces
#    267 -rw-rw-r-- MetricsSuite/VertMove
#   5202 -rw-rw-r-- MetricsSuite/diagrule
#    748 -rw-rw-r-- MetricsSuite/fonts
#    335 -rw-rw-r-- MetricsSuite/hmove
#   2764 -rw-rw-r-- MetricsSuite/letters
#   2253 -rw-rw-r-- MetricsSuite/numbers.and.symbols
#    124 -rwxr-xr-x MetricsSuite/run
#    814 -rw-rw-r-- MetricsSuite/spaces
#    201 -rw-rw-r-- MetricsSuite/vmove
#   1236 -rw-rw-r-- TestSuite/ClearMargins
#   1788 -rw-rw-r-- TestSuite/HMI
#    425 -rw-rw-r-- TestSuite/HMotion-Cols
#    454 -rw-rw-r-- TestSuite/HMotion-Decipoints
#    440 -rw-rw-r-- TestSuite/HMotion-Dots
#    358 -rw-rw-r-- TestSuite/HalfLineFeed
#    594 -rw-rw-r-- TestSuite/LinesPerInch
#    800 -rw-rw-r-- TestSuite/NumberOfCopies
#    544 -rw-rw-r-- TestSuite/Orientation
#   7512 -rw-rw-r-- TestSuite/PFontAttributes
#    368 -rw-rw-r-- TestSuite/PaperInputControl
#    285 -rw-rw-r-- TestSuite/Reset
#   1663 -rw-rw-r-- TestSuite/RightLeftMargins
#  19426 -rw-rw-r-- TestSuite/Tabs
#    991 -rw-rw-r-- TestSuite/TextLength
#    571 -rw-rw-r-- TestSuite/TopMargin
#    334 -rw-rw-r-- TestSuite/Underlining
#    293 -rw-rw-r-- TestSuite/VHMotion-ColRow
#    303 -rw-rw-r-- TestSuite/VHMotion-Decipoints
#    289 -rw-rw-r-- TestSuite/VHMotion-Dots
#    496 -rw-rw-r-- TestSuite/VMI
#    642 -rw-rw-r-- TestSuite/VMotion-Decipoints
#    630 -rw-rw-r-- TestSuite/VMotion-Dots
#    613 -rw-rw-r-- TestSuite/VMotion-Rows
#    748 -rw-rw-r-- TestSuite/fonts
#    154 -rwxr-xr-x TestSuite/run
#    871 -rw-r--r-- doc/BugFile
#  12487 -rw-rw-r-- doc/Copying
#   2980 -rw-r--r-- doc/LogFile
#   1683 -rw-rw-r-- doc/compile.options.doc
#   4873 -rw-rw-r-- doc/limitations.doc
#   4619 -rw-rw-r-- doc/lj2ps.l
#    657 -rw-rw-r-- doc/measurements.doc
#  17644 -rw-r--r-- doc/parameter.scanner.idraw
#   6829 -rw-rw-r-- doc/scanner.doc
#   3480 -rw-rw-r-- doc/suggestions.doc
#   3131 -rw-rw-r-- doc/supported.commands.doc
#  40749 -rw-r--r-- doc/text.scanner.idraw
#   2950 -rw-r--r-- errors.c
#   1170 -rw-r--r-- errors.h
#  20389 -rw-r--r-- lj.c
#  13148 -rw-r--r-- lj.h
#   8092 -rw-r--r-- lj2ps.c
#   1251 -rw-r--r-- lj2ps.h
#  33110 -rw-r--r-- ljcmds.c
#   2558 -rw-r--r-- ljcmds.h
#  16148 -rw-r--r-- ljfonts.c
#   1258 -rw-r--r-- ljfonts.h
#  32557 -rw-r--r-- scan.c
#   3044 -rw-r--r-- scan.h
#   5589 -rw-r--r-- transform.c
#   1091 -rw-r--r-- transform.h
#
if touch 2>&1 | fgrep '[-amc]' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= README ==============
if test X"$1" != X"-c" -a -f 'README'; then
	echo "File already exists: skipping 'README'"
else
echo "x - extracting README (Text)"
sed 's/^X//' << 'SHAR_EOF' > README &&
X				lj2ps
X	       A LaserJet PCL to PostScript Translator
X
X			Version 1.1 (release)
X
X			  Christopher Lishka
X		Wisconsin State Laboratory of Hygiene
X		      Data Processing Department
X
X			    June 30th, 1990
X
X
X			      Contents:
X
X		1. Introduction
X		2. This Distribution, and How To Create lj2ps
X		3. Implementation Notes
X		4. Miscellaneous (Things I Have To Get Off My Chest)
X		5. Contacting Me
X
X
X1. Introduction
X
XThe lj2ps program translates HP LaserJet PCL ("Page Control Language")
Xto PostScript.  Currently it converts a subset of the LaserJet Series
XII language (PCL 4) to device-independent PostScript.
X
Xlj2ps was originally written to allow my organization to "upgrade" our
XLaserJets to LaserWriters, yet still have a way to print PCL files.
XDue to a lack of time, not all of PCL is emulated (this is discussed
Xbelow).  I am releasing this program to the "real world" at the
Xsuggestion of by boss and coworkers, and with the hope that others
Xwill also find this program useful and may even extend its
Xcapabilities.
X
X
X2. This Distribution, and How To Create lj2ps
X
XIncluded in this distribution are all of the source files for lj2ps,
Xdocumentation, a test suite, and a metrics suite.
X
XAll source files are included in the top level directory, along with
Xthe Makefile and README file.  To create lj2ps, simply type "make".
XTo clean the directory, type "make clean".  Pretty simple, huh? ;-)
XThere are probably other options in the Makefile, but since I
Xregularly use "cake" (instead of make), and since I generated it with
Xmkmf (automatic Makefile creator), I am not sure what they are.  Feel
Xfree to edit it.  Those who are interested in the Cakefile, please
Xcontact me.
X
XThe TestSuite directory contains many tests used to check the
Xcompatibility of lj2ps with real LaserJets.  Similarly, the
XMetricsSuite directory is used to tune lj2ps to produce output which
Xlooks like LaserJet output.  These are discussed in more detail in the
Ximplementation section below.
X
XThe documentation directory has several files in it.  Here are
Xexplanations of them:
X
XBugFile		Known bugs that affect lj2ps are detailed here.  Each
X		entry identifies the date detected, revision affected,
X		and the person logging the bug (usually me!).  The
X		LogFile describes which bugs have been fixed.
X
XCopying		This is the standard Free Software Foundation
X		copyleft.  lj2ps is distributed according to these
X		restrictions.  Please look through it so that you are
X		familiar with the conditions of use for lj2ps.  The
X		only other thing that I ask is that you send me
X		changes (with descriptions) if you make them, so that
X		I can benefit from your work.
X
XLogFile		This file contains descriptions of each revision of
X		lj2ps.  All changes including bug fixes, added
X		features, and removals are detailed here.
X
Xcompile.options.doc
X		Options are available at compile-time to conditionally
X		include or exclude features when the program is
X		created.  This file describes the options currently
X		available.
X
Xlimitations.doc	Any program worth its salt has certain limitations.
X		lj2ps is no exception.  This file lists some that I
X		know about.  Feel free to fix any (or all) of them.
X
Xlj2ps.l		The man page for lj2ps, to be installed in
X		/usr/man/manl.  Use the command "nroff -man lj2ps.l"
X		to create the documentation file.
X
Xmeasurements.doc
X		One of the worst aspects of LaserJets is the many
X		different measurements used by different commands,
X		This file lists all measurements that I know of.
X
Xparameter.scanner.idraw
X		A diagram of the parameter scanner.  This file was
X		produced with the drawing program "idraw," and can be
X		printed on any PostScript printer.
X
Xscanner.doc
X		There are two distinct (yet related) scanners used in
X		lj2ps.  Scanner.doc describes the conceptual design I
X		used in creating them, which is derived from standard
X		scanner and finite state automata theory taught in
X		college (where do you think I learned it from? ;-).
X
Xsuggestions.doc	This file lists aspects of lj2ps that need work.  It
X		may also provide some insight as to how lj2ps was
X		designed.  If you have some free time, and need some
X		suggestions on how to improve the program, then look
X		here. 
X
Xsupported.commands.doc
X		As detailed below, I did not have time to emulate all
X		PCL commands.  This list shows which ones are (and
X		are not) supported.
X
Xtext.scanner.idraw
X		A diagram of the text scanner.  This file was produced
X		with the drawing program "idraw," and can be printed
X		on any PostScript printer.
X
X
X3. Implementation Notes
X
XThe program is written completely in K&R C (although not ANSI), and
Xthe C code should compile on nearly every standard machine out there.
XTo my knowledge, I have not used any "strange" C operators or
Xcombinations, so this program should work on anything from a PC to a
Xsuper-computer.
X
XI built the program with the idea of emulating full LJII PCL, so all
Xof the actual command syntax is parsed.  However, I have only
Ximplemented the commands which I needed.  Left out are graphics,
Xmacros, and soft font commands (among others).  It should not be that
Xhard to add features to this program, and I have included variables
X(some yet unused) for most (if not all) aspects of LaserJet operation.
XFeel free to work on extending this program to emulate the unfinished
XPCL commands, as well as fixing some of the inconsistencies that will
Xlikely pop up.  All I ask is that you send me any changes that you
Xmake, so I can add the same features to my own version (my address is
Xlisted at the end of this file.
X
XI have designed lj2ps with efficiency in mind.  To this end, I
Xhand-coded the scanner in C instead of generating it with Lex.  I have
Xalso spent some time profiling the execution.  Although one major
Xbottleneck has been fixed, most of the program actually runs at a
Xreasonable rate.  As would be expected, much of the execution time is
Xspent in the scanner and _doprnt.  The scanner could likely be sped up
Xsome more (a colleague suggests "caching" several variables in
Xregisters), but I have left this for the future.
X
XI have also designed the program with accuracy in mind.  Included in
Xthis distribution are two suites of files: one for testing, the other
Xfor accurate reproduction.  The test suite is an attempt at providing
Xtest files which will exercise critical and nit-picky features of
XLaserJet Series II printers.  It is by no means complete.  I have only
Xincluded tests for features that are needed at our organization, and I
Xhave likely even left out some of these.  I encourage you to add more
Xfiles to the test suite; if several people contribute, a nice
Xcollection could be created.  The metrics suite provides print samples
Xwhich highlight different measurements.  For instance, you could test
Xinter-line spacing by printing the appropriate metrics file on a
XLaserJet and a PostScript printer, and then tweak lj2ps to match the
XLaserJet's output.  This suite is also not complete, so feel free to
Xadd more files.
X
X
X4. Miscellaneous (Things I Have To Get Off My Chest)
X
XIt is unlikely that I will have any time at work to finish this
Xprogram.  I will only support it locally for our own users.  Although
Xit would be nice to work on this outside of my job, I have so many
Xother program (and non-program) ideas that I likely won't do much more
Xwith lj2ps.  Therefore it is up to you to build in the missing
Xfunctionality that you want.
X
XEven though the major reason I wrote this was because our organization
Xneeded it, a significant driving-force for me was a "proof of
Xconcept."  I always thought that PostScript was a much better language
Xthan LaserJet PCL, and this program provided me with a way to prove
Xit.  Even though this revision of lj2ps is limited, I am convinced
Xthat one could fully emulate a LaserJet with a filter (like lj2ps) and
Xa PostScript printer.  In fact, I bet it could be done with PostScript
Xalone, although it would be incredibly slow.  However, one cannot
Xemulate a PostScript printer using PCL.  Most (if not all) PostScript
Xto LaserJet emulators are programs (in software or hardware) which
Xsend bitmaps to a LaserJet; PCL is pretty-much bypassed.  This says a
Xlot about the two languages.
X
XI have spent several years writing programs which use PCL on
XLaserJets.  I have just finished a translator that parses and emulates
XPCL.  With all this experience and time spent using PCL, all I can say
Xis that it leaves a really bad taste in my mouth.  It is not user
Xfriendly, not consistent, and not robust.  Its syntax is lousy, its
Xcommands are impossible to remember, and it inner workings are very
Xhard to figure out (believe me, I spent too much time doing this!).
XWhoever is responsible for developing PCL ought to be taught a lesson.
XI have much respect for many Hewlett Packard products (like the hp28s
Xand hp48sx calculators).  However, the LaserJet's language is one of
XHP's worst creations.  Suffice it to say that the HP LaserJet is the
XIBM PC of the laser-printer world.
X
X
X5. Contacting Me
X
XIf you have any additions, fixes, or problems; need to know more about
Xthe secret workings of the code; have suggestions for improving lj2ps;
Xor simply want to say hello, you can contact me at:
X
X	Internet:	lishka@uwslh.slh.wisc.edu
X	UUCP:		...!uunet!uwvax!uwslh!lishka
X
X	Work phone:	(608) 262-4485 (Tues.-Sat., 5am-9pm)
X
X	Address:	Christopher Lishka
X			Data Processing Dept.
X			Wisconsin State Laboratory of Hygiene
X			465 Henry Mall
X			Madison, WI     53715
X
XMy only real request is that you send me any bug fixes, enhancements,
Xor other modifications that you have made.  Please don't send source
Xtrees without contacting me first.  The best thing to send is a
Xcontext-diff (e.g. for "patch") from some released version.
X
XIf you like this program enough to donate some money, then I ask that
Xyou give it to charity (for example: an environmental, peace, or
Xhomeless organization).  It will make both of us feel good, and it is
Xeven tax-deductible.
SHAR_EOF
$TOUCH -am 0630160890 README &&
chmod 0664 README ||
echo "restore of README failed"
set `wc -c README`;Wc_c=$1
if test "$Wc_c" != "9916"; then
	echo original size 9916, current size $Wc_c
fi
fi
# ============= Makefile ==============
if test X"$1" != X"-c" -a -f 'Makefile'; then
	echo "File already exists: skipping 'Makefile'"
else
echo "x - extracting Makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > Makefile &&
X# Project:	lj2ps, LaserJet PCL to PostScript translator
X# File:		Makefile
X#
X# Author:	Christopher Lishka
X# Organization:	Wisconsin State Laboratory of Hygiene
X#		Data Processing Department
X#
X# Note: I use "cake" instead of "make" to build the lj2ps program from its
X# source files.  However, because cake isn't as popular as make, I
X# have included this Makefile in the general distribution.  Anyone who
X# would like the Recipe file for cake can contact me.  However, it is
X# heavily dependent on my working style, and may not suit everyone's
X# tastes.  - Chris 
X#
X# Possible CFLAGS options:
X#
X# -DDEBUG		Compile in diagnostic print code 
X# -DVERBOSE_WARNINGS	More types of warnings are printed
X
XPROGRAM	      = lj2ps
X
XCFLAGS        = -O
X
XLDFLAGS	      = -O
X
XLIBS	      = -lm
X
XLINKER	      = cc
X
X# ----------------------------------------------------------------------
X
XDEST	      = .
X
XEXTHDRS	      = /usr/include/ctype.h \
X		/usr/include/math.h \
X		/usr/include/stdio.h \
X		/usr/include/strings.h
X
XHDRS	      = errors.h \
X		lj.h \
X		lj2ps.h \
X		ljcmds.h \
X		ljfonts.h \
X		scan.h \
X		transform.h
X
XOBJS	      = errors.o \
X		lj.o \
X		lj2ps.o \
X		ljcmds.o \
X		ljfonts.o \
X		scan.o \
X		transform.o
X
XSRCS	      = errors.c \
X		lj.c \
X		lj2ps.c \
X		ljcmds.c \
X		ljfonts.c \
X		scan.c \
X		transform.c
X
XMAKEFILE      = Makefile
X
XPRINT	      = pr
X
X# ----------------------------------------------------------------------
X
Xall:		$(PROGRAM)
X
X$(PROGRAM):     $(OBJS)
X		@echo -n "Loading $(PROGRAM) ... "
X		@$(LINKER) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
X		@echo "done"
X
Xclean:;		@rm -f $(OBJS)
X
Xdepend:;	@mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST)
X
Xindex:;		@ctags -wx $(HDRS) $(SRCS)
X
Xinstall:	$(PROGRAM)
X		@echo Installing $(PROGRAM) in $(DEST)
X		@install -s $(PROGRAM) $(DEST)
X
Xprint:;		@$(PRINT) $(HDRS) $(SRCS)
X
Xprogram:        $(PROGRAM)
X
Xtags:           $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS)
X
Xupdate:		$(DEST)/$(PROGRAM)
X
X$(DEST)/$(PROGRAM): $(SRCS) $(LIBS) $(HDRS) $(EXTHDRS)
X		@make -f $(MAKEFILE) DEST=$(DEST) install
X###
Xerrors.o: /usr/include/stdio.h errors.h lj2ps.h lj.h
Xlj.o: /usr/include/stdio.h lj.h ljcmds.h ljfonts.h scan.h lj2ps.h
Xlj2ps.o: /usr/include/stdio.h /usr/include/math.h lj2ps.h lj.h transform.h \
X	errors.h
Xljcmds.o: /usr/include/stdio.h /usr/include/math.h ljcmds.h lj.h ljfonts.h \
X	scan.h lj2ps.h
Xljfonts.o: /usr/include/strings.h ljfonts.h lj.h
Xscan.o: /usr/include/stdio.h /usr/include/ctype.h scan.h lj.h lj2ps.h
Xtransform.o: /usr/include/stdio.h transform.h scan.h lj2ps.h lj.h
SHAR_EOF
$TOUCH -am 0630160790 Makefile &&
chmod 0644 Makefile ||
echo "restore of Makefile failed"
set `wc -c Makefile`;Wc_c=$1
if test "$Wc_c" != "2518"; then
	echo original size 2518, current size $Wc_c
fi
fi
echo "End of part 1, continue with part 2"
exit 0