// SPDX-License-Identifier: MIT // Copyright (c) 2023 John Watts and the LuminaSensum contributors #include "symbol.h" #include "error.h" #include <string.h> #include <threads.h> #define SYMBOL_LEN 32 #define SYMBOLS_MAX 32 typedef struct { char name[SYMBOL_LEN]; symbol sym; } symbol_mapping; symbol_mapping symbols[SYMBOLS_MAX]; mtx_t symbols_lock; void init_symbols(void) { int err = mtx_init(&symbols_lock, mtx_plain); abort_if(err != thrd_success, "unable to init symbols mutex"); memset(symbols, 0, sizeof(symbols)); } symbol find_symbol(char *name) { int err = mtx_lock(&symbols_lock); abort_if(err != thrd_success, "unable to lock symbols mutex"); for (int i = 0; i < SYMBOLS_MAX; ++i) { symbol_mapping *curr_sym = &symbols[i]; char *curr_name = curr_sym->name; if (curr_name[0] == 0) { strncpy(curr_name, name, SYMBOL_LEN); curr_sym->sym = i; err = mtx_unlock(&symbols_lock); abort_if(err != thrd_success, "unable to unlock symbols mutex"); return curr_sym->sym; } else { int cmp = strncmp(curr_name, name, SYMBOL_LEN); if (cmp == 0) { err = mtx_unlock(&symbols_lock); abort_if(err != thrd_success, "unable to unlock symbols mutex"); return curr_sym->sym; } } } err = mtx_unlock(&symbols_lock); abort_if(err != thrd_success, "unable to unlock symbols mutex"); abort_msg("ran out of symbols"); }