This commit is contained in:
Josh Holtrop 2023-08-08 22:43:46 -04:00
parent cdb6294f1f
commit 4ffdea07bb

View File

@ -1,5 +1,7 @@
#include "<TBD>.h" #include "<TBD>.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h>
#include <string.h>
/************************************************************************** /**************************************************************************
* User code blocks * User code blocks
@ -640,26 +642,53 @@ static immutable parser_state_t[] parser_state_table = [
<% end %> <% end %>
]; ];
/* state_values linked list functionality */ /* state_values stack functionality */
typedef struct state_values_list_entry_s
{
/** State value object. */
state_value_t state_value;
/** Linked list previous entry. */
struct state_values_list_entry_s * prev;
/** Linked list next entry. */
struct state_values_list_entry_s * next;
} state_values_list_entry_t;
/** state_values stack type. */
typedef struct typedef struct
{ {
size_t length; size_t length;
state_values_list_entry_t * first; size_t capacity;
state_values_list_entry_t * last; state_value_t * entries;
} state_values_list_t; } state_values_stack_t;
/**
* Initialize state_values stack structure.
*
* @param stack
* state_values stack structure.
*/
void state_values_stack_init(state_values_stack_t * stack)
{
const size_t initial_capacity = 10u;
stack->length = 0u;
stack->capacity = initial_capacity;
stack->entries = (state_value_t *)malloc(initial_capacity * sizeof(state_value_t));
}
/**
* Push a new state_value to the state_values stack.
*
* @param stack
* state_values stack structure.
*/
void state_values_stack_push(state_values_stack_t * stack)
{
size_t const current_capacity = stack->capacity;
size_t const current_length = stack->length;
if (current_length >= current_capacity)
{
size_t const new_capacity = current_capacity * 2u;
state_value_t * new_entries = malloc(new_capacity * sizeof(state_value_t));
memcpy(new_entries, stack->entries, current_length * sizeof(state_value_t);
free(stack->entries);
stack->capacity = new_capacity;
stack->entries = new_entries;
}
memset(&stack->entries[current_length], 0, sizeof(state_value_t));
stack->length = current_length + 1u;
}
/** /**
* Execute user code associated with a parser rule. * Execute user code associated with a parser rule.
* *