|
@@ -0,0 +1,115 @@
|
|
|
+/** @file kudata.c
|
|
|
+ */
|
|
|
+#include <assert.h>
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <string.h>
|
|
|
+
|
|
|
+
|
|
|
+struct kudata_s {
|
|
|
+ char *name;
|
|
|
+ void *data;
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+// User data blobs list
|
|
|
+KCMP_NESTED(udata, plugin, name);
|
|
|
+KCMP_NESTED_BY_KEY(udata, plugin, name);
|
|
|
+KADD_NESTED(udata, plugin);
|
|
|
+KFIND_NESTED(udata, plugin);
|
|
|
+
|
|
|
+// PTYPE list
|
|
|
+KCMP_NESTED(udata, ptype, name);
|
|
|
+KCMP_NESTED_BY_KEY(udata, ptype, name);
|
|
|
+KADD_NESTED(udata, ptype);
|
|
|
+KFIND_NESTED(udata, ptype);
|
|
|
+
|
|
|
+// VIEW list
|
|
|
+KCMP_NESTED(udata, view, name);
|
|
|
+KCMP_NESTED_BY_KEY(udata, view, name);
|
|
|
+KADD_NESTED(udata, view);
|
|
|
+KFIND_NESTED(udata, view);
|
|
|
+
|
|
|
+
|
|
|
+kudata_t *kudata_new(kudata_error_e *error)
|
|
|
+{
|
|
|
+ kudata_t *udata = NULL;
|
|
|
+
|
|
|
+ udata = faux_zmalloc(sizeof(*udata));
|
|
|
+ assert(udata);
|
|
|
+ if (!udata) {
|
|
|
+ if (error)
|
|
|
+ *error = KSCHEME_ERROR_ALLOC;
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ // PLUGIN list
|
|
|
+ udata->plugins = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
|
|
|
+ kudata_plugin_compare, kudata_plugin_kcompare,
|
|
|
+ (void (*)(void *))kplugin_free);
|
|
|
+ assert(udata->plugins);
|
|
|
+
|
|
|
+ // PTYPE list
|
|
|
+ udata->ptypes = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
|
|
|
+ kudata_ptype_compare, kudata_ptype_kcompare,
|
|
|
+ (void (*)(void *))kptype_free);
|
|
|
+ assert(udata->ptypes);
|
|
|
+
|
|
|
+ // VIEW list
|
|
|
+ udata->views = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
|
|
|
+ kudata_view_compare, kudata_view_kcompare,
|
|
|
+ (void (*)(void *))kview_free);
|
|
|
+ assert(udata->views);
|
|
|
+
|
|
|
+ return udata;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*--------------------------------------------------------- */
|
|
|
+int kudata_compare(const void *first, const void *second)
|
|
|
+{
|
|
|
+ const kudata_t *f = (const kudata_t *)first;
|
|
|
+ const kudata_t *s = (const kudata_t *)second;
|
|
|
+
|
|
|
+ return strcmp(f->name, s->name);
|
|
|
+}
|
|
|
+
|
|
|
+/*--------------------------------------------------------- */
|
|
|
+kudata_t *kudata_new(const char *name, void *data)
|
|
|
+{
|
|
|
+ kudata_t *pdata =
|
|
|
+ (kudata_t *)malloc(sizeof(kudata_t));
|
|
|
+
|
|
|
+ if (!name) {
|
|
|
+ free(pdata);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ memset(pdata, 0, sizeof(*pdata));
|
|
|
+ pdata->name = lub_string_dup(name);
|
|
|
+ pdata->data = data;
|
|
|
+
|
|
|
+ return pdata;
|
|
|
+}
|
|
|
+
|
|
|
+/*--------------------------------------------------------- */
|
|
|
+void *kudata_free(kudata_t *this)
|
|
|
+{
|
|
|
+ void *data;
|
|
|
+
|
|
|
+ if (!this)
|
|
|
+ return NULL;
|
|
|
+ if (this->name)
|
|
|
+ lub_string_free(this->name);
|
|
|
+ data = this->data;
|
|
|
+ free(this);
|
|
|
+
|
|
|
+ return data;
|
|
|
+}
|
|
|
+
|
|
|
+/*--------------------------------------------------------- */
|
|
|
+void kudata_delete(void *data)
|
|
|
+{
|
|
|
+ kudata_t *this = (kudata_t *)data;
|
|
|
+ kudata_free(this);
|
|
|
+}
|