date and time created 82/12/15 04:08:53 by linton
[unix-history] / usr / src / old / dbx / keywords.c
CommitLineData
9a3f3b7b
ML
1/* Copyright (c) 1982 Regents of the University of California */
2
3static char sccsid[] = "@(#)@(#)keywords.c 1.1 %G%";
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
21private String reserved[] ={
22 "alias", "and", "assign", "at", "call", "catch", "cont",
23 "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
41typedef struct Keyword {
42 Name name;
43 Token toknum : 16;
44 Boolean isalias : 16;
45 struct Keyword *chain;
46} *Keyword;
47
48typedef unsigned int Hashvalue;
49
50private 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
58public 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
72public 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
93private keyword(s, t, isalias)
94String s;
95Token t;
96Boolean 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
116public String keywdstring(t)
117Token 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
127public Token findkeyword(n)
128Name 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
151public enter_alias(newcmd, oldcmd)
152Name newcmd;
153Name 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
169public print_alias(cmd)
170Name 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}