2014-07-10 13:14:52 -07:00
|
|
|
#include "tree_sitter/parser.h"
|
2014-06-26 08:52:42 -07:00
|
|
|
#include "runtime/tree.h"
|
2014-07-30 23:40:02 -07:00
|
|
|
#include "runtime/stack.h"
|
2014-09-26 16:15:07 -07:00
|
|
|
#include "runtime/length.h"
|
2014-03-13 00:43:23 -07:00
|
|
|
|
2014-08-31 16:24:27 -07:00
|
|
|
static size_t INITIAL_SIZE = 100;
|
2014-06-28 18:51:06 -07:00
|
|
|
static TSStateId INITIAL_STATE = 0;
|
2014-03-13 00:43:23 -07:00
|
|
|
|
2014-06-28 19:04:14 -07:00
|
|
|
TSStack ts_stack_make() {
|
2014-08-31 16:24:27 -07:00
|
|
|
return (TSStack) { .size = 0,
|
|
|
|
|
.capacity = INITIAL_SIZE,
|
|
|
|
|
.entries = malloc(INITIAL_SIZE * sizeof(TSStackEntry)) };
|
2014-03-13 00:43:23 -07:00
|
|
|
}
|
|
|
|
|
|
2014-06-28 19:04:14 -07:00
|
|
|
void ts_stack_delete(TSStack *stack) {
|
2014-07-20 20:27:33 -07:00
|
|
|
ts_stack_shrink(stack, 0);
|
|
|
|
|
free(stack->entries);
|
2014-06-03 13:19:49 -07:00
|
|
|
}
|
|
|
|
|
|
2014-06-28 19:04:14 -07:00
|
|
|
TSStateId ts_stack_top_state(const TSStack *stack) {
|
2014-07-20 20:27:33 -07:00
|
|
|
if (stack->size == 0)
|
|
|
|
|
return INITIAL_STATE;
|
|
|
|
|
return stack->entries[stack->size - 1].state;
|
2014-03-13 00:43:23 -07:00
|
|
|
}
|
|
|
|
|
|
2014-07-20 21:43:27 -07:00
|
|
|
TSTree *ts_stack_top_node(const TSStack *stack) {
|
2014-07-20 20:27:33 -07:00
|
|
|
if (stack->size == 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
return stack->entries[stack->size - 1].node;
|
2014-03-18 13:23:21 -07:00
|
|
|
}
|
|
|
|
|
|
2014-06-28 19:04:14 -07:00
|
|
|
void ts_stack_push(TSStack *stack, TSStateId state, TSTree *node) {
|
2014-08-30 21:39:55 -07:00
|
|
|
if (stack->size == stack->capacity) {
|
|
|
|
|
stack->capacity *= 2;
|
2014-08-31 12:10:31 -07:00
|
|
|
stack->entries =
|
|
|
|
|
realloc(stack->entries, stack->capacity * sizeof(*stack->entries));
|
2014-08-30 21:39:55 -07:00
|
|
|
}
|
2014-07-20 20:27:33 -07:00
|
|
|
stack->entries[stack->size].state = state;
|
|
|
|
|
stack->entries[stack->size].node = node;
|
|
|
|
|
stack->size++;
|
|
|
|
|
ts_tree_retain(node);
|
2014-03-13 00:43:23 -07:00
|
|
|
}
|
|
|
|
|
|
2014-06-28 19:04:14 -07:00
|
|
|
void ts_stack_shrink(TSStack *stack, size_t new_size) {
|
2014-07-20 20:27:33 -07:00
|
|
|
for (size_t i = new_size; i < stack->size; i++)
|
|
|
|
|
ts_tree_release(stack->entries[i].node);
|
|
|
|
|
stack->size = new_size;
|
2014-03-13 00:43:23 -07:00
|
|
|
}
|
|
|
|
|
|
2014-10-08 17:37:20 -07:00
|
|
|
TSLength ts_stack_total_tree_size(const TSStack *stack) {
|
2014-09-26 16:31:30 -07:00
|
|
|
TSLength result = ts_length_zero();
|
2014-07-20 20:27:33 -07:00
|
|
|
for (size_t i = 0; i < stack->size; i++) {
|
|
|
|
|
TSTree *node = stack->entries[i].node;
|
2014-09-26 16:15:07 -07:00
|
|
|
result = ts_length_add(result, ts_tree_total_size(node));
|
2014-07-20 20:27:33 -07:00
|
|
|
}
|
|
|
|
|
return result;
|
2014-03-21 13:02:25 -07:00
|
|
|
}
|