201 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Header$ */
 | 
						|
/*
 | 
						|
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						|
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 | 
						|
 */
 | 
						|
/* make dependencies; Date: jan 07, 1986; Author: Erik Baalbergen */
 | 
						|
/* Log:
 | 
						|
	[Thu Oct  6 09:56:30 MET 1988; erikb]
 | 
						|
	Added option '-d' which suppresses "file.c :" be printed
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
#define BSIZ 1024
 | 
						|
char *prog;
 | 
						|
 | 
						|
int dflag = 0;	/* suppress "file.c :" */
 | 
						|
 | 
						|
struct namelist {
 | 
						|
	struct namelist *next;
 | 
						|
	char *name;
 | 
						|
};
 | 
						|
 | 
						|
struct namelist *freelist;
 | 
						|
struct namelist *new_namelist();
 | 
						|
struct namelist *nl = 0;
 | 
						|
 | 
						|
char *Malloc(u)
 | 
						|
	unsigned u;
 | 
						|
{
 | 
						|
	char *sp, *malloc();
 | 
						|
 | 
						|
	if ((sp = malloc(u)) == 0) {
 | 
						|
		fprintf(stderr, "%s: out of space\n");
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	return sp;
 | 
						|
}
 | 
						|
 | 
						|
struct namelist *
 | 
						|
new_namelist()
 | 
						|
{
 | 
						|
	register struct namelist *nlp = freelist;
 | 
						|
 | 
						|
	if (nlp) {
 | 
						|
		freelist = nlp->next;
 | 
						|
		return nlp;
 | 
						|
	}
 | 
						|
 | 
						|
	return (struct namelist *) Malloc(sizeof(struct namelist));
 | 
						|
}
 | 
						|
 | 
						|
free_namelist(nlp)
 | 
						|
	struct namelist *nlp;
 | 
						|
{
 | 
						|
	if (nlp) {
 | 
						|
		free_namelist(nlp->next);
 | 
						|
		nlp->next = freelist;
 | 
						|
		freelist = nlp;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
add_name(nm)
 | 
						|
	char *nm;
 | 
						|
{
 | 
						|
	struct namelist *nlp = nl, *lnlp = 0, *nnlp;
 | 
						|
	char *strcpy();
 | 
						|
 | 
						|
	while (nlp) {
 | 
						|
		register i = strcmp(nm, nlp->name);
 | 
						|
		if (i < 0)
 | 
						|
			break;
 | 
						|
		if (i == 0)	/* already present */
 | 
						|
			return;
 | 
						|
		lnlp = nlp;
 | 
						|
		nlp = nlp->next;
 | 
						|
	}
 | 
						|
 | 
						|
	(nnlp = new_namelist())->name = strcpy(Malloc((unsigned)strlen(nm) + 1), nm);
 | 
						|
 | 
						|
	if (lnlp) {
 | 
						|
		nnlp->next = lnlp->next;
 | 
						|
		lnlp->next = nnlp;
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		nnlp->next = nl;
 | 
						|
		nl = nnlp;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
print_namelist(nm, nlp)
 | 
						|
	char *nm;
 | 
						|
	struct namelist *nlp;
 | 
						|
{
 | 
						|
	while (nlp) {
 | 
						|
		if (!dflag)
 | 
						|
			printf("%s: ", nm);
 | 
						|
		printf("%s\n", nlp->name);
 | 
						|
		nlp = nlp->next;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
main(argc, argv)
 | 
						|
	char *argv[];
 | 
						|
{
 | 
						|
	int err = 0;
 | 
						|
 | 
						|
	prog = *argv++;
 | 
						|
	if (*argv && **argv == '-') {
 | 
						|
		char *opt = &(*argv++)[1];
 | 
						|
 | 
						|
		if (*opt++ != 'd' || *opt) {
 | 
						|
			fprintf(stderr, "use: %s [-d] [file ...]\n", prog);
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
		dflag = 1;
 | 
						|
	}
 | 
						|
 | 
						|
	while (*argv) {
 | 
						|
		free_namelist(nl);
 | 
						|
		nl = 0;
 | 
						|
		if (dofile(*argv) == 0)
 | 
						|
			++err;
 | 
						|
		print_namelist(*argv++, nl);
 | 
						|
	}
 | 
						|
	exit(err ? 1 : 0);
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
contains_slash(s)
 | 
						|
	register char *s;
 | 
						|
{
 | 
						|
	while (*s)
 | 
						|
		if (*s++ == '/') return 1;
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
extern char *fgets();
 | 
						|
 | 
						|
dofile(fn)
 | 
						|
	char *fn;
 | 
						|
{
 | 
						|
	char buf[BSIZ];
 | 
						|
	FILE *fp;
 | 
						|
	char *nm, *include_line();
 | 
						|
 | 
						|
	if ((fp = fopen(fn, "r")) == 0) {
 | 
						|
		fprintf(stderr, "%s: cannot read %s\n", prog, fn);
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	if (contains_slash(fn)) {
 | 
						|
		fprintf(stderr, "%s: (warning) %s not in current directory; not checked\n", prog, fn);
 | 
						|
		fclose(fp);
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	while (fgets(buf, BSIZ, fp) != NULL)
 | 
						|
		if (nm = include_line(buf)) {
 | 
						|
			add_name(nm);
 | 
						|
			if (dofile(nm)) ;
 | 
						|
		}
 | 
						|
 | 
						|
	fclose(fp);
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
char *
 | 
						|
include_line(s)
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	while ((*s == '\t') || (*s == ' '))
 | 
						|
		s++;
 | 
						|
	
 | 
						|
	if (*s++ == '#') {
 | 
						|
		while ((*s == '\t') || (*s == ' '))
 | 
						|
			s++;
 | 
						|
		if (
 | 
						|
			(*s++ == 'i') &&
 | 
						|
			(*s++ == 'n') &&
 | 
						|
			(*s++ == 'c') &&
 | 
						|
			(*s++ == 'l') &&
 | 
						|
			(*s++ == 'u') &&
 | 
						|
			(*s++ == 'd') &&
 | 
						|
			(*s++ == 'e')
 | 
						|
		) {
 | 
						|
			while ((*s == '\t') || (*s == ' '))
 | 
						|
				s++;
 | 
						|
			if (*s++ == '"') {
 | 
						|
				char *nm = s;
 | 
						|
 | 
						|
				while (*s != 0 && *s != '"')
 | 
						|
					s++;
 | 
						|
				*s = '\0';
 | 
						|
				return nm;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return (char *) 0;
 | 
						|
}
 |