Skip to main content

c_src/libwrouter/src/symbol.h

#pragma once
#include "arena.h"
#include "wrouter.h"
#include <stdint.h>
#include <stddef.h>

typedef uint16_t symbol_t;

typedef struct {
    const char **base;
    size_t count;
    size_t capacity;
    arena_t arena;
} symbol_table_t;

typedef struct {
    const char **base;
    char *region;
    uint32_t count;
} symbols_t;

struct symbol_key {
    const char *ptr;
    size_t length;
};

int symbol_ncompare(const void *a, const void *b);

int symbol_compare(const void *a, const void *b);

const char *symbol_append(symbol_table_t *tbl, const char *str, size_t len, wrouter_error_t *err);

wrouter_error_t symbol_compile(const symbol_table_t *tbl, symbols_t *sym);

void symbol_table_free(symbol_table_t *tbl);

size_t symbol_nresolve(const symbols_t *symbols, const char *key, size_t n);

size_t symbol_resolve(const symbols_t *symbols, const char *key);

const char *symbol_lookup(const symbols_t *symbols, uint16_t symbol);

void symbols_free(symbols_t *symbols);