date and time created 82/12/15 04:07:34 by linton
authorMark Linton <linton@ucbvax.Berkeley.EDU>
Wed, 15 Dec 1982 20:07:34 +0000 (12:07 -0800)
committerMark Linton <linton@ucbvax.Berkeley.EDU>
Wed, 15 Dec 1982 20:07:34 +0000 (12:07 -0800)
SCCS-vsn: old/dbx/keywords.c 1.1

usr/src/old/dbx/keywords.c [new file with mode: 0644]

diff --git a/usr/src/old/dbx/keywords.c b/usr/src/old/dbx/keywords.c
new file mode 100644 (file)
index 0000000..64eeab8
--- /dev/null
@@ -0,0 +1,195 @@
+/* Copyright (c) 1982 Regents of the University of California */
+
+static char sccsid[] = "@(#)@(#)keywords.c 1.1 %G%";
+
+/*
+ * Keyword management.
+ */
+
+#include "defs.h"
+#include "keywords.h"
+#include "scanner.h"
+#include "names.h"
+#include "symbols.h"
+#include "tree.h"
+#include "y.tab.h"
+
+#ifndef public
+#include "scanner.h"
+#endif
+
+private String reserved[] ={
+    "alias", "and", "assign", "at", "call", "catch", "cont",
+    "delete", "div", "dump", "edit", "file", "func",
+    "gripe", "help", "if", "ignore", "in",
+    "list", "mod", "next", "nexti", "nil", "not", "or",
+    "print", "psym", "quit", "run",
+    "sh", "skip", "source", "status", "step", "stepi",
+    "stop", "stopi", "trace", "tracei",
+    "use", "whatis", "when", "where", "whereis", "which",
+    "INT", "REAL", "NAME", "STRING",
+    "LFORMER", "RFORMER", "#^", "->"
+};
+
+/*
+ * The keyword table is a traditional hash table with collisions
+ * resolved by chaining.
+ */
+
+#define HASHTABLESIZE 503
+
+typedef struct Keyword {
+    Name name;
+    Token toknum : 16;
+    Boolean isalias : 16;
+    struct Keyword *chain;
+} *Keyword;
+
+typedef unsigned int Hashvalue;
+
+private Keyword hashtab[HASHTABLESIZE];
+
+#define hash(n) ((((unsigned) n) >> 2) mod HASHTABLESIZE)
+
+/*
+ * Enter all the reserved words into the keyword table.
+ */
+
+public enterkeywords()
+{
+    register Integer i;
+
+    for (i = ALIAS; i <= WHICH; i++) {
+       keyword(reserved[ord(i) - ord(ALIAS)], i, false);
+    }
+    keyword("set", ASSIGN, false);
+}
+
+/*
+ * Deallocate the keyword table.
+ */
+
+public keywords_free()
+{
+    register Integer i;
+    register Keyword k, nextk;
+
+    for (i = 0; i < HASHTABLESIZE; i++) {
+       k = hashtab[i];
+       while (k != nil) {
+           nextk = k->chain;
+           dispose(k);
+           k = nextk;
+       }
+       hashtab[i] = nil;
+    }
+}
+
+/*
+ * Enter a keyword into the name table.  It is assumed to not be there already.
+ * The string is assumed to be statically allocated.
+ */
+
+private keyword(s, t, isalias)
+String s;
+Token t;
+Boolean isalias;
+{
+    register Hashvalue h;
+    register Keyword k;
+    Name n;
+
+    n = identname(s, true);
+    h = hash(n);
+    k = new(Keyword);
+    k->name = n;
+    k->toknum = t;
+    k->isalias = isalias;
+    k->chain = hashtab[h];
+    hashtab[h] = k;
+}
+
+/*
+ * Return the string associated with a token corresponding to a keyword.
+ */
+
+public String keywdstring(t)
+Token t;
+{
+    return reserved[ord(t) - ord(ALIAS)];
+}
+
+/*
+ * Find a keyword in the keyword table.
+ * We assume that tokens cannot legitimately be nil (0).
+ */
+
+public Token findkeyword(n)
+Name n;
+{
+    register Hashvalue h;
+    register Keyword k;
+    Token t;
+
+    h = hash(n);
+    k = hashtab[h];
+    while (k != nil and k->name != n) {
+       k = k->chain;
+    }
+    if (k == nil) {
+       t = nil;
+    } else {
+       t = k->toknum;
+    }
+    return t;
+}
+
+/*
+ * Create an alias.
+ */
+
+public enter_alias(newcmd, oldcmd)
+Name newcmd;
+Name oldcmd;
+{
+    Token t;
+
+    t = findkeyword(oldcmd);
+    if (t == nil) {
+       error("\"%s\" is not a command", ident(oldcmd));
+    } else {
+       keyword(ident(newcmd), t, true);
+    }
+}
+
+/*
+ * Print out an alias.
+ */
+
+public print_alias(cmd)
+Name cmd;
+{
+    register Keyword k;
+    register Integer i;
+    Token t;
+
+    if (cmd == nil) {
+       for (i = 0; i < HASHTABLESIZE; i++) {
+           for (k = hashtab[i]; k != nil; k = k->chain) {
+               if (k->isalias) {
+                   if (isredirected()) {
+                       printf("alias ");
+                   }
+                   printf("%s\t%s\n", ident(k->name), keywdstring(k->toknum));
+               }
+           }
+       }
+    } else {
+       t = findkeyword(cmd);
+       if (t == nil) {
+           printf("\n");
+       } else {
+           printf("%s\n", keywdstring(t));
+       }
+    }
+}