Переглянути джерело

Add user data to kaction_t structure.

Serj Kalichev 4 місяців тому
батько
коміт
bb6f618181
2 змінених файлів з 45 додано та 0 видалено
  1. 7 0
      klish/kaction.h
  2. 38 0
      klish/kscheme/kaction.c

+ 7 - 0
klish/kaction.h

@@ -30,6 +30,9 @@ typedef enum {
 } kaction_io_e;
 
 
+typedef void (*kaction_udata_free_fn)(void *data);
+
+
 C_DECL_BEGIN
 
 kaction_t *kaction_new(void);
@@ -74,6 +77,10 @@ tri_t kaction_sync(const kaction_t *action);
 bool_t kaction_set_sync(kaction_t *action, tri_t sync);
 bool_t kaction_is_sync(const kaction_t *action);
 
+void *kaction_udata(const kaction_t *action);
+bool_t kaction_set_udata(kaction_t *action, void *data,
+	kaction_udata_free_fn udata_free_fn);
+
 C_DECL_END
 
 #endif // _klish_kaction_h

+ 38 - 0
klish/kscheme/kaction.c

@@ -25,6 +25,8 @@ struct kaction_s {
 	tri_t permanent;
 	tri_t sync;
 	char *script;
+	void *udata;
+	kaction_udata_free_fn udata_free_fn;
 };
 
 
@@ -97,6 +99,8 @@ kaction_t *kaction_new(void)
 	action->script = NULL;
 	action->sym = NULL;
 	action->plugin = NULL;
+	action->udata = NULL;
+	action->udata_free_fn = NULL;
 
 	return action;
 }
@@ -110,6 +114,8 @@ void kaction_free(kaction_t *action)
 	faux_str_free(action->sym_ref);
 	faux_str_free(action->lock);
 	faux_str_free(action->script);
+	if (action->udata && action->udata_free_fn)
+		action->udata_free_fn(action->udata);
 
 	faux_free(action);
 }
@@ -189,3 +195,35 @@ bool_t kaction_is_sync(const kaction_t *action)
 
 	return BOOL_FALSE; // Default if not set
 }
+
+
+void *kaction_udata(const kaction_t *action)
+{
+	assert(action);
+	if (!action)
+		return NULL;
+
+	return action->udata;
+}
+
+
+bool_t kaction_set_udata(kaction_t *action, void *data,
+	kaction_udata_free_fn free_fn)
+{
+	assert(action);
+	if (!action)
+		return BOOL_FALSE;
+
+	// Free old udata value
+	if (action->udata) {
+		if (action->udata_free_fn)
+			action->udata_free_fn(action->udata);
+		else if (free_fn)
+			free_fn(action->udata);
+	}
+
+	action->udata = data;
+	action->udata_free_fn = free_fn;
+
+	return BOOL_TRUE;
+}