#ident	"@(#)make:defs	1.26"

#include <stdio.h>
#include <string.h>
#include <sys/types.h>	/* time_t */
#include <dirent.h>

#ifdef NO_XPG3_HDR
#	include <unistd.h>
#endif

#ifdef __STDC__
#	include <stdlib.h>
#else
	extern char *malloc();
	extern char *calloc();
	extern char *realloc();
	extern void free();
#endif

#include <sys/param.h>

/***	defs.h	-	global make header file	***/

/**		Function Macros			**/

#define PRESTIME()	time( (long) NULL )
#define ALLOC(x)	(struct x *)intalloc(sizeof(struct x))
#ifndef MAXPATHLEN
#define MAXPATHLEN 1024
#endif
#define ANY(a, b)	strchr(a, b)
#define	SRCHNAME(s)	hashfind(s)
#define STREQ(a, b)	(strcmp((a), (b)) == 0)
#define IS_ON(a)	( Mflags & (a) )
#define IS_OFF(a)	( !IS_ON(a) )

/**		Macros for array sizes			**/
#define	SUFF_SIZE	20	/* max. size for suffix rule string */
#define BUF_SIZE	512	/* max. size for a string */
#define ARGV_SIZE	200	/* Init. size for argv, used by exec. */
#define	MAX_INC		20	/* Max. include of include  by a makefile */
#define CHAR_LIST	256	/* Max funny characters = 2**8 */


/**		Macros for special characters		**/

#define PROMPT  "\t"	/* other systems -- pick what you want */

#define NEWLINE	'\n'
#define CNULL	'\0'
#define BLANK	' '
#define TAB	'\t'
#define DOT	'.'
#define WIGGLE	'~'
#define AT	'@'
#define MINUS	'-'
#define EQUALS	'='
#define SLASH	'/'
#define STAR	'*'
#define LCURLY	'{'
#define RCURLY	'}'
#define LPAREN	'('
#define RPAREN	')'
#define LSQUAR	'['
#define RSQUAR	']'
#define QUESTN	'?'
#define KOLON	':'
#define SKOLON	';'
#define DOLLAR	'$'
#define GREATR	'>'
#define POUND	'#'
#define EXCLAM	'!'
#define BACKSLASH	'\\'

/**		Flags		**/

#define CORRECT 00000001		/* enforce makefile correctness */
#define ENVOVER	00000002		/* environ overides file defines */
#define EXPORT	00000004		/* export current variable to env */
#define PRTR		00000010		/* print macros and target descriptions */
#define SIL			00000020		/* execute silently */
#define NOEX		00000040		/* don't execute commands */
#define INTRULE	00000100		/* use internal rules */
#define TOUCH		00000200		/* touch (update) out-of-date files */
#define GET			00000400		/* do a $(GET) if file not found */
#define QUEST		00001000		/* set `-q' flag */
#define INARGS	00002000		/* currently reading cmd args */
#define IGNERR	00004000		/* ignore errors */
#define KEEPGO	00010000		/* continue on other branches */
#define GF_KEEP	00020000		/* keep auto get files */
#define MH_DEP	00040000		/* use old question about whether cmd exists */
#define UCBLD		00100000		/* unconditional build */
#define TRACK		00200000		/* track the object files */

/*  debugging information can be installed by compiling in MKDEBUG
**	i.e.	cc -DMKDEBUG
*/
#ifdef MKDEBUG
#define DBUG		01000000		/* debug flag */
#endif
#define WARN		02000000		/* set on warning msgs. */
#define PAR			04000000		/* set on parallel */
#define BLOCK  010000000	/* set on parallel's target output blocking */

/*	flags for get()		*/


#define NO 	0
#define YES 	1

	/* Parallel defintions	*/

#define	D_INIT		0		/* Don't know what to do yet with this target */
#define	D_START		1		/* Start processing to update this target */
#define D_MUTEX		2		/* This target in MUTEX now; Do not eval it*/
#define D_NOEVAL	3		/* This target is not ready to be eval. yet */
#define D_DONAME	4		/* Call from pwait; this target is ready to be eval now*/
#define	D_READY		5		/* This target ready to be rebuild now */
#define	D_PROC		6		/* This target's dep. in process now */
#define	D_REBUILD	7		/* This target need rebuild */
#define	D_RUN			8		/* A background process is runing to update this target */
#define	D_RUN_IGN	9		/* See above; But this command uses the ignore option */
#define	D_NEXT		10 	/* Next command of a command block in process now */
#define D_CHECK		11
#define D_OK			12	/* This target was already in update stat;nothing to do */
#define	D_UPDATE	13	/* This target is up to date now - DONE */
#define	D_ERROR		14	/* An Error accured while updating this target */

#define IS_RUN(t)	(t->done == D_RUN || t->done == D_RUN_IGN)
#define IS_PROC(t)	(IS_RUN(t) || t->done == D_PROC || t->done == D_REBUILD)
#define IS_UP(t)	( t->done == D_UPDATE || t->done == D_ERROR)
#define IS_DONE(t)	( IS_UP(t) || t->done == D_OK)

#define PARALLEL	2 	/* default max. no. of parallel proc. */


#define NCHARS   500
#define NINTS    250
#define OUTMAX  10000
#define MAXVPATHLEN	 MAXPATHLEN*1
#define MAXVPATHDIR	10	/* Max number of viewpath directories */
#define LRGINT 077777

#define ALLDEPS  	1
#define SOMEDEPS 	2

#define META 		01
#define TERMINAL	02

/* define FSTATIC to be static on systems with C compilers
 * supporting file-static; otherwise define it to be null
 */
#define FSTATIC static

/**		Type definitions		**/

typedef char *	CHARSTAR;
typedef struct lineblock *	LINEBLOCK;
typedef struct depblock *	DEPBLOCK;

typedef struct shblock {
	struct shblock *nextsh;
	CHARSTAR shbp;
} *SHBLOCK;

typedef struct macrol{
	struct macrol *nextmacro;
	char mnamep[2];
	CHARSTAR mdefp;
} *MACROL;

typedef struct shenv{
	struct shenv *nextshenv;
	DEPBLOCK depp;
	SHBLOCK shp;
	MACROL macrolp;
} *SHENV;

typedef struct nameblock {

	struct nameblock *nextname,	/* pointer to next nameblock */
			 *backname;	/* pointer to predecessor */
	CHARSTAR namep,		/* ASCII name string and*/
		alias;		/*  alias, when namep translates to
				 * 	another pathstring.
				 */
	SHENV shenvp;	/* pointer to the macros that has to be restore in parallel */
	FILE *tbfp; 	/* tmp block file pointer ; hold the blocking output */
	LINEBLOCK linep;	/* pointer to dependents */
	time_t	modtime;	/* set by exists() */
	char	done,		/* 	finished?		*/
		septype,	/*	single or double ':' 	*/
		rundep;		/* 	runtime translation done? */

} *NAMEBLOCK;


typedef struct ready_list{
	struct ready_list *nextready;
	NAMEBLOCK tarp;
} *READY_LIST;

typedef struct run_list{
	struct run_list *nextrun;
	NAMEBLOCK tarp;
	int pid; /* shell process id that build this target in parallel*/
} *RUN_LIST;

struct lineblock {
	LINEBLOCK nextline;
	DEPBLOCK depp;
	SHBLOCK shp;
};

struct depblock {
	DEPBLOCK nextdep;
	NAMEBLOCK depname;
};

typedef struct chain {
	struct chain *nextchain;
	union {
		CHARSTAR charstar;
		NAMEBLOCK nameblock;
	} datap;
} *CHAIN;

typedef struct varblock {
	struct varblock *nextvar;
	CHARSTAR varname;
	union {
		CHARSTAR charstar;
		CHAIN chain;
	} varval;

	char	noreset,
		used,
		envflg,
		v_aflg;
} *VARBLOCK;

typedef struct pattern {
	struct pattern *nextpattern;
	CHARSTAR patval;
} *PATTERN;

typedef struct s_opendir {
	struct s_opendir *nextopendir;
	DIR	*dirfc;
	CHARSTAR dirn;
} *OPENDIR;

CHARSTAR copys(), copstr(), concat(), compath(),
	dname(), sname(), strrchr(), strchr();

void cat();

int *intalloc();		/* misc.c */
NAMEBLOCK makename();			/* misc.c */
NAMEBLOCK hashfind();			/* misc.c */
VARBLOCK varptr();			/* misc.c */
void	mkexit();			/* misc.c */
void	fatal(), fatal1();		/* misc.c */
char *ck_malloc();			/* misc.c */
extern char funny[CHAR_LIST];		/* main.c */

extern char *cur_makefile;
extern int parallel;
extern char tmp_block[];
extern int nproc;
extern NAMEBLOCK firstname;
extern OPENDIR	firstod;
extern CHARSTAR *environ;
/*
extern CHARSTAR *linesptr;
*/
extern int	Mflags,
		okdel,
		end;		/* loader value for end of core */

extern FILE 	*fin;
extern char	Nullstr[];

