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