[comp.sources.unix] v12i007: Cake, a make replacement, Part01/09

rsalz@uunet.UU.NET (Rich Salz) (10/16/87)

Submitted-by: Zoltan Somogyi <zs@munnari.oz>
Posting-number: Volume 12, Issue 7
Archive-name: cake/part01

Cake is a rewrite of make from the ground up. The main difference is one
of attitude: cake is considerably more general and flexible, and can be
extended and customized by the user to a much greater extent. It is applicable
to a wide range of domains, not just program development: for example, standard
cakefiles exist to handle documents and VLSI designs.

The main differences between make and cake:

-	Cake dependencies may be dynamic, and their applicability may be
	conditional upon a test.

-	Cake rules have the same syntax and semantics as ordinary dependencies,
	and may more than one target.

-	There are no restrictions on the forms of either the targets or the
	sources. This enables cake to handle files in more than one directory
	and to interface with SCCS, RCS and archivers, among others, without
	any special arrangements.

-	Cake has a more general search algorithm than make. When seeking a
	target it considers all rules which could update it even if the
	corresponding intermediate files do not exist; it recreates them
	if (and only if) it is necessary to do so.

-	Cakefiles are passed through the C preprocessor. They may therefore
	#include other cakefiles (including standard ones) and use #if and
	#ifdef to customize themselves.

-	Cake allows the user to choose his own shell, and to include shell
	scripts in actions.

-	Cake can check to see if a newly 'updated' file has actually been
	changed via a byte-by-byte comparison, which works even if the modify
	date has been touched. If there is no change, cake avoids recomputing
	the file's dependents.

-	Cake has a lot more options (whether one considers these an improvement
	of course depends on whether one needs them).

Cake is not backwards-compatible with make.

The copyright on cake is derived from GNU Emacs.

The following files are shar files. To extract their contents, give them
to /bin/sh as input. Some of them should be put in different directories,
according to the map below:

Part01		.
Part02		.
Part03		.
Part04		./Aux
Part05		./Lex
Part06		./Lib
Part07		./Man
Part08		./Man
Part09		./Script

Some of the programs in Aux and some of the scripts in Script are also usable
independently of cake. For example, the program Aux/subcmd solves the consistent
renaming problem (e.g. how to move x to .x, y to .y z to .z etc in one command),
and the script Script/ol is an outline generator for -me documents.

Zoltan Somogyi
Department of Computer Science
University of Melbourne
Parkville, 3052 Victoria, Australia

UUCP:	{uunet,mcvax,ukc}!munnari.oz!zs
ARPA:	zs%munnari.oz@uunet.uu.net
CSNET:	zs%munnari.oz@australia

#! /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:
#	README
#	COPYING
#	Makefile
#	cake.h
#	cake_g.y
#	cake_s.l
#	conf.h
#	extern.h
#	list.h
#	macro.h
#	port.h
#	std.h
#	table.h
#	wait.h
# This archive created: Wed Oct 14 21:07:46 1987
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'README'" '(5454 characters)'
if test -f 'README'
then
	echo shar: "will not over-write existing file 'README'"
else
sed 's/^X//' << \SHAR_EOF > 'README'
XThis is the root directory of the cake distribution.
X
XThis directory contains the sources for the cake command itself.
XIts subdirectories contain sources for commands used by the standard
Xcakefiles (Aux), diffs for a modified version of the lex driver (Lex),
X"standard" cakefiles (Lib), manuals and a paper on cake (Man), and
Xcommands implemented by scripts (Script). Each subdirectory contains
Xits own README file; you should have a look at them. The rest of this
Xfile is just for the cake source.
X
XCake was developed on a 3240 under 4.2BSD Unix, with an early version
Xon a Pyramid 90x (in the Berkeley universe). It has been tested on a
XVAX-11/780 under 4.3BSD, on a Sun under SunOS 3.4, and on an ELXSI 6400
Xunder both 4.2BSD and System V. It should also be portable to other
Xconfigurations. Its parameters are concentrated in the Makefile and
Xin conf.h, but you should have a look at Lex/README *before* you run
X"make install".
X
XMakefile:
X
XThe four make variables you should have a look at and maybe change
Xare DEST, COPTS, CFLAGS, and LDFLAGS. DEST and CFLAGS should be
Xself-explanatory. LDFLAGS as it is just sets the max stack size
Xon the 3240 (a segmented non-paged machine) - on other machines
Xan empy LDFLAGS should do just fine. The macros you can choose from
Xfor COPTS are:
X
XATT is for AT&T variants of Unix. Cake has not been tested extensively
Xfor these, but it has been in use for a while now on an Elxsi 6400 
Xrunning Enix, a System V port. Defining ATT shortens variable names
Xto ensure that all are unique in the first six characters (see port.h)
Xand that no two variable names differ only in case. This effect depends
Xon the C preprocessor being able to handle long case-sensitive variable
Xnames, even if the compiler/loader can't handle them. Defining ATT makes
Xcake call System V system calls instead of Berkeley ones, and does a few
Xother things as well. It may or may not work for System III.
X
XCAKEDEBUG, when defined, enables cake to output debugging information
Xof various kinds, either on abnormal termination or in response to
Xdebugging options (see main.c). The option -Y requires YYDEBUG
Xto debug the parser actions.
X
XCAREFUL is a safety feature. It prevents cake from removing user files,
Xeven when its semantics call for it (see the -G option). It moves files
Xto /tmp instead. This can slow cake down, so if you think it is not
Xnecessary (e.g. because you have used cake long enough to be confident
Xthat it will not delete files it should not delete or because you do
Xfrequent backups) you should not define CAREFUL.
X
XEXTRACHECK is another safety feature - it enables extra internal
Xconsistency checks. These are fairly cheap, so you may keep them
Xunless you are hurting for CPU time. The one specific instance you
Xmay want to delete is the one in mem.c which checks the aligment
Xof malloc returns.
X
XIf you are concerned about memory usage, you may want to define MEMUSED,
Xwithout which cake never free()s space. However, the opportunities for
Xsavings are minimal (really!); and you should also keep in mind that
Xcake has never been tested with MEMUSED.
X
Xconf.h:
X
XCast should be a type to which all kinds of pointers can be converted
Xforward and back without loss. On most machines int will do.
X
XSLIB is the directory containing the "standard" systemwide library
X(which is in the Lib subdirectory in the distribution), while ULIB
Xis the suffix (after $HOME) of people's own cake library.
X
XCPP is the command to invoke the C preprocessor.
X
XSTATS_FILE is the name of the file in which each invocation of cake
Xputs statistics. If you don't define STATS_FILE, cake does not keep
Xany stats. If you do, the stats are reported (nicely formatted)
Xby Script/{cs,ccs}.
X
XCake parses and execs normal (non-script) actions by itself if they
Xdon't contain any chars from the macro METACHARS. If they do, cake
Xcalls SYSTEM_CMD, while it calls SCRIPT_CMD for scripts. The arg
Xto SYSTEM_CMD is the command itself, while the arg to SCRIPT_CMD
Xis the name of a file (in /tmp) which contains the script. To convert
Xto the Bourne shell, change csh to sh and delete the -f flags.
XFor other shells, you will have to find out how to get equivalent
Xbehaviour, but keep in mind that Unix restricts you to zero or one
Xarguments.
X
XFor ATT systems, TIMERES is the resulotion of the times() system call,
Xbut this is used only for stats.
X
XGENESIS is just a time() value used internally for time when there is
Xnone applicable. It doesn't really matter what it is, as long as it
Xprecedes all valid values.
X
XCHASEROOT is also a name used only internally - it too could be anything
Xas long as it does not conflict with real filenames.
X
XThe other macros in conf.h define the (maximum) sizes of various kinds
Xof things. You need to check only CHARSETSIZE, which should be 512 for
X9-bit byte systems. You should enlarge the others when somebody gets
Xa bounds exceeded message.
X
XConditions:
X
XThe copying conditions for the cake distribution are in the file
XCOPYING. It is patterned after the copying conditions of GNU,
Xin particular GNU Emacs. Basically, you can do anything with it
Xexcept prevent other people from getting access to it. This
Xmeans that you can't sell it. For the reasons for these conditions,
Xread Stallman's GNU manifesto.
X
XAuthor:
X
XZoltan Somogyi
X
XDepartment of Computer Science
XUniversity of Melbourne
XParkville, 3052 Victoria, Australia
X
XUUCP:	{uunet,mcvax,ukc}!munnari.oz!zs
XARPA:	zs%munnari.oz@uunet.uu.net
XCSNET:	zs%munnari.oz@australia
SHAR_EOF
if test 5454 -ne "`wc -c < 'README'`"
then
	echo shar: "error transmitting 'README'" '(should have been 5454 characters)'
fi
fi
echo shar: "extracting 'COPYING'" '(2204 characters)'
if test -f 'COPYING'
then
	echo shar: "will not over-write existing file 'COPYING'"
else
sed 's/^X//' << \SHAR_EOF > 'COPYING'
XCake copying permission notice Copyright (C) 1987 Zoltan Somogyi
X
XCake is distributed in the hope that it will be useful, but without any
Xwarranty. No author or distributor accepts responsibility to anyone for
Xthe consequences of using it or for whether it serves any particular purpose
Xor works at all, unless he/she says so in writing.
X
XEveryone is granted permission to copy, modify and redistribute Cake
Xunder the following conditions:
X
X	Permission is granted to anyone to make or distribute verbatim copies
X	of Cake source code as received, in any medium, provided that all
X	copyright notices and permission and nonwarranty notices are preserved,
X	and that the distributor grants the recipient permission for further
X	redistribution as permitted by this document, and gives him/her and
X	points out to him/her an exact copy of this document to inform him/her
X	of his/her rights.
X
X	Permission is granted to distribute modified versions of Cake source
X	code, or of portions of it, under the above conditions, provided also
X	that all changed files carry prominent notices stating who last changed
X	them and that all the Cake-derived material, including everything
X	packaged together with it and not independently usable, is distributed
X	under the conditions stated in this document.
X
X	Permission is granted to distribute Cake in compiled or executable form
X	under the same conditions applying for source code, provided that either
X
X	A	it is accompanied by the corresponding machine-readable source
X		code, or
X	B	it is accompanied by a written offer, with no time limit, to
X		give anyone a machine-readable copy of the corresponding source
X		code in return for reimbursement of the cost of distribution.
X		This written offer must permit verbatim duplication by anyone.
X	C	it is distributed by someone who received only the executable
X		form, and is accompanied by a copy of the written offer of
X		source code which he/she received along with it.
X
XIn other words, you are welcome to use, share and improve Cake.
XYou are forbidden to forbid anyone else to use, share and improve
Xwhat you give them. Help stamp out software-hoarding!
X
XThis copyright notice was adapted from the one supplied with GNU Emacs.
SHAR_EOF
if test 2204 -ne "`wc -c < 'COPYING'`"
then
	echo shar: "error transmitting 'COPYING'" '(should have been 2204 characters)'
fi
fi
echo shar: "extracting 'Makefile'" '(1943 characters)'
if test -f 'Makefile'
then
	echo shar: "will not over-write existing file 'Makefile'"
else
sed 's/^X//' << \SHAR_EOF > 'Makefile'
X#	Makefile for Cake
X#
X#	$Header: /mip/zs/src/sys/cake/RCS/Makefile,v 1.15 87/10/05 20:13:19 zs Exp $
X
XHDR   =	cake.h conf.h port.h
XSRC   =	act.c chase.c entry.c error.c expand.c file.c \
X	list.c main.c make.c mem.c pat.c print.c proc.c \
X	sym.c sys.c table.c test.c trail.c
XOBJ   =	act.o chase.o entry.o error.o expand.o file.o \
X	list.o main.o make.o mem.o pat.o print.o proc.o \
X	sym.o sys.o table.o test.o trail.o
XGEN   =	cake_g.y cake_s.l
XGHDR  =	cake_g.h
XGSRC  =	cake_g.c cake_s.c
XGOBJ  =	cake_g.o cake_s.o
XDEST  = /mip/usr/bin
XCOPTS = -DCAKEDEBUG -DYYDEBUG -DCAREFUL
XCFLAGS= $(COPTS)
XLDFLAGS=-k 64k
X
Xcake:		$(OBJ) $(GOBJ)
X		$(CC) $(LDFLAGS) $(CFLAGS) -o cake $(OBJ) $(GOBJ)
X		-/bin/rm fake
X		ln cake fake
X
Xall:		cake lint tags defs
X
Xinstall:	cake
X		mv $(DEST)/cake /tmp/Oldcake
X		cp cake $(DEST)/cake
X		strip $(DEST)/cake
X
X$(OBJ):		$(HDR)
X$(GOBJ):	$(HDR)
X
Xcake_g.c:	cake_g.y
X		yacc -dv cake_g.y
X		@mv y.tab.h cake_g.h
X		@mv y.tab.c cake_g.c
X		@mv y.output cake_g.t
X
Xcake_s.c:	cake_s.l
X		lex cake_s.l
X		@mv lex.yy.c cake_s.c
X
Xvar:		$(SRC) $(GSRC)
X		var -DATT $(COPTS) $(SRC) $(GSRC) > Var
X
Xplint:		$(SRC) $(GSRC)
X		lint -acpx $(COPTS) $(SRC) $(GSRC) > Lint_errs
X
Xulint:		$(SRC) $(GSRC)
X		lint -v $(COPTS) $(SRC) $(GSRC) > Lint_errs
X
Xlint:		$(SRC) $(GSRC)
X		lint -v $(COPTS) $(SRC) $(GSRC) > Lint_errs
X		@gred yy Lint_errs
X		@gred malloc Lint_errs
X		@gred strcpy Lint_errs
X		@gred strcat Lint_errs
X		@gred printf Lint_errs
X		@gred flsbuf Lint_errs
X		@gred setbuf Lint_errs
X		@gred rcs_id Lint_errs
X		@gred longjmp Lint_errs
X		@gred sbrk Lint_errs
X
Xcchk:		$(SRC)
X		cchk $(SRC) > Cchk_errs
X
Xtags:		$(SRC) $(GSRC)
X		ctags $(SRC) $(GSRC)
X
Xdefs:		$(SRC) $(GSRC)
X		defn $(SRC) $(GSRC) > defs
X
Xcxref:		$(SRC)
X		cxref -C $(SRC) > Cxref
X
Xssize:
X		ssize $(SRC) $(GEN)
X
Xasize:
X		ssize $(SRC) $(GEN) $(GSRC)
X
Xclean:		
X		/bin/rm	cake_g.h cake_g.t \
X			Make_errs Lint_errs Cchk_errs core \
X			$(OBJ) $(GOBJ) $(GSRC)
X
Xgclean:		
X		/bin/rm $(GSRC) $(GHDR)
SHAR_EOF
if test 1943 -ne "`wc -c < 'Makefile'`"
then
	echo shar: "error transmitting 'Makefile'" '(should have been 1943 characters)'
fi
fi
echo shar: "extracting 'cake.h'" '(2721 characters)'
if test -f 'cake.h'
then
	echo shar: "will not over-write existing file 'cake.h'"
else
sed 's/^X//' << \SHAR_EOF > 'cake.h'
X/*
X**	Cake definitions.
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/cake.h,v 1.15 87/10/05 20:13:40 zs Exp $
X*/
X
X#include	<sys/types.h>
X#include	<stdio.h>
X#include	"std.h"
X#include	"conf.h"
X#include	"wait.h"
X#include	"list.h"
X#include	"table.h"
X
X#define	nf_NONVOL	0x0001
X#define	nf_PRECIOUS	0x0002
X#define	nf_PSEUDO	0x0004
X#define	nf_REDUNDANT	0x0008
X#define	nf_WHEN		0x0010
X#define	nf_DEPNONVOL	0x0020
X#define	nf_NODELETE	0x0040
X#define	nf_NEWFILE	0x0080
X#define	nf_EXIST	0x0100
X#define	nf_BUSY		0x0200
X#define	nf_ERR		0x0400
X#define	nf_TRACED	0x0800
X#define	nf_WARNED	0x1000
X#define	nf_ORIG		0x2000
X
X#define	af_SILENT	0x0001
X#define	af_IGNORE	0x0002
X#define	af_MINUSN	0x0004
X#define	af_SYSTEM	0x0008
X#define	af_SCRIPT	0x0010
X
X/* type of internal patterns */
Xtypedef	struct	s_pat
X{
X	char	*p_str;
X	short	p_flag;
X	short	p_cmd;
X} Pat;
X
X/* type of internal actions */
Xtypedef	struct	s_act
X{
X	char	*a_str;
X	short	a_flag;
X} Act;
X
X/* kinds of actions */
Xtypedef	enum
X{
X	Exec, System, Script
X} A_kind;
X
X/* kinds of tests */
Xtypedef	enum
X{
X	t_TRUE, t_FALSE, t_AND, t_OR, t_NOT,
X	t_CMD, t_MATCH, t_LIST, t_EXIST, t_CANDO, t_OK
X} T_kind;
X
X/* type of tests */
Xtypedef	struct	s_test
X{
X	T_kind		t_kind;
X	Pat		*t_pat;
X	List		*t_list;	/* of Pat(L), char(M)	*/
X	char		*t_cmd;
X	struct	s_test	*t_left;
X	struct	s_test	*t_right;
X} Test;
X
X/* type of substitution variables */
Xtypedef	struct	s_var
X{
X	char	*v_val;
X	bool	v_bound;
X} Var;
X
X#define	NOVAR		10
X#define	MAXVAR		11
X
X/* type of substitution environments */
Xtypedef	Var	Env[MAXVAR];
X
X/* type of entries */
Xtypedef	struct	s_entry
X{
X	char	*e_file;
X	List	*e_new;				/* of Pat	*/
X	List	*e_old;				/* of Pat	*/
X	List	*e_when;			/* of Pat	*/
X	List	*e_act;				/* of Act	*/
X	Test	*e_cond;
X	bool	e_dblc;
X} Entry;
X
Xtypedef	enum
X{
X	n_OK, n_CANDO, n_NOWAY
X} N_kind;
X
X/* type of nodes in the dependency graph */
Xtypedef	struct	s_node
X{
X	char	*n_name;	/* name of the node		*/
X	N_kind	n_kind;		/* current status of the chase	*/
X	int	n_flag;		/* the applicable nf_[A-Z]*	*/
X	time_t	n_rtime;	/* Real modify time if exist	*/
X	time_t	n_stime;	/* Saved copy of n_rtime	*/
X	time_t	n_utime;	/* last ancestor Update time	*/
X	List	*n_new;		/* left side or rule, of Node	*/
X	List	*n_old;		/* right side of rule, of Node	*/
X	List	*n_when;	/* starred right side, of Pat	*/
X	List	*n_act;		/* the actions, of Act		*/
X#if 0	/* N must be 1 for the time being */
X	int	n_pid;		/* current update process	*/
X	char	*n_file;	/* name of output file		*/
X#endif
X	char	*n_msg;		/* error message, if nf_ERR	*/
X	List	*n_badguys;	/* error causes, if nf_ERR	*/
X} Node;
X
Xtypedef	struct	s_proc
X{
X	int	pr_pid;
X	bool	pr_run;
X	Wait	pr_stat;
X	int	(*pr_func)();
X	List	*pr_args;
X	Node	*pr_node;
X} Proc;
X
X#include	"extern.h"
X#include	"macro.h"
SHAR_EOF
if test 2721 -ne "`wc -c < 'cake.h'`"
then
	echo shar: "error transmitting 'cake.h'" '(should have been 2721 characters)'
fi
fi
echo shar: "extracting 'cake_g.y'" '(3523 characters)'
if test -f 'cake_g.y'
then
	echo shar: "will not over-write existing file 'cake_g.y'"
else
sed 's/^X//' << \SHAR_EOF > 'cake_g.y'
X%{
X/*
X**	Grammar for Cakefiles
X*/
X
Xstatic	char
Xrcs_id[] = "$Header: /mip/zs/src/sys/cake/RCS/cake_g.y,v 1.15 87/10/05 20:13:45 zs Exp $";
X
X#include	"cake.h"
X#include	<ctype.h>
X
Xextern	List	*set_flag();
Xextern	int	yylineno;
Xextern	char	*yyfile;
X%}
X
X%start		file
X
X%union
X{
X	int	Uint;
X	char	*Ustr;
X	List	*Ulist;
X	Entry	*Uent;
X	Test	*Utest;
X	Act	*Uact;
X	Pat	*Upat;
X}
X
X%token		NL EMPTYLINE
X%token		NONVOL PRECIOUS REDUNDANT PSEUDO WHEN
X%token		IF IN MATCH EXIST CANDO OK
X%token		LPAREN RPAREN
X%token	<Ustr>	COLON PAT PATCMD TESTCMD
X%token	<Uact>	BEGIN_ACT ACT END_ACT
X%token		GARBAGE
X%left		OR
X%left		AND
X%left		NOT
X
X%type	<Uent>	rule
X%type	<Utest>	cond test
X%type	<Upat>	basepat
X%type	<Uact>	act
X%type	<Uint>	flag flag_el
X%type	<Ulist>	pat
X%type	<Ulist>	rule_l ACT_el act_el pat_el pat_l
X
X%%
X
X/**********************************************************************/
X/*		Entries						      */
X
Xfile	:	empty_el ent_esl empty_el
X	;
X
Xentry	:	rule_l act_el
X		{	new_entry($1, $2);		}
X	;
X
Xrule	:	pat_l COLON pat_el cond NL
X		{	$$ = make_dep($1, $3, $4, new_name(yyfile), $2);	}
X	;
X
Xcond	:	IF test
X		{	$$ = $2;			}
X	|	/* empty */
X		{	$$ = (Test *) NULL;		}
X	;
X
Xtest	:	basepat IN pat_l
X		{	$$ = make_test_l($1, $3);	}
X	|	basepat MATCH basepat
X		{	$$ = make_test_m($1, (Pat *) NULL, $3);}
X	|	basepat MATCH basepat basepat
X		{	$$ = make_test_m($1, $3, $4);	}
X	|	EXIST basepat
X		{	$$ = make_test_s(t_EXIST, $2);	}
X	|	CANDO basepat
X		{	$$ = make_test_s(t_CANDO, $2);	}
X	|	OK basepat
X		{	$$ = make_test_s(t_OK, $2);	}
X	|	TESTCMD
X		{	$$ = make_test_c($1);		}
X	|	test AND test
X		{	$$ = make_test_b(t_AND, $1, $3);}
X	|	test OR test
X		{	$$ = make_test_b(t_OR, $1, $3);	}
X	|	NOT test
X		{	$$ = make_test_u(t_NOT, $2);	}
X	|	LPAREN test RPAREN
X		{	$$ = $2;			}
X	;
X
Xact	:	ACT
X		{	$$ = $1;			}
X	|	BEGIN_ACT ACT_el END_ACT
X		{	$$ = prep_script($1, $2, $3);	}
X	;
X
Xbasepat	:	PAT
X		{	$$ = make_pat($1, FALSE, 0);	}
X	|	PATCMD
X		{	$$ = make_pat($1, TRUE, 0);	}
X	;
X
Xpat	:	basepat flag_el
X		{	$$ = set_flag(makelist($1), $2);}
X	|	LPAREN pat_l RPAREN flag_el
X		{	$$ = set_flag($2, $4);		}
X	;
X
Xflag	:	NONVOL
X		{	$$ = nf_NONVOL;			}
X	|	PRECIOUS
X		{	$$ = nf_PRECIOUS;		}
X	|	REDUNDANT
X		{	$$ = nf_REDUNDANT;		}
X	|	PSEUDO
X		{	$$ = nf_PSEUDO;			}
X	|	WHEN
X		{	$$ = nf_WHEN;			}
X	;
X
X/* From here on, the grammar is JUNK				      */
X/**********************************************************************/
X/*		Lists						      */
X
Xent_esl	:	entry
X	|	ent_esl empty_l entry
X	;
X
Xrule_l	:	rule
X		{	$$ = makelist($1);		}
X	|	rule_l rule
X		{	$$ = addtail($1, $2);		}
X	;
X
XACT_el	:	/* empty */
X		{	$$ = makelist0();		}
X	|	ACT_el ACT
X		{	$$ = addtail($1, $2);		}
X	;
X
Xact_el	:	/* empty */
X		{	$$ = makelist0();		}
X	|	act_el act
X		{	$$ = addtail($1, $2);		}
X	;
X
Xpat_el	:	/* empty */
X		{	$$ = makelist0();		}
X	|	pat_l
X		{	$$ = $1;			}
X	;
X
Xpat_l	:	pat
X		{	$$ = $1;			}
X	|	pat_l pat
X		{	$$ = addlist($1, $2);		}
X	;
X
Xflag_el	:	/* empty */
X		{	$$ = 0;				}
X	|	flag_el flag
X		{	$$ = $1 | $2;			}
X	;
X
Xempty_el:	/* empty */
X	|	empty_l
X	;
X
Xempty_l	:	EMPTYLINE
X	|	empty_l EMPTYLINE
X	;
X
X%%
X
Xyyerror(s)
Xchar	*s;
X{
X	extern	int	yyleng;
X	extern	char	yytext[];
X	char		buf[80];
X
X	if (yychar <= 0)
X	{
X		sprintf(buf, "premature EOF");
X		yylineno--;
X	}
X	or (yytext[0] == '\n' || yytext[0] == '\f')
X		sprintf(buf, "%s at end of line", s);
X	or (isprint(yytext[0]))
X		sprintf(buf, "%s at symbol %s", s, yytext);
X	else
X		sprintf(buf, "%s at \\%o", s, yytext[0]);
X	
X	if (cakedebug)
X		printf("%s, %d: %s, token %d\n", yyfile, yylineno, buf, yychar);
X	else
X		printf("%s, %d: %s\n", yyfile, yylineno, buf);
X}
SHAR_EOF
if test 3523 -ne "`wc -c < 'cake_g.y'`"
then
	echo shar: "error transmitting 'cake_g.y'" '(should have been 3523 characters)'
fi
fi
echo shar: "extracting 'cake_s.l'" '(6441 characters)'
if test -f 'cake_s.l'
then
	echo shar: "will not over-write existing file 'cake_s.l'"
else
sed 's/^X//' << \SHAR_EOF > 'cake_s.l'
X%{
X/*
X**	Scanner for Cake
X*/
X
Xstatic	char
Xrcs_id[] = "$Header: /mip/zs/src/sys/cake/RCS/cake_s.l,v 1.15 87/10/05 20:13:49 zs Exp $";
X
X#include	"cake.h"
X#include	"cake_g.h"
X#include	<ctype.h>
X
X#ifdef	CAKEDEBUG
X#define	ret(x)	if (lexdebug) printf("lex: x\n"); return x
X#else
X#define	ret(x)	return x
X#endif
X
X/* YYLMAX must be defined here; it can't be defined in conf.h */
X#undef	YYLMAX
X#define	YYLMAX		MAXLEXBUF
X
X#define	LATE_CATCH
X#define	LATE_RECOVERY	printf("cake: token '%s' is too long\n", yytext); \
X			exit(1);
X
X#define	LBRACE	'{'
X#define	RBRACE	'}'
X
Xextern	char	*yysquare();
Xextern	char	*yycurly();
X
Xextern	int	lexdebug;
Xchar		*yyfile = "no input file";
Xbool		afterifdef = FALSE;
X%}
X
X%a	2500
X%o	5000
X
X%start	edge middle
X
Xpat	[a-zA-Z_0-9/%+-.,]
Xsp	[ \t]
Xnl	[\n\f]
Xnonl	[^\n\f]
Xenonl	({nonl}|\\{nl})
X
X%%
X
X"if"			{ BEGIN middle;	ret(IF);		}
X"and"			{ BEGIN middle;	ret(AND);		}
X"or"			{ BEGIN middle;	ret(OR);		}
X"not"			{ BEGIN middle;	ret(NOT);		}
X"in"			{ BEGIN middle;	ret(IN);		}
X"match"			{ BEGIN middle;	ret(MATCH);		}
X"exist"			{ BEGIN middle;	ret(EXIST);		}
X"cando"			{ BEGIN middle;	ret(CANDO);		}
X"ok"			{ BEGIN middle;	ret(OK);		}
X
X"("			{ BEGIN middle;	ret(LPAREN);		}
X")"			{ BEGIN middle;	ret(RPAREN);		}
X
X"@"			{ BEGIN middle;	ret(NONVOL);		}
X"!"			{ BEGIN middle;	ret(PRECIOUS);		}
X"&"			{ BEGIN middle;	ret(PSEUDO);		}
X"^"			{ BEGIN middle;	ret(REDUNDANT);		}
X"*"			{ BEGIN middle;	ret(WHEN);		}
X
X":"			|
X"::"			{
X				BEGIN middle;
X				yylval.Ustr = new_name(yytext);
X				ret(COLON);
X			}
X
X({pat}|\\{nonl})+	{
X				BEGIN middle;
X				yylval.Ustr = new_name(yytext);
X				ret(PAT);
X			}
X
X\"([^"]|\\\")*\"	{
X				BEGIN middle;
X				/* strip off quotes */
X				yytext[yyleng-1] = '\0';
X				yylval.Ustr = new_name(yytext+1);
X				ret(PAT);
X			}
X
X"[["			{
X				BEGIN middle;
X				yylval.Ustr = yysquare();
X				ret(PATCMD);
X			}
X
X"{{"			{
X				BEGIN middle;
X				yylval.Ustr = yycurly();
X				ret(TESTCMD);
X			}
X
X<middle>({sp}|\\{nl})*	{ BEGIN middle;			}
X
X<edge>[@!+-]*"{"{enonl}*{nl}	|
X<edge>[@!+-]*"}"{enonl}*{nl}	|
X<edge>{sp}+{enonl}+{nl}	{
X				BEGIN edge;
X				afterifdef  = FALSE;
X				yylval.Uact = prep_act(yytext);
X
X				/* comment out check_actlen if  */
X				/* have a lex driver with CATCH */
X				check_actlen();
X
X				/* braces around ret ARE needed */
X				/* as ret expands to an if stmt */
X				if (yylval.Uact->a_str[0] == LBRACE)
X				{
X					ret(BEGIN_ACT);
X				}
X				or (yylval.Uact->a_str[0] == RBRACE)
X				{
X					ret(END_ACT);
X				}
X				else
X				{
X					ret(ACT);
X				}
X			}
X
X<edge>"set"{nonl}*{nl}	{
X				BEGIN edge;
X				if (lexdebug)
X					printf("set line\n");
X				yyset(yytext);
X			}
X
X<edge>#{nonl}*{nl}	{
X				BEGIN edge;
X				if (lexdebug)
X					printf("hash line\n");
X				yyhash(yytext);
X				if (! afterifdef)
X					ret(EMPTYLINE);
X			}
X
X<edge>{sp}*{nl}		{
X				BEGIN edge;
X				if (lexdebug)
X					printf("empty line\n");
X				if (! afterifdef)
X					ret(EMPTYLINE);
X			}
X
X<middle>{nl}		{
X				BEGIN edge;
X				afterifdef = FALSE;
X				ret(NL);
X			}
X
X{nonl} 			{ BEGIN middle;	ret(GARBAGE);	}
X
X"$"{nonl}*{nl}		{ BEGIN edge;			}
X
X%%
X
Xyyinit()
X{
X	BEGIN edge;
X}
X
Xyywrap()
X{
X	return 1;
X}
X
Xyyset(text)
Xreg	char	text[];
X{
X	reg	char	*s;
X	int		setc;
X	char		*setv[MAXARGS];
X
X	for (s = text+4; *s != '\0' && isspace(*s); s++)
X		;
X
X	setc = parse_args(s, setv);
X	process_args(setv, &setc, 0);
X	if (setc > 0)
X		printf("cake: non-options on parameter line ignored\n");
X}
X
Xyyhash(text)
Xreg	char	text[];
X{
X	reg	char	*oldfile = yyfile;
X	reg	char	*s, *t;
X
X	afterifdef = TRUE;	/* assume so until proven otherwise */
X	if (sscanf(text+1, "%d", &yylineno) != 1)
X		return;
X
X	text[strlen(text)-1] = '\0';	/* clobber the newline */
X	for (s = text; *s != '\0' && *s != '"' && !isalpha(*s); s++)
X		;
X
X	if (*s == '\0')
X		return;
X	
X	if (*s != '"')
X		yyfile = new_name(s);
X	else
X	{
X		for (t = s+strlen(s)-1; t != s && *t != '"'; t--)
X			;
X		
X		if (t != s)
X			*t = '\0';
X
X		yyfile = new_name(s+1);
X	}
X
X	if (yyfile != oldfile)
X	{
X		afterifdef = FALSE;
X		return;
X	}
X}
X
X/*
X**	Read in a PATCMD, which is [[.*PATCMD?.*]]
X**	(or a matched set of double brackets with other stuff.
X**	Note that PATCMD cannot be described by a REAL regular
X**	expression; the one above cheats by using recursion.
X**	yysquare returns the PATCMD brackets and all.
X*/
X
Xchar *
Xyysquare()
X{
X	char		buf[MAXSIZE];
X	reg	int	c, c1;
X	reg	int	i;
X	reg	int	n;	/* number of outstanding levels */
X
X	n = 1;
X	i = 0;
X	buf[i++] = '[';
X	buf[i++] = '[';
X	for (c = input(); c != '\0' && c != '\n' && c != '\f'; c = input())
X	{
X		buf[i++] = c;
X		if (c == ']')
X		{
X			if ((c1 = input()) != ']')
X			{
X				/* for the next iteration */
X				unput(c1);
X				continue;
X			}
X
X			buf[i++] = c1;
X			if (--n > 0)
X				continue;
X
X			buf[i] = '\0';
X			if (strlen(buf) >= MAXSIZE)
X			{
X				fprintf(stderr, "cake internal error: buffer overflow in yysquare\n");
X				exit_cake(FALSE);
X			}
X
X			if (lexdebug)
X				printf("yysquare: %s\n", buf);
X
X			fflush(stdout);
X			return new_name(buf);
X		}
X		or (c == '[')
X		{
X			if ((c1 = input()) != '[')
X			{
X				/* for the next iteration */
X				unput(c1);
X				continue;
X			}
X
X			buf[i++] = c1;
X			n++;
X		}
X		or (c == '\\')
X		{
X			/* don't check next char */
X			if ((c1 = input()) != '\0')
X				buf[i++] = c1;
X		}
X	}
X
X	if (c == '\0')
X		fprintf(stderr, "%s, %d: premature EOF\n", yyfile, yylineno);
X	else
X		fprintf(stderr, "%s, %d: unescaped newline inside a command\n", yyfile, yylineno);
X
X	exit_cake(FALSE);
X}
X
X/*
X**	Read in a TESTCMD, which is {{.*}}. Strip the brackets.
X*/
X
Xchar *
Xyycurly()
X{
X	char		buf[MAXSIZE];
X	reg	int	c, c1;
X	reg	int	i;
X
X	i = 0;
X	for (c = input(); c != '\0' && c != '\n' && c != '\f'; c = input())
X	{
X		buf[i++] = c;
X		if (c == RBRACE)
X		{
X			if ((c1 = input()) != RBRACE)
X			{
X				/* for the next iteration */
X				unput(c1);
X				continue;
X			}
X
X			/* overwrite first RBRACE */
X			buf[--i] = '\0';
X			if (strlen(buf) >= MAXSIZE)
X			{
X				fprintf(stderr, "cake internal error: buffer overflow in yycurly\n");
X				exit_cake(FALSE);
X			}
X
X			if (lexdebug)
X				printf("yycurly: %s\n", buf);
X
X			fflush(stdout);
X			return new_name(buf);
X		}
X		or (c == '\\')
X		{
X			/* don't check next char */
X			if ((c1 = input()) != '\0')
X				buf[i++] = c1;
X		}
X	}
X
X	if (c == '\0')
X		fprintf(stderr, "%s, %d: premature EOF\n", yyfile, yylineno);
X	else
X		fprintf(stderr, "%s, %d: unescaped newline inside a command\n", yyfile, yylineno);
X
X	exit_cake(FALSE);
X}
X
Xcheck_actlen()
X{
X	if (strlen(yytext) >= YYLMAX)
X	{
X		printf("cake: action '%s' too long\n", yytext);
X		exit_cake(FALSE);
X	}
X}
SHAR_EOF
if test 6441 -ne "`wc -c < 'cake_s.l'`"
then
	echo shar: "error transmitting 'cake_s.l'" '(should have been 6441 characters)'
fi
fi
echo shar: "extracting 'conf.h'" '(1401 characters)'
if test -f 'conf.h'
then
	echo shar: "will not over-write existing file 'conf.h'"
else
sed 's/^X//' << \SHAR_EOF > 'conf.h'
X/*
X**	Cake configuration parameters.
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/conf.h,v 1.15 87/10/05 20:14:08 zs Exp $
X*/
X
X/* type used when type is not known */
Xtypedef	int	Cast;
X
X/* location of the systemwide cake library */
X#define	SLIB		"/u/pgrad/zs/lib/cake"
X
X/* suffix (after $HOME) of personal libraries */
X#define	ULIB		"/lib/cake"
X
X/* command to invoke the C preprocessor */
X#define	CPP		"/lib/cpp"
X
X/* location of the statistics file - if not defined, no stats kept */
X#define	STATS_FILE	"/u/pgrad/zs/lib/cake_stats"
X
X/* characters always requiring shell attention */
X#define	METACHARS	"*?!&|;<>()[]{}'`\"%$~#"
X
X/* default command to execute non-script shell actions */
X#define	SYSTEM_CMD	"/bin/csh -cf"
X
X/* default command to execute shell scripts */
X#define	SCRIPT_CMD	"/bin/csh -f"
X
X/*	System V compatibility			*/
X#ifdef	ATT
X/* the resolution of the times(2) system call */
X#ifdef	exlsi
X#define	TIMERES		100
X#else
X#define	TIMERES		60
X#endif
X
X#include		"port.h"
X
X#define	vfork()		fork()
X#define	index(s, c)	strchr(s, c)
X#define	rindex(s, c)	strrchr(s, c)
X#endif
X
X#define	MAXARGS		64
X#define	MAXGSTACK	128
X#define	MAXARGSIZE	128
X#define	MAXPATSIZE	512
X#define	MAXLEXBUF	2048
X#define	MAXSIZE		2048
X#define	MAXSCRIPT	16384
X#define	MAXNEST		8
X#define	SIZE		97		/* size of tables */
X#define	CHARSETSIZE	256
X#define	GENESIS		(time_t) 42	/* something distinctive */
X#define	CHASEROOT	"!MAINCAKE!"
SHAR_EOF
if test 1401 -ne "`wc -c < 'conf.h'`"
then
	echo shar: "error transmitting 'conf.h'" '(should have been 1401 characters)'
fi
fi
echo shar: "extracting 'extern.h'" '(1540 characters)'
if test -f 'extern.h'
then
	echo shar: "will not over-write existing file 'extern.h'"
else
sed 's/^X//' << \SHAR_EOF > 'extern.h'
X/*
X**	External definitions for Cake.
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/extern.h,v 1.15 87/10/05 20:14:30 zs Exp $
X*/
X
X/* library functions */
Xextern	char	*malloc();
X#ifdef	ATT
Xextern	char	*strchr();
Xextern	char	*strrchr();
X#else
Xextern	char	*index();
Xextern	char	*rindex();
X#endif
X
X/* memory management */
Xextern	Cast	newmem();
Xextern		oldmem();
X
X/* make routines */
Xextern	Node	*make_node();
Xextern	Entry	*make_dep();
Xextern	Test	*make_test_mm();
Xextern	Test	*make_test_m();
Xextern	Test	*make_test_c();
Xextern	Test	*make_test_s();
Xextern	Test	*make_test_l();
Xextern	Test	*make_test_b();
Xextern	Test	*make_test_u();
Xextern	Pat	*make_pat();
Xextern	Act	*make_act();
X
Xextern	Act	*prep_act();
Xextern	Act	*prep_script();
X
X/* table handling routines */
Xextern		init_sym();
Xextern	char	*new_name();
X
X/* printout routines */
Xextern	char	scratchbuf[];
Xextern		print_pat();
Xextern		print_test();
Xextern		print_entry();
Xextern		print_node();
X
X/* flags */
Xextern	int	Gflag;
Xextern	int	Lflag;
Xextern	int	Rflag;
Xextern	int	Xflag;
Xextern	int	bflag;
Xextern	int	cflag;
Xextern	int	dflag;
Xextern	int	gflag;
Xextern	int	iflag;
Xextern	int	kflag;
Xextern	int	nflag;
Xextern	int	qflag;
Xextern	int	rflag;
Xextern	int	sflag;
Xextern	int	tflag;
Xextern	int	vflag;
Xextern	int	wflag;
Xextern	int	xflag;
Xextern	int	zflag;
X
Xextern	int	cakedebug;
Xextern	int	entrydebug;
Xextern	int	patdebug;
Xextern	int	lexdebug;
X
X/* misc global vars */
Xextern	char	*cakefile;
Xextern	int	maxprocs;
X
X/* misc functions */
Xextern	char	*get_newname();
Xextern		put_trail();
Xextern		get_trail();
SHAR_EOF
if test 1540 -ne "`wc -c < 'extern.h'`"
then
	echo shar: "error transmitting 'extern.h'" '(should have been 1540 characters)'
fi
fi
echo shar: "extracting 'list.h'" '(1206 characters)'
if test -f 'list.h'
then
	echo shar: "will not over-write existing file 'list.h'"
else
sed 's/^X//' << \SHAR_EOF > 'list.h'
X/*
X**	Definitions for the list module.
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/list.h,v 1.15 87/10/05 20:14:45 zs Exp $
X*/
X
Xtypedef	struct	s_list
X{
X	Cast		l_data;
X	struct	s_list	*l_prev;
X	struct	s_list	*l_next;
X} List;
X
X#define	next(ptr)	(ptr)->l_next
X#define	prev(ptr)	(ptr)->l_prev
X#define	ldata(ptr)	(ptr)->l_data
X#define	first_ptr(list)	((list)->l_next)
X#define	last_ptr(list)	((list)->l_prev)
X#define	first(list)	((list)->l_next->l_data)
X#define	last(list)	((list)->l_prev->l_data)
X
X#define	for_list(p, l)	for (p = (l? next(l): NULL); p != l && p != NULL; p = next(p))
X#define	for_2list(p1, p2, l1, l2)	for \
X			(p1 = (l1? next(l1): NULL), p2 = (l2? next(l2): NULL); \
X			p1 != l1 && p1 != NULL && p2 != l2 && p2 != NULL; \
X			p1 = next(p1), p2 = next(p2))
X#define	end_list(p, l)	(p == l || p == NULL)
X
X#define	makelist(d)		_makelist((Cast) d)
X#define	addhead(l, d)		_addhead(l, (Cast) d)
X#define	addtail(l, d)		_addtail(l, (Cast) d)
X#define	insert_before(l, w, d)	_insert_before(l, w, (Cast) d)
X#define	insert_after(l, w, d)	_insert_after(l, w, (Cast) d)
X
Xextern	List	*makelist0();
Xextern	List	*_makelist();
Xextern	List	*_addhead();
Xextern	List	*_addtail();
Xextern	List	*addlist();
Xextern		delete();
SHAR_EOF
if test 1206 -ne "`wc -c < 'list.h'`"
then
	echo shar: "error transmitting 'list.h'" '(should have been 1206 characters)'
fi
fi
echo shar: "extracting 'macro.h'" '(1029 characters)'
if test -f 'macro.h'
then
	echo shar: "will not over-write existing file 'macro.h'"
else
sed 's/^X//' << \SHAR_EOF > 'macro.h'
X/*
X**	Common macros for Cake
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/macro.h,v 1.15 87/10/05 20:14:48 zs Exp $
X*/
X
X#define	checkpatlen(p)	if (strlen(p) > MAXPATSIZE) \
X			printf("Pattern %s too long\n", p), exit_cake(FALSE)
X#define	cdebug		if (cakedebug) printf
X
X#ifndef	CAKEDEBUG
X#define	put_trail(func, event)
X#define	get_trail(fp)
X#endif
X
X/*	Flag handling				*/
X
X#define	on_node(n, f)		((n)->n_flag & (f))
X#define	off_node(n, f)		(!((n)->n_flag & (f)))
X#define	set_node(n, f)		(n)->n_flag |= (f)
X#define	reset_node(n, f)	(n)->n_flag &= ~(f)
X
X#define	on_pat(p, f)		((p)->p_flag & (f))
X#define	off_pat(p, f)		(!((p)->p_flag & (f)))
X#define	set_pat(p, f)		(p)->p_flag |= (f)
X#define	reset_pat(p, f)		(p)->p_flag &= ~(f)
X
X#define	on_act(a, f)		((a)->a_flag & (f))
X#define	off_act(a, f)		(!((a)->a_flag & (f)))
X#define	set_act(a, f)		(a)->a_flag |= (f)
X#define	reset_act(a, f)		(a)->a_flag &= ~(f)
X
X#define	is_ok(n)		((n)->n_kind == n_OK)
X#define	is_cando(n)		((n)->n_kind == n_CANDO)
X#define	is_noway(n)		((n)->n_kind == n_NOWAY)
SHAR_EOF
if test 1029 -ne "`wc -c < 'macro.h'`"
then
	echo shar: "error transmitting 'macro.h'" '(should have been 1029 characters)'
fi
fi
echo shar: "extracting 'port.h'" '(2793 characters)'
if test -f 'port.h'
then
	echo shar: "will not over-write existing file 'port.h'"
else
sed 's/^X//' << \SHAR_EOF > 'port.h'
X/*
X**	Cake portability aids.
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/port.h,v 1.15 87/10/05 20:15:28 zs Exp $
X*/
X
X/* too long names */
X#define	cake_abort	c_abort
X#define	cake_error	c_error
X#define	cake_exec	c_exec
X#define	cake_finish	c_finish
X#define	cake_gettime	c_gettime
X#define	cake_pclose	c_pclose
X#define	cake_popen	c_popen
X#define	cake_remove	c_remove
X#define	cake_script	c_script
X#define	cake_system	c_system
X#define	cake_utimes	c_utimes
X#define	cake_wait	c_wait
X#define	chase		chs
X#define	chase_node	chs_node
X#define	cppargc		cppcarg
X#define	cppargv		cppvarg
X#define	deref		drf
X#define	deref_entry	drf_entry
X#define	dir_finish	dr_finish
X#define	dir_setup	dr_setup
X#define	dir_start	dr_start
X#define	entry_anay	en_nay
X#define	entry_ayea	en_yea
X#define	expand_cmds	ex_cmds
X#define	find_path	fd_path
X#define	find_process	fd_proc
X#define	found_incl	fnd_incl
X#define	found_main	fnd_main
X#define	get_allnodes	g_allnodes
X#define	get_cmd_result	gc_result
X#define	get_cmd_status	gc_status
X#define	get_newname	g_newname
X#define	get_output	g_output
X#define	get_savename	g_savename
X#define	get_utime	g_utime
X#define	get_youngest	g_youngest
X#define	goal_stackp	gs_p
X#define	ground		gr
X#define	ground_entry	gr_entry
X#define	ground_test	gr_test
X#define	init_chase	i_chase
X#define	init_entry	i_entry
X#define	init_sym	i_sym
X#define	make_act	m_act
X#define	make_cmd	m_cmd
X#define	make_dep	m_dep
X#define	make_node	m_node
X#define	make_pat	m_pat
X#define	make_test_b	m_btest
X#define	make_test_c	m_ctest
X#define	make_test_l	m_ltest
X#define	make_test_m	m_mtest
X#define	make_test_mm	m_mmtest
X#define	make_test_s	m_stest
X#define	make_test_u	m_utest
X#define	makelist0	m_0list
X#define	miss_anay	ms_nay
X#define	miss_ayea	ms_yea
X#define	mutex_lock	mx_lock
X#define	mutex_unlock	mx_unlock
X#define	name_equal	nm_equal
X#define	name_key	nm_key
X#define	new_cmd		nw_cmd
X#define	new_name	nw_name
X#define	node_resetstat	nd_resetstat
X#define	node_setstat	nd_setstat
X#define	node_stat	nd_stats
X#define	picked_time	pck_time
X#define	prep_act	pp_act
X#define	prep_entries	pp_entries
X#define	prep_script	pp_script
X#define	print_act	pr_act
X#define	print_entry	pr_entry
X#define	print_node	pr_node
X#define	print_pat	pr_pat
X#define	print_test	pr_test
X#define	print_time	pr_time
X#define	script_filename	scr_fn
X#define	set_buddies	st_buddies
X#define	set_flag	st_flag
X#define	shell_cmd	sh_cmd
X#define	shell_opt	sh_opt
X#define	shell_path	sh_path
X#define	signalint	sg_int
X#define	signalquit	sg_quit
X#define	spawn_finish	sp_finish
X#define	spawn_start	sp_start
X#define	stat_tried	st_tried
X#define	str_aflag	s_aflag
X#define	str_nkind	s_nkind
X#define	str_pflag	s_pflag
X#define	warn_equal	w_equal
X#define	warn_key	w_key
X
X/* case sensitive variable names */
X#define	Gflag		ggflag
X#define	Lflag		llflag
X#define	Rflag		rrflag
X#define	Xflag		xxflag
SHAR_EOF
if test 2793 -ne "`wc -c < 'port.h'`"
then
	echo shar: "error transmitting 'port.h'" '(should have been 2793 characters)'
fi
fi
echo shar: "extracting 'std.h'" '(942 characters)'
if test -f 'std.h'
then
	echo shar: "will not over-write existing file 'std.h'"
else
sed 's/^X//' << \SHAR_EOF > 'std.h'
X/*
X**	Standard definitions for C
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/std.h,v 1.15 87/10/05 20:16:04 zs Exp $
X*/
X
X#define	or		else if
X#define	when		break;case
X#define	otherwise	break;default
X#define	loop		for(;;)
X#define	until(expr)	while(!(expr))
X#ifndef	reg
X#define	reg		register
X#endif
X#ifndef	bool
X#define	bool		char
X#endif
X
X#define	max(a, b)	((a) > (b) ? (a) : (b))
X#define	min(a, b)	((a) < (b) ? (a) : (b))
X
X#define streq(s1, s2)		(strcmp(s1, s2) == 0)
X#define strdiff(s1, s2)		(strcmp(s1, s2) != 0)
X#define strneq(s1, s2, n)	(strncmp(s1, s2, n) == 0)
X#define strndiff(s1, s2, n)	(strncmp(s1, s2, n) != 0)
X
X#define	ungetchar(c)		ungetc(c, stdin)
X#define make(type)		((type *) newmem(sizeof(type)))
X#define make_many(type, count)	((type *) newmem(count * sizeof(type)))
X
X#ifndef	TRUE
X#define	TRUE		1
X#endif
X#ifndef	FALSE
X#define	FALSE		0
X#endif
X#ifndef	NULL
X#define	NULL		0
X#endif
X
X#define	CNULL		(char *) 0
X#define	LNULL		(List *) 0
SHAR_EOF
if test 942 -ne "`wc -c < 'std.h'`"
then
	echo shar: "error transmitting 'std.h'" '(should have been 942 characters)'
fi
fi
echo shar: "extracting 'table.h'" '(837 characters)'
if test -f 'table.h'
then
	echo shar: "will not over-write existing file 'table.h'"
else
sed 's/^X//' << \SHAR_EOF > 'table.h'
X/*
X**	Definitions for the table module.
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/table.h,v 1.14 86/07/19 12:24:13 zs Exp $
X*/
X
Xtypedef	struct	s_table
X{
X	int	ta_size;	/* the size of the store	*/
X	List	**ta_store;	/* the store, an array of lists	*/
X	Cast	(*ta_key)();	/* applied to entries		*/
X	int	(*ta_hash)();	/* applied to keys		*/
X	bool	(*ta_equal)();	/* applied to two keys		*/
X} Table;
X
X#define	init_table(t)		_init_table(&t)
X#define	lookup_table(t, k)	_lookup_table(&t, (Cast) k)
X#define	insert_table(t, e)	_insert_table(&t, (Cast) e)
X#define	contents_table(t)	_contents_table(&t)
X
X#define	tablekey(table)		(*(table->ta_key))
X#define	tablehash(table)	(*(table->ta_hash))
X#define	tableequal(table)	(*(table->ta_equal))
X
Xextern		_init_table();
Xextern	Cast	_lookup_table();
Xextern	bool	_insert_table();
Xextern	List	*_contents_table();
SHAR_EOF
if test 837 -ne "`wc -c < 'table.h'`"
then
	echo shar: "error transmitting 'table.h'" '(should have been 837 characters)'
fi
fi
echo shar: "extracting 'wait.h'" '(2707 characters)'
if test -f 'wait.h'
then
	echo shar: "will not over-write existing file 'wait.h'"
else
sed 's/^X//' << \SHAR_EOF > 'wait.h'
X/*
X**	Compatibility for ATT versions of Unix
X**	with Berkeley's wait system calls.
X**
X**	$Header: /mip/zs/src/sys/cake/RCS/wait.h,v 1.14 86/07/19 12:24:22 zs Exp $
X*/
X
X#ifdef	ATT
X/*
X * Copyright (c) 1982 Regents of the University of California.
X * All rights reserved.  The Berkeley software License Agreement
X * specifies the terms and conditions for redistribution.
X *
X *	@(#)wait.h	6.2 (Berkeley) 6/8/85
X */
X
X/*
X * This file holds definitions relevent to the wait system call.
X * Some of the options here are available only through the ``wait3''
X * entry point; the old entry point with one argument has more fixed
X * semantics, never returning status of unstopped children, hanging until
X * a process terminates if any are outstanding, and never returns
X * detailed information about process resource utilization (<vtimes.h>).
X */
X
X/*
X * Structure of the information in the first word returned by both
X * wait and wait3.  If w_stopval==WSTOPPED, then the second structure
X * describes the information returned, else the first.  See WUNTRACED below.
X */
Xunion wait	{
X	int	w_status;		/* used in syscall */
X	/*
X	 * Terminated process status.
X	 */
X	struct {
X		unsigned short	w_Termsig:7;	/* termination signal */
X		unsigned short	w_Coredump:1;	/* core dump indicator */
X		unsigned short	w_Retcode:8;	/* exit code if w_termsig==0 */
X	} w_T;
X	/*
X	 * Stopped process status.  Returned
X	 * only for traced children unless requested
X	 * with the WUNTRACED option bit.
X	 */
X	struct {
X		unsigned short	w_Stopval:8;	/* == W_STOPPED if stopped */
X		unsigned short	w_Stopsig:8;	/* signal that stopped us */
X	} w_S;
X};
X#define	w_termsig	w_T.w_Termsig
X#define w_coredump	w_T.w_Coredump
X#define w_retcode	w_T.w_Retcode
X#define w_stopval	w_S.w_Stopval
X#define w_stopsig	w_S.w_Stopsig
X
X
X#define	WSTOPPED	0177	/* value of s.stopval if process is stopped */
X
X/*
X * Option bits for the second argument of wait3.  WNOHANG causes the
X * wait to not hang if there are no stopped or terminated processes, rather
X * returning an error indication in this case (pid==0).  WUNTRACED
X * indicates that the caller should receive status about untraced children
X * which stop due to signals.  If children are stopped and a wait without
X * this option is done, it is as though they were still running... nothing
X * about them is returned.
X */
X#define WNOHANG		1	/* dont hang in wait */
X#define WUNTRACED	2	/* tell about stopped, untraced children */
X
X#define WIFSTOPPED(x)	((x).w_stopval == WSTOPPED)
X#define WIFSIGNALED(x)	((x).w_stopval != WSTOPPED && (x).w_termsig != 0)
X#define WIFEXITED(x)	((x).w_stopval != WSTOPPED && (x).w_termsig == 0)
X#else
X#include	<sys/wait.h>
X
X#define mask(s)	(1 << ((s)-1))
X#endif
X
Xtypedef	union wait	Wait;
SHAR_EOF
if test 2707 -ne "`wc -c < 'wait.h'`"
then
	echo shar: "error transmitting 'wait.h'" '(should have been 2707 characters)'
fi
fi
exit 0
#	End of shell archive