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