1 /* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/vars.c,v 1.7 2008/03/19 09:17:13 cshapiro Rel $ */
11 #define NAME_BUCKETS 31
12 #define OBJ_BUCKETS 31
14 static struct var *NameHash[NAME_BUCKETS], *ObjHash[OBJ_BUCKETS];
15 static int tempcntr = 1;
19 lispobj(*update_fn) (struct var * var);
22 boolean map_back, permanent;
24 struct var *nnext; /* Next in name list */
25 struct var *onext; /* Next in object list */
31 unsigned long value = 0;
33 while (*name != '\0') {
34 value = (value << 1) ^ *(unsigned char *) (name++);
35 value = (value & (1 - (1 << 24))) ^ (value >> 24);
38 return value % NAME_BUCKETS;
44 return (unsigned long) obj % OBJ_BUCKETS;
52 struct var *var, *next, *perm = NULL;
54 /* 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. */
56 for (index = 0; index < NAME_BUCKETS; index++)
57 for (var = NameHash[index]; var != NULL; var = next) {
67 memset(NameHash, 0, sizeof(NameHash));
68 memset(ObjHash, 0, sizeof(ObjHash));
71 for (var = perm; var != NULL; var = next) {
73 index = hash_name(var->name);
74 var->nnext = NameHash[index];
75 NameHash[index] = var;
77 index = hash_obj(var->obj);
78 var->onext = ObjHash[index];
85 lookup_by_name(char *name)
89 for (var = NameHash[hash_name(name)]; var != NULL; var = var->nnext)
90 if (strcmp(var->name, name) == 0)
96 lookup_by_obj(lispobj obj)
100 for (var = ObjHash[hash_obj(obj)]; var != NULL; var = var->onext)
107 make_var(char *name, boolean perm)
113 var = (struct var *) malloc(sizeof(struct var));
121 sprintf(buffer, "%d", tempcntr++);
124 var->name = (char *) malloc(strlen(name) + 1);
125 strcpy(var->name, name);
127 var->permanent = perm;
128 var->map_back = FALSE;
130 index = hash_name(name);
131 var->nnext = NameHash[index];
132 NameHash[index] = var;
138 define_var(char *name, lispobj obj, boolean perm)
140 struct var *var = make_var(name, perm);
144 var->update_fn = NULL;
146 if (lookup_by_obj(obj) == NULL) {
147 var->map_back = TRUE;
148 index = hash_obj(obj);
149 var->onext = ObjHash[index];
150 ObjHash[index] = var;
157 define_dynamic_var(char *name, lispobj updatefn(struct var *), boolean perm)
159 struct var *var = make_var(name, perm);
161 var->update_fn = updatefn;
167 var_name(struct var *var)
173 var_value(struct var * var)
175 if (var->update_fn != NULL)
176 var->obj = (*var->update_fn) (var);
181 var_clock(struct var *var)
187 var_setclock(struct var *var, long val)