210 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Id$ */
 | |
| /*
 | |
|  * (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>
 | |
| #include <string.h>
 | |
| #include <stdlib.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(unsigned int);
 | |
| 
 | |
| char *include_line(char *);
 | |
| int dofile(char *);
 | |
| 
 | |
| char *Malloc(u)
 | |
| 	unsigned u;
 | |
| {
 | |
| 	char *sp;
 | |
| 
 | |
| 	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));
 | |
| }
 | |
| 
 | |
| void free_namelist(struct namelist *nlp)
 | |
| {
 | |
| 	if (nlp)
 | |
| 	{
 | |
| 		free_namelist(nlp->next);
 | |
| 		nlp->next = freelist;
 | |
| 		freelist = nlp;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void add_name(char *nm)
 | |
| {
 | |
| 	struct namelist *nlp = nl, *lnlp = 0, *nnlp;
 | |
| 
 | |
| 	while (nlp)
 | |
| 	{
 | |
| 		register int 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;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void print_namelist(char *nm, struct namelist *nlp)
 | |
| {
 | |
| 	while (nlp)
 | |
| 	{
 | |
| 		if (!dflag)
 | |
| 			printf("%s: ", nm);
 | |
| 		printf("%s\n", nlp->name);
 | |
| 		nlp = nlp->next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| int main(int argc, 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(register char *s)
 | |
| {
 | |
| 	while (*s)
 | |
| 		if (*s++ == '/')
 | |
| 			return 1;
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int dofile(char *fn)
 | |
| {
 | |
| 	char buf[BSIZ];
 | |
| 	FILE *fp;
 | |
| 	char *nm;
 | |
| 
 | |
| 	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(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;
 | |
| }
 |