kustore.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /** @file kudata.c
  2. */
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. struct kudata_s {
  8. char *name;
  9. void *data;
  10. };
  11. // User data blobs list
  12. KCMP_NESTED(udata, plugin, name);
  13. KCMP_NESTED_BY_KEY(udata, plugin, name);
  14. KADD_NESTED(udata, plugin);
  15. KFIND_NESTED(udata, plugin);
  16. // PTYPE list
  17. KCMP_NESTED(udata, ptype, name);
  18. KCMP_NESTED_BY_KEY(udata, ptype, name);
  19. KADD_NESTED(udata, ptype);
  20. KFIND_NESTED(udata, ptype);
  21. // VIEW list
  22. KCMP_NESTED(udata, view, name);
  23. KCMP_NESTED_BY_KEY(udata, view, name);
  24. KADD_NESTED(udata, view);
  25. KFIND_NESTED(udata, view);
  26. kudata_t *kudata_new(kudata_error_e *error)
  27. {
  28. kudata_t *udata = NULL;
  29. udata = faux_zmalloc(sizeof(*udata));
  30. assert(udata);
  31. if (!udata) {
  32. if (error)
  33. *error = KSCHEME_ERROR_ALLOC;
  34. return NULL;
  35. }
  36. // PLUGIN list
  37. udata->plugins = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
  38. kudata_plugin_compare, kudata_plugin_kcompare,
  39. (void (*)(void *))kplugin_free);
  40. assert(udata->plugins);
  41. // PTYPE list
  42. udata->ptypes = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
  43. kudata_ptype_compare, kudata_ptype_kcompare,
  44. (void (*)(void *))kptype_free);
  45. assert(udata->ptypes);
  46. // VIEW list
  47. udata->views = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
  48. kudata_view_compare, kudata_view_kcompare,
  49. (void (*)(void *))kview_free);
  50. assert(udata->views);
  51. return udata;
  52. }
  53. /*--------------------------------------------------------- */
  54. int kudata_compare(const void *first, const void *second)
  55. {
  56. const kudata_t *f = (const kudata_t *)first;
  57. const kudata_t *s = (const kudata_t *)second;
  58. return strcmp(f->name, s->name);
  59. }
  60. /*--------------------------------------------------------- */
  61. kudata_t *kudata_new(const char *name, void *data)
  62. {
  63. kudata_t *pdata =
  64. (kudata_t *)malloc(sizeof(kudata_t));
  65. if (!name) {
  66. free(pdata);
  67. return NULL;
  68. }
  69. memset(pdata, 0, sizeof(*pdata));
  70. pdata->name = lub_string_dup(name);
  71. pdata->data = data;
  72. return pdata;
  73. }
  74. /*--------------------------------------------------------- */
  75. void *kudata_free(kudata_t *this)
  76. {
  77. void *data;
  78. if (!this)
  79. return NULL;
  80. if (this->name)
  81. lub_string_free(this->name);
  82. data = this->data;
  83. free(this);
  84. return data;
  85. }
  86. /*--------------------------------------------------------- */
  87. void kudata_delete(void *data)
  88. {
  89. kudata_t *this = (kudata_t *)data;
  90. kudata_free(this);
  91. }