+ Name n;
+
+ if (cmd == nil) {
+ for (i = 0; i < HASHTABLESIZE; i++) {
+ for (k = hashtab[i]; k != nil; k = k->chain) {
+ if (k->class == ISALIAS) {
+ if (isredirected()) {
+ printf("alias %s", ident(k->name));
+ printparams(k->value.alias.paramlist);
+ printf("\t\"%s\"\n", k->value.alias.expansion);
+ } else {
+ printf("%s", ident(k->name));
+ printparams(k->value.alias.paramlist);
+ printf("\t%s\n", k->value.alias.expansion);
+ }
+ }
+ }
+ }
+ } else {
+ k = findword(cmd, ISALIAS);
+ if (k == nil) {
+ printf("\n");
+ } else {
+ printparams(k->value.alias.paramlist);
+ printf("%s\n", k->value.alias.expansion);
+ }
+ }
+}
+
+private printparams (pl)
+List pl;
+{
+ Name n;
+
+ if (pl != nil) {
+ printf("(");
+ foreach(Name, n, pl)
+ printf("%s", ident(n));
+ if (not list_islast()) {
+ printf(", ");
+ }
+ endfor
+ printf(")");
+ }
+}
+
+/*
+ * Remove an alias.
+ */
+
+public unalias (n)
+Name n;
+{
+ if (not keywords_delete(n, ISALIAS)) {
+ error("%s is not aliased", ident(n));
+ }
+}
+
+/*
+ * Define a variable.
+ */
+
+public defvar (n, val)
+Name n;
+Node val;
+{
+ Keyword k;
+
+ if (n == nil) {
+ print_vars();
+ } else {
+ if (lookup(n) != nil) {
+ error("\"%s\" is a program symbol -- use assign", ident(n));
+ }
+ k = findword(n, ISVAR);
+ if (k == nil) {
+ k = keywords_insert(n);
+ }
+ k->class = ISVAR;
+ k->value.var = val;
+ if (n == identname("$mapaddrs", true)) {
+ vaddrs = true;
+ }
+ }
+}
+
+/*
+ * Return the value associated with a variable.
+ */
+
+public Node findvar (n)
+Name n;
+{
+ Keyword k;
+ Node val;
+
+ k = findword(n, ISVAR);
+ if (k == nil) {
+ val = nil;
+ } else {
+ val = k->value.var;
+ }
+ return val;
+}
+
+/*
+ * Return whether or not a variable is set.
+ */
+
+public boolean varIsSet (s)
+String s;
+{
+ return (boolean) (findword(identname(s, false), ISVAR) != nil);
+}
+
+/*
+ * Delete a variable.
+ */
+
+public undefvar (n)
+Name n;
+{
+ if (not keywords_delete(n, ISVAR)) {
+ error("%s is not set", ident(n));
+ }
+ if (n == identname("$mapaddrs", true)) {
+ vaddrs = false;
+ }
+}
+
+/*
+ * Print out all the values of set variables.
+ */
+
+private print_vars ()
+{
+ register integer i;
+ register Keyword k;
+
+ for (i = 0; i < HASHTABLESIZE; i++) {
+ for (k = hashtab[i]; k != nil; k = k->chain) {
+ if (k->class == ISVAR) {
+ if (isredirected()) {
+ printf("set ");
+ }
+ printf("%s", ident(k->name));
+ if (k->value.var != nil) {
+ printf("\t");
+ prtree(stdout, k->value.var);
+ }
+ printf("\n");
+ }