Browse Source

session: Add kudata_t

Serj Kalichev 3 years ago
parent
commit
959964565b
5 changed files with 221 additions and 2 deletions
  1. 13 2
      klish/Makefile.am
  2. 27 0
      klish/kudata.h
  3. 2 0
      klish/session/Makefile.am
  4. 64 0
      klish/session/kudata.c
  5. 115 0
      klish/session/kustore.c

+ 13 - 2
klish/Makefile.am

@@ -6,10 +6,17 @@ libklish_la_LDFLAGS = $(AM_LDFLAGS) $(VERSION_INFO)
 #libklish_la_CFLAGS += -DTESTC
 #endif
 
+# Common
+nobase_include_HEADERS += \
+	klish/khelper.h
+
+# KTP
 nobase_include_HEADERS += \
-	klish/khelper.h \
 	klish/ktp.h \
-	klish/ktp_session.h \
+	klish/ktp_session.h
+
+# Scheme
+nobase_include_HEADERS += \
 	klish/kscheme.h \
 	klish/kview.h \
 	klish/kcommand.h \
@@ -19,6 +26,10 @@ nobase_include_HEADERS += \
 	klish/kptype.h \
 	klish/ksym.h
 
+# Session
+nobase_include_HEADERS += \
+	klish/kudata.h
+
 #noinst_HEADERS += \
 #	klish/khelper.h
 

+ 27 - 0
klish/kudata.h

@@ -0,0 +1,27 @@
+/** @file kudata.h
+ *
+ * @brief Klish user data
+ */
+
+#ifndef _klish_kudata_h
+#define _klish_kudata_h
+
+typedef struct kudata_s kudata_t;
+
+typedef bool_t (*kudata_free_fn)(void *data);
+
+C_DECL_BEGIN
+
+// kudata_t
+kudata_t *kudata_new(const char *name);
+void kudata_free(kudata_t *udata);
+
+const char *kudata_name(const kudata_t *udata);
+void *kudata_data(const kudata_t *udata);
+bool_t kudata_set_data(kudata_t *udata, void *data);
+kudata_free_fn kudata_free_fn(const kudata_t *udata);
+bool_t kudata_set_free_fn(kudata_t *udata, kudata_free_fn free_fn);
+
+C_DECL_END
+
+#endif // _klish_kudata_h

+ 2 - 0
klish/session/Makefile.am

@@ -0,0 +1,2 @@
+libklish_la_SOURCES += \
+	klish/session/kudata.c

+ 64 - 0
klish/session/kudata.c

@@ -0,0 +1,64 @@
+/** @file kudata.c
+ */
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <faux/str.h>
+#include <klish/khelper.h>
+
+struct kudata_s {
+	char *name;
+	void *data;
+	kudata_free_fn free_fn;
+};
+
+// Name
+KGET_STR(udata, name);
+
+// Data
+KGET(udata, void *, data);
+KSET(udata, void *, data);
+
+// Data
+KGET(udata, kudata_free_fn, free_fn);
+KSET(udata, kudata_free_fn, free_fn);
+
+
+kudata_t *kudata_new(const char *name)
+{
+	kudata_t *udata = NULL;
+
+	if (faux_str_is_empty(name))
+		return NULL;
+
+	udata = faux_zmalloc(sizeof(*udata));
+	assert(udata);
+	if (!udata)
+		return NULL;
+
+	// Initialize
+	udata->name = faux_str_dup(name);
+	udata->data = NULL;
+	udata->free_fn = NULL;
+
+	return udata;
+}
+
+
+bool_t kudata_free(kudata_t *udata)
+{
+	void *data;
+
+	if (!udata)
+		return BOOL_FALSE;
+
+	faux_str_free(udata->name);
+	if (udata->free_fn)
+		udata->free_fn(udata->data);
+
+	faux_free(udata);
+
+	return BOOL_TRUE;
+}

+ 115 - 0
klish/session/kustore.c

@@ -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);
+}