drgn/libdrgn/lexer.c
Omar Sandoval 9f9bec4762 libdrgn: use common vector where applicable
This converts several open-coded dynamic arrays to the new common vector
implementation:

- drgn_lexer stack
- Array dimension array for DWARF parsing
- drgn_program_read_c_string()
- DWARF index directory name hashes
- DWARF index file name hashes
- DWARF index abbreviation table
- DWARF index shard entries
2019-07-15 12:27:16 -07:00

51 lines
1.1 KiB
C

// Copyright 2018-2019 - Omar Sandoval
// SPDX-License-Identifier: GPL-3.0+
#include "internal.h"
#include "lexer.h"
DEFINE_VECTOR_FUNCTIONS(drgn_token_vector)
void drgn_lexer_init(struct drgn_lexer *lexer, drgn_lexer_func func,
const char *str)
{
lexer->func = func;
lexer->p = str;
drgn_token_vector_init(&lexer->stack);
}
void drgn_lexer_deinit(struct drgn_lexer *lexer)
{
drgn_token_vector_deinit(&lexer->stack);
}
struct drgn_error *drgn_lexer_pop(struct drgn_lexer *lexer,
struct drgn_token *token)
{
if (lexer->stack.size) {
*token = *drgn_token_vector_pop(&lexer->stack);
return NULL;
} else {
return lexer->func(lexer, token);
}
}
struct drgn_error *drgn_lexer_push(struct drgn_lexer *lexer,
const struct drgn_token *token)
{
if (!drgn_token_vector_append(&lexer->stack, token))
return &drgn_enomem;
return NULL;
}
struct drgn_error *drgn_lexer_peek(struct drgn_lexer *lexer,
struct drgn_token *token)
{
struct drgn_error *err;
err = drgn_lexer_pop(lexer, token);
if (!err)
err = drgn_lexer_push(lexer, token);
return err;
}