#include #include #include #include #include #include #include #include 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); }