*** empty log message ***
This commit is contained in:
		
							parent
							
								
									83e08e04d7
								
							
						
					
					
						commit
						991df05826
					
				
					 3 changed files with 1044 additions and 0 deletions
				
			
		
							
								
								
									
										465
									
								
								util/cmisc/cclash.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										465
									
								
								util/cmisc/cclash.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,465 @@ | ||||||
|  | /*
 | ||||||
|  | 	cclash: find clashing names within C programs | ||||||
|  | 
 | ||||||
|  | 	Flags: | ||||||
|  | 	-c		: produce oldname=newname line for each clashing id | ||||||
|  | 			  (useful input for cid) | ||||||
|  | 	-l<num>		: check identifiers of <num> or more characters | ||||||
|  | 			  (default <num> = 8) | ||||||
|  | 	-m		: output a #define for each clashing id | ||||||
|  | 
 | ||||||
|  | 	Author: Erik Baalbergen | ||||||
|  | 	Date: Nov 8, 1985 | ||||||
|  | 
 | ||||||
|  | 	Revised: Dec 10, 1985 | ||||||
|  | 		C keywords are not listed | ||||||
|  | 	Revised: Aug 27, 1986 | ||||||
|  | 		Skip C numeric constants | ||||||
|  | 	Revised: Wed Jul 23 13:27:16 MDT 1986 | ||||||
|  | 		by Ceriel Jacobs, | ||||||
|  | 		replaced "stoi" by "atoi" | ||||||
|  | 	Revised: Wed Oct  1 14:23:35 MDT 1986 | ||||||
|  | 		by Ceriel Jacobs, | ||||||
|  | 		to produce lists in the order in which they were read. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | #define DEF_LENGTH	8 | ||||||
|  | 
 | ||||||
|  | struct idf { | ||||||
|  | 	struct idf *id_next; | ||||||
|  | 	char *id_name; | ||||||
|  | 	struct idf *id_same; | ||||||
|  | 	char *id_key; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #define ACT_LISTONLY	0 | ||||||
|  | #define ACT_MAPFILE	1 | ||||||
|  | #define ACT_CID		2 | ||||||
|  | 
 | ||||||
|  | int maxlen = DEF_LENGTH; | ||||||
|  | int action = ACT_LISTONLY; | ||||||
|  | 
 | ||||||
|  | char *ProgName; | ||||||
|  | 
 | ||||||
|  | char * keywords[] = { | ||||||
|  | 	"asm", | ||||||
|  | 	"auto", | ||||||
|  | 	"break", | ||||||
|  | 	"case", | ||||||
|  | 	"char", | ||||||
|  | 	"continue", | ||||||
|  | 	"default", | ||||||
|  | 	"do", | ||||||
|  | 	"double", | ||||||
|  | 	"else", | ||||||
|  | 	"entry", | ||||||
|  | 	"extern", | ||||||
|  | 	"float", | ||||||
|  | 	"for", | ||||||
|  | 	"fortran", | ||||||
|  | 	"goto", | ||||||
|  | 	"if", | ||||||
|  | 	"int", | ||||||
|  | 	"long", | ||||||
|  | 	"register", | ||||||
|  | 	"return", | ||||||
|  | 	"short", | ||||||
|  | 	"sizeof", | ||||||
|  | 	"static", | ||||||
|  | 	"struct", | ||||||
|  | 	"switch", | ||||||
|  | 	"typedef", | ||||||
|  | 	"union", | ||||||
|  | 	"unsigned", | ||||||
|  | 	"while", | ||||||
|  | 	0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | DefineKeys() | ||||||
|  | { | ||||||
|  | 	register char **pkey = &keywords[0]; | ||||||
|  | 	register char *id; | ||||||
|  | 
 | ||||||
|  | 	while (id = *pkey++) | ||||||
|  | 		if (strlen(id) >= maxlen) | ||||||
|  | 			InsertId(id, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DoOption(str) | ||||||
|  | 	char *str; | ||||||
|  | { | ||||||
|  | 	switch (str[1]) { | ||||||
|  | 
 | ||||||
|  | 	case 'c': | ||||||
|  | 		action = ACT_CID; | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case 'l': | ||||||
|  | 		if ((maxlen = atoi(&str[2])) <= 0) { | ||||||
|  | 			fprintf(stderr, "%s: option \"-l%s\" ignored\n", | ||||||
|  | 				ProgName, &str[2]); | ||||||
|  | 			maxlen = DEF_LENGTH; | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
|  | 	 | ||||||
|  | 	case 'm': | ||||||
|  | 		action = ACT_MAPFILE; | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	default: | ||||||
|  | 		fprintf(stderr, "%s: bad option \"%s\"\n", ProgName, str); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #define HASHSIZE 257 | ||||||
|  | 
 | ||||||
|  | struct idf *hash_tab[HASHSIZE]; | ||||||
|  | 
 | ||||||
|  | char *Malloc(), *Salloc(); | ||||||
|  | 
 | ||||||
|  | InsertId(id, key) | ||||||
|  | 	char *id; | ||||||
|  | { | ||||||
|  | 	int hash_val = EnHash(id); | ||||||
|  | 	register struct idf *idp = hash_tab[hash_val]; | ||||||
|  | 	register struct idf *p = 0; | ||||||
|  | 
 | ||||||
|  | 	while (idp && strncmp(idp->id_name, id, maxlen)) { | ||||||
|  | 		p = idp; | ||||||
|  | 		idp = idp->id_next; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (idp == 0) { | ||||||
|  | 		idp = (struct idf *) Malloc(sizeof(struct idf)); | ||||||
|  | 		idp->id_next = 0; | ||||||
|  | 		if (!p) hash_tab[hash_val] = idp; | ||||||
|  | 		else p->id_next = idp; | ||||||
|  | 		idp->id_name = Salloc(id); | ||||||
|  | 		idp->id_same = 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	p = idp; | ||||||
|  | 
 | ||||||
|  | 	while (p && strcmp(p->id_name, id)) { | ||||||
|  | 		idp = p; | ||||||
|  | 		p = p->id_same; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (p == 0) { | ||||||
|  | 		p = (struct idf *) Malloc(sizeof(struct idf)); | ||||||
|  | 		p->id_next = 0; | ||||||
|  | 		p->id_same = 0; | ||||||
|  | 		p->id_name = Salloc(id); | ||||||
|  | 		idp->id_same = p; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (key) | ||||||
|  | 		p->id_key = id; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char * | ||||||
|  | Malloc(n) | ||||||
|  | 	unsigned n; | ||||||
|  | { | ||||||
|  | 	char *mem, *malloc(); | ||||||
|  | 
 | ||||||
|  | 	if ((mem = malloc(n)) == 0) { | ||||||
|  | 		fprintf(stderr, "%s: out of memory\n", ProgName); | ||||||
|  | 		exit(1); | ||||||
|  | 	} | ||||||
|  | 	return mem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char * | ||||||
|  | Salloc(str) | ||||||
|  | 	char *str; | ||||||
|  | { | ||||||
|  | 	char *strcpy(); | ||||||
|  | 
 | ||||||
|  | 	if (str == 0) | ||||||
|  | 		str = ""; | ||||||
|  | 
 | ||||||
|  | 	return strcpy(Malloc(strlen(str) + 1), str); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | EnHash(id) | ||||||
|  | 	char *id; | ||||||
|  | { | ||||||
|  | 	register unsigned hash_val = 0; | ||||||
|  | 	register n = maxlen; | ||||||
|  | 
 | ||||||
|  | 	while (n-- && *id) | ||||||
|  | 		hash_val = 31 * hash_val + *id++; | ||||||
|  | 
 | ||||||
|  | 	return hash_val % (unsigned) HASHSIZE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Results() | ||||||
|  | { | ||||||
|  | 	register int i; | ||||||
|  | 	register struct idf *idp, *p; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < HASHSIZE; i++) { | ||||||
|  | 		for (idp = hash_tab[i]; idp; idp = idp->id_next) { | ||||||
|  | 			if (idp->id_same == 0) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
|  | 			switch (action) { | ||||||
|  | 				register n; | ||||||
|  | 
 | ||||||
|  | 			case ACT_LISTONLY: | ||||||
|  | 				n = 0; | ||||||
|  | 				if (idp->id_key == 0) { | ||||||
|  | 					printf(idp->id_name); | ||||||
|  | 					n++; | ||||||
|  | 				} | ||||||
|  | 				for (p = idp->id_same; p; p = p->id_same) | ||||||
|  | 					if (p->id_key == 0) { | ||||||
|  | 						printf("%s%s", | ||||||
|  | 							n ? " " : "", | ||||||
|  | 							p->id_name | ||||||
|  | 						); | ||||||
|  | 						n++; | ||||||
|  | 					} | ||||||
|  | 				if (n) | ||||||
|  | 					printf("\n"); | ||||||
|  | 				break; | ||||||
|  | 			 | ||||||
|  | 			case ACT_CID: | ||||||
|  | 			case ACT_MAPFILE: | ||||||
|  | 				if (idp->id_key == 0) | ||||||
|  | 					mapline(idp->id_name); | ||||||
|  | 				for (p = idp->id_same; p; p = p->id_same) | ||||||
|  | 					if (p->id_key == 0) | ||||||
|  | 						mapline(p->id_name); | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | mapline(nm) | ||||||
|  | 	char *nm; | ||||||
|  | { | ||||||
|  | 	static map_count = 0; | ||||||
|  | 
 | ||||||
|  | 	switch (action) { | ||||||
|  | 
 | ||||||
|  | 	case ACT_MAPFILE: | ||||||
|  | 		printf("#define %s _%d_%s\n", nm, ++map_count, nm); | ||||||
|  | 		break; | ||||||
|  | 	 | ||||||
|  | 	case ACT_CID: | ||||||
|  | 		printf("%s=_%d_%s\n", nm, ++map_count, nm); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #define MAX_ID_LEN	256 | ||||||
|  | 
 | ||||||
|  | main(argc, argv) | ||||||
|  | 	char *argv[]; | ||||||
|  | { | ||||||
|  | 	char **nargv; | ||||||
|  | 	int nargc = 0; | ||||||
|  | 	FILE *fp; | ||||||
|  | 
 | ||||||
|  | 	ProgName = *argv++; | ||||||
|  | 	nargv = argv; | ||||||
|  | 
 | ||||||
|  | 	while (--argc > 0) | ||||||
|  | 		if ((*argv)[0] == '-') | ||||||
|  | 			DoOption(*argv++); | ||||||
|  | 		else | ||||||
|  | 			nargv[nargc++] = *argv++; | ||||||
|  | 
 | ||||||
|  | 	DefineKeys(); | ||||||
|  | 	if (nargc > 0) | ||||||
|  | 		while (nargc-- > 0) { | ||||||
|  | 			if ((fp = fopen(*nargv, "r")) == NULL) | ||||||
|  | 				fprintf(stderr, "%s: cannot read file \"%s\"\n", | ||||||
|  | 					ProgName, *nargv); | ||||||
|  | 			else | ||||||
|  | 				DoFile(fp); | ||||||
|  | 			nargv++; | ||||||
|  | 		} | ||||||
|  | 	else | ||||||
|  | 		DoFile(stdin); | ||||||
|  | 	Results(); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DoFile(fp) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getc(fp)) != EOF) | ||||||
|  | 		switch (c) { | ||||||
|  | 
 | ||||||
|  | 		case '"': | ||||||
|  | 		case '\'': | ||||||
|  | 			SkipString(fp, c); | ||||||
|  | 			break; | ||||||
|  | 		 | ||||||
|  | 		case '/': | ||||||
|  | 			if ((c = getc(fp)) == '*') | ||||||
|  | 				SkipComment(fp); | ||||||
|  | 			else | ||||||
|  | 				ungetc(c, fp); | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 		default: | ||||||
|  | 			if (StartId(c)) | ||||||
|  | 				DoIdent(fp, c); | ||||||
|  | 			else | ||||||
|  | 			if (StartNum(c)) | ||||||
|  | 				DoNum(fp, c); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	fclose(fp); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SkipString(fp, stopc) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getc(fp)) != EOF) { | ||||||
|  | 		if (c == stopc) | ||||||
|  | 			return; | ||||||
|  | 		if (c == '\\') | ||||||
|  | 			c = getc(fp); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SkipComment(fp) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getc(fp)) != EOF) | ||||||
|  | 		if (c == '*') { | ||||||
|  | 			if ((c = getc(fp)) == '/') | ||||||
|  | 				return; | ||||||
|  | 			ungetc(c, fp); | ||||||
|  | 		} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DoIdent(fp, s) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	char id_buf[MAX_ID_LEN]; | ||||||
|  | 	register cnt = 1; | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	id_buf[0] = s; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getc(fp)) != EOF) | ||||||
|  | 		if (InId(c)) | ||||||
|  | 			id_buf[cnt++] = c; | ||||||
|  | 		else { | ||||||
|  | 			ungetc(c, fp); | ||||||
|  | 			id_buf[cnt] = '\0'; | ||||||
|  | 			if (cnt >= maxlen) | ||||||
|  | 				InsertId(&id_buf[0], 0); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #define inrange(c, l, u)	((unsigned)((c) - (l)) <= ((u) - (l))) | ||||||
|  | #define isdec(c) inrange(c, '0', '9') | ||||||
|  | #define isoct(c) inrange(c, '0', '7') | ||||||
|  | #define ishex(c) (isdec(c) || inrange(c, 'a', 'f') || inrange(c, 'A', 'F')) | ||||||
|  | #define getdec(c, fp)	do c = getc((fp)); while (isdec(c)) | ||||||
|  | #define getoct(c, fp)	do c = getc((fp)); while (isoct(c)) | ||||||
|  | #define gethex(c, fp)	do c = getc((fp)); while (ishex(c)) | ||||||
|  | 
 | ||||||
|  | DoNum(fp, c) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	if (c != '0') { | ||||||
|  | 		getdec(c, fp); | ||||||
|  | 		if (c == '.') | ||||||
|  | 			getdec(c, fp); | ||||||
|  | 		if (c == 'e') { | ||||||
|  | 			c = getc(fp); | ||||||
|  | 			if (c == '+' || c == '-') | ||||||
|  | 				c = getc(fp); | ||||||
|  | 			if (isdec(c)) | ||||||
|  | 				getdec(c, fp); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		c = getc(fp); | ||||||
|  | 		if (c == 'x' || c == 'X') | ||||||
|  | 			gethex(c, fp); | ||||||
|  | 		else | ||||||
|  | 		if (isoct(c)) | ||||||
|  | 			getoct(c, fp); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | StartId(c) | ||||||
|  | { | ||||||
|  | 	switch (c) { | ||||||
|  | 
 | ||||||
|  | 	case 'a': case 'b': case 'c': case 'd': case 'e': | ||||||
|  | 	case 'f': case 'g': case 'h': case 'i': case 'j': | ||||||
|  | 	case 'k': case 'l': case 'm': case 'n': case 'o': | ||||||
|  | 	case 'p': case 'q': case 'r': case 's': case 't': | ||||||
|  | 	case 'u': case 'v': case 'w': case 'x': case 'y': | ||||||
|  | 	case 'z': | ||||||
|  | 	case 'A': case 'B': case 'C': case 'D': case 'E': | ||||||
|  | 	case 'F': case 'G': case 'H': case 'I': case 'J': | ||||||
|  | 	case 'K': case 'L': case 'M': case 'N': case 'O': | ||||||
|  | 	case 'P': case 'Q': case 'R': case 'S': case 'T': | ||||||
|  | 	case 'U': case 'V': case 'W': case 'X': case 'Y': | ||||||
|  | 	case 'Z': | ||||||
|  | 	case '_': | ||||||
|  | 		return 1; | ||||||
|  | 	 | ||||||
|  | 	default: | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | StartNum(c) | ||||||
|  | { | ||||||
|  | 	switch(c) { | ||||||
|  | 	case '0': case '1': case '2': case '3': case '4': | ||||||
|  | 	case '5': case '6': case '7': case '8': case '9': | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InId(c) | ||||||
|  | { | ||||||
|  | 	switch (c) { | ||||||
|  | 
 | ||||||
|  | 	case 'a': case 'b': case 'c': case 'd': case 'e': | ||||||
|  | 	case 'f': case 'g': case 'h': case 'i': case 'j': | ||||||
|  | 	case 'k': case 'l': case 'm': case 'n': case 'o': | ||||||
|  | 	case 'p': case 'q': case 'r': case 's': case 't': | ||||||
|  | 	case 'u': case 'v': case 'w': case 'x': case 'y': | ||||||
|  | 	case 'z': | ||||||
|  | 	case 'A': case 'B': case 'C': case 'D': case 'E': | ||||||
|  | 	case 'F': case 'G': case 'H': case 'I': case 'J': | ||||||
|  | 	case 'K': case 'L': case 'M': case 'N': case 'O': | ||||||
|  | 	case 'P': case 'Q': case 'R': case 'S': case 'T': | ||||||
|  | 	case 'U': case 'V': case 'W': case 'X': case 'Y': | ||||||
|  | 	case 'Z': | ||||||
|  | 	case '_': | ||||||
|  | 	case '0': case '1': case '2': case '3': case '4': | ||||||
|  | 	case '5': case '6': case '7': case '8': case '9': | ||||||
|  | 		return 1; | ||||||
|  | 	 | ||||||
|  | 	default: | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										388
									
								
								util/cmisc/cid.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								util/cmisc/cid.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,388 @@ | ||||||
|  | /*	@cc % $LIBDIR/stoi.o -o cid@	*/ | ||||||
|  | 
 | ||||||
|  | /*	Change IDentifiers occurring in C programs outside comment, strings
 | ||||||
|  | 	and character constants. | ||||||
|  | 	-Dname=text	: replace all occerences of name by text | ||||||
|  | 	-Dname		: same as -Dname= | ||||||
|  | 	-Ffile		: read sentences of the from name=text from file | ||||||
|  | 
 | ||||||
|  | 	Author: Erik Baalbergen | ||||||
|  | 	Date: Oct 23, 1985 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*** Generic C Identifier Processing Module	***/ | ||||||
|  | /* IMPORT CheckId(char *) and DoOption(char *, int)
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | extern CheckId(); | ||||||
|  | extern DoOption(); | ||||||
|  | 
 | ||||||
|  | #define MAX_ID_LEN	256 | ||||||
|  | 
 | ||||||
|  | char *ProgName; | ||||||
|  | 
 | ||||||
|  | main(argc, argv) | ||||||
|  | 	char *argv[]; | ||||||
|  | { | ||||||
|  | 	char **nargv; | ||||||
|  | 	int nargc = 0; | ||||||
|  | 	FILE *fp; | ||||||
|  | 
 | ||||||
|  | 	ProgName = *argv++; | ||||||
|  | 	nargv = argv; | ||||||
|  | 
 | ||||||
|  | 	while (--argc > 0) { | ||||||
|  | 		if ((*argv)[0] == '-') { | ||||||
|  | 			DoOption(*argv++); | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			nargv[nargc++] = *argv++; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (nargc > 0) { | ||||||
|  | 		while (nargc-- > 0) { | ||||||
|  | 			if ((fp = fopen(*nargv, "r")) == NULL) { | ||||||
|  | 				fprintf(stderr, "%s: cannot read file \"%s\"\n", | ||||||
|  | 					ProgName, *nargv); | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				DoFile(fp); | ||||||
|  | 			} | ||||||
|  | 			nargv++; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		DoFile(stdin); | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DoFile(fp) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getc(fp)) != EOF) { | ||||||
|  | 		switch (c) { | ||||||
|  | 
 | ||||||
|  | 		case '"': | ||||||
|  | 		case '\'': | ||||||
|  | 			SkipString(fp, c); | ||||||
|  | 			break; | ||||||
|  | 		 | ||||||
|  | 		case '/': | ||||||
|  | 			if ((c = getc(fp)) == '*') { | ||||||
|  | 				SkipComment(fp); | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				putchar('/'); | ||||||
|  | 				ungetc(c, fp); | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 		default: | ||||||
|  | 			if (StartId(c)) { | ||||||
|  | 				DoIdent(fp, c); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 				putchar(c); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	fclose(fp); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SkipString(fp, stopc) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	putchar(stopc); | ||||||
|  | 	while ((c = getc(fp)) != EOF) { | ||||||
|  | 		if (c == stopc) { | ||||||
|  | 			putchar(stopc); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (c == '\\') { | ||||||
|  | 			putchar(c); | ||||||
|  | 			c = getc(fp); | ||||||
|  | 		} | ||||||
|  | 		putchar(c); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SkipComment(fp) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	putchar('/'); | ||||||
|  | 	putchar('*'); | ||||||
|  | 	while ((c = getc(fp)) != EOF) { | ||||||
|  | 		if (c == '*') { | ||||||
|  | 			putchar('*'); | ||||||
|  | 			if ((c = getc(fp)) == '/') { | ||||||
|  | 				putchar('/'); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			ungetc(c, fp); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			putchar(c); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DoIdent(fp, s) | ||||||
|  | 	FILE *fp; | ||||||
|  | { | ||||||
|  | 	char id_buf[MAX_ID_LEN]; | ||||||
|  | 	register cnt = 1; | ||||||
|  | 	register c; | ||||||
|  | 
 | ||||||
|  | 	id_buf[0] = s; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getc(fp)) != EOF) { | ||||||
|  | 		if (InId(c)) { | ||||||
|  | 			id_buf[cnt++] = c; | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			ungetc(c, fp); | ||||||
|  | 			id_buf[cnt] = '\0'; | ||||||
|  | 			CheckId(id_buf, cnt); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | StartId(c) | ||||||
|  | { | ||||||
|  | 	switch (c) { | ||||||
|  | 
 | ||||||
|  | 	case 'a': case 'b': case 'c': case 'd': case 'e': | ||||||
|  | 	case 'f': case 'g': case 'h': case 'i': case 'j': | ||||||
|  | 	case 'k': case 'l': case 'm': case 'n': case 'o': | ||||||
|  | 	case 'p': case 'q': case 'r': case 's': case 't': | ||||||
|  | 	case 'u': case 'v': case 'w': case 'x': case 'y': | ||||||
|  | 	case 'z': | ||||||
|  | 	case 'A': case 'B': case 'C': case 'D': case 'E': | ||||||
|  | 	case 'F': case 'G': case 'H': case 'I': case 'J': | ||||||
|  | 	case 'K': case 'L': case 'M': case 'N': case 'O': | ||||||
|  | 	case 'P': case 'Q': case 'R': case 'S': case 'T': | ||||||
|  | 	case 'U': case 'V': case 'W': case 'X': case 'Y': | ||||||
|  | 	case 'Z': | ||||||
|  | 	case '_': | ||||||
|  | 		return 1; | ||||||
|  | 	 | ||||||
|  | 	default: | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InId(c) | ||||||
|  | { | ||||||
|  | 	switch (c) { | ||||||
|  | 
 | ||||||
|  | 	case 'a': case 'b': case 'c': case 'd': case 'e': | ||||||
|  | 	case 'f': case 'g': case 'h': case 'i': case 'j': | ||||||
|  | 	case 'k': case 'l': case 'm': case 'n': case 'o': | ||||||
|  | 	case 'p': case 'q': case 'r': case 's': case 't': | ||||||
|  | 	case 'u': case 'v': case 'w': case 'x': case 'y': | ||||||
|  | 	case 'z': | ||||||
|  | 	case 'A': case 'B': case 'C': case 'D': case 'E': | ||||||
|  | 	case 'F': case 'G': case 'H': case 'I': case 'J': | ||||||
|  | 	case 'K': case 'L': case 'M': case 'N': case 'O': | ||||||
|  | 	case 'P': case 'Q': case 'R': case 'S': case 'T': | ||||||
|  | 	case 'U': case 'V': case 'W': case 'X': case 'Y': | ||||||
|  | 	case 'Z': | ||||||
|  | 	case '_': | ||||||
|  | 	case '0': case '1': case '2': case '3': case '4': | ||||||
|  | 	case '5': case '6': case '7': case '8': case '9': | ||||||
|  | 		return 1; | ||||||
|  | 	 | ||||||
|  | 	default: | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | /*** end of GCIPM	***/ | ||||||
|  | 
 | ||||||
|  | #ifndef DEF_LENGTH | ||||||
|  | #define DEF_LENGTH	8 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define LINE_LEN	1024 | ||||||
|  | 
 | ||||||
|  | #define HASHSIZE 257 | ||||||
|  | 
 | ||||||
|  | struct idf { | ||||||
|  | 	struct idf *id_next; | ||||||
|  | 	char *id_name; | ||||||
|  | 	char *id_text; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct idf *hash_tab[HASHSIZE]; | ||||||
|  | 
 | ||||||
|  | char *Malloc(), *Salloc(); | ||||||
|  | struct idf *FindId(); | ||||||
|  | 
 | ||||||
|  | DoOption(str) | ||||||
|  | 	char *str; | ||||||
|  | { | ||||||
|  | 	switch (str[1]) { | ||||||
|  | 
 | ||||||
|  | 	case 'D': | ||||||
|  | 		DoMacro(&str[2]); | ||||||
|  | 		break; | ||||||
|  | 	 | ||||||
|  | 	case 'F': | ||||||
|  | 		GetMacros(&str[2]); | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	default: | ||||||
|  | 		fprintf(stderr, "%s: bad option \"%s\"\n", ProgName, str); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CheckId(id, len) | ||||||
|  | 	char *id; | ||||||
|  | { | ||||||
|  | 	struct idf *idp = FindId(id); | ||||||
|  | 
 | ||||||
|  | 	if (idp) { | ||||||
|  | 		printf("%s", idp->id_text); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		printf("%s", id); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DoMacro(str) | ||||||
|  | 	char *str; | ||||||
|  | { | ||||||
|  | 	char *id, *text; | ||||||
|  | 
 | ||||||
|  | 	id = str++; | ||||||
|  | 
 | ||||||
|  | 	while (*str != '\0' && *str != '=') { | ||||||
|  | 		str++; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (*str == '=') { | ||||||
|  | 		*str++ = '\0'; | ||||||
|  | 		text = str; | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		text = ""; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	InsertMacro(id, text); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | GetMacros(fn) | ||||||
|  | 	char *fn; | ||||||
|  | { | ||||||
|  | 	FILE *fp; | ||||||
|  | 	register c; | ||||||
|  | 	char buf[LINE_LEN]; | ||||||
|  | 	char *bufp = &buf[0]; | ||||||
|  | 
 | ||||||
|  | 	if ((fp = fopen(fn, "r")) == NULL) { | ||||||
|  | 		fprintf(stderr, "%s: cannot read file \"%s\"\n", ProgName, fn); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	while ((c = getc(fp)) != EOF) { | ||||||
|  | 		if (c == '\n' && bufp != &buf[0]) { | ||||||
|  | 			*bufp = '\0'; | ||||||
|  | 			DoMacro(&buf[0]); | ||||||
|  | 			bufp = &buf[0]; | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			*bufp++ = c; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	fclose(fp); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InsertMacro(id, text) | ||||||
|  | 	char *id, *text; | ||||||
|  | { | ||||||
|  | 	int hash_val = EnHash(id); | ||||||
|  | 	struct idf *idp = hash_tab[hash_val]; | ||||||
|  | 
 | ||||||
|  | 	while (idp) { | ||||||
|  | 		if (strcmp(idp->id_name, id) == 0) { | ||||||
|  | 			fprintf(stderr, "%s: (warning) redefinition of %s\n", | ||||||
|  | 				ProgName, id); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		idp = idp->id_next; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (idp == 0) { | ||||||
|  | 		idp = (struct idf *) Malloc(sizeof(struct idf)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	idp->id_next = hash_tab[hash_val]; | ||||||
|  | 	idp->id_name = Salloc(id); | ||||||
|  | 	idp->id_text = Salloc(text); | ||||||
|  | 	hash_tab[hash_val] = idp; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char * | ||||||
|  | Malloc(n) | ||||||
|  | 	unsigned n; | ||||||
|  | { | ||||||
|  | 	char *mem, *malloc(); | ||||||
|  | 
 | ||||||
|  | 	if ((mem = malloc(n)) == 0) { | ||||||
|  | 		fprintf(stderr, "%s: out of memory\n", ProgName); | ||||||
|  | 		exit(1); | ||||||
|  | 	} | ||||||
|  | 	return mem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char * | ||||||
|  | Salloc(str) | ||||||
|  | 	char *str; | ||||||
|  | { | ||||||
|  | 	char *strcpy(); | ||||||
|  | 
 | ||||||
|  | 	if (str == 0) { | ||||||
|  | 		str = ""; | ||||||
|  | 	} | ||||||
|  | 	return strcpy(Malloc(strlen(str) + 1), str); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct idf * | ||||||
|  | FindId(id) | ||||||
|  | 	char *id; | ||||||
|  | { | ||||||
|  | 	register hash_val = EnHash(id); | ||||||
|  | 	register struct idf *idp = hash_tab[hash_val]; | ||||||
|  | 
 | ||||||
|  | 	while (idp) { | ||||||
|  | 		if (strcmp(idp->id_name, id) == 0) { | ||||||
|  | 			return idp; | ||||||
|  | 		} | ||||||
|  | 		idp = idp->id_next; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | EnHash(id) | ||||||
|  | 	char *id; | ||||||
|  | { | ||||||
|  | 	register unsigned hash_val = 0; | ||||||
|  | 
 | ||||||
|  | 	while (*id) { | ||||||
|  | 		hash_val = 31 * hash_val + *id++; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return hash_val % (unsigned) HASHSIZE; | ||||||
|  | } | ||||||
							
								
								
									
										191
									
								
								util/cmisc/mkdep.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								util/cmisc/mkdep.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,191 @@ | ||||||
|  | /* make dependencies; Date: jan 07, 1986; Author: Erik Baalbergen */ | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | #define BSIZ 1024 | ||||||
|  | char *progname; | ||||||
|  | 
 | ||||||
|  | struct namelist { | ||||||
|  | 	struct namelist *next; | ||||||
|  | 	char *name; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct namelist *freelist; | ||||||
|  | struct namelist *new_namelist(); | ||||||
|  | struct namelist *nl = 0; | ||||||
|  | 
 | ||||||
|  | int lflag = 0;	/* produce vertical list of included files */ | ||||||
|  | 
 | ||||||
|  | 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; | ||||||
|  | 	struct namelist *lnlp = 0; | ||||||
|  | 	struct namelist *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(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; | ||||||
|  | { | ||||||
|  | 	if (nlp) { | ||||||
|  | 		if (lflag) { | ||||||
|  | 			while (nlp) { | ||||||
|  | 				printf("%s\n", nlp->name); | ||||||
|  | 				nlp = nlp->next; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			printf("%s:", nm); | ||||||
|  | 			while (nlp) { | ||||||
|  | 				printf(" %s", nlp->name); | ||||||
|  | 				nlp = nlp->next; | ||||||
|  | 			} | ||||||
|  | 			printf("\n"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | main(argc, argv) | ||||||
|  | 	char *argv[]; | ||||||
|  | { | ||||||
|  | 	int err = 0; | ||||||
|  | 
 | ||||||
|  | 	progname = *argv++; | ||||||
|  | 	if (**argv == '-') { | ||||||
|  | 		register char *s = *argv++; | ||||||
|  | 
 | ||||||
|  | 		argc--; | ||||||
|  | 		while (*++s) { | ||||||
|  | 			switch (*s) { | ||||||
|  | 			case 'l': | ||||||
|  | 				lflag = 1; | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				fprintf(stderr, "use: %s [-l] file ...\n", | ||||||
|  | 					progname); | ||||||
|  | 				return 0; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	while (--argc > 0) { | ||||||
|  | 		free_namelist(nl); | ||||||
|  | 		nl = 0; | ||||||
|  | 		if (dofile(*argv) == 0) | ||||||
|  | 			++err; | ||||||
|  | 		print_namelist(*argv++, nl); | ||||||
|  | 	} | ||||||
|  | 	return err ? 1 : 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | dofile(fn) | ||||||
|  | 	char *fn; | ||||||
|  | { | ||||||
|  | 	char *fgets(), buf[BSIZ]; | ||||||
|  | 	FILE *fp; | ||||||
|  | 	char *nm, *include_line(); | ||||||
|  | 
 | ||||||
|  | 	if ((fp = fopen(fn, "r")) == 0) { | ||||||
|  | 		fprintf(stderr, "%s: cannot read %s\n", progname, fn); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	while (fgets(buf, BSIZ, fp) != NULL) | ||||||
|  | 		if (nm = include_line(buf)) { | ||||||
|  | 			add_name(nm); | ||||||
|  | 			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++ == '"') { | ||||||
|  | 				register char *nm = s; | ||||||
|  | 				while (*s != 0 && *s != '"') | ||||||
|  | 					s++; | ||||||
|  | 				*s = '\0'; | ||||||
|  | 				return nm; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return (char *) 0; | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue