3 This code was written as part of the CMU Common Lisp project at
4 Carnegie Mellon University, and has been placed in the public domain.
17 #define NAME_BUCKETS 31
18 #define OBJ_BUCKETS 31
20 static struct var *NameHash[NAME_BUCKETS], *ObjHash[OBJ_BUCKETS];
21 static int tempcntr = 1;
25 lispobj(*update_fn) (struct var * var);
28 boolean map_back, permanent;
30 struct var *nnext; /* Next in name list */
31 struct var *onext; /* Next in object list */
37 unsigned long value = 0;
39 while (*name != '\0') {
40 value = (value << 1) ^ *(unsigned char *) (name++);
41 value = (value & (1 - (1 << 24))) ^ (value >> 24);
44 return value % NAME_BUCKETS;
50 return (unsigned long) obj % OBJ_BUCKETS;
58 struct var *var, *next, *perm = NULL;
60 /* Note: all vars in the object hash table also appear in the name hash table, so if we free everything in the name hash table, we free everything in the object hash table. */
62 for (index = 0; index < NAME_BUCKETS; index++)
63 for (var = NameHash[index]; var != NULL; var = next) {
73 memset(NameHash, 0, sizeof(NameHash));
74 memset(ObjHash, 0, sizeof(ObjHash));
77 for (var = perm; var != NULL; var = next) {
79 index = hash_name(var->name);
80 var->nnext = NameHash[index];
81 NameHash[index] = var;
83 index = hash_obj(var->obj);
84 var->onext = ObjHash[index];
91 lookup_by_name(char *name)
95 for (var = NameHash[hash_name(name)]; var != NULL; var = var->nnext)
96 if (strcmp(var->name, name) == 0)
102 lookup_by_obj(lispobj obj)
106 for (var = ObjHash[hash_obj(obj)]; var != NULL; var = var->onext)
113 make_var(char *name, boolean perm)
119 var = (struct var *) malloc(sizeof(struct var));
127 sprintf(buffer, "%d", tempcntr++);
130 var->name = (char *) malloc(strlen(name) + 1);
131 strcpy(var->name, name);
133 var->permanent = perm;
134 var->map_back = FALSE;
136 index = hash_name(name);
137 var->nnext = NameHash[index];
138 NameHash[index] = var;
144 define_var(char *name, lispobj obj, boolean perm)
146 struct var *var = make_var(name, perm);
150 var->update_fn = NULL;
152 if (lookup_by_obj(obj) == NULL) {
153 var->map_back = TRUE;
154 index = hash_obj(obj);
155 var->onext = ObjHash[index];
156 ObjHash[index] = var;
163 define_dynamic_var(char *name, lispobj updatefn(struct var *), boolean perm)
165 struct var *var = make_var(name, perm);
167 var->update_fn = updatefn;
173 var_name(struct var *var)
179 var_value(struct var * var)
181 if (var->update_fn != NULL)
182 var->obj = (*var->update_fn) (var);
187 var_clock(struct var *var)
193 var_setclock(struct var *var, long val)