#include #include #include #include #include struct no_null_sn { char *data; uint32_t length; }; struct var_dict_node { struct var_dict_node *next; struct var_dict_node *prev; struct no_null_sn name; struct no_null_sn value; }; static struct var_dict_node *var_dict_start = 0; __attribute__ ((pure)) static struct var_dict_node *get_node(struct no_null_sn name) { for (struct var_dict_node *i = var_dict_start; i; i = i->next) if ((i->name.length == name.length) && blockequ(i->name.data, name.data, name.length)) return i; return 0; } static struct var_dict_node *new_node() { struct var_dict_node *node = get_block(sizeof(struct var_dict_node)); node->prev = 0; node->next = var_dict_start; if (var_dict_start) var_dict_start->prev = node; var_dict_start = node; return node; } void set_var(struct no_null_sn name, struct no_null_sn value) { struct var_dict_node *node = get_node(name); if (node) free_block(node->value.data); else { node = new_node(); node->name.length = name.length; node->name.data = get_block(name.length); blockcpy(node->name.data, name.data, name.length); } node->value.length = value.length; node->value.data = get_block(value.length); blockcpy(node->value.data, value.data, value.length); } __attribute__ ((pure)) const struct no_null_sn *get_var(struct no_null_sn name) { struct var_dict_node *node = get_node(name); return node ? &node->value : 0; } void del_var(struct no_null_sn name) { struct var_dict_node *node = get_node(name); if (!node) return; free_block(node->name.data); free_block(node->value.data); if (node->prev) node->prev->next = node->next; if (node->next) node->next->prev = node->prev; if (node == var_dict_start) var_dict_start = node->next; free_block(node); } void dump_vars() { for (struct var_dict_node *node = var_dict_start; node; node = node->next) { term_addf_no_ww("$%ns$\t= %ns\n", node->name.length, node->name.data, node->value.length, node->value.data); term_paint(); } }