void test_two_level_stack(void) { names_stack *stack; unsigned int check_num; check_num = 0; stack = stack_new(); stack_enter(stack); check_depth(check_num++, stack, "foo", 0); check_depth(check_num++, stack, "bar", 0); check_depth(check_num++, stack, "baz", 0); check_unsigned_int(stack_frame_size(stack), 0); stack_name_add(stack, "foo"); stack_name_add(stack, "bar"); check_depth(check_num++, stack, "foo", 1); check_depth(check_num++, stack, "bar", 2); check_depth(check_num++, stack, "baz", 0); check_unsigned_ints(stack_frame_size(stack), 2, "1"); stack_enter(stack); check_unsigned_ints(stack_frame_size(stack), 0, "2"); stack_name_add(stack, "baz"); check_unsigned_ints(stack_frame_size(stack), 1, "3"); stack_name_add(stack, "foo"); check_unsigned_ints(stack_frame_size(stack), 2, "4"); check_depth(check_num++, stack, "foo", 2); check_depth(check_num++, stack, "bar", 0); check_depth(check_num++, stack, "baz", 1); stack_leave(stack); check_unsigned_ints(stack_frame_size(stack), 2, "5"); check_depth(check_num++, stack, "foo", 1); check_depth(check_num++, stack, "bar", 2); check_depth(check_num++, stack, "baz", 0); stack_leave(stack); check_unsigned_ints(stack_frame_size(stack), 0, "6"); check_depth(check_num++, stack, "foo", 0); check_depth(check_num++, stack, "bar", 0); check_depth(check_num++, stack, "baz", 0); stack_destroy(stack); }
void stack_destroy(names_stack *stack) { while (stack->names_lists_c) { stack_leave(stack); } if (stack->names_lists_c > 0) { if (stack->names_lists[0]) { if (stack->names_lists[0]->names) { heap_free(stack->names_lists[0]->names); } } heap_free(stack->names_lists); } heap_free(stack); }
ExceptionHolder* findHolder(int data) { while (currentFrame != NULL) { ExceptionHolder* holder = currentFrame -> exception; if (holder != NULL) { int i = 0; for (i = 0; i < holder -> size; i++) { if ((holder -> exceptions)[i] == data || (holder -> exceptions)[i] == -1) { return holder; } } } if (currentFrame -> prev == NULL) { printf("An error occured."); return NULL; } else { stack_leave(); } } printf("Unhandled Exception."); return NULL; }