44 lines
1001 B
C
44 lines
1001 B
C
|
#include"vartable.h"
|
||
|
|
||
|
#include"utils.h"
|
||
|
#include<stdlib.h>
|
||
|
#include<string.h>
|
||
|
|
||
|
VarTable *vartable_new(VarTable *parent) {
|
||
|
VarTable *ret = malloc(sizeof(*ret));
|
||
|
ret->parent = parent;
|
||
|
ret->count = 0;
|
||
|
ret->names = NULL;
|
||
|
ret->data = NULL;
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
VarTableEntry *vartable_get(VarTable *this, const char *name) {
|
||
|
for(size_t v = 0; v < this->count; v++) {
|
||
|
if(!strcmp(name, this->names[v])) return this->data[v];
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
VarTableEntry *vartable_find(VarTable *this, const char *name) {
|
||
|
VarTable *tbl = this;
|
||
|
while(tbl) {
|
||
|
VarTableEntry *entry = vartable_get(tbl, name);
|
||
|
if(entry) {
|
||
|
return entry;
|
||
|
}
|
||
|
tbl = tbl->parent;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
VarTableEntry *vartable_set(VarTable *this, const char *name, VarTableEntry *e) {
|
||
|
this->names = realloc(this->names, sizeof(*this->names) * (this->count + 1));
|
||
|
this->data = realloc(this->data, sizeof(*this->data) * (this->count + 1));
|
||
|
this->names[this->count] = name;
|
||
|
this->data[this->count] = e;
|
||
|
this->count++;
|
||
|
return e;
|
||
|
}
|