3 #include "gs/gs_private.h"
6 struct s_gs_type *p_type;
14 gras_dynar_t *globals;
20 _gs_vars_pop(struct s_gs_vars *p_vars,
23 gras_dynar_t *p_dynar = NULL;
24 struct s_gs_var *p_var = NULL;
26 gras_dict_retrieve(p_vars->space, name, (void **)&p_dynar);
27 gras_dynar_pop(p_dynar, &p_var);
29 if (!gras_dynar_length(p_dynar)) {
30 gras_dict_remove(p_vars->space, name);
31 gras_dynar_free_container(p_dynar);
38 gs_vars_pop(void *_p_vars,
40 struct s_gs_type **pp_type) {
42 struct s_gs_vars *p_vars = _p_vars;
43 gras_dynar_t *p_dynar = NULL;
44 struct s_gs_var *p_var = NULL;
47 gras_dict_retrieve(p_vars->space, name, (void **)&p_dynar);
48 gras_dynar_pop(p_dynar, &p_var);
50 if (!gras_dynar_length(p_dynar)) {
51 gras_dict_remove(p_vars->space, name);
52 gras_dynar_free_container(p_dynar);
56 *pp_type = p_var->p_type;
63 gras_dynar_pop(p_vars->stack, &p_dynar);
65 int l = gras_dynar_length(p_dynar);
70 gras_dynar_get(p_dynar, l, &_name);
71 if (!strcmp(name, _name)) {
72 gras_dynar_remove_at(p_dynar, l, &_name);
78 gras_dynar_push(p_vars->stack, &p_dynar);
85 gs_vars_push(void *_p_vars,
86 struct s_gs_type *p_type,
90 struct s_gs_vars *p_vars = _p_vars;
91 gras_dynar_t *p_dynar = NULL;
92 struct s_gs_var *p_var = NULL;
96 gras_dict_retrieve(p_vars->space, name, (void **)&p_dynar);
99 gras_dynar_new(&p_dynar, sizeof (struct s_gs_var *), NULL);
100 gras_dict_insert(p_vars->space, name, (void **)p_dynar, NULL);
103 p_var = calloc(1, sizeof(struct s_gs_var));
104 p_var->p_type = p_type;
107 gras_dynar_push(p_dynar, &p_var);
109 gras_dynar_pop(p_vars->stack, &p_dynar);
110 gras_dynar_push(p_dynar, &name);
111 gras_dynar_push(p_vars->stack, &p_dynar);
115 gs_vars_set(void *_p_vars,
116 struct s_gs_type *p_type,
120 struct s_gs_vars *p_vars = _p_vars;
121 gras_dynar_t *p_dynar = NULL;
122 struct s_gs_var *p_var = NULL;
125 gras_dict_retrieve(p_vars->space, name, (void **)&p_dynar);
128 gras_dynar_new(&p_dynar, sizeof (struct s_gs_var *), NULL);
129 gras_dict_insert(p_vars->space, name, (void **)p_dynar, NULL);
131 p_var = calloc(1, sizeof(struct s_gs_var));
132 gras_dynar_push(p_vars->globals, &name);
134 gras_dynar_pop(p_dynar, &p_var);
137 p_var->p_type = p_type;
140 gras_dynar_push(p_dynar, &p_var);
144 gs_vars_get(void *_p_vars,
146 struct s_gs_type **pp_type) {
148 struct s_gs_vars *p_vars = _p_vars;
149 gras_dynar_t *p_dynar = NULL;
150 struct s_gs_var *p_var = NULL;
152 gras_dict_retrieve(p_vars->space, name, (void **)&p_dynar);
153 gras_dynar_pop(p_dynar, &p_var);
154 gras_dynar_push(p_dynar, &p_var);
157 *pp_type = p_var->p_type;
164 gs_vars_enter(void *_p_vars) {
166 struct s_gs_vars *p_vars = _p_vars;
167 gras_dynar_t *p_dynar = NULL;
169 gras_dynar_new(&p_dynar, sizeof (char *), NULL);
170 gras_dynar_push(p_vars->stack, &p_dynar);
175 gs_vars_leave(void *_p_vars) {
176 struct s_gs_vars *p_vars = _p_vars;
177 gras_dynar_t *p_dynar = NULL;
181 gras_dynar_pop(p_vars->stack, &p_dynar);
183 gras_dynar_foreach(p_dynar, cursor, name) {
184 _gs_vars_pop(p_vars, name);
188 gras_dynar_free_container(p_dynar);
193 gs_vars_alloc(void) {
195 struct s_gs_vars *p_vars = NULL;
197 p_vars = calloc(1, sizeof (struct s_gs_vars));
199 gras_dict_new (&p_vars->space);
200 gras_dynar_new(&p_vars->stack, sizeof (gras_dynar_t *), NULL);
202 gs_vars_enter(p_vars);
204 gras_dynar_pop(p_vars->stack, &p_vars->globals);
205 gras_dynar_push(p_vars->stack, &p_vars->globals);
212 gs_vars_free(void *_p_vars) {
214 struct s_gs_vars *p_vars = _p_vars;
216 gs_vars_leave(p_vars);
218 gras_dynar_free_container(p_vars->stack);
219 gras_dict_free(&p_vars->space);