122 lines
2.8 KiB
C
122 lines
2.8 KiB
C
#include <common/fzl_types.h>
|
|
#include <compiler/fzl_parser.h>
|
|
#include <compiler/utils/fzl_symtable.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
fzl_symtable_t *fzl_mksymt()
|
|
{
|
|
fzl_symtable_t *tbl = malloc(sizeof(fzl_symtable_t));
|
|
if (!tbl)
|
|
return NULL;
|
|
|
|
tbl->free_slot = 0;
|
|
tbl->remainder = 2;
|
|
tbl->size = 0;
|
|
tbl->symbols = malloc(tbl->remainder * sizeof(fzl_sym_t));
|
|
if (!tbl->symbols)
|
|
return NULL;
|
|
|
|
return tbl;
|
|
}
|
|
|
|
fzl_symtable_res_t fzl_symt_put(fzl_symtable_t *symt, fzl_node_t *node,
|
|
char *name, fzl_type_t type, uint64_t ip)
|
|
{
|
|
if (!symt)
|
|
return FZL_SYMTABLE_RESULT_ERR;
|
|
|
|
for (size_t i = 0; i < symt->size; i++)
|
|
if (strcmp(symt->symbols[i].name, name) == 0)
|
|
return FZL_SYMTABLE_RESULT_EXISTS;
|
|
|
|
if (symt->remainder <= symt->size)
|
|
{
|
|
symt->remainder *= 2;
|
|
symt->symbols = realloc(symt->symbols, symt->remainder * sizeof(fzl_sym_t));
|
|
}
|
|
|
|
symt->symbols[symt->size++] = (fzl_sym_t){.name = name,
|
|
.node = node,
|
|
.type = type,
|
|
.ip = ip,
|
|
.classname = NULL,
|
|
.slot_set = false,
|
|
.slot = 0};
|
|
return FZL_SYMTABLE_RESULT_OK;
|
|
}
|
|
|
|
fzl_symtable_res_t fzl_symt_setobjclass(fzl_symtable_t *symt, char *name,
|
|
char *classname)
|
|
{
|
|
if (!symt)
|
|
return FZL_SYMTABLE_RESULT_ERR;
|
|
|
|
for (size_t i = 0; i < symt->size; i++)
|
|
{
|
|
if (strcmp(symt->symbols[i].name, name) == 0)
|
|
{
|
|
if (symt->symbols[i].type != FZL_TYPE_OBJECT)
|
|
return FZL_SYMTABLE_RESULT_NOT_OBJECT;
|
|
|
|
symt->symbols[i].classname = classname;
|
|
return FZL_SYMTABLE_RESULT_OK;
|
|
}
|
|
}
|
|
|
|
return FZL_SYMTABLE_RESULT_ERR;
|
|
}
|
|
|
|
int fzl_symt_setslot(fzl_symtable_t *symt, char *name)
|
|
{
|
|
if (!symt)
|
|
return -1;
|
|
|
|
for (size_t i = 0; i < symt->size; i++)
|
|
{
|
|
if (strcmp(symt->symbols[i].name, name) == 0)
|
|
{
|
|
if (symt->symbols[i].slot_set)
|
|
return symt->symbols[i].slot;
|
|
|
|
symt->symbols[i].slot = symt->free_slot++;
|
|
symt->symbols[i].slot_set = true;
|
|
|
|
return symt->symbols[i].slot;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
bool fzl_symt_get(fzl_symtable_t *symt, char *name, fzl_sym_t *res)
|
|
{
|
|
if (!symt)
|
|
return false;
|
|
|
|
for (size_t i = 0; i < symt->size; i++)
|
|
{
|
|
if (strcmp(symt->symbols[i].name, name) == 0)
|
|
{
|
|
*res = symt->symbols[i];
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void fzl_freesymt(fzl_symtable_t *symt)
|
|
{
|
|
if (!symt)
|
|
return;
|
|
|
|
if (symt->symbols)
|
|
free(symt->symbols);
|
|
|
|
free(symt);
|
|
}
|