symbol.c 694 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #include <string.h>
  2. #include "symbol.h"
  3. static void
  4. symbol_free(void *dat, void *extra)
  5. {
  6. (void) extra;
  7. free(dat);
  8. }
  9. Disposer symbol_disposer = {
  10. .dispose = symbol_free,
  11. .extra = NULL
  12. };
  13. Nit_error
  14. symtbl_init(Symtbl *tbl)
  15. {
  16. return set_init(tbl, &symbol_disposer, 0);
  17. }
  18. Nit_error
  19. symtbl_symbol(Symtbl *tbl, Symbol *symbol, const char *str)
  20. {
  21. Nit_error error = NIT_ERROR_FINE;
  22. size_t len = strlen(str) + 1;
  23. *symbol = str;
  24. if (!set_get(tbl, len, (void **) symbol)) {
  25. if (!(*symbol = malloc(len)))
  26. return NIT_ERROR_MEMORY;
  27. strcpy((void *) *symbol, str);
  28. if ((error = set_add(tbl, len, *symbol)))
  29. free((void *) *symbol); /* Removes const */
  30. }
  31. return error;
  32. }