123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- /* $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);
- }
- }
|