250 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			250 lines
		
	
	
	
		
			4.5 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".
 | |
|  */
 | |
| /*** Generic C Identifier Processing Module	***/
 | |
| /* IMPORT CheckId(char *, int), DoOption(char *), BeginOfProgram(), and
 | |
|    EndOfProgram().
 | |
| */
 | |
| 
 | |
| #include <stdio.h>
 | |
| 
 | |
| extern CheckId();
 | |
| extern DoOption();
 | |
| extern BeginOfProgram(), EndOfProgram();
 | |
| 
 | |
| #define MAX_ID_LEN	256
 | |
| 
 | |
| char *ProgName;
 | |
| int GCcopy;
 | |
| 
 | |
| main(argc, argv)
 | |
| 	char *argv[];
 | |
| {
 | |
| 	char **nargv;
 | |
| 	int nargc = 0;
 | |
| 	FILE *fp;
 | |
| 
 | |
| 	ProgName = *argv++;
 | |
| 	nargv = argv;
 | |
| 
 | |
| 	BeginOfProgram();
 | |
| 	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);
 | |
| 	}
 | |
| 	EndOfProgram();
 | |
| 	exit(0);
 | |
| }
 | |
| 
 | |
| DoFile(fp)
 | |
| 	FILE *fp;
 | |
| {
 | |
| 	register c;
 | |
| 
 | |
| 	while ((c = getc(fp)) != EOF) {
 | |
| 		switch (c) {
 | |
| 
 | |
| 		case '"':
 | |
| 		case '\'':
 | |
| 			if (GCcopy) putchar(c);
 | |
| 			SkipString(fp, c);
 | |
| 			break;
 | |
| 		
 | |
| 		case '/':
 | |
| 			if (GCcopy) putchar(c);
 | |
| 			if ((c = getc(fp)) == '*') {
 | |
| 				if (GCcopy) putchar(c);
 | |
| 				SkipComment(fp);
 | |
| 			}
 | |
| 			else {
 | |
| 				ungetc(c, fp);
 | |
| 			}
 | |
| 			break;
 | |
| 
 | |
| 		default:
 | |
| 			if (StartId(c)) {
 | |
| 				DoIdent(fp, c);
 | |
| 			}
 | |
| 			else if (StartNum(c)) {
 | |
| 				if (GCcopy) putchar(c);
 | |
| 				DoNum(fp, c);
 | |
| 			}
 | |
| 			else if (GCcopy) putchar(c);
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 	fclose(fp);
 | |
| }
 | |
| 
 | |
| SkipString(fp, stopc)
 | |
| 	FILE *fp;
 | |
| {
 | |
| 	register c;
 | |
| 
 | |
| 	while ((c = getc(fp)) != EOF) {
 | |
| 		if (GCcopy) putchar(c);
 | |
| 		if (c == stopc) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if (c == '\\') {
 | |
| 			c = getc(fp);
 | |
| 			if (GCcopy) putchar(c);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| SkipComment(fp)
 | |
| 	FILE *fp;
 | |
| {
 | |
| 	register c;
 | |
| 
 | |
| 	while ((c = getc(fp)) != EOF) {
 | |
| 		if (GCcopy) putchar(c);
 | |
| 		if (c == '*') {
 | |
| 			if ((c = getc(fp)) == '/') {
 | |
| 				if (GCcopy) putchar(c);
 | |
| 				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';
 | |
| 			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;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 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;
 | |
| }
 | |
| 
 | |
| #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)); if (GCcopy) putchar(c);} while (isdec(c))
 | |
| #define getoct(c, fp)	do { c = getc((fp)); if (GCcopy) putchar(c);} while (isoct(c))
 | |
| #define gethex(c, fp)	do { c = getc((fp)); if (GCcopy) putchar(c);} while (ishex(c))
 | |
| 
 | |
| DoNum(fp, c)
 | |
| 	register 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 (GCcopy) putchar(c);
 | |
| 		if (c == 'x' || c == 'X')
 | |
| 			gethex(c, fp);
 | |
| 		else
 | |
| 		if (isoct(c))
 | |
| 			getoct(c, fp);
 | |
| 	}
 | |
| }
 |