commit 0cc11334c93bfb095fb88fe06d7f808888d9c89f
parent c61c8326110cfe3639af0f60b0f946ef19a0b443
Author: Tomas Hlavaty <tom@logand.com>
Date: Tue, 13 Mar 2012 23:25:26 +0100
better intern1
Diffstat:
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/unoidl2.c b/unoidl2.c
@@ -64,21 +64,19 @@ Any cons(Any car, Any cdr) {
return x;
}
-static Any root1 = NULL;
+static Any root1;
+static Any intern1_k;
Any intern1(char *x) {
- if(x) {
- Any root = root1;
- while(*x) {
- Any c = mkchara(*x++); // TODO no consing
- Any root2 = find(c, cdr(root), equal, caar);
- if(NIL == root2)
- root->u.c.cdr = cons(root2 = list1(cons(c, root)), cdr(root));
- root = root2;
- }
- return root;
+ Any p = root1;
+ for(; *x; x++) {
+ intern1_k->u.chara = *x;
+ Any r = find(intern1_k, cdr(p), equal, caar);
+ if(NIL == r)
+ p->u.c.cdr = cons(r = list1(cons(mkchara(*x), p)), cdr(p));
+ p = r;
}
- return NIL;
+ return p;
}
Any mk(Kind kind, char *token) {
@@ -260,6 +258,7 @@ void init() {
NIL->u.c.car = NIL;
NIL->u.c.cdr = NIL;
root1 = list1(NIL);
+ intern1_k = mkchara(0);
T = xalloc();
T->tag = TOKEN;
T->u.t.kind = 0;