A dynamic tracer for Linux

sym.c 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <assert.h>
  2. #include <errno.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "sym.h"
  7. sym_t *sym_get(symtab_t *st, const char *name)
  8. {
  9. size_t i;
  10. for (i = 0; i < st->len; i++) {
  11. if (!strcmp(st->sym[i]->name, name))
  12. return st->sym[i];
  13. }
  14. return NULL;
  15. }
  16. int sym_add(symtab_t *st, const char *name, type_t *type, sym_t **new)
  17. {
  18. sym_t *sym;
  19. sym = sym_get(st, name);
  20. if (sym) {
  21. /* if there is no type info, accept anything */
  22. if (!sym->type)
  23. sym->type = type;
  24. /* otherwise, if specified, it must match */
  25. else if (type && !type_equal(sym->type, type))
  26. return -EINVAL;
  27. goto found;
  28. }
  29. st->sym = realloc(st->sym, ++st->len * sizeof(*st->sym));
  30. assert(st->sym);
  31. st->sym[st->len - 1] = calloc(1, sizeof(sym_t));
  32. sym = st->sym[st->len - 1];
  33. sym->st = st;
  34. sym->name = name;
  35. sym->type = type;
  36. found:
  37. if (new)
  38. *new = sym;
  39. return 0;
  40. }
  41. void sym_dump(sym_t *sym, FILE *fp)
  42. {
  43. fputs("\e[2m", fp);
  44. type_dump(sym->type, fp);
  45. fputs("\e[0m ", fp);
  46. fputs(sym->name, fp);
  47. }
  48. void symtab_dump(symtab_t *st, FILE *fp)
  49. {
  50. size_t i;
  51. for (i = 0; i < st->len; i++) {
  52. sym_dump(st->sym[i], fp);
  53. fputc('\n', fp);
  54. }
  55. }