ksym.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <faux/str.h>
  6. #include <faux/list.h>
  7. #include <faux/conv.h>
  8. #include <faux/error.h>
  9. #include <klish/khelper.h>
  10. #include <klish/ksym.h>
  11. struct ksym_s {
  12. char *name;
  13. ksym_fn function;
  14. tri_t permanent;
  15. tri_t sync;
  16. };
  17. // Simple methods
  18. // Name
  19. KGET_STR(sym, name);
  20. KSET_STR_ONCE(sym, name);
  21. // Function
  22. KGET(sym, ksym_fn, function);
  23. KSET(sym, ksym_fn, function);
  24. // Permanent
  25. KGET(sym, tri_t, permanent);
  26. KSET(sym, tri_t, permanent);
  27. // Sync
  28. KGET(sym, tri_t, sync);
  29. KSET(sym, tri_t, sync);
  30. ksym_t *ksym_new(const char *name, ksym_fn function)
  31. {
  32. ksym_t *sym = NULL;
  33. if (faux_str_is_empty(name))
  34. return NULL;
  35. sym = faux_zmalloc(sizeof(*sym));
  36. assert(sym);
  37. if (!sym)
  38. return NULL;
  39. // Initialize
  40. sym->name = faux_str_dup(name);
  41. sym->function = function;
  42. sym->permanent = TRI_UNDEFINED;
  43. sym->sync = TRI_UNDEFINED;
  44. return sym;
  45. }
  46. ksym_t *ksym_new_ext(const char *name, ksym_fn function,
  47. tri_t permanent, tri_t sync)
  48. {
  49. ksym_t *sym = NULL;
  50. sym = ksym_new(name, function);
  51. if (!sym)
  52. return NULL;
  53. ksym_set_permanent(sym, permanent);
  54. ksym_set_sync(sym, sync);
  55. return sym;
  56. }
  57. void ksym_free(ksym_t *sym)
  58. {
  59. if (!sym)
  60. return;
  61. faux_str_free(sym->name);
  62. faux_free(sym);
  63. }