Lines Matching refs:stack
27 static __inline bool stack_empty(const struct stack *);
28 static void stack_grow(struct stack *);
37 stack_init(struct stack *stack) in stack_init() argument
39 stack->size = 0; in stack_init()
40 stack->sp = -1; in stack_init()
41 stack->stack = NULL; in stack_init()
45 stack_empty(const struct stack *stack) in stack_empty() argument
47 bool empty = stack->sp == -1; in stack_empty()
98 stack_size(const struct stack *stack) in stack_size() argument
100 return stack->sp + 1; in stack_size()
104 stack_dup(struct stack *stack) in stack_dup() argument
109 value = stack_tos(stack); in stack_dup()
114 stack_push(stack, stack_dup_value(value, ©)); in stack_dup()
118 stack_swap(struct stack *stack) in stack_swap() argument
122 if (stack->sp < 1) { in stack_swap()
126 copy = stack->stack[stack->sp]; in stack_swap()
127 stack->stack[stack->sp] = stack->stack[stack->sp-1]; in stack_swap()
128 stack->stack[stack->sp-1] = copy; in stack_swap()
132 stack_grow(struct stack *stack) in stack_grow() argument
136 if ((size_t)(++stack->sp) == stack->size) { in stack_grow()
137 new_size = stack->size * 2 + 1; in stack_grow()
138 stack->stack = brealloc(stack->stack, in stack_grow()
139 new_size * sizeof(*stack->stack)); in stack_grow()
140 for (i = stack->size; i < new_size; i++) in stack_grow()
141 stack->stack[i].array = NULL; in stack_grow()
142 stack->size = new_size; in stack_grow()
147 stack_pushnumber(struct stack *stack, struct number *b) in stack_pushnumber() argument
149 stack_grow(stack); in stack_pushnumber()
150 stack->stack[stack->sp].type = BCODE_NUMBER; in stack_pushnumber()
151 stack->stack[stack->sp].u.num = b; in stack_pushnumber()
155 stack_pushstring(struct stack *stack, char *string) in stack_pushstring() argument
157 stack_grow(stack); in stack_pushstring()
158 stack->stack[stack->sp].type = BCODE_STRING; in stack_pushstring()
159 stack->stack[stack->sp].u.string = string; in stack_pushstring()
163 stack_push(struct stack *stack, struct value *v) in stack_push() argument
167 stack_grow(stack); in stack_push()
168 stack->stack[stack->sp].type = BCODE_NONE; in stack_push()
171 stack_pushnumber(stack, v->u.num); in stack_push()
174 stack_pushstring(stack, v->u.string); in stack_push()
177 stack->stack[stack->sp].array = v->array == NULL ? in stack_push()
182 stack_tos(const struct stack *stack) in stack_tos() argument
184 if (stack->sp == -1) in stack_tos()
186 return &stack->stack[stack->sp]; in stack_tos()
190 stack_set_tos(struct stack *stack, struct value *v) in stack_set_tos() argument
192 if (stack->sp == -1) in stack_set_tos()
193 stack_push(stack, v); in stack_set_tos()
195 stack_free_value(&stack->stack[stack->sp]); in stack_set_tos()
196 stack->stack[stack->sp] = *v; in stack_set_tos()
197 stack->stack[stack->sp].array = v->array == NULL ? in stack_set_tos()
203 stack_pop(struct stack *stack) in stack_pop() argument
205 if (stack_empty(stack)) in stack_pop()
207 return &stack->stack[stack->sp--]; in stack_pop()
211 stack_popnumber(struct stack *stack) in stack_popnumber() argument
213 if (stack_empty(stack)) in stack_popnumber()
215 if (stack->stack[stack->sp].array != NULL) { in stack_popnumber()
216 array_free(stack->stack[stack->sp].array); in stack_popnumber()
217 stack->stack[stack->sp].array = NULL; in stack_popnumber()
219 if (stack->stack[stack->sp].type != BCODE_NUMBER) { in stack_popnumber()
223 return stack->stack[stack->sp--].u.num; in stack_popnumber()
227 stack_popstring(struct stack *stack) in stack_popstring() argument
229 if (stack_empty(stack)) in stack_popstring()
231 if (stack->stack[stack->sp].array != NULL) { in stack_popstring()
232 array_free(stack->stack[stack->sp].array); in stack_popstring()
233 stack->stack[stack->sp].array = NULL; in stack_popstring()
235 if (stack->stack[stack->sp].type != BCODE_STRING) { in stack_popstring()
239 return stack->stack[stack->sp--].u.string; in stack_popstring()
243 stack_clear(struct stack *stack) in stack_clear() argument
245 while (stack->sp >= 0) { in stack_clear()
246 stack_free_value(&stack->stack[stack->sp--]); in stack_clear()
248 free(stack->stack); in stack_clear()
249 stack_init(stack); in stack_clear()
253 stack_print(FILE *f, const struct stack *stack, const char *prefix, u_int base) in stack_print() argument
257 for (i = stack->sp; i >= 0; i--) { in stack_print()
258 print_value(f, &stack->stack[i], prefix, base); in stack_print()
334 frame_assign(struct stack *stack, size_t indexv, const struct value *v) in frame_assign() argument
339 if (stack->sp == -1) { in frame_assign()
342 stack_push(stack, &n); in frame_assign()
345 a = stack->stack[stack->sp].array; in frame_assign()
347 a = stack->stack[stack->sp].array = array_new(); in frame_assign()
352 frame_retrieve(const struct stack *stack, size_t indexv) in frame_retrieve() argument
356 if (stack->sp == -1) in frame_retrieve()
358 a = stack->stack[stack->sp].array; in frame_retrieve()
360 a = stack->stack[stack->sp].array = array_new(); in frame_retrieve()