feat: finished variables declaration / assign

This commit is contained in:
samsonium
2026-10-14 01:00:01 +03:00
parent 7e52c671aa
commit c0dc14a0c7
11 changed files with 419 additions and 32 deletions
+68
View File
@@ -0,0 +1,68 @@
#include <compiler/utils/fzl_symtable.h>
#include <stdbool.h>
#include <stddef.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->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, char *name,
fzl_type_t type)
{
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, .type = type};
return FZL_SYMTABLE_RESULT_OK;
}
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);
}