[comp.sources.unix] v10i052: Ease translator repost, Part02/04

rs@uunet.UU.NET (Rich Salz) (07/10/87)

Submitted-by: Wombat <rsk@j.cc.purdue.edu>
Posting-number: Volume 10, Issue 52
Archive-name: ease/Part02

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 4)."
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'config-files/FINIS/pucc-j.mc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'config-files/FINIS/pucc-j.mc'\"
else
echo shar: Extracting \"'config-files/FINIS/pucc-j.mc'\" \(3004 characters\)
sed "s/^X//" >'config-files/FINIS/pucc-j.mc' <<'END_OF_FILE'
X/***********************************************************
X ***********************************************************
X ****
X ****	SENDMAIL CONFIGURATION FILE
X ****
X ****	For PUCC-J
X ****
X ****	$Id: pucc-j.mc,v 1.2 86/04/04 14:20:57 kcs Exp $
X ****
X ***********************************************************
X ***********************************************************/
X
X
X
X/***********************************************************
X **	local info
X ***********************************************************/
X
Xmacro
X	m_sitename = "j.cc.purdue.edu"; 	/* internet hostname */
X	arpa_name  = "asc";			/* our arpanet name */
X
Xclass
X	m_sitename = { "j.cc.purdue.edu", pucc-j, puccj, j, pucc, purdue-asc, 
X		        purdue-205-gw, purdue-asc-tn, asc, "asc.purdue.edu", 
X		       "asc.cc.purdue.edu", 205-gw, asc-tn };
X
X	arpa_name = { "asc.purdue.edu", "asc.cc.purdue.edu", asc, purdue-asc,
X		       purdue-205-gw };
X
X#include "phonenethosts.cpp"
X
X#include "puccbase.cpp"
X
X#include "zerobase.cpp"
X
X/**********************************************
X **  Machine dependent part of ruleset zero  **
X **********************************************/
X
X	/* send berknet names through relay */
X
X	if ( < @berkhost > : path )
X		resolve ( mailer ( pcl ),
X			  host ( $relay_host ),
X			  user ( $2<@$1> ) );		/* @berkhost: ... */
X
X	if ( anypath < @anypath berkhost > anypath )
X		resolve ( mailer ( pcl ),
X			  host ( $relay_host ),
X			  user ( $1<@$2$3>$4 ) );	/* user@berknethost */
X
X	/* resolve campus names */
X
X	if ( anypath < @anypath campushost > anypath )
X		resolve ( mailer ( pcl ),
X			  host ( $3 ),
X			  user ( $1<@$2$3>$4 ) );	/* user@campushost */
X
X	/* send csnet names through relay */
X
X	if ( anypath < @phonehost > anypath )
X		resolve ( mailer ( tcp ),
X			  host ( "CSNet-Relay" ),
X			  user ( $1%$2<@"CSNet-Relay">$3 ) );
X
X	if ( anypath < @phonehost ".ARPA" > anypath )
X		resolve ( mailer ( tcp ),
X			  host ( "CSNet-Relay" ),
X			  user ( $1%$2<@"CSNet-Relay">$3 ) );
X
X	if ( anypath < @path ".CSNET" > anypath )
X		resolve ( mailer ( tcp ),
X			  host ( "CSNet-Relay" ),
X			  user ( $1%$2<@"CSNet-Relay">$3 ) );
X
X	/* we don't do uucp */
X
X	if ( anypath < @anypath ".UUCP" > anypath )
X		resolve ( mailer ( error ),
X			  user ( "Non-Local UUCP Mail Unavailable" ) );
X
X	/* we don't do bitnet (yet) */
X
X	if ( anypath < @anypath ".BITNET" > anypath )
X			resolve ( mailer ( error ),
X				  user ( "Bitnet Mail Unavailable At This Time" ) );
X
X	/* other non-local names to the arpanet */
X
X	if ( anypath < @anypath > anypath )
X		resolve ( mailer ( tcp ),
X			  host ( $2 ),
X			  user ( $1<@$2>$3 ) );		/* user@arpahost */
X
X	/* remaining names must be local */
X
X	if ( path )
X		resolve ( mailer ( local ),
X			  user ( $1 ) );		/* everything else */
X
X/**************************************
X **  Host dependent address cleanup  **
X **************************************/
X
Xruleset HOSTDEP_RW {
X
X	if ( anypath uucphost!usr@hostpath )
X		retry ( $3@$4 );			/* drop uucp forward */
X
X}
X
X#include "pclm.cpp"
X#include "tcpm.cpp"
END_OF_FILE
if test 3004 -ne `wc -c <'config-files/FINIS/pucc-j.mc'`; then
    echo shar: \"'config-files/FINIS/pucc-j.mc'\" unpacked with wrong size!
fi
# end of 'config-files/FINIS/pucc-j.mc'
fi
if test -f 'maketd/Manual/maketd.1l' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'maketd/Manual/maketd.1l'\"
else
echo shar: Extracting \"'maketd/Manual/maketd.1l'\" \(4509 characters\)
sed "s/^X//" >'maketd/Manual/maketd.1l' <<'END_OF_FILE'
X.TH MAKETD 1L "11 November 1985"
X.if n \{.de Q
X"\\$1"\\$2
X.\}
X.if t \{.de Q
X``\\$1''\\$2
X.\}
X..
X.SH NAME
Xmaketd \- make transitive dependencies
X.SH SYNOPSIS
X.B maketd
X[
X.I option(s)
X] 
X.I file(s)
X.SH DESCRIPTION
X.I Maketd
Xcomputes dependencies for makefiles from sources introduced through
Xinclude files.
XIt generates lines like
X.Q "xx.o: e.h struct.h ../h/const.h ..." .
XIt makes xx.o not only dependent on all files it includes,
Xbut also recursively on all files other files include.
XThis is achieved by passing the source through the C preprocessor.
X.PP
XThe directories used in the search for include files
Xare identical to the ones used by the C compiler, because the
XC preprocessor is used.
XThis also means that `#define's, `#ifdef's, etc. are evaluated.
XIt may therefore be necessary to recompute the dependencies if
Xany source has been changed, including the associated Makefile.
X.PP
XA typical application in a Makefile goes as follows:
X.nf
X
X	INCL= \-I../include  \-I../h
X	CFLAGS= \-DPUCC \-DBSD4_2 ${INCL}
X	SRC= a.c b.c c.c
X
X	maketd: ${SRC}
X		maketd \-a ${CFLAGS} ${SRC}
X
X	# DO NOT DELETE THIS LINE \- make depend DEPENDS ON IT
X
X.fi
XThe generated dependencies will be inserted after the `# DO NOT DELETE...'
Xline.
XEverything after this line will go away through the editing
Xprocess of the Makefile.
XIf no such line exists, a line of the expected form will be emitted,
Xfollowed by the dependencies.
XThe default filename for the Makefile is `makefile'.
XIf `makefile' does not exist, `Makefile' is used.
XThe \-m and \-d options override this default action.
XBefore it is edited, the Makefile will be saved in `Makefile.bak',
Xoverwritting any existing `Makefile.bak'.
X.PP
XSeveral options apply.
XIf an option takes any arguments, all arguments follow the option
Xdirectly, with no spaces.
XIf spaces are required inside an argument to an option, then
Xquotes must be used to prevent the shell from breaking up the
Xargument.
X.TP
X.BI \-a
XNormally, dependencies on files in `/usr/include' are
Xnot included \- this option also includes dependencies on those files.
X.TP
X.BI \-b
XGenerate dependencies for binaries rather than object files.
XThis is equivelent to specifying a null suffix.
XThe `.o' is stripped from the filename.
X.TP
X.BI \-d
XInstead of editing the Makefile, dependencies are written to standard
Xoutput.
XThe standard header and trailer, `# DO NOT...' are not emitted.
X.TP
X.BI \-f
XForce printing of header and trailer.
XNormally, these are suppresed when the output file is the standard
Xoutput.
X.TP
X.BI \-h
XPrint a set of oneline descriptions to the terminal and exit.
X.TP
X.BI \-m file
XInstead of editing `makefile' or `Makefile', the file named
X.I file
Xis edited.
X.TP
X.BI \-nonlocalo
XGenerate dependency paths that match the source paths given.
X.TP
X.BI \-o directory
XNormally dependencies are of the form
X.Q "a.o: ....." .
XThis option generates dependencies of the form
X.Q "\fIdirectory\fP/a.o:...." ,
Xwhich is useful for Makefiles which store the objects in
Xa separate subdirectory.
XThe name of the directory must not be empty.
X.TP
X.BI \-r
XCauses the dependencies for a single source file to be generated and
Xreplaced in the edited Makefile.
X.TP
X.BI \-s suffix
XSupply a suffix for the target.
XThe suffix should start with a `.'.
XThe target file name should have a suffix of some sort that
Xis delimited by a `.' that is replaced by this suffix.
X.TP
X.BI \-t target
XSupply a new basename for the target.
X.TP
X.BI \-x
XDon't shorten include files.
XThe default action is to replace various strings with abbreviations.
XThe Makefile is scanned to see which single letter uppercase
Xvariables are set.
XThese definitions are remembered.
XThe pathnames `/usr/include' and `/usr/include/sys', along with any
Xpathnames specified with \-I options are also used in abbreviations.
XUnused uppercase single letters are defined, printed to the Makefile,
Xand used.
X.TP
X.BI \-v
XBe verbose.
XExtra output is directed to
X.I stderr.
X.TP
X.BI \-I...
XSpecify a directory to search for include files.
XThis option is passed to /lib/cpp, and thus behaves identically to
Xthe same option to `cc'.
X.TP
X.BI \-D...
XSpecify a definition.
XThis option is passed to /lib/cpp, and thus behaves identically to
Xthe same option to `cc'.
X.TP
X.BI \-U....
XSpecify that a variable that should not be defined.
XThis option is passed to /lib/cpp, and thus behaves identically to
Xthe same option to `cc'.
X.IR cc (1).
X.SH "AUTHOR"
XStephan v. Bechtolsheim (the shell script) (Purdue CS)
X.br
XStephen Uitti (the C version) (PUCC)
X.SH "SEE ALSO"
Xmake(1), cc(1)
END_OF_FILE
if test 4509 -ne `wc -c <'maketd/Manual/maketd.1l'`; then
    echo shar: \"'maketd/Manual/maketd.1l'\" unpacked with wrong size!
fi
# end of 'maketd/Manual/maketd.1l'
fi
if test -f 'maketd/Manual/nshpopen.3l' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'maketd/Manual/nshpopen.3l'\"
else
echo shar: Extracting \"'maketd/Manual/nshpopen.3l'\" \(2367 characters\)
sed "s/^X//" >'maketd/Manual/nshpopen.3l' <<'END_OF_FILE'
X.TH NSHPOPEN 3 "local"
X.SH NAME
Xnshpopen, nshpclose \- initiate I/O to/from a process
X.SH SYNOPSIS
X.B #include <stdio.h>
X.PP
X.SM
X.B FILE
X.B *nshpopen(command, type)
X.br
X.B char *command, *type;
X.PP
X.B nshpclose(stream)
X.br
X.SM
X.B FILE
X.B *stream;
X.SH DESCRIPTION
XThe arguments to 
X.I nshpopen
Xare pointers to null-terminated strings containing respectively
Xa shell command line and an I/O mode, either "r" for reading or
X"w" for writing.
XIt creates a pipe between the calling process and the command
Xto be executed.
XThe value returned is a stream pointer that can be used (as
Xappropriate) to write to the standard input of the command or
Xread from its standard output.
X.PP
XA stream opened by
X.I nshpopen
Xshould be closed by
X.IR nshpclose ,
Xwhich waits for the associated process to terminate
Xand returns the exit status of the command.
X.PP
XBecause open files are shared, a type "r" command may be used
Xas an input filter, and a type "w" as an output filter.
X.PP
X.I Nshpopen
Xbreaks up the
X.I command
Xargument string at spaces and tabs for the child process.
XHowever, it does not invoke a shell, and does not
Xattempt any shell shell meta character parsing.
XIn particular, quoted white space will still cause argument seperation.
XBy avoiding calling a shell, pipe creation is a great deal quicker.
XAlso, by avoiding the (rather complicated) shell meta character
Xparsing, some types of bugs may be avoided.
XThis is important where the security of setuid programs is involved.
X.SH "SEE ALSO"
Xpipe(2),
Xpopen(3),
Xfopen(3S),
Xfclose(3S),
Xsystem(3),
Xwait(2),
Xsh(1)
X.SH DIAGNOSTICS
X.I Nshpopen
Xreturns a null pointer if files or processes cannot be created,
Xor the shell cannot be accessed.
X.PP
X.I Nshpclose
Xreturns \-1 if
X.I stream
Xis not associated with an `nshpopened' command.
X.SH BUGS
XBuffered reading before opening an input filter
Xmay leave the standard input of that filter mispositioned.
XSimilar problems with an output filter may be
Xforestalled by careful buffer flushing, for instance, with
X.I fflush,
Xsee
X.IR fclose (3).
X.LP
X.I Nshpopen
Xdoes not call a shell to do it's work.
XIt does not attempt to process shell meta characters.
XThus, it does not treat quotes, I/O redirects, or file
Xname wildcard characters specially.
XThis is it's incompatibility with
X.I popen(3).
X.LP
XThis type of function should have been included with
X.I popen(3)
Xin the standard I/O library.
END_OF_FILE
if test 2367 -ne `wc -c <'maketd/Manual/nshpopen.3l'`; then
    echo shar: \"'maketd/Manual/nshpopen.3l'\" unpacked with wrong size!
fi
# end of 'maketd/Manual/nshpopen.3l'
fi
if test -f 'maketd/Manual/srtunq.3l' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'maketd/Manual/srtunq.3l'\"
else
echo shar: Extracting \"'maketd/Manual/srtunq.3l'\" \(3745 characters\)
sed "s/^X//" >'maketd/Manual/srtunq.3l' <<'END_OF_FILE'
X.TH SRTUNQ 1L PUCC
X.SH NAME
Xsrtinit, srtin, srtgti, srtgets, srtfree, srtdtree
X.SH SYNOPSIS
X.B #include <stdio.h>
X.br
X.B #include <local/srtunq.h>
X.sp
Xcc file.c
X.B \-lsrtunq
X.SH DESCRIPTION
X.I Libsrtunq.a
Xis a set of sorting routines for a particular purpose.
XIt's use is extracting unique items from a possibly long list,
Xwhere items are likely to be replicated numerously.
XThe list of unique items will be small enough to
Xfit in main memory.
XHigh speed is desired.
X.PP
XThe caller has control over the database through the use of a
X.I struct srtent
Xvariable.
XThe subroutines provide for data entry and retrieval,
Xmemory allocation and deallocation.
X.SH ROUTINES
X.TP
X.ft B
Xvoid srtinit(ent) struct srtent *ent;
X.ft
XThis subroutine must be called before the first time
Xany data is entered or retrieved
Xfrom a database tree whose tag is pointed to by
X.B ent.
XIt assumes that the database tag has not been used
Xto store a tree, and therefore does not attempt to free
Xany such data.
X.TP
X.ft B
Xchar *srtin(ent, string, compar) struct srtent *ent; char *string; int (*compar)();
X.ft
XThe existing data tree is searched.
XIf the string is found in the tree then nothing is done.
XOtherwise, space is allocated for the string and pointer structure via
X.I malloc(3).
XThe string is copied to this new space.
XThe structure is linked into the tree.
XIf space cannot be obtained, the operation is aborted, and
Xa pointer to an error string is returned.
XThe data structure remains consistent, but the string is not placed in it.
XIf the operation is successful, NULL is returned.
XThe strings are compared and sorted with the subroutine pointed to by
X.I compar.
XThis subroutine takes two string pointers as arguments.
XIt returns zero if the strings are the same,
Xless than zero if the first string should precede the second, and
Xgreater than zero if the second string should precede the first.
XIf the subroutine pointer is NULL, then a simple string compare is used, which
Xsorts in ascending ASCII order, and strings of different length comparing
Xas unequal.
X.TP
X.ft B
Xvoid srtgti(ent); struct srtent *ent;
X.ft
XThis subroutine initializes the database tag pointed to by
X.B ent
Xso that a tree transversal can be made via
X.I srtgets.
X.TP
X.ft B
Xchar *srtgets(ent); struct srtent *ent;
X.ft
XThis routine extracts the next string from the data structure.
XThe strings are returned in increasing order.
XWhen the list is exhausted, NULL is returned.
X.TP
X.ft B
Xvoid srtfree(ent) struct srtent *ent;
X.ft
XThis subroutine deletes a database, and re-initializes the
Xdatabase tag.
XIt assumes that the database tag was initialized at one time via
X.I srtinit
X(other routines will probably also have been called).
XThe space formally occupied by string data and pointer structures is
Xdeallocated via
X.I free(3).
X.TP
X.ft B
Xvoid srtdtree(ent, tbl) struct srtent *ent; struct srtbl *tbl;
X.ft
XThis subroutine recursively deletes a database subtree.
XThe space formally occupied by the string data and pointer structures is
Xdeallocated via
X.I free(3).
XThis routine is most likely only of use internally.
X.SH EXAMPLE
X.nf
Xmain()
X{
X    char buf[80], *p;
X    struct srtent d;
X    srtinit(&d);
X    while (fgets(buf, stdin, 79) != NULL)
X        if ((p = srtin(&d, "foo")) != NULL)
X            printf("test: %s\n", p);  /* warning message */
X    srtgti(&d);
X    while ((p = srtgets(&d)) != NULL)
X        puts(p);
X    srtfree(&d);
X}
X.fi
X.SH DIAGNOSTICS
XThere are no messages printed by these routines.
XCatchable errors are returned as strings.
XCompiled in errors such as the use of strings that
Xare not null terminated tend to result in core files.
X.SH FILES
X/usr/local/lib/libsrtunq.a
X.br
X/usr/include/local/srtunq.h
X.SH SEE ALSO
Xmalloc(3), qsort(3)
X.SH AUTHOR
XStephen Uitti, PUCC
X.SH BUGS
XLikely.
END_OF_FILE
if test 3745 -ne `wc -c <'maketd/Manual/srtunq.3l'`; then
    echo shar: \"'maketd/Manual/srtunq.3l'\" unpacked with wrong size!
fi
# end of 'maketd/Manual/srtunq.3l'
fi
if test -f 'maketd/breakargs.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'maketd/breakargs.c'\"
else
echo shar: Extracting \"'maketd/breakargs.c'\" \(2529 characters\)
sed "s/^X//" >'maketd/breakargs.c' <<'END_OF_FILE'
X/* breakargs - break a string into a string vector for execv.
X * Returns NULL if can't malloc space for vector, else vector.
X * Note, when done with the vector, mearly "free" the vector.
X * Written by Stephen Uitti, PUCC, Nov '85 for the new version
X * of "popen" - "nshpopen", that doesn't use a shell.
X * (used here for the as filters, a newer option).
X *
X * breakargs is copyright (C) Purdue University, 1985
X *
X * put in a fix for cmds lines with "string string" in them
X * Mon Aug 25 13:34:27 EST 1986 (ksb)
X *
X * Permission is hereby given for its free reproduction and
X * modification for non-commercial purposes, provided that this
X * notice and all embedded copyright notices be retained.
X * Commercial organisations may give away copies as part of their
X * systems provided that they do so without charge, and that they
X * acknowledge the source of the software.
X */
X#ifdef BSD2_9
X#include <sys/types.h>
X#endif
X#include <stdio.h>			/* for nothing, really */
X#define SPC '\040'			/* ascii space */
X
Xchar *
Xmynext(pch)
Xregister char *pch;
X{
X	register int fQuote;
X
X	for (fQuote = 0; (*pch != '\000' && *pch != SPC && *pch != '\t')||fQuote; ++pch) {
X		if ('\\' == *pch) {
X			continue;
X		}
X		switch (fQuote) {
X		default:
X		case 0:
X			if ('"' == *pch) {
X				fQuote = 1;
X			} else if ('\'' == *pch) {
X				fQuote = 2;
X			}
X			break;
X		case 1:
X			if ('"' == *pch)
X				fQuote = 0;
X			break;
X		case 2:
X			if ('\'' == *pch)
X				fQuote = 0;
X			break;
X		}
X	}
X	return pch;
X}
X
Xchar **
Xbreakargs(cmd)
Xchar *cmd;
X{
X	register char *p;		/* tmp				*/
X	register char **v;		/* vector of commands returned	*/
X	register unsigned sum;		/* bytes for malloc		*/
X	register int i;			/* number of args		*/
X	register char *s;		/* save old position		*/
X	char *malloc(), *strcpy();
X
X	p = cmd;
X	while (*p == SPC || *p == '\t')
X		p++;
X	cmd = p;			/* no leading spaces		*/
X	sum = sizeof(char *);
X	i = 0;
X	while (*p != '\0') {		/* space for argv[];		*/
X		++i;
X		s = p;
X		p = mynext(p);
X		sum += sizeof(char *) + 1 + (unsigned)(p - s);
X		while (*p == SPC || *p == '\t')
X			p++;
X	}
X	++i;
X	/* vector starts at v, copy of string follows NULL pointer */
X	v = (char **)malloc(sum+1);
X	if (v == NULL)
X		return (char **)NULL;
X	p = (char *)v + i * sizeof(char *); /* after NULL pointer */
X	i = 0;				/* word count, vector index */
X	while (*cmd != '\0') {
X		v[i++] = p;
X		s = cmd;
X		cmd = mynext(cmd);
X		if (*cmd != '\0')
X			*cmd++ = '\0';
X		strcpy(p, s);
X		p += strlen(p);
X		++p;
X		while (*cmd == SPC || *cmd == '\t')
X			++cmd;
X	}
X	v[i] = (char *)NULL;
X	return v;
X}
END_OF_FILE
if test 2529 -ne `wc -c <'maketd/breakargs.c'`; then
    echo shar: \"'maketd/breakargs.c'\" unpacked with wrong size!
fi
# end of 'maketd/breakargs.c'
fi
if test -f 'maketd/maketd.sh' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'maketd/maketd.sh'\"
else
echo shar: Extracting \"'maketd/maketd.sh'\" \(2941 characters\)
sed "s/^X//" >'maketd/maketd.sh' <<'END_OF_FILE'
X#! /bin/sh
X#
X# maketd - generates file dependencies for makefiles using cc -M
X#
XPATH=/usr/local/bin:/bin:/usr/bin:/usr/ucb
Xexport PATH
X
Xprogname=`basename $0`
X
X# Name of the Makefile which will be edited to add the dependencies
Xif [ $# = 0 ] ; then
X    cat << EOF
Xusage: $progname [-a] [-d] [-m<file>] [-o<directory>] [-D...] [-I...] [-U...]
X	      [<file> ...] [-T <file> ...]
XEOF
X    exit
Xfi
X
XDEPFILE=/tmp/mtd3$$.tmp
Xtouch $DEPFILE
XEDDFILE=/tmp/mtd4$$.tmp
X
Xtrap 'rm -f $DEPFILE $EDDFILE ; exit ' 1 2 3 15
X
X# Default values for -a, -d, -m and -o options
XAOPTION="-e /\/usr\/include/d"
XDOPTION=0
XMAKEFILE=Makefile
XOBJDIR=
X
X# Collect in OPTIONS all options you want to pass on to the C preprocessor.
X# 	  in SOURCES all files you want to create dependencies for
Xwhile [ -n "$1" ] ; do
X    case $1 in
X
X	-a)
X	    AOPTION=
X	;;
X
X	-d)
X	    DOPTION=1
X	;;
X
X	-m*)
X	    MAKEFILE=`expr $1 : '-m\(.*\)'`
X	;;
X
X	-nonlocalo)
X	    echo "$progname: -nonlocalo option obsolete"
X	    exit 1
X	;;
X
X	-o*)
X	    if [ "$1" = "-o" ] ; then
X		echo    "$progname: -o option requires directory name"
X		exit 1
X	    fi
X	    OBJDIR=`expr $1 : '-o\(.*\)'`
X	    if [ ! -d $OBJDIR ] ; then
X		echo    "$progname: -o option: \"$OBJDIR\" is not a directory"
X		exit 1
X	    fi
X	    OBJDIR="$OBJDIR/"
X	;;
X
X	-[D,I,U]*)
X	    OPTIONS="$OPTIONS $1"
X	;;
X
X	-T)
X	    shift
X	    TSOURCES="$*"
X	    set ""
X	;;
X
X	-*)
X	    echo        "$progname: option \"$1\" unknown; ignored"
X	;;
X
X	*)
X	    SOURCES="$SOURCES $1"
X	;;
X    esac
X    shift
Xdone
X
X#       Run everything through the preprocessor (using cc), sort this
X#	output and remove duplictate lines.  If there is no '-a' option
X#	remove all dependencies of the form '/usr/include/<file>'. Cc
X#	will exit quietly if there are no source files.
X/bin/cc -M $OPTIONS $SOURCES | sort | uniq | \
X    sed $AOPTION \
X	-e "s, \./, ,g" \
X	-e "s,\.\./[a-zA-Z0-9]*/\.\.,\.\.,g" \
X	-e "s,^,$OBJDIR," >> $DEPFILE
X
X/bin/cc -M $OPTIONS $TSOURCES | sort | uniq | \
X    sed $AOPTION \
X	-e "s,\.o:,:," \
X	-e "s, \./, ,g" \
X	-e "s,\.\./[a-zA-Z0-9]*/\.\.,\.\.,g" \
X	-e "s,^,$OBJDIR," >> $DEPFILE
X
X# If DOPTION then cat file and exit, otherwise edit Makefile
Xif [ $DOPTION -eq 1 ] ; then
X    cat $DEPFILE
X    rm -f $DEPFILE $EDDFILE
X    exit
Xfi
X
X# Now start editing the Makefile
Xif [ ! -w $MAKEFILE ] ; then
X    echo        "$progname: can't edit $MAKEFILE"
X    rm -f $DEPFILE $EDDFILE
X    exit 1
Xfi
X
X
X# Make sure we have the "DO NOT DELETE" line in the Makefile
Xcat << EOF >> $MAKEFILE
X
X# DO NOT DELETE THIS LINE - maketd DEPENDS ON IT
XEOF
X
X# Build the editor script to edit the Makefile later.
Xcat << EOF > $EDDFILE
X/# DO NOT DELETE THIS LINE/,\$d
X\$a
X# DO NOT DELETE THIS LINE - maketd DEPENDS ON IT
X# Dependencies generated at: `date`
X
XEOF
Xcat $DEPFILE >> $EDDFILE
Xcat << EOF >> $EDDFILE
X
X# DO NOT ADD ANYTHING HERE - WILL GO AWAY
X.
Xw
Xq
XEOF
X
X# Editor scipt done, edit makefile now.
Xcp $MAKEFILE $MAKEFILE.bak
Xed - $MAKEFILE < $EDDFILE
X
Xrm -f $DEPFILE $EDDFILE
END_OF_FILE
if test 2941 -ne `wc -c <'maketd/maketd.sh'`; then
    echo shar: \"'maketd/maketd.sh'\" unpacked with wrong size!
fi
# end of 'maketd/maketd.sh'
fi
if test -f 'maketd/misc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'maketd/misc.c'\"
else
echo shar: Extracting \"'maketd/misc.c'\" \(3572 characters\)
sed "s/^X//" >'maketd/misc.c' <<'END_OF_FILE'
X/* Written & hacked by Stephen Uitti, PUCC staff, ach@pucc-j, 1985
X * maketd is copyright (C) Purdue University, 1985
X *
X * Permission is hereby given for its free reproduction and
X * modification for non-commercial purposes, provided that this
X * notice and all embedded copyright notices be retained.
X * Commercial organisations may give away copies as part of their
X * systems provided that they do so without charge, and that they
X * acknowledge the source of the software.
X */
X
X#ifdef BSD2_9
X#include <sys/types.h>
X#include <signal.h>
X#endif
X#ifdef BSD4_2
X#include <sys/signal.h>
X#endif
X#include <stdio.h>
X
X#include "maketd.h"
X
X/* VARARGS */
X/* print and error and exit */
Xvoid
Xerr(a, b, c, d)
Xchar *a;				/* the format string, as printf */
Xchar *b, *c, *d;			/* arguments, as printf */
X{
X    fprintf(stderr, "%s: ", prgnm);
X    fprintf(stderr, a, b, c, d);
X    fprintf(stderr, "\n");
X    errrec();				/* clean up backup file, if any */
X    exit(1);
X}
X
X/* errrec - error recovery: recover temp file */
Xstatic void
Xerrrec()
X{
X    if (backedup) {
X	backedup = FALSE;		/* prevent infinite error recursion */
X	unlink(makename);		/* may or may not exist */
X	if (link(backupfn, makename))
X	    err("can't link %s to %s during recovery", makename, backupfn);
X	if (unlink(backupfn))
X	    err("can't delete %s during recovery", backupfn);
X	err("edit of '%s' aborted - file unchanged.", makename);
X    }
X    exit(1);
X}
X
X/* signal trap routines, one for each */
Xstatic void
Xerrhup()
X{
X    fprintf(stderr, "%s: SIGHUP recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrint()
X{
X    fprintf(stderr, "%s: SIGINT recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrill()
X{
X    fprintf(stderr, "%s: SIGILL recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrtrap()
X{
X    fprintf(stderr, "%s: SIGTRAP recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerriot()
X{
X    fprintf(stderr, "%s: SIGIOT recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerremt()
X{
X    fprintf(stderr, "%s: SIGEMT recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrfpe()
X{
X    fprintf(stderr, "%s: SIGFPE recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrbus()
X{
X    fprintf(stderr, "%s: SIGBUS recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrsegv()
X{
X    fprintf(stderr, "%s: SIGSEGV recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrsys()
X{
X    fprintf(stderr, "%s: SIGSYS recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrpipe()
X{
X    fprintf(stderr, "%s: SIGPIPE recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerralrm()
X{
X    fprintf(stderr, "%s: SIGALRM recieved\n", prgnm);
X    errrec();
X}
X
Xstatic void
Xerrterm()
X{
X    fprintf(stderr, "%s: SIGTERM recieved\n", prgnm);
X    errrec();
X}
X
X/* catchsig - init signal traps */
Xcatchsig()
X{
X    signal(SIGHUP, errhup);
X    signal(SIGINT, errint);
X    signal(SIGILL, errill);
X    signal(SIGTRAP, errtrap);
X    signal(SIGIOT, erriot);
X    signal(SIGEMT, erremt);
X    signal(SIGFPE, errfpe);
X    signal(SIGBUS, errbus);
X    signal(SIGSEGV, errsegv);
X    signal(SIGSYS, errsys);
X    signal(SIGPIPE, errpipe);
X    signal(SIGALRM, erralrm);
X    signal(SIGTERM, errterm);
X/* Stock 2.9BSD has all the above, but not as many as 4.2BSD:
X * Want SIGQUIT to drop core.
X * Not worrying about:	SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF
X * cannot be caught: SIGKILL, SIGSTOP
X * Leaving alone: SIGURG, SIGTSTP, SIGCONT, SIGCHLD, SIGTTIN, SIGTTOU, SIGIO
X */
X}
X
X/* lastlnch - return last char before newline or NULL in string */
Xchar
Xlastlnch(p)
Xregister char *p;
X{
X    register char *q;
X
X    q = p;
X    while (*p != '\0' && *p != '\n')
X	q = p++;
X    return *q;
X}
END_OF_FILE
if test 3572 -ne `wc -c <'maketd/misc.c'`; then
    echo shar: \"'maketd/misc.c'\" unpacked with wrong size!
fi
# end of 'maketd/misc.c'
fi
if test -f 'maketd/srtunq.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'maketd/srtunq.c'\"
else
echo shar: Extracting \"'maketd/srtunq.c'\" \(4678 characters\)
sed "s/^X//" >'maketd/srtunq.c' <<'END_OF_FILE'
X/* Sorting function that inserts strings one at a time into memory.
X * Strings are null terminated.
X * Only uniq strings are stored (no count is kept of how many)
X * Any memory used is freed on init (or re-init).
X *
X * Author: Stephen Uitti, PUCC, 1985
X * libsrtunq is copyright (C) Purdue University, 1985
X *
X * Permission is hereby given for its free reproduction and
X * modification for non-commercial purposes, provided that this
X * notice and all embedded copyright notices be retained.
X * Commercial organisations may give away copies as part of their
X * systems provided that they do so without charge, and that they
X * acknowledge the source of the software.
X */
X
X#ifndef lint
Xstatic char *rcsid =
X    "$Id: srtunq.c,v 1.4 86/08/30 21:35:36 ksb Exp Locker: ksb $";
X#endif
X
X#ifdef BSD2_9
X#include <sys/types.h>
X#endif
X#ifdef notdef			/* a comment that allows comments. */
X * use:
X * #include <local/srtunq.h>			/* defines, etc */
X * struct srtent d;				/* data structure foothold */
X * char *p;					/* temp */
X * srtinit(&d);					/* init the structure */
X * if ((p = srtin(&d, "foo", NULL)) != NULL) err(p);	/* add the data */
X *	...
X * srtgti(&d);					/* init for get */
X * p = srtgets(&d);				/* get next entry */
X *	...
X * srtfree(&d);					/* delete the structure */
X#endif
X
X#include <stdio.h>			/* for null */
X#include <sys/types.h>			/* for void, in V7 */
X#include "srtunq.h"			/* for srtunq structs & functions */
X/* #include <local/srtunq.h>		/* for srtunq structs & functions */
X
X/* libc functions */
Xchar   *malloc();			/* need more memory */
Xchar   *strcpy();			/* copy string */
X
X/* srtgti - init get string function */
Xvoid
Xsrtgti(ent)
Xstruct srtent *ent;
X{
X    ent->srt_next = ent->srt_top;
X    if (ent->srt_next == NULL)
X	return;
X    while (ent->srt_next->srt_less != NULL)
X	ent->srt_next = ent->srt_next->srt_less;
X}
X
X/* srtgets - get next string from sorted list, NULL if none more. */
X/* The least shall be first... and the greatest shall be last */
Xchar *
Xsrtgets(ent)
Xstruct srtent *ent;
X{
X    register struct srtbl *s;		/* tmp */
X    register char *p;			/* ret val */
X
X    if ((s = ent->srt_next) == NULL)
X	return NULL;
X    p = s->srt_str;			/* ret val */
X    if (s->srt_more != NULL) {
X	s = s->srt_more;		/* go one more */
X	while (s->srt_less != NULL)	/* then all the way less */
X	    s = s->srt_less;
X	ent->srt_next = s;
X	return p;
X    }
X    while (s != ent->srt_top && s->srt_prev->srt_more == s)
X	s = s->srt_prev;		/* back down any more's */
X    if (s == ent->srt_top)
X	s = NULL;			/* no more */
X    else
X	s = s->srt_prev;
X    ent->srt_next = s;
X    return p;
X}
X
X/* srtinit - init the database tag */
Xvoid
Xsrtinit(ent)
Xstruct srtent *ent;
X{
X    ent->srt_top = NULL;		/* erase any knowledge of it */
X    ent->srt_next = NULL;		/* extractions at the begining */
X}
X
X/* srtfree - delete all the data, init the tag */
Xvoid
Xsrtfree(ent)
Xstruct srtent *ent;
X{
X    if (ent->srt_top == NULL)		/* is the structure empty? */
X	return;				/* yes - exit */
X    srtdtree(ent->srt_top);
X    free((char *)ent->srt_top);		/* clean up last struct */
X    srtinit(ent);			/* init the tag */
X}
X
X/* srtdtree - recursive tree delete
X * frees all less & more entries pointed to by the srt struct */
Xvoid
Xsrtdtree(srt)
Xregister struct srtbl *srt;
X{
X    if (srt->srt_less != NULL) {
X	srtdtree(srt->srt_less);
X	free((char *)srt->srt_less);
X	srt->srt_less = NULL;		/* for consistency */
X    }
X    if (srt->srt_more != NULL) {
X	srtdtree(srt->srt_more);
X	free((char *)srt->srt_more);
X	srt->srt_more = NULL;
X    }
X}
X
X/* srtin - insert string sorted & unique.
X * returns NULL if good, else error message string. */
Xchar *
Xsrtin(ent, str, compar)
Xstruct srtent *ent;
Xchar *str;
Xint (*compar)();			/* if NULL: use strcmp */
X{
X    register char *p;			/* temp string pointer */
X    register i;				/* string compare result */
X    register struct srtbl *s;		/* temp */
X    register struct srtbl *srtold;	/* old temp */
X
X    s = srtold = ent->srt_top;
X    while (s != NULL) {
X    	if ((i = (compar == NULL ?
X		strcmp(str, s->srt_str) : (*compar)(str, s->srt_str))) == 0)
X	    return NULL;		/* found: do nothing - "good" */
X	srtold = s;
X	if (i > 0)
X	    s = s->srt_more;
X	else
X	    s = s->srt_less;
X    }
X    if ((p = malloc((unsigned)(strlen(str) + sizeof(struct srtbl)))) == NULL)
X	return "srtin: warning - out of memory"; /* soft error - caller \n */
X    s = (struct srtbl *)p;
X    if (srtold == NULL) {		/* empty list */
X	ent->srt_top = s;
X	srtold = ent->srt_top;
X    } else {
X	if (i > 0)
X	    srtold->srt_more = s;
X	else
X	    srtold->srt_less = s;
X    }
X    s->srt_prev = srtold;
X    s->srt_less = NULL;
X    s->srt_more = NULL;
X    (void) strcpy(s->srt_str, str);
X    return NULL;
X}
END_OF_FILE
if test 4678 -ne `wc -c <'maketd/srtunq.c'`; then
    echo shar: \"'maketd/srtunq.c'\" unpacked with wrong size!
fi
# end of 'maketd/srtunq.c'
fi
if test -f 'src/errors.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/errors.c'\"
else
echo shar: Extracting \"'src/errors.c'\" \(2340 characters\)
sed "s/^X//" >'src/errors.c' <<'END_OF_FILE'
X/*	$Header: /usr/src/local/etc/ease/RCS/errors.c,v 1.2 85/10/29 23:40:20 jss Exp $	*/
X
X/*
X *  	errors.c   -- Contains error initialization and reporting routines.
X *
X *  	author     -- James S. Schoner, Purdue University Computing Center,
X *				        West Lafayette, Indiana  47907
X *
X *  	date       -- July 9, 1985
X *
X *	Copyright (c) 1985 by Purdue Research Foundation
X *
X *	All rights reserved.
X *
X */
X
X#include <stdio.h>
X
Xextern int  ErrorCount;	 /* error count	               */
Xextern char FNbuf[];	 /* input file name   	       */
Xextern int  Lcount;	 /* line count	     	       */
XFILE *DIAGf = {stderr};  /* file for diagnostic output */
X
X
X/*
X *	ErrorReport () -- Prints source file name (FNbuf), line number (Lcount),
X *			  and error message (sbErr) for each invokation.
X *
X */
Xvoid
XErrorReport (sbErr)
Xchar *sbErr;
X{
X	fprintf (DIAGf, "%s, line %d: %s", FNbuf, Lcount, sbErr);
X	ErrorCount++;
X}
X
X
X/*
X *	FatalError () -- Translator fatal error routine which prints 
X *			 error message (sbErr) and an argument (sbArg).
X *
X */
Xvoid
XFatalError (sbErr, sbArg)
Xchar *sbErr,
X     *sbArg;
X{
X	fprintf (DIAGf, "%s, line %d: Fatal Error In Translator: %s %s\n", 
X		 FNbuf, Lcount, sbErr, sbArg);
X	exit (1);
X}
X
X
X/*
X *	yyerror () -- Prints source file name (FNbuf), line number (Lcount),
X *		      and error message (sbErr) for each invokation.
X *
X */
Xvoid
Xyyerror (sbErr)
Xchar *sbErr;
X{
X	fprintf (DIAGf, "%s, line %d: %s\n", FNbuf, Lcount, sbErr);
X	ErrorCount++;
X}
X
X
X/*
X *	PrintError () -- Prints source file name (FNbuf), line number
X *			 (cline), error message (sbErr), and argument
X *			 (sbArg) for each invokation.
X *
X */
Xvoid
XPrintError (sbErr, sbArg)
Xchar *sbErr;
Xchar *sbArg;
X{
X	fprintf (DIAGf, "%s, line %d: %s %s.\n", FNbuf, Lcount, sbErr, sbArg);
X	ErrorCount++;
X}
X
X
X/*
X *	PrintWarning () -- Prints a warning message with source file
X *			   name (FNbuf), line number (Lcount), warning
X *			   (sbWarn), and a possible identifier (sbID).
X *
X */
Xvoid
XPrintWarning (sbWarn, sbID)
Xchar *sbWarn;
Xchar *sbID;
X{
X	fprintf (DIAGf, "%s, line %d: Warning: ", FNbuf, Lcount);
X	if (sbID != NULL)
X		fprintf (DIAGf, sbWarn, sbID);
X	else
X		fprintf (DIAGf, sbWarn);
X}
X
X
X/*
X *	InitError () -- Initialize line count (Lcount) to one and error count
X *		        (ErrorCount) to zero.
X *
X */
Xvoid
XInitError ()
X{
X	Lcount     = 1;
X	ErrorCount = 0;
X}
END_OF_FILE
if test 2340 -ne `wc -c <'src/errors.c'`; then
    echo shar: \"'src/errors.c'\" unpacked with wrong size!
fi
# end of 'src/errors.c'
fi
if test -f 'src/idman.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/idman.c'\"
else
echo shar: Extracting \"'src/idman.c'\" \(5550 characters\)
sed "s/^X//" >'src/idman.c' <<'END_OF_FILE'
X/*	$Header: /usr/src/local/etc/ease/RCS/idman.c,v 1.2 85/10/29 23:41:38 jss Exp $	*/
X
X/*
X *  	idman.c	-- Contains routines for manipulating identifiers and their
X *		   symbolic associations.
X *
X *  	author	-- James S. Schoner, Purdue University Computing Center,
X *				     West Lafayette, Indiana  47907
X *
X *  	date	-- July 9, 1985
X *
X *	Copyright (c) 1985 by Purdue Research Foundation
X *
X *	All rights reserved.
X *
X */
X
X#include <stdio.h>
X#include "symtab.h"
X
Xextern struct he *LookupSymbol ();
Xextern void	  FatalError (),
X		  ErrorReport (),
X		  PrintWarning (),
X		  PrintError ();
X
Xshort Uchar = 'A';			/* for unique macro names */
X
X
X/*
X *	UniqMac () -- Assigns and returns a unique one-character macro
X *		      name (upper-case) for an Ease macro name.
X *
X */
Xchar
XUniqMac (phe)
Xstruct he *phe;		/* symbol table entry for Ease macro */
X{
X	if ((phe->idval.idc = Uchar++) > 'Z')
X		FatalError ("Too many macro names (26 max)", (char *) NULL);
X	return (phe->idval.idc);
X}
X
X
X/*
X *	BindID () -- Binds either a ruleset or precedence identifier (phe) to
X * 		     an integer (vid).  The id type distinction is passed in
X *		     the parameter idt.
X *
X */
Xvoid
XBindID (phe, vid, idt)
Xregister struct he *phe;	/* symbol table entry for an identifier    */
Xint vid;			/* value of the identifier		   */
Xunsigned idt;			/* identifier type (ruleset or precedence) */
X{
X	if (ISTYPED(phe->idtype)) {	/* should be undefined */
X		PrintWarning ("Redeclaration of %s.\n", phe->psb);
X		phe->idtype = ID_UNTYPED;
X	}
X	phe->idtype |= idt;		/* make defined	       */
X	if (ISRULESET(phe->idtype)) {
X		if (vid > VALRSNMAX) {
X			ErrorReport ("Ruleset number too large.\n");
X			return;
X		} else if (vid < 0) {
X			ErrorReport ("Ruleset number must be non-negative.\n");
X			return;
X		}
X		sprintf (phe->idval.rsn, "%d", vid);
X	} else 
X		phe->idval.prec = vid;
X}
X
X
X/*
X *	CheckRS () -- Checks validity of a ruleset identifier (phe) and 
X *		      returns the ruleset string to which the identifier
X *		      is bound.  If the ruleset identifier is invalid, the
X *		      null string is returned.
X *
X */
Xchar *
XCheckRS (phe)
Xstruct he *phe;		/* symbol table entry for ruleset identifier */
X{
X	if (!ISRULESET(phe->idtype)) {
X		if (!ISTYPED(phe->idtype))
X			PrintError ("Ruleset identifier not bound to a number:", phe->psb);
X		else
X			PrintError ("Identifier not of ruleset type:", phe->psb);
X		return (NULL);
X	} else
X		return (phe->idval.rsn);
X}
X
X
X/*
X *	MakeMac () -- Declare a macro name (pmac) as a class and/or macro type 
X *		      (targtype) and return the unique cf character assigned 
X *		      to it.
X *
X */
Xchar
XMakeMac (pmac, targtype)
Xregister struct he *pmac;	/* symbol table entry for macro identifier */
Xunsigned targtype;		/* target declaration type for the macro   */
X{
X	/*
X	 *	An Ease macro may be declared as both a singular macro and
X	 *	a class macro.
X	 *
X	 */
X	if (ISMACRO(pmac->idtype) || ISCLASS(pmac->idtype)) {
X		pmac->idtype |= targtype;
X		return (pmac->idval.idc);
X	}
X	if (ISTYPED(pmac->idtype)) {	/* not a macro or class id */
X		PrintError ("Redeclaring or using as macro or class:", pmac->psb);
X		return ('\0');
X	}
X	pmac->idtype |= targtype;	/* previously untyped; declare here */
X	return (UniqMac (pmac));
X}
X	
X
X/*
X *	GetField () -- Returns a field type string given a field 
X *		       identifier (fid).
X *
X */
Xchar *
XGetField (fid)
Xregister struct he *fid;	/* field identifier */
X{
X	if (!ISFIELD(fid->idtype)) {
X		PrintError ("Field type not defined for", fid->psb);
X		return (NULL);
X	} else 
X		return (fid->idval.fstring);
X}
X
X
X/*
X *	CheckMailer () -- Declares a mailer identifier (mid) as type mailer,
X *			  checking that the identifier was not previously 
X *			  declared a different type. 
X *
X */
Xchar *
XCheckMailer (mid)
Xregister struct he *mid;
X{
X	if (ISTYPED (mid->idtype) && !ISMAILER (mid->idtype)) {
X		PrintError ("Redeclaration as mailer:", mid->psb);
X		return (NULL);
X	}
X	mid->idtype |= ID_MAILER;
X	return (mid->psb);
X}
X
X
X/*
X *	AssignType () -- Assigns to each field identifier in fidlist the
X *			 type (in string form) fidtype.  This is accomplished
X *			 by making each field identifier symbol table entry
X *			 "point" to the type found in fidtype.
X *
X */
Xvoid
XAssignType (fidlist, fidtype)
Xregister char *fidlist;		/* field identifier list, blank separated */
Xchar *fidtype;			/* field identifier type string		  */
X{
X	register struct he *fid;	/* pointer to a field identifier  */
X	char *fres;			/* field type result string	  */
X	register char *srch;		/* fidlist search pointer	  */
X	char  sep;			/* fidlist separator character    */
X
X	fres = (char *) malloc (strlen (fidtype) + 1);
X	if (fres == NULL)
X		FatalError ("System out of string space in AssignType ()", (char *) NULL);
X	strcpy (fres, fidtype);		/* make clean copy of string type */
X
X	/*
X	 *	Search for all field identifiers and make the type assignment. 
X 	 *
X	 */
X	srch = fidlist;
X	while (*srch != '\0') {
X		while ((*++srch != ' ') && (*srch != '\0'))
X			/* null */ ;
X		if (*fidlist != '\0') {		        /* found a field id       */
X			sep = *srch;
X			*srch = '\0';
X			fid = LookupSymbol (fidlist);	/* get symbol table entry */
X			if (ISFIELD(fid->idtype)) {
X				if (strcmp (fid->idval.fstring, fres))
X					PrintWarning ("Redefinition of field type for %s.\n", fid->psb);
X			} else if (ISTYPED(fid->idtype)) {
X				PrintError ("Redeclaration of identifier as a field:", fid->psb);
X				return;
X			}
X			fid->idtype |= ID_FIELD;	/* type the identifier    */
X			fid->idval.fstring = fres;	/* type the field	  */
X			if ((*srch = sep) != '\0')
X				fidlist = ++srch;
X		}
X	}
X}
END_OF_FILE
if test 5550 -ne `wc -c <'src/idman.c'`; then
    echo shar: \"'src/idman.c'\" unpacked with wrong size!
fi
# end of 'src/idman.c'
fi
if test -f 'src/lexan.l' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/lexan.l'\"
else
echo shar: Extracting \"'src/lexan.l'\" \(5031 characters\)
sed "s/^X//" >'src/lexan.l' <<'END_OF_FILE'
X%{
X/*	$Header: /usr/src/local/etc/ease/RCS/lexan.l,v 1.2 85/10/29 23:42:40 jss Exp $	*/
X
X/*
X *	lexan.l -- Lexical Analyzer for EASE.
X *
X *		   Contains code for lex(1) which generates a lexical
X *		   analyzer (lex.yy.c) for Ease, a high-level specification 
X *		   format for sendmail configuration files.
X *
X *	author -- James S. Schoner, Purdue University Computing Center,
X *				    West Lafayette, Indiana  47907
X *
X *	date   -- July 1, 1985
X *
X *	Copyright (c) 1985 by Purdue Research Foundation
X *
X *	All rights reserved.
X *
X */
X
X#include "symtab.h"
X#include "lexdefs.h"
X
X#define  LEXnewline '\n'
X#define	 LEXeof	    '\0'
X#define  MaxFN	    200			/* maximum file name length */
X
Xextern struct he *LookupSymbol ();
Xextern void	  ErrorReport ();
X
Xint  Lcount;				/* line counter		    */
Xchar FNbuf[MaxFN];			/* file name buffer	    */
Xshort RMatch  = FALSE;			/* ruleset match flag  	    */
X
X%}
X
X/* lex-specific extensions */
X%e 1100
X%p 3700
X%n 500
X
X%%
X	int INch;			/* any input character */
X
X[ \t\f]+			; 	/* discard whitepsace  */
X[\n]				Lcount++;
X^\#[ \t]*[0-9]+[ \t]*\".*\"[ \t]*$	{
X			        sscanf (yytext, "%*c%d%s", &Lcount, FNbuf);
X			        INch = input ();
X			        }
Xmatch				return (MATCH);
Xin				return (IN);
Xbind				return (BIND);
Xdefine				return (DEFINE);
Xmacro				return (MACRO);
Xclass				return (CLASS);
Xoptions				return (OPTIONS);
Xprecedence			return (PRECEDENCE);
Xtrusted				return (TRUSTED);
Xheader				return (HEADER);
Xruleset				return (RULESET);
Xmailer				return (MAILER);
Xhost				return (HOST);
Xuser				return (USER);
Xhostnum				return (HOSTNUM);
Xif				return (IF);
Xretry				return (RETRY);
Xnext				return (NEXT);
Xreturn				return (RETURN);
Xresolve				return (RESOLVE);
Xfor				return (FOR);
Xfield				return (FIELD);
Xconcat				return (CONCAT);
Xifset				return (IFSET);
Xcanon				return (CANON);
Xreadclass			return (READCLASS);
XPath				return (MPATH);
XFlags				return (MFLAGS);
XSender				return (MSENDER);
XRecipient			return (MRECIPIENT);
XArgv				return (MARGV);
XEol				return (MEOL);
XMaxsize				return (MMAXSIZE);
Xo_alias				return (AAOPT);
Xo_ewait				return (AOPT);
Xo_bsub				return (BBOPT);
Xo_qwait				return (COPT);
Xo_delivery			return (DOPT);
Xd_interactive			return (DOPTI);
Xd_background			return (DOPTB);
Xd_queue				return (DOPTQ);
Xo_rebuild			return (DDOPT);
Xo_handling			return (EOPT);
Xh_print				return (EOPTP);
Xh_exit				return (EOPTE);
Xh_mail				return (EOPTM);
Xh_write				return (EOPTW);
Xh_mailz				return (EOPTZ);
Xo_tmode				return (FFOPT);
Xo_usave				return (FOPT);
Xo_gid				return (GOPT);
Xo_fsmtp				return (HHOPT);
Xo_skipd				return (IOPT);
Xo_slog				return (LLOPT);
Xo_rsend				return (MOPT);
Xo_dnet				return (NNOPT);
Xo_hformat			return (OOPT);
Xo_qdir				return (QQOPT);
Xo_tread				return (ROPT);
Xo_flog				return (SSOPT);
Xo_safe				return (SOPT);
Xo_qtimeout			return (TTOPT);
Xo_timezone			return (TOPT);
Xo_dmuid				return (UOPT);
Xo_verbose			return (VOPT);
Xo_wizpass			return (WWOPT);
Xo_loadq				return (XOPT);
Xo_loadnc			return (XXOPT);
Xf_ffrom				return (FFLAG);
Xf_rfrom				return (RFLAG);
Xf_noreset			return (SSFLAG);
Xf_noufrom			return (NFLAG);
Xf_locm				return (LFLAG);
Xf_strip				return (SFLAG);
Xf_mult				return (MFLAG);
Xf_from				return (FFFLAG);
Xf_date				return (DDFLAG);
Xf_mesg				return (MMFLAG);
Xf_full				return (XFLAG);
Xf_return			return (PPFLAG);
Xf_upperu			return (UFLAG);
Xf_upperh			return (HFLAG);
Xf_arpa				return (AAFLAG);
Xf_ufrom				return (UUFLAG);
Xf_expensive			return (EFLAG);
Xf_dot				return (XXFLAG);
Xf_llimit			return (LLFLAG);
Xf_retsmtp			return (PFLAG);
Xf_smtp				return (IIFLAG);
Xf_addrw				return (CCFLAG);
X[A-Za-z][A-Za-z0-9_-]*		{
X				/* store identifiers in symbol table */
X				yylval.phe = LookupSymbol (yytext);
X				return (IDENT);
X				}
X["]((\\\n)|(\\\")|[^"\n])*	{
X				if ((INch = input()) == LEXnewline) {
X					ErrorReport ("End of line in string.\n");
X					unput (INch);
X				}
X				yylval.psb = (char *) malloc (strlen (yytext) + 1);
X				strcpy (yylval.psb, yytext + 1);
X				return (SCONST);
X				}
X[0][0-7]*			{
X				sscanf (yytext, "%o", &yylval.ival);  /* octal constant */
X				return (ICONST);
X				}
X[-]?[1-9][0-9]*			{
X				yylval.ival = atoi (yytext);
X				return (ICONST);
X				}
X"="				return (ASGN);
X","				return (COMMA);
X"{"				return (LBRACE);
X"}"				return (RBRACE);
X"("				return (LPAREN);
X")"				return (RPAREN);
X";"				return (SEMI);
X"$"				return (DOLLAR);
X":"				return (COLON);
X"*"				return (STAR);
X"/*"				{
X				/* eat C comments */
X				INch = input ();
X				while ((INch != '*') || 
X				      ((INch = input ()) != '/')) {
X					if (INch == LEXnewline)
X						Lcount++;
X					else
X						if (INch == LEXeof) {
X							ErrorReport ("End of file in comment.\n");
X							break;
X						}
X					if (INch != '*')
X						INch = input ();
X				}
X				}
X[\\]?.				{
X				if (RMatch) {	/* in rulesets, return literal character */
X					yylval.ival = (yytext[0] == '\\') ? yytext[1] : yytext[0];
X					return (SEPCHAR);
X				} else {
X					ErrorReport ("Illegal delimiter character");
X					printf (": (octal code) \\%03o\n", *yytext);
X				}
X				}
X%%
END_OF_FILE
if test 5031 -ne `wc -c <'src/lexan.l'`; then
    echo shar: \"'src/lexan.l'\" unpacked with wrong size!
fi
# end of 'src/lexan.l'
fi
if test -f 'src/main.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/main.c'\"
else
echo shar: Extracting \"'src/main.c'\" \(3915 characters\)
sed "s/^X//" >'src/main.c' <<'END_OF_FILE'
X/*	$Header: /usr/src/local/etc/ease/RCS/main.c,v 1.2 85/10/29 23:43:38 jss Exp $	*/
X
X/*
X *  	main.c     -- Main procedure for Ease Translator.
X *
X *  	author     -- James S. Schoner, Purdue University Computing Center
X *				        West Lafayette, Indiana  47907
X *
X *  	date       -- July 9, 1985
X *
X *	Copyright (c) 1985 by Purdue Research Foundation
X *
X *	All rights reserved.
X *
X */
X
X#include <stdio.h>
X
Xextern FILE *DIAGf;			/* diagnostic file */
Xextern void InitError (), 
X	    InitSymbolTable (),
X	    DefScan (),
X	    FatalError (),
X            PreLoad ();
X
Xint ErrorCount;				/* translation error count */
Xvoid GetArgs ();			/* gets arguments to "et"  */
X
X/*
X *	main () -- Main procedure for the Ease Translator et.  If no files are 
X *	       	   given as arguments to et, stdin is translated and written to 
X *	           stdout.  If one file is given, it is translated and written 
X *	           to stdout.  If two files are given, the first is translated
X *	           and written to the second.  If the first filename is "-",
X *	           standard input is assumed.  A translation is performed on 
X *	           valid Ease input only, producing a regular sendmail 
X *		   configuration file. 
X *
X */
Xvoid
Xmain (argc, argv)
Xint argc;		/* argument count for "et"  */
Xchar *argv[];		/* argument vector for "et" */
X{
X	InitError ();			/* initialize error conditions */
X	InitSymbolTable ();		/* initialize the symbol table */
X	PreLoad ();			/* preload special identifiers */
X	GetArgs (argc, argv);		/* set up argument files       */
X	(void) yyparse ();		/* perform translation	       */
X	if (fflush (stdout) == EOF)
X		FatalError ("Cannot flush output stream/file", (char *) NULL);
X	DefScan ();		        /* warn about undefined idents */
X	if (ErrorCount)
X		fprintf (DIAGf, "\n\n*** %d error(s) detected.\n", ErrorCount);
X	exit (ErrorCount);
X}
X
X
X/*
X *	GetArgs () -- Processes arguments to the Ease translator "et".  The
X *		      arguments are files (margv) which may replace either/both
X *		      of the files standard input and standard output.  The 
X *		      following cases are possible:
X *			
X *		      -- et f.e f.cf
X *				Translate Ease file f.e and write result
X *				to f.cf.
X *
X *		      -- et f.e
X *				Translate Ease file f.e and write result to
X *				standard output.
X *
X *		      -- et - f.cf
X *				Translate standard input and write result to
X *				f.cf.
X *
X *		      -- et
X *				Translate standard input and write result to
X *				standard output.
X *
X *		      Finally, a message indicating the volatility of the 
X *		      Ease output is written.
X *
X */
Xvoid
XGetArgs (margc, margv)
Xregister int   margc;		/* argument count  */
Xregister char *margv[];		/* argument vector */
X{
X	switch (margc) {
X		case 1 : break;
X		case 2 :
X		case 3 : if (strcmp (margv[1], "-") && (freopen (margv[1], "r", stdin) == NULL))
X				FatalError ("Cannot open input stream/file:", margv[1]);
X			 if ((margc == 3) && (freopen (margv[2], "w", stdout) == NULL))
X				FatalError ("Cannot open output file:", margv[2]);
X			 break;
X		default: FatalError ("Usage: et [infile [outfile]]", (char *) NULL);
X			 break;
X	}
X	printf ("###################################################\n");
X	printf ("##                                               ##\n");
X	printf ("##  WARNING: THIS FILE IS TO BE MODIFIED BY      ##\n");
X	printf ("##           THE EASE TRANSLATOR (ET) ONLY.      ##\n");
X	printf ("##                                               ##\n");
X	printf ("##           ALL OTHER MODIFICATIONS WILL        ##\n");
X	printf ("##           DISAPPEAR THE NEXT TIME ET IS RUN.  ##\n");
X	printf ("##                                               ##\n");
X	printf ("##           MAKE MODIFICATIONS TO THE EASE      ##\n");
X	printf ("##           SOURCE ONLY.                        ##\n");
X	printf ("##                                               ##\n");
X	printf ("###################################################\n");
X}
END_OF_FILE
if test 3915 -ne `wc -c <'src/main.c'`; then
    echo shar: \"'src/main.c'\" unpacked with wrong size!
fi
# end of 'src/main.c'
fi
if test -f 'src/symtab.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/symtab.c'\"
else
echo shar: Extracting \"'src/symtab.c'\" \(5288 characters\)
sed "s/^X//" >'src/symtab.c' <<'END_OF_FILE'
X/*	$Header: /usr/src/local/etc/ease/RCS/symtab.c,v 1.2 85/10/29 23:46:48 jss Exp $	*/
X
X/*
X *  	symtab.c   -- Contains Ease Translator symbol table routines.
X *
X *  	author     -- James S. Schoner, Purdue University Computing Center,
X *				        West Lafayette, Indiana  47907
X *
X *  	date       -- July 9, 1985
X *
X *	Copyright (c) 1985 by Purdue Research Foundation
X *
X *	All rights reserved.
X *
X */
X
X#include <stdio.h>
X#include <ctype.h>
X#include "symtab.h"
X
X#define ERRORMAILER "error"		/* predefined error mailer name */
X
Xextern void FatalError (),
X	    PrintWarning ();
X
Xstruct he *LookupSymbol ();
X
Xstruct Defmac {				/* predefined macro struct def  */
X	char *macname;
X	char  macrep;
X};
X
Xstruct he *SymTab[SST];			/* hash table base array        */
Xstatic struct Defmac MacDefs[] = {	/* predefined macros	        */
X			{"m_smtp",	'e'},
X			{"m_oname",	'j'},
X			{"m_ufrom",	'l'},
X			{"m_daemon",	'n'},
X			{"m_addrops",	'o'},
X			{"m_defaddr",	'q'},
X			{"m_sitename",	'w'},
X			{"m_odate",	'a'},
X			{"m_adate",	'b'},
X			{"m_hops",	'c'},
X			{"m_udate",	'd'},
X			{"m_saddr",	'f'},
X			{"m_sreladdr",	'g'},
X			{"m_rhost",	'h'},
X			{"m_qid",	'i'},
X			{"m_pid",	'p'},
X			{"m_protocol",	'r'},
X			{"m_shostname", 's'},
X			{"m_ctime",	't'},
X			{"m_ruser",	'u'},
X			{"m_version",	'v'},
X			{"m_sname",	'x'},
X			{"m_stty",	'y'},
X			{"m_rhdir",	'z'},
X			{"sentinel",	'\0'}
X};
X
X
X/*
X *	DefScan () -- Scan symbol table to find macros, classes, mailers, 
X *		      and rulesets which have been referenced or declared, but
X *		      not defined.  A warning is printed for each such 
X *		      occurence.  This routine is usually called at the end
X *		      of a successful Ease translation.
X *
X */
Xvoid
XDefScan ()
X{
X	register int stindex;		/* symbol table hash index   */
X	register struct he *hcsearch;	/* hash chain search pointer */
X
X	for (stindex = 0; stindex < SST; stindex++) {
X		if ((hcsearch = SymTab[stindex]) != NULL)
X			while (hcsearch != NULL) {
X				if ((ISMACRO(hcsearch->idtype) && 
X				     isupper(hcsearch->idval.idc)) &&
X				     !ISMACRO(hcsearch->idd))
X					PrintWarning ("Macro not defined: %s\n", hcsearch->psb);
X				if (ISCLASS(hcsearch->idtype) && !ISCLASS(hcsearch->idd))
X					PrintWarning ("Class not defined: %s\n", hcsearch->psb);
X				if (ISMAILER(hcsearch->idtype) && !ISMAILER(hcsearch->idd))
X					PrintWarning ("Mailer not defined: %s\n", hcsearch->psb);
X				if (ISRULESET(hcsearch->idtype) && !ISRULESET(hcsearch->idd))
X					PrintWarning ("Ruleset not defined: %s\n", hcsearch->psb);
X				hcsearch = hcsearch->phe;
X			}
X	}
X}
X				     
X
X/*
X *	InitSymbolTable () -- Invoked by main () to initialize the symbol table.
X *
X */
Xvoid
XInitSymbolTable ()
X{
X	int i;
X
X	for (i = 0; i < SST; i++)		/* initialize base array */
X		SymTab[i] = NULL;
X}
X
X
X/*
X *	PreLoad () -- Invoked by main () to preload special macro names 
X *		      and mailer declarations.
X *
X */
Xvoid
XPreLoad ()
X{
X	struct Defmac *macptr;
X	struct he     *symptr;
X
X	/* preload special (lower-case) macros */
X	for (macptr = &MacDefs[0]; (*macptr).macrep != '\0'; macptr++) {
X		symptr = LookupSymbol ((*macptr).macname);
X		symptr->idtype |= ID_MACRO;
X		symptr->idval.idc = (*macptr).macrep;
X	}
X
X	/* preload error mailer declaration */
X	symptr = LookupSymbol (ERRORMAILER);
X	symptr->idtype |= ID_MAILER;
X	symptr->idd |= ID_MAILER;
X}
X	
X
X/*
X *	LookupSymbol () -- Returns a pointer to the hash entry already 
X *			   existing, or newly created, which corresponds 
X *			   to string sb.
X *
X */
Xstruct he *
XLookupSymbol (sb)
Xchar sb[];			/* string buffer containing identifier */
X{
X	struct he *phe;		/* hash entry search pointer  */
X	int	  hc;		/* hash code of sb identifier */
X
X	phe = SymTab[hc = HashCode (sb)];
X	while (phe != NULL)			/* find hash entry for sb */
X		if (!strcmp (phe->psb, sb))
X			return (phe);
X		else
X			phe = phe->phe;
X	/* make new symbol table entry */
X	if ((phe = (struct he *) malloc (sizeof (struct he))) == NULL)
X		FatalError ("System out of space in LookupSymbol ()", (char *) NULL);
X	if ((phe->psb = (char *) malloc (strlen (sb) + 1)) == NULL)
X		FatalError ("System out of space in LookupSymbol ()", (char *) NULL);
X	strcpy (phe->psb, sb);
X	phe->idval.idc = '\0';
X	phe->idtype = ID_UNTYPED;
X	phe->idd = ID_UNTYPED;
X	phe->phe = SymTab[hc];
X	return (SymTab[hc] = phe);
X}
X
X
X/*
X *	RemoveSymbol () -- Removes the symbol table entry phe from the 
X *			   symbol table.
X *
X */
Xvoid
XRemoveSymbol (phe)
Xstruct he *phe;	   /* pointer to hash entry to be removed from symbol table */
X{
X	int hc;	   		/* hash code of entry phe       */
X	struct he *sphe;	/* search pointer for entry phe */
X
X	if (phe == NULL)
X		return;
X	else {			/* search and remove entry phe  */
X		sphe = SymTab[hc = HashCode (phe->psb)];
X		free (phe->psb);
X		if (sphe == phe)
X			SymTab[hc] = phe->phe;
X		else
X			while (sphe != NULL)
X				if (sphe->phe == phe) {
X					sphe->phe = phe->phe;
X					return;
X				} else
X					sphe = sphe->phe;
X	}
X}
X
X
X/*
X *	HashCode () -- Returns the hash code of the string in sb by adding 
X *		       the character values and applying mod by the hash 
X *		       table size.
X *
X */
Xint
XHashCode (sb)
Xchar sb[];
X{
X	int ccSum = 0;			/* sum of char values in string sb */
X	int i;
X
X	for (i = 0; sb[i]; i++)		/* add char codes for sb chars     */
X		ccSum += sb[i];
X	return (ccSum % SST);		/* return sum mod table size	   */
X}
END_OF_FILE
if test 5288 -ne `wc -c <'src/symtab.c'`; then
    echo shar: \"'src/symtab.c'\" unpacked with wrong size!
fi
# end of 'src/symtab.c'
fi
echo shar: End of archive 2 \(of 4\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 

Rich $alz			"Anger is an energy"
Cronus Project, BBN Labs	rsalz@bbn.com
Moderator, comp.sources.unix	sources@uunet.uu.net