#include #include #include #include "elf32.h" int strtab_get_str(struct elf_str_table *strtab, const char *str, size_t *res) { for (size_t i = 0; i < strtab->size; i ++) { if (strcmp(strtab->ptr + i, str) == 0) { if (res != NULL) *res = i; return M_SUCCESS; } } return M_ERROR; } int strtab_write_str(struct elf_str_table *strtab, const char *str, size_t *res) { if (strtab_get_str(strtab, str, res) == M_SUCCESS) return M_SUCCESS; size_t len = strlen(str); char *new = realloc(strtab->ptr, strtab->size + len + 1); if (new == NULL) return M_ERROR; strtab->ptr = new; memcpy(strtab->ptr + strtab->size, str, len + 1); if (res != NULL) *res = strtab->size; strtab->size += len + 1; return M_SUCCESS; } int strtab_init(struct elf_str_table *strtab) { strtab->size = 1; strtab->ptr = malloc(1); if (strtab->ptr == NULL) { PERROR("cannot alloc"); return M_ERROR; } *strtab->ptr = '\0'; return M_SUCCESS; } void strtab_free(struct elf_str_table *strtab) { free(strtab->ptr); }