blob: 82062c4cd52e031605f480cce98a1bb22f04b6ae (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include <libterm/terminal.h>
#include <knob/format.h>
#include <knob/block.h>
#include <knob/heap.h>
#include <pland/pcrt.h>
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();
}
}
|