|
|
1.1 root 1: /* Copyright (c) 1982 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)keywords.c 1.3 5/18/83";
4:
5: /*
6: * Keyword management.
7: */
8:
9: #include "defs.h"
10: #include "keywords.h"
11: #include "scanner.h"
12: #include "names.h"
13: #include "symbols.h"
14: #include "tree.h"
15: #include "y.tab.h"
16:
17: #ifndef public
18: #include "scanner.h"
19: #endif
20:
21: private String reserved[] ={
22: "alias", "and", "assign", "at", "call", "catch", "cont",
23: "debug", "delete", "div", "dump", "edit", "file", "func",
24: "gripe", "help", "if", "ignore", "in",
25: "list", "mod", "next", "nexti", "nil", "not", "or",
26: "print", "psym", "quit", "run",
27: "sh", "skip", "source", "status", "step", "stepi",
28: "stop", "stopi", "trace", "tracei",
29: "use", "whatis", "when", "where", "whereis", "which",
30: "INT", "REAL", "NAME", "STRING",
31: "LFORMER", "RFORMER", "#^", "->"
32: };
33:
34: /*
35: * The keyword table is a traditional hash table with collisions
36: * resolved by chaining.
37: */
38:
39: #define HASHTABLESIZE 503
40:
41: typedef struct Keyword {
42: Name name;
43: Token toknum : 16;
44: Boolean isalias : 16;
45: struct Keyword *chain;
46: } *Keyword;
47:
48: typedef unsigned int Hashvalue;
49:
50: private Keyword hashtab[HASHTABLESIZE];
51:
52: #define hash(n) ((((unsigned) n) >> 2) mod HASHTABLESIZE)
53:
54: /*
55: * Enter all the reserved words into the keyword table.
56: */
57:
58: public enterkeywords()
59: {
60: register Integer i;
61:
62: for (i = ALIAS; i <= WHICH; i++) {
63: keyword(reserved[ord(i) - ord(ALIAS)], i, false);
64: }
65: keyword("set", ASSIGN, false);
66: }
67:
68: /*
69: * Deallocate the keyword table.
70: */
71:
72: public keywords_free()
73: {
74: register Integer i;
75: register Keyword k, nextk;
76:
77: for (i = 0; i < HASHTABLESIZE; i++) {
78: k = hashtab[i];
79: while (k != nil) {
80: nextk = k->chain;
81: dispose(k);
82: k = nextk;
83: }
84: hashtab[i] = nil;
85: }
86: }
87:
88: /*
89: * Enter a keyword into the name table. It is assumed to not be there already.
90: * The string is assumed to be statically allocated.
91: */
92:
93: private keyword(s, t, isalias)
94: String s;
95: Token t;
96: Boolean isalias;
97: {
98: register Hashvalue h;
99: register Keyword k;
100: Name n;
101:
102: n = identname(s, true);
103: h = hash(n);
104: k = new(Keyword);
105: k->name = n;
106: k->toknum = t;
107: k->isalias = isalias;
108: k->chain = hashtab[h];
109: hashtab[h] = k;
110: }
111:
112: /*
113: * Return the string associated with a token corresponding to a keyword.
114: */
115:
116: public String keywdstring(t)
117: Token t;
118: {
119: return reserved[ord(t) - ord(ALIAS)];
120: }
121:
122: /*
123: * Find a keyword in the keyword table.
124: * We assume that tokens cannot legitimately be nil (0).
125: */
126:
127: public Token findkeyword(n)
128: Name n;
129: {
130: register Hashvalue h;
131: register Keyword k;
132: Token t;
133:
134: h = hash(n);
135: k = hashtab[h];
136: while (k != nil and k->name != n) {
137: k = k->chain;
138: }
139: if (k == nil) {
140: t = nil;
141: } else {
142: t = k->toknum;
143: }
144: return t;
145: }
146:
147: /*
148: * Create an alias.
149: */
150:
151: public enter_alias(newcmd, oldcmd)
152: Name newcmd;
153: Name oldcmd;
154: {
155: Token t;
156:
157: t = findkeyword(oldcmd);
158: if (t == nil) {
159: error("\"%s\" is not a command", ident(oldcmd));
160: } else {
161: keyword(ident(newcmd), t, true);
162: }
163: }
164:
165: /*
166: * Print out an alias.
167: */
168:
169: public print_alias(cmd)
170: Name cmd;
171: {
172: register Keyword k;
173: register Integer i;
174: Token t;
175:
176: if (cmd == nil) {
177: for (i = 0; i < HASHTABLESIZE; i++) {
178: for (k = hashtab[i]; k != nil; k = k->chain) {
179: if (k->isalias) {
180: if (isredirected()) {
181: printf("alias ");
182: }
183: printf("%s\t%s\n", ident(k->name), keywdstring(k->toknum));
184: }
185: }
186: }
187: } else {
188: t = findkeyword(cmd);
189: if (t == nil) {
190: printf("\n");
191: } else {
192: printf("%s\n", keywdstring(t));
193: }
194: }
195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.