date and time created 83/08/05 13:35:04 by sam
[unix-history] / usr / src / old / dbx / keywords.c
CommitLineData
9a3f3b7b
ML
1/* Copyright (c) 1982 Regents of the University of California */
2
ae26f283 3static char sccsid[] = "@(#)keywords.c 1.3 %G%";
9a3f3b7b
ML
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",
ae26f283 23 "debug", "delete", "div", "dump", "edit", "file", "func",
9a3f3b7b
ML
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}