/* int.c */
struct variable {
+ struct node car;
char* name;
char* value;
int modified;
- struct variable* next;
};
struct hlist {
struct email e;
};
-struct variable** var_hash;
+struct list* var_hash;
void print_tree(struct tree* t, int ind);
-void interp(struct tree* t, struct variable** hash);
-struct variable** new_var_hash(void);
-void print_vars(struct variable** hash);
-void save_current_headers(struct variable** hash);
+void interp(struct tree* t, struct list* hash);
+struct list* new_var_hash(void);
+void print_vars(struct list* hash);
+void save_current_headers(struct list* hash);
/* ham.c */
struct list* current_headers;
#define HASHSIZE 103
#define MAGIC 19
-struct variable**
+struct list*
new_var_hash(void)
{
- struct variable** res;
+ struct list* res;
+ int i;
- res = xmalloc (HASHSIZE * sizeof(struct variable*));
- memset(res, 0, sizeof(struct variable*)*HASHSIZE);
+ res = xmalloc (HASHSIZE * sizeof(struct list));
+ for (i = 0; i < HASHSIZE; i++)
+ list_init(res + i);
+
return res;
}
/* value NULL for finding without modyfiing */
static struct variable*
-find_var(char* name, char* value, struct variable** hash)
+find_var(char* name, char* value, struct list* hash)
{
- int n;
+ int n, found = 0;
struct variable *p;
n = get_bucket_number(name);
- p = hash[n];
-
if (isupper(*name)){
- while(p && strcasecmp(p->name,name))
- p = p->next;
+ LIST_FOREACH(p, hash + n)
+ if (!strcasecmp(p->name,name)){
+ found = 1;
+ break;
+ }
} else {
- while(p && strcmp(p->name,name))
- p = p->next;
+ LIST_FOREACH(p, hash + n)
+ if (!strcmp(p->name, name)){
+ found = 1;
+ break;
+ }
}
- if (p && value){
+ if (found && value){
free(p->value);
p->value = value;
p->modified = 1;
- } else if (p && !value)
+ } else if (found && !value)
return p;
else {
p = xmalloc(sizeof(struct variable));
- p->next = hash[n];
- hash[n] = p;
p->name = name;
p->value = (value? value:xstrdup(""));
p->modified = 1;
+
+ list_add_last(hash+n, &p->car);
}
return p;
return res;
}
-char*
-interp_ass_right(struct tree* t, struct variable** hash)
+static char*
+interp_ass_right(struct tree* t, struct list* hash)
{
switch (t->st){
case ST_LEAF:
}
// FIXME: we would like to be able also do things like ($a & $b) == $c
-int
-interp_cond(struct tree* t, struct variable** hash)
+static int
+interp_cond(struct tree* t, struct list* hash)
{
if (t->st != ST_COND)
die("Muhehehechlemst?");
}
static void
-modify_headers(struct list* headers, struct variable** hash)
+modify_headers(struct list* headers, struct list* hash)
{
struct hlist* p;
struct variable* pv;
/* find new headers */
for (i = 0; i < HASHSIZE; i++){
- for(pv = hash[i]; pv; pv = pv->next){
+ LIST_FOREACH(pv, hash + i){
if (isupper(pv->name[0]) && pv->modified){
pv->modified = 0;
}
static void
-new_action(char* l, char* r, char* s, struct variable** hash)
+new_action(char* l, char* r, char* s, struct list* hash)
{
struct action* a;
}
void
-interp(struct tree* t, struct variable** hash)
+interp(struct tree* t, struct list* hash)
{
if (!t)
return;
}
void
-print_vars(struct variable** hash)
+print_vars(struct list* hash)
{
int i;
struct variable* p;
for (i=0; i<HASHSIZE; i++){
- p = hash[i];
- while(p){
+ LIST_FOREACH(p, hash + i)
printf("%s=%s\n",p->name, p->value);
- p = p->next;
- }
}
}
}
void
-save_current_headers(struct variable** hash)
+save_current_headers(struct list* hash)
{
struct hlist* p;
struct variable* pv;