Date: Fri, 3 Jul 92 13:08:55 PDT 
From: edmoy@violet.berkeley.edu
Subject: macps/prepfix v. 2.3 

Well, here is the long-overdue System 7 compatible version of macps and
prepfix, version 2.3, in shar format.  Following are some excerpts from
the included ReadMe file.

Edward Moy				Principal Programmer - Macintosh & Unix
Workstation Support Services		Workstation Software Support Group
University of California
Berkeley, CA  94720

--------------------------------------------------------------------------------

WHAT IS MACPS?

Macps is a Unix program that takes an uploaded PostScript file created
on a Macintosh (see macps.1 for more details) and includes an
appropriately modified LaserPrep file so that the result can be sent to
a PostScript printer from Unix.  The LaserPrep file contains macros
used by the PostScript generator on the Macintosh.

HOW ARE THE LASERPREP FILES GENERATED?

Since the Apple LaserPrep files are copyrighted, I've included a
program, prepfix, that reads version 4.0 and up LaserPrep files, and
edits them so that they are (mostly) compatible with Unix (See
prepfix.1 for more details).

CHANGES IN VERSION 2.3

Version 2.3 of prepfix now support LaserPrep 7.x (System 7).  Resulting
LaserPrep files are slightly smaller, since some extraneous comments
have been removed.  Version 2.3 of macps works with System 7-generated
PostScript files, replacing the included LaserPrep with the modified
version.  Because of the way this change was made, macps can now work
on either a Command-F or Command-K (pre-System 7) PostScript file.

Creating a PostScript file under System 7 will cause all fonts used in
a document to be downloaded.  Downloaded fonts, especially TrueType
fonts, tend to make the resulting PostScript file very large.  Both the
size of the PostScript file and the complexity of a downloadable
TrueType font can cause some printers to fail to print, even when the
printer already contains the requested fonts.  Software like H.M.
Ayala's Trimmer CDEV (available from most Macintosh ftp sites and
bulletin board systems) can prevents selected fonts (those already
resident in the printer) from being downloaded.
----------- cut ------------------- cut -------------------- cut ------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	Installation
#	Makefile
#	ReadMe
#	macaux.c
#	macps.1
#	macps.c
#	macps.config
#	prepfix.1
#	prepfix.c
#	str.h
#	ucbwhich.c
#	ucbwhich.h
# macps/prepfix v 2.3 - archive created: Fri Jul  3 12:35:19 PDT 1992
if test -f Installation
then
	echo shar: will not overwrite existing file "'Installation'"
else
echo 'x - Installation'
cat << \RAZZLE!DAZZLE > Installation
Installation Instructions (SCCSid = "@(#)Installation	2.3 7/1/92")

1) Look at the Makefile.  There are three CFLAGS options that you can
use.  Setting SYSV should allow macps and prepfix to compile on System
V machines (I've only tried it under A/UX).  Setting CONFIGDIR will
cause macps to look for macps.config in that directory.  Setting SAVE
will cause macps to enclose the entire print job is a PostScript
save/restore context.  Normally you don't need SAVE, since most
spooling software will automatically do an EOF between print jobs,
which effectively does a restore of memory for you, but some spooling
software does require the save/restore.  Note that defining SAVE will
cause printing to fail on a NeXT laser printer, while it is harmless on
most other systems.

The options will look something like:

CFLAGS = -O -DSYSV -DCONFIGDIR=\"/usr/new/lib\" -DSAVE

if you defined all the options.

2) Type "make".  If all goes well, macps and prepfix will be created.

3) For pre-System 7 systems, to create the unprocessed LaserPrep file
on the Mac, as well as creating the raw PostScript files that you want
to print, make sure that either you're not running MultiFinder, or if
you are, go to the Chooser under the Apple menu, click on the
LaserWriter icon and then turn off Background Printing.  (No special
setting need to be made under System 7.)

4a) Under a pre-System 7 system, for each version of LaserPrep on the
Mac that you want to include, install that version in the System
Folder.  Then, open an empty document in some simple application (one
that doesn't have its own ProcSet to download).  Choose Print from the
File menu and the LaserWriter print dialog will appear.  Click on the
OK button and IMMEDIATELY press and hold Command-K.  When a dialog box
appears telling you that it is creating a PostScript file, you can
release Command-K.  The unprocessed LaserPrep file will usually be
found in one of three places, in the System Folder, in the same folder
as the application or at the top level of the disk.

4b) Under a System 7 system, make sure that the LaserWriter driver is
installed in the System Folder.  Then, open an empty document in some
simple application (one that doesn't have its own ProcSet to
download).  Choose Print from the File menu and the LaserWriter print
dialog will appear.  Click on the PostScript File radio button, and
then click on the Save button.  When the standard file dialog box
appears, specify a name and folder for the PostScript file, and click
on the Save button.

5) Upload the PostScript file(s) to Unix, using some file transfer
program like MacTerminal, Versaterm, Red Ryder, MacKermit or ftp.

6) Run prepfix on each unprocessed file, diverting the standard output
to an appropriataly named file (like LaserPrep5.2).  If you want to
allow bit smoothing on a non-Apple PostScript printer, specify the -l
option to prepfix (you can specify as many printer names as you want,
each with a separate -l flag).  If you aren't sure the your printer can
do smoothing, you can try it and see if it works (if it doesn't, you
can always re-run prepfix on the unprocessed file(s), leaving off the
printer that doesn't work).  If you don't know the product name for you
printer, you can use the following PostScript code to print it:

%!
/in {72 mul} def
/Courier findfont 18 scalefont setfont
1 in 8 in moveto
statusdict /product get show
showpage

7) Put the modified LaserPrep file(s) in some directory and modify the
macps.config file to point to these LaserPrep files.  Then put the
macps.config file in a "lib" subdirectory to where you install macps
(or in the directory CONFIGDIR if you used that option).

8) Now when you want to print something, do the same thing as in step 4
above with the LaserWriter print dialog, except for pre-System 7
system, press and hold Command-F (this cause LaserPrep not to be
included in the PostScript file).

9) Upload the PostScript file and run macps on it, sending the output
to your printer, as in:

	% macps psfile | lpr
RAZZLE!DAZZLE
fi	# End Installation
if test -f Makefile
then
	echo shar: will not overwrite existing file "'Makefile'"
else
echo 'x - Makefile'
cat << \RAZZLE!DAZZLE > Makefile
# Copyright (c) 1988, 1992, The Regents of the University of California.
# Edward Moy, Workstation Software Support Group, Workstation Support Serices,
# Information Systems and Technology.
#
# Permission is granted to any individual or institution to use, copy,
# or redistribute this software so long as it is not sold for profit,
# provided that this notice and the original copyright notices are
# retained.  The University of California makes no representations about the
# suitability of this software for any purpose.  It is provided "as is"
# without express or implied warranty.
#
# SCCSid = "@(#)Makefile	2.3 7/1/92"
#
# For System V, include -DSYSV in CFLAGS below.
# To specify a fixed path for macps.config, include -DCONFIGDIR=\"path\"
# in CFLAGS below (path is the full pathname of the directory).
# To do save/restore context, include -DSAVE in CFLAGS below.
#
CFLAGS = -O
MACPS = macps.o macaux.o ucbwhich.o
PREPFIX = prepfix.o macaux.o

all : macps prepfix

macps : $(MACPS)
	cc -o macps $(CFLAGS) $(MACPS)

prepfix : $(PREPFIX)
	cc -o prepfix $(CFLAGS) $(PREPFIX)

macps.o : macps.c str.h ucbwhich.h

macaux.o : macaux.c str.h

prepfix.o : prepfix.c str.h

ucbwhich.o : ucbwhich.c ucbwhich.h

clean :
	/bin/rm -f *.o macps prepfix
RAZZLE!DAZZLE
fi	# End Makefile
if test -f ReadMe
then
	echo shar: will not overwrite existing file "'ReadMe'"
else
echo 'x - ReadMe'
cat << \RAZZLE!DAZZLE > ReadMe
COPYRIGHT NOTICE (SCCSid = "@(#)ReadMe	2.3 7/3/92")

Copyright (C) 1988, 1992, The Regents of the University of California.
Edward Moy, Workstation Software Support Group, Workstation Support
Serices, Information Systems and Technology.

Permission is granted to any individual or institution to use, copy, or
redistribute this software so long as it is not sold for profit,
provided that this notice and the original copyright notices are
retained.  The University of California makes no representations about
the suitability of this software for any purpose.  It is provided "as
is" without express or implied warranty.

WHAT IS MACPS?

Macps is a Unix program that takes an uploaded PostScript file created
on a Macintosh (see macps.1 for more details) and includes an
appropriately modified LaserPrep file so that the result can be sent to
a PostScript printer from Unix.  The LaserPrep file contains macros
used by the PostScript generator on the Macintosh.

WHY IS MACPS NEEDED?

This is how Mac printing works.  When a Mac talks to a LaserWriter, it
asks if the LaserWriter has had a LaserPrep file downloaded to it.  A
LaserWriter that is first powered up, has no such LaserPrep file, and
so the Mac downloads it and makes the LaserPrep file resident in
memory.  Then the actual print file is sent to the LaserWriter.
Subsequent print requests need not download the LaserPrep file, unless
it is a different version.

Since a LaserWriter connected to a Unix system usually does things
other than Mac printing, it is unwise to make LaserPrep files resident
in memory so that other PostScript jobs have less memory to work with.
What prepfix does is to modify a LaserPrep file so that, among other
things, it does not make itself resident in memory.  Thus, the
LaserPrep file must be downloaded for each Mac print job.  This is the
function of macps, to automatically append the appropriate LaserPrep
file.

Since System 7, the LaserPrep is no longer downloaded to the printer.
Some people have had success printing a System 7-generated PostScript
file directly, but using macps should make printing more reliable and
available to non-Apple PostScript printers.

WHICH VERSION OF THE LASERPREP WILL BE USED?

Macps interprets the %%IncludeProcSet directive found in the PostScript
generated by LaserWriter driver 4.0 and greater.  It takes the ProcSet
id and looks it up in a file "macps.config", to get the pathname of the
prep file, and thus macps can convert PostScript generated by different
versions of the LaserWriter driver.

HOW ARE THE LASERPREP FILES GENERATED?

Since the Apple LaserPrep files are copyrighted, I've included a
program, prepfix, that reads version 4.0 and up LaserPrep files, and
edits them so that they are (mostly) compatible with Unix (See
prepfix.1 for more details).

WHERE IS THE MACPS.CONFIG FILE LOCATED?

Macps has some special code that is able to figure out from which
directory it was called from.  It will then look in a "lib" subdiretory
for the macps.config file.

WHAT ABOUT BIT-SMOOTHING ON NON-LASERWRITER PRINTERS?

For PostScript printers using Motorola 680x0 processors and Adobe
PostScript firmware other than LaserWriters, there is an option that
will allow these printers to do bit-smoothing, just like LaserWriters.

CHANGES IN VERSION 2.3

Version 2.3 of prepfix now support LaserPrep 7.x (System 7).  Resulting
LaserPrep files are slightly smaller, since some extraneous comments
have been removed.  Version 2.3 of macps works with System 7-generated
PostScript files, replacing the included LaserPrep with the modified
version.  Because of the way this change was made, macps can now work
on either a Command-F or Command-K (pre-System 7) PostScript file.

Creating a PostScript file under System 7 will cause all fonts used in
a document to be downloaded.  Downloaded fonts, especially TrueType
fonts, tend to make the resulting PostScript file very large.  Both the
size of the PostScript file and the complexity of a downloadable
TrueType font can cause some printers to fail to print, even when the
printer already contains the requested fonts.  Software like H.M.
Ayala's Trimmer CDEV (available from most Macintosh ftp sites and
bulletin board systems) can prevents selected fonts (those already
resident in the printer) from being downloaded.

CHANGES IN VERSION 2.2

Version 2.2 of prepfix now supports LaserPrep 6.0.  The PostScript
save/restore context is now a compile-time option, since it caused
printing to fail on a NeXT printer (though it was harmless on most
other printers).  This save/restore is now more intelligent about
clearing the stacks.

CHANGES IN VERSION 2.1

Version 2.1 of prepfix uses a safer method for turning on bit-smoothing
for non-Apple printers.  This should get around some of the problems
people have been having with specialized macros in the LaserPreps that
are Apple printer specific.  The -l and -p options in version 1.1 have
been replaced with the single -l option, and the limit on the number
of printers you can specify has been removed.

Also, prepfix removes some other various macros that cause
unpredictable problems, and a problem with Apple LaserWriter II/NTs
(but not other Apple printers).

Version 2.1 macps has several new options.  The -c option allow you to
specify the number of copies to generate (overriding any multiple copy
option that was specified on the Macintosh).  The -d option allows an
alternate directory to look for the macps.config file.  Finally, the -r
(raw) option suppresses the conversion of 8-bit binary into ASCII, and
is useful for some graphics programs that manipulate gray-scale images,
and produce 8-bit binary PostScript output.

Macps will even work with a NeXT laser printer, but (at least the 0.8
version of the operating system) will not do bit smoothing.  Beware,
though, that if you print Macintosh patterns at 400 dpi, they will
look funny.
RAZZLE!DAZZLE
fi	# End ReadMe
if test -f macaux.c
then
	echo shar: will not overwrite existing file "'macaux.c'"
else
echo 'x - macaux.c'
cat << \RAZZLE!DAZZLE > macaux.c
/*
 * Copyright (c) 1988, 1992, The Regents of the University of California.
 * Edward Moy, Workstation Software Support Group, Workstation Support Serices,
 * Information Systems and Technology.
 *
 * Permission is granted to any individual or institution to use, copy,
 * or redistribute this software so long as it is not sold for profit,
 * provided that this notice and the original copyright notices are
 * retained.  The University of California makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 */

#ifndef lint
static char *SCCSid = "@(#)macaux.c	2.3 7/1/92";
#endif lint

#include <ctype.h>
#include <stdio.h>
#include "str.h"

#define	FALSE		0
#define	TRUE		1

extern char *myname;
int rawmode = FALSE;

STR *
STRalloc()
{
	register STR *str;
	char *malloc();

	if((str = (STR *)malloc(sizeof(STR))) == NULL ||
	 (str->bufptr = (byte *)malloc(STRSIZE)) == NULL) {
		fprintf(stderr, "%s: STRalloc: Out of memory\n", myname);
		exit(1);
	}
	str->curendptr = str->bufptr;
	str->realendptr = str->bufptr + STRSIZE;
	return(str);
}

STRfree(str)
STR *str;
{
	free((char *)str->bufptr);
	free((char *)str);
}

STRexpand(str)
register STR *str;
{
	register int curend, realend;
	char *realloc();

	curend = str->curendptr - str->bufptr;
	realend = (str->realendptr - str->bufptr) + STRSIZEDELTA;
	if((str->bufptr = (byte *)realloc((char *)str->bufptr,
	 realend)) == NULL) {
		fprintf(stderr, "%s: STRexpand: Out of memory\n", myname);
		exit(1);
	}
	str->curendptr = str->bufptr + curend;
	str->realendptr = str->bufptr + realend;
}

STRgets(str, fp)
register STR *str;
register FILE *fp;
{
	register int c;

	str->curendptr = str->bufptr;
	for( ; ; ) {
		if((c = getc(fp)) == EOF)
			return(str->curendptr > str->bufptr);
		if(str->curendptr >= str->realendptr)
			STRexpand(str);
		*str->curendptr++ = c;
		if(c == '\n' || c == '\r') {
			if(str->curendptr >= str->realendptr)
				STRexpand(str);
			*str->curendptr = 0;
			return(TRUE);
		}
	}
}

STRputsptr(str, cp, fp)
register STR *str;
register byte *cp;
register FILE *fp;
{
	if(rawmode) {
		for( ; cp < str->curendptr ; cp++)
			putc(*cp, fp);
		return;
	}
	for( ; cp < str->curendptr ; cp++) {
		if(!isascii(*cp))
			fprintf(fp, "\\%03o", *cp);
		else if(isprint(*cp))
			putc(*cp, fp);
		else {
			switch(*cp) {
			 case '\n':
			 case '\r':
				putc('\n', fp);
				continue;
			 case '\t':
				putc('\t', fp);
				continue;
			 default:
				fprintf(fp, "\\%03o", *str);
				continue;
			}
		}
	}
}

STRcompareptr(str, cp, sp)
register STR *str;
register byte *cp, *sp;
{
	register int comp;

	for( ; ; ) {
		if(*sp == 0)
			return(cp >= str->curendptr ? 0 : 1);
		if(cp >= str->curendptr)
			return(-1);
		if(*sp == '\n') {
			if(*cp != '\n' && *cp != '\r')
				return((int)*cp - (int)*sp);
		} else if((comp = (int)*cp - (int)*sp) != 0)
			return(comp);
		cp++;
		sp++;
	}
}

STRheadcmpptr(str, cp, sp)
register STR *str;
register byte *cp, *sp;
{
	register int comp;

	for( ; ; ) {
		if(*sp == 0)
			return(0);
		if(cp >= str->curendptr)
			return(-1);
		if(*sp == '\n') {
			if(*cp != '\n' && *cp != '\r')
				return((int)*cp - (int)*sp);
		} else if((comp = (int)*cp - (int)*sp) != 0)
			return(comp);
		cp++;
		sp++;
	}
}

byte *
STRmatch(str, sp)
register STR *str;
register byte *sp;
{
	register byte *mp, *last;
	register int firstchar;

	firstchar = *sp;
	last = str->curendptr - strlen(sp);
	mp = str->bufptr;
	while(mp <= last) {
		if(*mp == firstchar && STRheadcmpptr(str, mp, sp) == 0)
			return(mp);
		mp++;
	}
	return(NULL);
}
RAZZLE!DAZZLE
fi	# End macaux.c
if test -f macps.1
then
	echo shar: will not overwrite existing file "'macps.1'"
else
echo 'x - macps.1'
cat << \RAZZLE!DAZZLE > macps.1
.\" SCCSid = "@(#)macps.1	2.3 7/3/92"
.TH MACPS 1 "1 July 1992"
.UC 4
.SH NAME
macps \- print Macintosh-created PostScript file on Unix
.SH SYNOPSIS
.B macps
[
\-c copies
]
[
\-d directory
]
[
\-r
]
[
file
]
.SH DESCRIPTION
.I Macps
takes the command-line file (or the standard input if no filename is given),
and prepends the appropriate Macintosh LaserPrep file (e.g., those generated
by
.IR prepfix (1)).
The standard output can then be directed to a PostScript printer, via
.IR lpr (1),
for example.
.PP
The input PostScript file is generated on a Macintosh in one of two ways.
On pre-System 7 systems, this PostScript file is created by typing (and
holding) Command-F immediately after clicking the OK button of the LaserWriter
Print dialog box.
Another dialog will appear, confirming that a file named ``PostScript'' is
being created (the Command-F keys can be released now).
Depending on the application, the created PostScript file can be found in the
System Folder, the application folder or the top level of the disk.
.PP
On System 7 systems, the Print dialog box allows the selection of the
destination of the output.
Clicking on the PostScript File radio button and then clicking the Save button
will cause a standard file dialog box to appear, allowing the user to specify
the name and location of the resultant PostScript file.
.PP
The PostScript file can then be uploaded via some file transfer program, such
as MacTerminal/VersaTerm and
.IR macget (1),
MacKermit/Red Ryder and
.IR kermit (1)
or
.IR ftp (1).
.PP
Normally, you would specify the number of copies in the LaserWriter
Print dialog box on the Macintosh.
However, you can override that after uploading the PostScript file by
specifying the
.B \-c
option, followed by the number of copies.
.PP
In a Macintosh PostScript file, the line beginning with ``%%IncludeProcSet:''
is a request to include a LaserPrep with the internal name that follows on
the same line as the ``%%IncludeProcSet:'' directive.
This internal name corresponds to the name in a LaserPrep file that follows
on the same line as the ``%%BeginProcSet:'' directive.
.PP
To specify where a LaserPrep file with a certain internal name is stored, a
file named
.B macps.config
is used.
This file is composed of one of more lines; one for each LaserPrep file.
Each line contains the internal name followed a tab character followed by
the name of file containing the corresponding LaserPrep.
The file name can be either a full pathname or a pathname relative
to the directory that
.B macps.config
resides.
.PP
The
.B macps.config
file is normally located in a `lib' subdirectory of the directory
.I macps
is located.
The
.B \-d
option allow you to specify an alternate directory in which the
.B macps.config
file can be found.
.PP
Most Macintosh applications produce normal ASCII PostScript files.
However, some graphics programs that manipulate gray-scale images will
produce PostScript files that contain 8-bit binary data.
Since
.I macps
normally converts this binary data, these PostScript files will not work
properly.
The
.B \-r
(raw) option suppresses this binary conversion.
(Note: Depending on how the printer is physically connected, it may not be
able to handle 8-bit binary data properly, and results may be disappointing.)
.SH FILES
.TP "\w'lib/macps.config     'u"
lib/macps.config
Maps ProcSet internal names to LaserPrep filenames
.SH "SEE ALSO"
lpr(1), macget(1), kermit(1), prepfix(1)
.SH BUGS
.I Macps
only works with version 4.0 and up of the Macintosh LaserPrep files.
.PP
Because of the way bit smoothing is implemented by the LaserWriter driver,
some PostScript printers other than the Apple LaserWriters may not be able to
bit smooth.
.PP
Creating a PostScript file under System 7 will cause all fonts used in
a document to be downloaded.
Downloaded fonts, especially TrueType fonts, tend to make the resulting
PostScript file very large.
Both the size of the PostScript file and the complexity of a downloadable
TrueType font can cause some printers to fail to print, even when the
printer already contains the requested fonts.
Software like H.M. Ayala's Trimmer CDEV (available from most Macintosh ftp
sites and bulletin board systems) can prevents selected fonts (those already
resident in the printer) from being downloaded.
RAZZLE!DAZZLE
fi	# End macps.1
if test -f macps.c
then
	echo shar: will not overwrite existing file "'macps.c'"
else
echo 'x - macps.c'
cat << \RAZZLE!DAZZLE > macps.c
/*
 * Copyright (c) 1988, 1992, The Regents of the University of California.
 * Edward Moy, Workstation Software Support Group, Workstation Support Serices,
 * Information Systems and Technology.
 *
 * Permission is granted to any individual or institution to use, copy,
 * or redistribute this software so long as it is not sold for profit,
 * provided that this notice and the original copyright notices are
 * retained.  The University of California makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 */

#ifndef lint
static char *SCCSid = "@(#)macps.c	2.3 7/1/92";
#endif lint

#include <ctype.h>
#include <stdio.h>
#ifdef SYSV
#include <string.h>
#else SYSV
#include <strings.h>
#endif SYSV
#include <sys/types.h>
#include <sys/file.h>
#include "str.h"
#include "ucbwhich.h"

#define	BEGINPROC	1
#define	CONFIG		"macps.config"
#define	INCLUDEPROC	0
#define	PS_INCLUDED	0x1

#ifdef SYSV
#define	index		strchr
#define	rindex		strrchr
#endif SYSV

typedef struct procset_str {
	struct procset_str *next;
	char *procset;
	char *path;
	short flags;
} ProcSet;

ProcSet *firstprocset;
#ifdef SAVE
char *finale = "clear countdictstack 2 sub{end}repeat macps restore\n";
char intro[] = "\
%%! *** Created by macps: %s\
/macps save def\n\
";
#else SAVE
char intro[] = "\
%%! *** Created by macps: %s\
";
#endif SAVE
ProcSet *lastprocset;
char *myname;
int ncopies = 0;
#ifdef CONFIGDIR
char ucblib[UCBMAXPATHLEN] = CONFIGDIR;
#else CONFIGDIR
int ucbalternate;
char ucbpath[UCBMAXPATHLEN];
char ucblib[UCBMAXPATHLEN];
#endif CONFIGDIR

void copyproc();
ProcSet *findprocset();
void insertproc();
char *newstring();
void newprocset();
void readprocfile();
void Usage();

main(argc, argv)
int argc;
char **argv;
{
	register STR *str;
	register char *cp;
	long ltime;
	char *ctime();

#ifndef CONFIGDIR
	ucbwhich(*argv);
#endif CONFIGDIR
	strcat(ucblib, "/");
	if(myname = rindex(*argv, '/'))
		myname++;
	else
		myname = *argv;
	cp = NULL;
	for(argc--, argv++ ; argc > 0 && **argv == '-' ; argc--, argv++) {
		switch((*argv)[1]) {
		 case 'c':	/* multiple copies */
			if((*argv)[2])
				ncopies = atoi(&(*argv[2]));
			else {
				if(argc < 2)
					Usage();	/* never returns */
				argc--;
				ncopies = atoi(*++argv);
			}
			if(ncopies <= 0)
				Usage();	/* never returns */
			break;
		 case 'd':	/* alternate directory for config file */
			if((*argv)[2])
				cp = &(*argv[2]);
			else {
				if(argc < 2)
					Usage();	/* never returns */
				argc--;
				cp = *++argv;
			}
			strcpy(ucblib, cp);
			break;
		 case 'r':	/* raw mode */
			rawmode++;
			break;
		 default:
			Usage();	/* never returns */
		}
	}
	if(argc > 1)
		Usage();	/* never returns */
	if(argc == 1 && freopen(*argv, "r", stdin) == NULL) {
		fprintf(stderr, "%s: can't open %s\n", myname, *argv);
		exit(1);
	}
	readprocfile();
	str = STRalloc();
	if(!STRgets(str, stdin)) {
		fprintf(stderr, "%s: Null input\n", myname);
		exit(1);
	}
	time(&ltime);
	printf(intro, ctime(&ltime));
	do {
		if(ncopies != 0 && STRheadcompare(str, "userdict /#copies ")
		 == 0)
			continue;
		if(STRcompare(str, "%%EOF\n") == 0) {
#ifdef SAVE
			if(finale) {
				fputs(finale, stdout);
				finale = NULL;
			}
#endif SAVE
			STRputs(str, stdout);
			continue;
		}
		if(STRheadcompare(str, "%%IncludeProcSet:") == 0) {
			insertproc(str, INCLUDEPROC);
			continue;
		}
		if(STRheadcompare(str, "%%BeginProcSet:") == 0) {
			insertproc(str, BEGINPROC);
			continue;
		}
		STRputs(str, stdout);
		if(ncopies > 1 && isascii(*str->bufptr) &&
		 isdigit(*str->bufptr)) {
			cp = (char *)str->bufptr;
			while(cp < (char *)str->curendptr && isascii(*cp)
			 && isdigit(*cp))
				cp++;
			if((char *)str->curendptr - cp == 4 &&
			 STRcompareptr(str, cp, " mf\n") == 0) {
				printf("userdict /#copies %d put\n", ncopies);
				ncopies = -1;
			}
		}
	} while(STRgets(str, stdin));
#ifdef SAVE
	if(finale)
		fputs(finale, stdout);
#endif SAVE
	exit(0);
}

void
insertproc(str, beginproc)
register STR *str;
int beginproc;
{
	register char *cp, *pp;
	register int i, n, fd;
	register ProcSet *ps;
	char buf[BUFSIZ];

	cp = index((char *)str->bufptr, ':') + 1;
	strcpy(buf, cp);
	cp = buf;
	for( ; ; cp++) {
		if(!*cp) {
			fprintf(stderr,
		 "%s: Syntax error on IncludeProcSet/BeginProcSet line\n",
			 myname);
			exit(1);
		}
		if(!isascii(*cp) || !isspace(*cp))
			break;
	}
	pp = cp + strlen(cp);
	while(--pp >= cp) {
		if(!isascii(*pp) || !isspace(*pp))
			break;
		*pp = 0;
	}
	if((ps = findprocset(cp)) == NULL) {
		if(beginproc) {
			STRputs(str, stdout);
			copyproc(str, stdout);
			return;
		}
		fprintf(stderr, "%s: Unknown IncludeProcSet %s\n",
		 myname, cp);
		exit(1);
	}
	if(ps->flags & PS_INCLUDED)
		return;
	ps->flags |= PS_INCLUDED;
	if(*(ps->path) == '/')
		strcpy(buf, ps->path);
	else {
		strcpy(buf, ucblib);
		strcat(buf, ps->path);
	}
	fflush(stdout);
	if((fd = open(buf, O_RDONLY, 0)) < 0) {
		fprintf(stderr, "%s: Can't open %s\n", myname, buf);
		exit(1);
	}
	if(beginproc)
		copyproc(str, NULL);
	while((i = read(fd, buf, BUFSIZ)) > 0) {
		do {
			if((n = write(1, buf, i)) < 0) {
				fprintf(stderr, "%s: Write error\n", myname);
				exit(1);
			}
		} while((i -= n) > 0);
	}
	close(fd);
}

void
readprocfile()
{
	register FILE *fp;
	register char *pp;
	register int linenum;
	char buf[BUFSIZ];

	strcpy(buf, ucblib);
	strcat(buf, CONFIG);
	if((fp = fopen(buf, "r")) == NULL) {
		fprintf(stderr, "%s: Can't open %s\n", myname, buf);
		exit(1);
	}
	linenum = 0;
	while(fgets(buf, BUFSIZ, fp)) {
		linenum++;
		if(*buf == '#')
			continue;
		if(pp = index(buf, '\n')) {
			if(pp == buf)
				continue;
			*pp = 0;
		}
		if(!(pp = index(buf, '\t'))) {
			fprintf(stderr,
			 "%s: Syntax error in macps.config, line %d\n",
			 myname, linenum);
			exit(1);
		}
		*pp++ = 0;
		newprocset(buf, pp);
	}
	fclose(fp);
}

void
copyproc(str, fp)
register STR *str;
register FILE *fp;
{
	for( ; ; ) {
		if(!STRgets(str, stdin)) {
			fprintf(stderr, "%s: End of file copying ProcSet\n",
			 myname);
			exit(1);
		}
		if(fp)
			STRputs(str, fp);
		if(STRheadcompare(str, "%%EndProcSet") == 0)
			return;
	}
}

void
newprocset(procset, path)
char *procset, *path;
{
	register ProcSet *ps;
	char *calloc();

	if((ps = (ProcSet *)calloc(1, sizeof(ProcSet))) == NULL) {
		fprintf(stderr, "%s: Out of memory allocating ProcSet\n",
		 myname);
		exit(1);
	}
	if(firstprocset) {
		lastprocset->next = ps;
		lastprocset = ps;
	} else
		firstprocset = lastprocset = ps;
	ps->procset = newstring(procset);
	ps->path = newstring(path);
}

ProcSet *
findprocset(procset)
register char *procset;
{
	register ProcSet *ps;

	for(ps = firstprocset ; ps ; ps = ps->next) {
		if(strcmp(procset, ps->procset) == 0)
			return(ps);
	}
	return(NULL);
}

char *
newstring(str)
register char *str;
{
	register char *cp;
	char *malloc();

	if((cp = malloc(strlen(str) + 1)) == NULL) {
		fprintf(stderr, "%s: Out of memory allocating string\n",
		 myname);
		exit(1);
	}
	strcpy(cp, str);
	return(cp);
}

void
Usage()
{
	fputs("Usage: macps [-c #] [-d directory] [-r] [file]\n", stderr);
	exit(1);
}
RAZZLE!DAZZLE
fi	# End macps.c
if test -f macps.config
then
	echo shar: will not overwrite existing file "'macps.config'"
else
echo 'x - macps.config'
cat << \RAZZLE!DAZZLE > macps.config
# This is the config file read by macps.
# SCCSid = "@(#)macps.config	2.3 7/1/92"
#
# Each line is composed of the %%IncludeProcSet id, a tab and the file
# containing the ProcSet.  If the file doesn't begin with a slash, the
# the name is taken to be relative to the directory in which this config file
# resides.

"(AppleDict md)" 65 0	ProcSets/LaserPrep4.0
"(AppleDict md)" 66	ProcSets/LaserPrep5.0
"(AppleDict md)" 67 0	ProcSets/LaserPrep5.1
"(AppleDict md)" 68 0	ProcSets/LaserPrep5.2
"(AppleDict md)" 70 0	ProcSets/LaserPrep6.0
"(AppleDict md)" 71 0	ProcSets/LaserPrep7.0
RAZZLE!DAZZLE
fi	# End macps.config
if test -f prepfix.1
then
	echo shar: will not overwrite existing file "'prepfix.1'"
else
echo 'x - prepfix.1'
cat << \RAZZLE!DAZZLE > prepfix.1
.\" SCCSid = "@(#)prepfix.1	2.3 7/1/92"
.TH PREPFIX 1 "1 Jul 1992"
.UC 4
.SH NAME
prepfix \- converts Apple LaserPrep files to form useable on Unix
.SH SYNOPSIS
.B prepfix
[
\-l
printer_name1
[
\-l
printer_name2
]...
]
[
file
]
.SH DESCRIPTION
.I Prepfix
takes the command-line LaserPrep file (or the standard input if no filename is
given), and converts it into a form that is useable on Unix with the
.IR macps (1).
.PP
To use
.IR prepfix ,
create the input LaserPrep file on a Macintosh by opening an empty
document in some application, and selecting
.B Print
from the
.B File
menu.
On a pre-System 7 system, typing (and holding) Command-K immediately after
clicking the
.B OK
button in the LaserWriter print dialog box will cause
another dialog to appear, confirming that a file named ``PostScript'' is
being created (the Command-K keys can be released now).
Depending on the application, the created PostScript file can be found in the
System Folder, the application folder or the top level of the disk.
.PP
On a System 7 system, clicking on the
.B "PostScript File"
radio button and then clicking on the
.B Save
button will cause a standard file dialog to appear, requesting the name
and location to save the PostScript file.
.PP
This PostScript file can then be uploaded via some file transfer program,
such as MacTerminal/VersaTerm and
.IR macget (1),
MacKermit/Red Ryder and
.IR kermit (1)
or
.IR ftp (1).
.PP
Normally, only Apple LaserWriters can take advantage of the bit smoothing
feature of the LaserPrep file.
However, other PostScript laser printer using the Motorola 680x0 processor
and the Adobe PostScript firmware can be made to do bit smoothing by
specifying for each printer the
.B \-l
option and the printer's name, as returned by the PostScript
.B product
command in
.B statusdict
(remember to quote the printer name if it contains blanks).
The resulting LaserPrep file will be modified so that for LaserWriters and for
printers specified in the
.B \-l
option, bit smoothing will be allowed (smoothing must still be selected in the
Print Dialog box when saving the PostScript to disk).
More than one printer name can be specified using additional
.B \-l
and printer name pairs.
.SH "SEE ALSO"
ftp(1), macps(1), macget(1), kermit(1)
.SH BUGS
.I Prepfix
only works with version 4.0 and up of the Macintosh LaserPrep files.
RAZZLE!DAZZLE
fi	# End prepfix.1
if test -f prepfix.c
then
	echo shar: will not overwrite existing file "'prepfix.c'"
else
echo 'x - prepfix.c'
cat << \RAZZLE!DAZZLE > prepfix.c
/*
 * Copyright (c) 1988, 1992, The Regents of the University of California.
 * Edward Moy, Workstation Software Support Group, Workstation Support Serices,
 * Information Systems and Technology.
 *
 * Permission is granted to any individual or institution to use, copy,
 * or redistribute this software so long as it is not sold for profit,
 * provided that this notice and the original copyright notices are
 * retained.  The University of California makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 */

#ifndef lint
static char *SCCSid = "@(#)prepfix.c	2.3 7/1/92";
#endif lint

#include <ctype.h>
#include <stdio.h>
#ifdef SYSV
#include <string.h>
#else SYSV
#include <strings.h>
#endif SYSV
#include "str.h"

#define	CLEARTOMARK	12
#define EEXECLEN	80
#define EXTRA		(NZEROLINE * ZEROLINE + CLEARTOMARK)
#define LINELEN		256
#define	NPRODUCTS	32
#define NZEROLINE	7
#define ZEROLINE	65
#ifdef SYSV
#define	index		strchr
#define	rindex		strrchr
#endif SYSV

char exstr[] = "\
%ck userdict/%s known not and{currentfile eexec}{%d{currentfile read\n\
pop pop}repeat}ifelse\n\
";
char *match();
char *myname;
int maxproducts = NPRODUCTS;
int nproducts = 0;
char Ok[] = "\
/Ok{ok{true}{save /Pd statusdict /product get def false 0 1 ProdArr length\n\
1 sub{Pd exch ProdArr exch get anchorsearch exch pop{pop pop true exit}if}for\n\
exch restore}ifelse}bind def\n\
";
char ProdArr0[] = "/ProdArr [\n";
char ProdArr1[] = "] def\n";
char **products;
char tempname[] = "/tmp/prepfixXXXXXX";

main(argc, argv)
int argc;
char **argv;
{
	register STR *str;
	register FILE *tp;
	register int i;
	register byte *lp;
	char buf[BUFSIZ];
	char *malloc(), *realloc();

	if(myname = rindex(*argv, '/'))
		myname++;
	else
		myname = *argv;
	for(argc--, argv++ ; argc > 0 && **argv == '-' ; argc--, argv++) {
		switch((*argv)[1]) {
		 case 'h':
			usage();
		 case 'l':
			if(nproducts <= 0 && (products =
			 (char **)malloc(maxproducts*sizeof(char *))) == NULL) {
				fprintf(stderr,
				 "%s: Out of memory creating products array\n",
				 myname);
				exit(1);
			} else if(nproducts >= maxproducts - 1 && (products =
			 (char **)realloc(products, (maxproducts += NPRODUCTS)
			 * sizeof(char *))) == NULL) {
				fprintf(stderr,
				 "%s: Out of memory expanding products array\n",
				 myname);
				exit(1);
			}
			if((*argv)[2])
				products[nproducts++] = &(*argv)[2];
			else {
				if(argc < 2) {
					fprintf(stderr,
					 "%s: No argument for -l\n", myname);
					exit(1);
				}
				argc--;
				argv++;
				products[nproducts++] = *argv;
			}
			break;
		}
	}
	if(argc > 1)
		usage();
	if(argc > 0 && freopen(*argv, "r", stdin) == NULL) {
		fprintf(stderr, "%s: Can't open %s\n", myname, *argv);
		exit(1);
	}
	mktemp(tempname);
	if((tp = fopen(tempname, "w+")) == NULL) {
		fprintf(stderr, "%s: Can't create temp file %s\n",
		 myname, tempname);
		exit(1);
	}
	unlink(tempname);
	str = STRalloc();
	if(!STRgets(str, stdin)) {
		fprintf(stderr, "%s: Null input\n", myname);
		exit(1);
	}
	for( ; ; ) {
		if(STRheadcompare(str, "% \251") == 0) {
			fputs("% ", tp);
			str->bufptr[0] = '(';
			str->bufptr[1] = 'C';
			str->bufptr[2] = ')';
			STRputs(str, tp);
		} else if(STRheadcompare(str, "%% \251") == 0) {
			fputs("%%", tp);
			str->bufptr[0] = ' ';
			str->bufptr[1] = '(';
			str->bufptr[2] = 'C';
			str->bufptr[3] = ')';
			STRputs(str, tp);
		} else if(STRheadcompare(str, "%%BeginProcSet:") == 0) {
			STRputs(str, stdout);
			rewind(tp);
			while((i = fread(buf, 1, BUFSIZ, tp)) > 0)
				fwrite(buf, 1, i, stdout);
			fclose(tp);
			break;
		} else if(STRheadcompare(str, "%{appledict") == 0)
			STRputs(str, tp);
		if(!STRgets(str, stdin)) {
			fprintf(stderr, "%s: No BeginProcSet\n", myname);
			exit(1);
		}
	}
	while(STRgets(str, stdin)) {
		if(nproducts > 0 && STRmatch(str, "/ok{")) {
			STRputs(str, stdout);
			fputs(ProdArr0, stdout);
			for(i = 0 ; i < nproducts ; i++)
				printf("(%s)\n", products[i]);
			fputs(ProdArr1, stdout);
			fputs(Ok, stdout);
			continue;
		} else if(STRmatch(str, "setdefaulttimeouts")
		 || STRmatch(str, "setsccinteractive"))
			continue;
		else if(STRmatch(str, " checkload")) {
			checkload(str);
			continue;
		} else if(STRmatch(str, "/stretch") && STRmatch(str, "eexec")) {
			eexec("stretch", str);
			continue;
		} else if(STRmatch(str, "/smooth4") && STRmatch(str, "eexec")) {
			eexec("smooth4", str);
			continue;
		} else if(STRmatch(str, "(LaserWriter II NT)")) {
			while(STRgets(str, stdin) && STRheadcompare(str, "35de")
			 != 0)
				{ /* ignore line */ }
			while(STRgets(str, stdin) && isxdigit(*str->bufptr))
				{ /* ignore line */ }
		} else if(lp = STRmatch(str, "scaleby96{ppr")) {
			STRputsptr(str, lp, stdout);
			continue;
		} else if(STRmatch(str, "waittimeout"))
			continue;
		else if(STRheadcompare(str, "%%EndProcSet") == 0) {
			STRputs(str, stdout);
			break;
		}
		STRputs(str, stdout);
	}
	exit(0);
}

eexec(name, str)
char *name;
register STR *str;
{
	register int len;

	if(!STRgets(str, stdin)) {
		fprintf(stderr, "%s: EOF during reading eexec\n", myname);
		exit(1);
	}
	len = (str->curendptr - str->bufptr) - 1;
	printf(exstr, nproducts > 0 ? 'O' : 'o', name, len + (len / EEXECLEN)
	 + (len % EEXECLEN ? 1 : 0) + EXTRA);
	spliteexec(str);
}

checkload(str)
register STR *str;
{
	register byte *cp;

	if(nproducts > 0 && (cp = STRmatch(str, "ok ")))
		*cp = 'O';
	STRputs(str, stdout);
	if(!STRgets(str, stdin)) {
		fprintf(stderr, "%s: EOF during reading eexec\n", myname);
		exit(1);
	}
	spliteexec(str);
}

spliteexec(str)
register STR *str;
{
	register int len;
	register byte *bp;

	bp = str->bufptr;
	len = (str->curendptr - bp) - 1;
	while(len >= 80) {
		fwrite(bp, 80, 1, stdout);
		putchar('\n');
		bp += 80;
		len -= 80;
	}
	if(len > 0) {
		fwrite(bp, len, 1, stdout);
		putchar('\n');
	}
	for( ; ; ) {
		if(!STRgets(str, stdin)) {
			fprintf(stderr, "%s: EOF reached before cleartomark\n",
			 myname);
			exit(1);
		}
		STRputs(str, stdout);
		if(STRheadcompare(str, "cleartomark") == 0)
			return;
	}
}

usage()
{
	fprintf(stderr,
	 "Usage: %s [-l product_name1 [-l product_name2]...] [file]\n",
	 myname);
	fprintf(stderr, "       %s -help\n", myname);
	exit(1);
}
RAZZLE!DAZZLE
fi	# End prepfix.c
if test -f str.h
then
	echo shar: will not overwrite existing file "'str.h'"
else
echo 'x - str.h'
cat << \RAZZLE!DAZZLE > str.h
/*
 * Copyright (c) 1988, 1992, The Regents of the University of California.
 * Edward Moy, Workstation Software Support Group, Workstation Support Serices,
 * Information Systems and Technology.
 *
 * Permission is granted to any individual or institution to use, copy,
 * or redistribute this software so long as it is not sold for profit,
 * provided that this notice and the original copyright notices are
 * retained.  The University of California makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 */

/*
 * SCCSid = "@(#)str.h	2.3 7/1/92"
 */

#define	STRSIZEDELTA	1024
#define	STRSIZE		1024

#define	STRcompare(str,fp)	STRcompareptr((str), (str)->bufptr, (fp))
#define	STRheadcompare(str,fp)	STRheadcmpptr((str), (str)->bufptr, (fp))
#define	STRputs(str,fp)		STRputsptr((str), (str)->bufptr, (fp))

typedef unsigned char byte;
typedef struct {
	byte *bufptr;
	byte *curendptr;
	byte *realendptr;
} STR;

extern int rawmode;

STR *STRalloc();
int STRcompareptr();
int STRfree();
int STRgets();
int STRheadcmpptr();
byte *STRmatch();
int STRputsptr();
RAZZLE!DAZZLE
fi	# End str.h
if test -f ucbwhich.c
then
	echo shar: will not overwrite existing file "'ucbwhich.c'"
else
echo 'x - ucbwhich.c'
cat << \RAZZLE!DAZZLE > ucbwhich.c
/*
 * Copyright (c) 1988, 1992, The Regents of the University of California.
 * Edward Moy, Workstation Software Support Group, Workstation Support Serices,
 * Information Systems and Technology.
 *
 * Permission is granted to any individual or institution to use, copy,
 * or redistribute this software so long as it is not sold for profit,
 * provided that this notice and the original copyright notices are
 * retained.  The University of California makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 */

#ifndef CONFIGDIR
#ifndef lint
static char *SCCSid = "@(#)ucbwhich.c	2.3 7/1/92";
#endif lint

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "ucbwhich.h"

#define	F_OK		0	/* does file exist */
#define	X_OK		1	/* is it executable by caller */
#define	W_OK		2	/* writable by caller */
#define	R_OK		4	/* readable by caller */

#define	LIBLEN		4
#ifdef SYSV
#define	index		strchr
#define	rindex		strrchr
#endif SYSV

static char lib[] = "/lib";

char ucblib[UCBMAXPATHLEN];
int ucbalternate = 0;
char ucbpath[UCBMAXPATHLEN];

ucbwhich(str)
char *str;
{
	register char *dir, *name, *cp, *tp;
	register int len;
	char dirbuf[UCBMAXPATHLEN], namebuf[UCBMAXPATHLEN];
	struct stat sbuf;
	char *index(), *rindex(), *getwd(), *getenv();

	strcpy(name = namebuf, str);
	if(*name == '/')	/* absolute pathname */
		*(rindex(dir = name, '/')) = 0 ; /* remove tail */
	else {
		if(cp = index(name, '/')) { /* relative pathname */
			if((dir = getwd(dirbuf)) == NULL)
				return(0);
			 /* if any errors occurs assume standard version */
			*cp++ = 0;
			for( ; ; ) {
				if(*name != 0) { /* multiple slashes */
					if(strcmp(name, "..") == 0) {
						/* parent directory */
						if((tp = rindex(dir, '/')) ==
						 NULL)
						 	return(0);
						if(tp == dir)
							tp++;
						 /* root directory */
						*tp = 0;
						 /* remove last component */
					} else if(strcmp(name, ".") != 0) {
						/* subdirectory */
						strcat(dir, "/");
						strcat(dir, name);
					}
				}
				name = cp;
				if((cp = index(name, '/')) == NULL) break;
				/* ignore last component */
				*cp++ = 0;
			}
		} else { /* look through $PATH variable */
			if((tp = getenv("PATH")) == NULL)
				return(0);
			for(name = namebuf ; ; ) {
				if(*tp == 0)
					return(0);
				else if(*tp == ':')
					tp++;
				if((cp = index(tp, ':')) == NULL)
					cp = tp + strlen(tp);
				 /* positioned on null */
				for(dir = dirbuf ; tp < cp ; )
					*dir++ = *tp++;
				*dir = 0;
				strcpy(name, dir = dirbuf);
				strcat(name, "/");
				strcat(name, str);
				if(stat(name, &sbuf) < 0 || (sbuf.st_mode &
				 S_IFMT) != S_IFREG)
					continue;
				if(access(name, X_OK) == 0) {
					if(strcmp(dir, ".") == 0 &&
					 (dir = getwd(dirbuf)) == NULL)
						return(0);
					break;
				}
			}
		}
	}
	strcpy(ucbpath, dir);
	strcpy(ucblib, dir);
	if((len = strlen(dir)) < LIBLEN || strcmp(&dir[len - LIBLEN], lib)
	 != 0)
		strcat(ucblib, lib);
	else
		ucbpath[len - LIBLEN] = 0;
	ucbalternate = (strcmp(ucbpath, UCBSTANDARD) != 0);
#ifdef EBUG
	fprintf(stderr, "ucbwhich: alt=%d path=%s lib=%s\n", ucbalternate,
	 ucbpath, ucblib);
#endif EBUG
	return(ucbalternate);
}
#endif CONFIGDIR
RAZZLE!DAZZLE
fi	# End ucbwhich.c
if test -f ucbwhich.h
then
	echo shar: will not overwrite existing file "'ucbwhich.h'"
else
echo 'x - ucbwhich.h'
cat << \RAZZLE!DAZZLE > ucbwhich.h
/*
 * Copyright (c) 1988, 1992, The Regents of the University of California.
 * Edward Moy, Workstation Software Support Group, Workstation Support Serices,
 * Information Systems and Technology.
 *
 * Permission is granted to any individual or institution to use, copy,
 * or redistribute this software so long as it is not sold for profit,
 * provided that this notice and the original copyright notices are
 * retained.  The University of California makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 */

/*
 * SCCSid = "@(#)ucbwhich.h	2.3 7/1/92"
 */

#define	UCBMAXPATHLEN	128
#define	UCBSTANDARD	"/usr/ucb"

extern char ucblib[];
extern int ucbalternate;
extern char ucbpath[];
RAZZLE!DAZZLE
fi	# End ucbwhich.h
echo '***** End of' macps/prepfix v 2.3 '*****'
exit