Initial revision
authorceriel <none@none>
Tue, 11 Nov 1986 13:34:20 +0000 (13:34 +0000)
committerceriel <none@none>
Tue, 11 Nov 1986 13:34:20 +0000 (13:34 +0000)
util/cmisc/GCIPM.c [new file with mode: 0644]

diff --git a/util/cmisc/GCIPM.c b/util/cmisc/GCIPM.c
new file mode 100644 (file)
index 0000000..fe2b050
--- /dev/null
@@ -0,0 +1,244 @@
+/*** 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();
+}
+
+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);
+       }
+}