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;
 | |
| }
 |