kustore.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /** @file kustore.c
  2. */
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <faux/list.h>
  8. #include <klish/khelper.h>
  9. #include <klish/kudata.h>
  10. #include <klish/kustore.h>
  11. struct kustore_s {
  12. faux_list_t *udatas;
  13. };
  14. // User data blobs list
  15. KCMP_NESTED(ustore, udata, name);
  16. KCMP_NESTED_BY_KEY(ustore, udata, name);
  17. KADD_NESTED(ustore, kudata_t *, udatas);
  18. KFIND_NESTED(ustore, udata);
  19. kustore_t *kustore_new()
  20. {
  21. kustore_t *ustore = NULL;
  22. ustore = faux_zmalloc(sizeof(*ustore));
  23. assert(ustore);
  24. if (!ustore)
  25. return NULL;
  26. // User data blobs list
  27. ustore->udatas = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
  28. kustore_udata_compare, kustore_udata_kcompare,
  29. (void (*)(void *))kudata_free);
  30. assert(ustore->udatas);
  31. return ustore;
  32. }
  33. void kustore_free(kustore_t *ustore)
  34. {
  35. if (!ustore)
  36. return;
  37. faux_list_free(ustore->udatas);
  38. free(ustore);
  39. }
  40. kudata_t *kustore_slot_new(kustore_t *ustore,
  41. const char *name, void *data, kudata_data_free_fn free_fn)
  42. {
  43. kudata_t *udata = NULL;
  44. assert(ustore);
  45. if (!ustore)
  46. return NULL;
  47. if (!name)
  48. return NULL;
  49. udata = kudata_new(name);
  50. if (!udata)
  51. return NULL;
  52. kudata_set_data(udata, data);
  53. kudata_set_free_fn(udata, free_fn);
  54. if (!kustore_add_udatas(ustore, udata)) {
  55. kudata_free(udata);
  56. return NULL;
  57. }
  58. return udata;
  59. }
  60. void *kustore_slot_data(kustore_t *ustore, const char *udata_name)
  61. {
  62. kudata_t *udata = NULL;
  63. assert(ustore);
  64. if (!ustore)
  65. return NULL;
  66. if (!udata_name)
  67. return NULL;
  68. udata = kustore_find_udata(ustore, udata_name);
  69. if (!udata)
  70. return NULL;
  71. return kudata_data(udata);
  72. }