GCIPM.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /* $Id$ */
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. */
  6. /*** Generic C Identifier Processing Module ***/
  7. /* IMPORT CheckId(char *, int), DoOption(char *), BeginOfProgram(), and
  8. EndOfProgram().
  9. */
  10. #include <stdio.h>
  11. extern CheckId();
  12. extern DoOption();
  13. extern BeginOfProgram(), EndOfProgram();
  14. #define MAX_ID_LEN 256
  15. char *ProgName;
  16. int GCcopy;
  17. main(argc, argv)
  18. char *argv[];
  19. {
  20. char **nargv;
  21. int nargc = 0;
  22. FILE *fp;
  23. ProgName = *argv++;
  24. nargv = argv;
  25. BeginOfProgram();
  26. while (--argc > 0) {
  27. if ((*argv)[0] == '-') {
  28. DoOption(*argv++);
  29. }
  30. else {
  31. nargv[nargc++] = *argv++;
  32. }
  33. }
  34. if (nargc > 0) {
  35. while (nargc-- > 0) {
  36. if ((fp = fopen(*nargv, "r")) == NULL) {
  37. fprintf(stderr, "%s: cannot read file \"%s\"\n",
  38. ProgName, *nargv);
  39. }
  40. else {
  41. DoFile(fp);
  42. }
  43. nargv++;
  44. }
  45. }
  46. else {
  47. DoFile(stdin);
  48. }
  49. EndOfProgram();
  50. exit(0);
  51. }
  52. DoFile(fp)
  53. FILE *fp;
  54. {
  55. register c;
  56. while ((c = getc(fp)) != EOF) {
  57. switch (c) {
  58. case '"':
  59. case '\'':
  60. if (GCcopy) putchar(c);
  61. SkipString(fp, c);
  62. break;
  63. case '/':
  64. if (GCcopy) putchar(c);
  65. if ((c = getc(fp)) == '*') {
  66. if (GCcopy) putchar(c);
  67. SkipComment(fp);
  68. }
  69. else {
  70. ungetc(c, fp);
  71. }
  72. break;
  73. default:
  74. if (StartId(c)) {
  75. DoIdent(fp, c);
  76. }
  77. else if (StartNum(c)) {
  78. if (GCcopy) putchar(c);
  79. DoNum(fp, c);
  80. }
  81. else if (GCcopy) putchar(c);
  82. break;
  83. }
  84. }
  85. fclose(fp);
  86. }
  87. SkipString(fp, stopc)
  88. FILE *fp;
  89. {
  90. register c;
  91. while ((c = getc(fp)) != EOF) {
  92. if (GCcopy) putchar(c);
  93. if (c == stopc) {
  94. return;
  95. }
  96. if (c == '\\') {
  97. c = getc(fp);
  98. if (GCcopy) putchar(c);
  99. }
  100. }
  101. }
  102. SkipComment(fp)
  103. FILE *fp;
  104. {
  105. register c;
  106. while ((c = getc(fp)) != EOF) {
  107. if (GCcopy) putchar(c);
  108. if (c == '*') {
  109. if ((c = getc(fp)) == '/') {
  110. if (GCcopy) putchar(c);
  111. return;
  112. }
  113. ungetc(c, fp);
  114. }
  115. }
  116. }
  117. DoIdent(fp, s)
  118. FILE *fp;
  119. {
  120. char id_buf[MAX_ID_LEN];
  121. register cnt = 1;
  122. register c;
  123. id_buf[0] = s;
  124. while ((c = getc(fp)) != EOF) {
  125. if (InId(c)) {
  126. id_buf[cnt++] = c;
  127. }
  128. else {
  129. ungetc(c, fp);
  130. id_buf[cnt] = '\0';
  131. CheckId(id_buf, cnt);
  132. return;
  133. }
  134. }
  135. }
  136. StartId(c)
  137. {
  138. switch (c) {
  139. case 'a': case 'b': case 'c': case 'd': case 'e':
  140. case 'f': case 'g': case 'h': case 'i': case 'j':
  141. case 'k': case 'l': case 'm': case 'n': case 'o':
  142. case 'p': case 'q': case 'r': case 's': case 't':
  143. case 'u': case 'v': case 'w': case 'x': case 'y':
  144. case 'z':
  145. case 'A': case 'B': case 'C': case 'D': case 'E':
  146. case 'F': case 'G': case 'H': case 'I': case 'J':
  147. case 'K': case 'L': case 'M': case 'N': case 'O':
  148. case 'P': case 'Q': case 'R': case 'S': case 'T':
  149. case 'U': case 'V': case 'W': case 'X': case 'Y':
  150. case 'Z':
  151. case '_':
  152. return 1;
  153. default:
  154. return 0;
  155. }
  156. }
  157. InId(c)
  158. {
  159. switch (c) {
  160. case 'a': case 'b': case 'c': case 'd': case 'e':
  161. case 'f': case 'g': case 'h': case 'i': case 'j':
  162. case 'k': case 'l': case 'm': case 'n': case 'o':
  163. case 'p': case 'q': case 'r': case 's': case 't':
  164. case 'u': case 'v': case 'w': case 'x': case 'y':
  165. case 'z':
  166. case 'A': case 'B': case 'C': case 'D': case 'E':
  167. case 'F': case 'G': case 'H': case 'I': case 'J':
  168. case 'K': case 'L': case 'M': case 'N': case 'O':
  169. case 'P': case 'Q': case 'R': case 'S': case 'T':
  170. case 'U': case 'V': case 'W': case 'X': case 'Y':
  171. case 'Z':
  172. case '_':
  173. case '0': case '1': case '2': case '3': case '4':
  174. case '5': case '6': case '7': case '8': case '9':
  175. return 1;
  176. default:
  177. return 0;
  178. }
  179. }
  180. StartNum(c)
  181. {
  182. switch(c) {
  183. case '0': case '1': case '2': case '3': case '4':
  184. case '5': case '6': case '7': case '8': case '9':
  185. return 1;
  186. }
  187. return 0;
  188. }
  189. #define inrange(c, l, u) ((unsigned)((c) - (l)) <= ((u) - (l)))
  190. #define isdec(c) inrange(c, '0', '9')
  191. #define isoct(c) inrange(c, '0', '7')
  192. #define ishex(c) (isdec(c) || inrange(c, 'a', 'f') || inrange(c, 'A', 'F'))
  193. #define getdec(c, fp) do { c = getc((fp)); if (GCcopy) putchar(c);} while (isdec(c))
  194. #define getoct(c, fp) do { c = getc((fp)); if (GCcopy) putchar(c);} while (isoct(c))
  195. #define gethex(c, fp) do { c = getc((fp)); if (GCcopy) putchar(c);} while (ishex(c))
  196. DoNum(fp, c)
  197. register FILE *fp;
  198. {
  199. if (c != '0') {
  200. getdec(c, fp);
  201. if (c == '.')
  202. getdec(c, fp);
  203. if (c == 'e') {
  204. c = getc(fp);
  205. if (c == '+' || c == '-')
  206. c = getc(fp);
  207. if (isdec(c))
  208. getdec(c, fp);
  209. }
  210. }
  211. else {
  212. c = getc(fp);
  213. if (GCcopy) putchar(c);
  214. if (c == 'x' || c == 'X')
  215. gethex(c, fp);
  216. else
  217. if (isoct(c))
  218. getoct(c, fp);
  219. }
  220. }