This is cref.c in view mode; [Download] [Up]
/* Output from p2c, the Pascal-to-C translator */ /* From input file "dist/examples/cref.p" */ #include <p2c/p2c.h> /* linesperpage = 139; */ #define maxnamelen 30 typedef Char str255[256]; #define k_normal 0 #define k_proc 1 #define k_var 2 #define k_const 3 #define k_type 4 #define k_strlit 5 #define k_extproc 6 #define k_kw 7 #define k_prockw 8 #define k_varkw 9 #define k_constkw 10 #define k_typekw 11 #define k_beginkw 12 typedef struct occur { struct occur *next; long lnum, fnum; boolean defn; } occur; typedef struct node { struct node *left, *right; Char name[maxnamelen + 1]; occur *first; short kind; } node; Static FILE *f; Static Char fn[121]; Static long fnum; Static str255 buf, name; Static boolean good; Static long i, j, lnum; Static node *np, *base; Static occur *op; Static short curkind, section; Static long paren, brace; Static Void lookup(name, np) Char *name; node **np; { node **npp; if (strlen(name) > maxnamelen) name[maxnamelen] = '\0'; npp = &base; while (*npp != NULL && strcmp((*npp)->name, name)) { if (strcmp(name, (*npp)->name) < 0) npp = &(*npp)->left; else npp = &(*npp)->right; } if (*npp != NULL) { *np = *npp; return; } *np = (node *)Malloc(sizeof(node)); *npp = *np; strcpy((*np)->name, name); (*np)->first = NULL; (*np)->left = NULL; (*np)->right = NULL; (*np)->kind = k_normal; } Static Void kw(name_, kind) Char *name_; short kind; { str255 name; node *np; strcpy(name, name_); lookup(name, &np); np->kind = kind; } Static Void cref(np, kind) node *np; short kind; { occur *op; op = (occur *)Malloc(sizeof(occur)); op->next = np->first; np->first = op; op->lnum = lnum; op->fnum = fnum; op->defn = (((1L << ((long)kind)) & ((1L << ((long)k_var)) | (1L << ((long)k_type)) | (1L << ((long)k_const)) | (1L << ((long)k_proc)))) != 0); if (op->defn || kind == k_strlit || kind == k_extproc && np->kind == k_normal) np->kind = kind; } Static Void traverse(np) node *np; { occur *op; long i; if (np == NULL) return; traverse(np->left); if ((long)np->kind < (long)k_kw) { switch (np->kind) { case k_var: fprintf(f, "V:"); break; case k_type: fprintf(f, "T:"); break; case k_const: fprintf(f, "C:"); break; case k_proc: fprintf(f, "P:"); break; case k_strlit: fprintf(f, "S:"); break; case k_extproc: fprintf(f, "E:"); break; case k_normal: fprintf(f, "X:"); break; } fputs(np->name, f); i = 0; op = np->first; while (op != NULL) { if (i == 0) { fprintf(f, "\n "); i = 5; } fprintf(f, " %ld/%ld", op->lnum, op->fnum); if (op->defn) putc('*', f); i--; op = op->next; } putc('\n', f); } traverse(np->right); } main(argc, argv) int argc; Char *argv[]; { Char STR1[256]; Char *TEMP; long FORLIM; PASCAL_MAIN(argc, argv); f = NULL; base = NULL; fnum = 0; kw("procedure", k_prockw); kw("function", k_prockw); kw("var", k_varkw); kw("record", k_varkw); kw("type", k_typekw); kw("const", k_constkw); kw("begin", k_beginkw); kw("end", k_kw); kw("do", k_kw); kw("for", k_kw); kw("to", k_kw); kw("while", k_kw); kw("repeat", k_kw); kw("until", k_kw); kw("if", k_kw); kw("then", k_kw); kw("else", k_kw); kw("case", k_kw); kw("of", k_kw); kw("div", k_kw); kw("mod", k_kw); kw("nil", k_kw); kw("not", k_kw); kw("and", k_kw); kw("or", k_kw); kw("with", k_kw); kw("array", k_kw); kw("integer", k_kw); kw("char", k_kw); kw("boolean", k_kw); kw("true", k_kw); kw("false", k_kw); printf("\nPascal Cross Reference Utility\n\n"); do { fnum++; printf("Name of cross-reference file #%ld? ", fnum); fgets(fn, 121, stdin); TEMP = strchr(fn, '\n'); if (TEMP != NULL) *TEMP = 0; good = true; if (*fn != '\0') { TRY(try1); if (f != NULL) f = freopen(fn, "r", f); else f = fopen(fn, "r"); if (f == NULL) { P_escapecode = -10; P_ioresult = FileNotFound; goto _Ltry1; } RECOVER2(try1,_Ltry1); if (P_escapecode != -10) _Escape(P_escapecode); good = false; printf("Can't read file!\n"); ENDTRY(try1); } else good = false; if (good) { lnum = 0; section = k_normal; curkind = k_normal; paren = 0; while (!P_eof(f)) { lnum++; fgets(buf, 256, f); TEMP = strchr(buf, '\n'); if (TEMP != NULL) *TEMP = 0; /* p2c: dist/examples/cref.p, line 228: * Note: Null character at end of sprintf control string [148] */ strcpy(STR1, buf); strcpy(buf, STR1); i = 1; while (buf[i - 1] == ' ') i++; do { while (!(buf[i - 1] == '\0' || buf[i - 1] == '_' || isalnum(buf[i - 1]))) { switch (buf[i - 1]) { case ':': case '=': if (brace == 0) curkind = k_normal; break; case ';': if (brace == 0) curkind = section; break; case '\'': if (brace == 0) { i++; j = i; while ((buf[i - 1] != '\'' || buf[i] == '\'') && buf[i - 1] != '\0') { if (buf[i - 1] == '\'') i += 2; else i++; } if (buf[i - 1] == '\0') i--; sprintf(name, "'%.*s'", (int)(i - j), buf + j - 1); lookup(name, &np); cref(np, k_strlit); } break; case '(': if (brace == 0) { if (buf[i] == '*') { brace = 1; i++; } else { paren++; curkind = k_normal; } } break; case ')': if (brace == 0) paren--; break; case '*': if (buf[i] == ')') { brace = 0; i++; } break; case '{': brace = 1; break; case '}': brace = 0; break; } i++; } if (buf[i - 1] != '\0') { j = i; if (isdigit(buf[i - 1]) && i > 1 && buf[i - 2] == '-') j--; while (buf[i - 1] == '_' || isalnum(buf[i - 1])) i++; if (brace == 0) { sprintf(name, "%.*s", (int)(i - j), buf + j - 1); FORLIM = strlen(name); for (j = 1; j <= FORLIM; j++) { if (isupper(buf[j - 1])) buf[j - 1] += 32; } while (buf[i - 1] == ' ') i++; lookup(name, &np); switch (np->kind) { case k_varkw: if (paren == 0) { section = k_var; curkind = section; } break; case k_typekw: section = k_type; curkind = section; break; case k_constkw: section = k_const; curkind = section; break; case k_prockw: section = k_normal; curkind = k_proc; break; case k_beginkw: section = k_normal; curkind = k_normal; break; case k_kw: /* blank case */ break; default: if (curkind == k_normal && buf[i - 1] == '(') cref(np, k_extproc); else cref(np, curkind); break; } } } } while (buf[i - 1] != '\0'); } if (paren != 0) printf("Warning: ending paren count = %ld\n", paren); if (f != NULL) fclose(f); f = NULL; } } while (*fn != '\0'); putchar('\n'); do { printf("Output file name: "); fgets(fn, 121, stdin); TEMP = strchr(fn, '\n'); if (TEMP != NULL) *TEMP = 0; } while (*fn == '\0'); if (f != NULL) f = freopen(fn, "w", f); else f = fopen(fn, "w"); if (f == NULL) _EscIO(FileNotFound); traverse(base); if (f != NULL) fclose(f); f = NULL; if (f != NULL) fclose(f); exit(EXIT_SUCCESS); } /* End. */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.