aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/var.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/var.c')
-rw-r--r--sys/cmd/rc/var.c69
1 files changed, 67 insertions, 2 deletions
diff --git a/sys/cmd/rc/var.c b/sys/cmd/rc/var.c
index 5e1e90c..3e9635f 100644
--- a/sys/cmd/rc/var.c
+++ b/sys/cmd/rc/var.c
@@ -1,6 +1,19 @@
#include "rc.h"
+#include "parse.h"
+
+// TODO: string interning
+
+// -----------------------------------------------------------------------
+// globals
+
+struct Keyword
+{
+ char *name;
+ int type;
+};
static Var *globals[512];
+static struct Keyword keywords[100]; // sparse map means less hits
// -----------------------------------------------------------------------
// internals
@@ -111,8 +124,6 @@ bigpath(Var *v)
·setvar("path", w, 0);
}
-
-
// -----------------------------------------------------------------------
// exports
@@ -269,3 +280,57 @@ initpath(void)
bigpath(v);
}
+#define KEYWORDS \
+ KEYWORD("for", Tfor) \
+ KEYWORD("in", Tin) \
+ KEYWORD("while", Twhile) \
+ KEYWORD("if", Tif) \
+ KEYWORD("else", Telse) \
+ KEYWORD("switch", Tswitch) \
+ KEYWORD("case", Tcase) \
+ KEYWORD("!", Tbang) \
+ KEYWORD("@", Tsubshell) \
+ KEYWORD("func", Tfunc)
+
+void
+initkeywords(void)
+{
+ int i, s, j, h;
+#define KEYWORD(a, b) a,
+ static char *name[] = { KEYWORDS };
+#undef KEYWORD
+#define KEYWORD(a, b) b,
+ static int type[] = { KEYWORDS };
+#undef KEYWORD
+
+ for(i = 0; i < arrlen(type); i++){
+ h = hash(name[i], arrlen(keywords));
+ for(s=0; s < arrlen(keywords); s++){
+ j = (h + s) % arrlen(keywords);
+ if(!keywords[j].type || strcmp(keywords[j].name, name[i]) == 0){
+ keywords[j].name = name[i];
+ keywords[j].type = type[i];
+ goto nextkeyword;
+ }
+ }
+ nextkeyword:;
+ }
+}
+
+int
+iskeyword(char *word)
+{
+ int i, s, h;
+
+ h = hash(word, arrlen(keywords));
+ for(s = 0; s < arrlen(keywords); s++){
+ i = (h + s) % arrlen(keywords);
+ if(!keywords[i].type)
+ return 0;
+ if(strcmp(keywords[i].name, word) == 0)
+ return keywords[i].type;
+ }
+ return 0;
+}
+
+#undef KEYWORDS