Newer
Older
Tardis / lang / symbol.c
// 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");
}