Browse Source

scheme: Add kaction

Serj Kalichev 3 years ago
parent
commit
456b2204b0
4 changed files with 100 additions and 0 deletions
  1. 30 0
      klish/kaction.h
  2. 1 0
      klish/kscheme.h
  3. 1 0
      klish/kscheme/Makefile.am
  4. 68 0
      klish/kscheme/kaction.c

+ 30 - 0
klish/kaction.h

@@ -0,0 +1,30 @@
+/** @file action.h
+ *
+ * @brief Klish scheme's "action" entry
+ */
+
+#ifndef _klish_kaction_h
+#define _klish_kaction_h
+
+#include <klish/kcommand.h>
+
+typedef struct kaction_s kaction_t;
+
+typedef struct kaction_info_s {
+	char *sym;
+} kaction_info_t;
+
+
+C_DECL_BEGIN
+
+kaction_t *kaction_new(kaction_info_t info);
+kaction_t *kaction_new_static(kaction_info_t info);
+void kaction_free(kaction_t *action);
+
+const char *kaction_name(const kaction_t *action);
+
+bool_t kaction_add_command(kaction_t *action, kcommand_t *command);
+
+C_DECL_END
+
+#endif // _klish_kaction_h

+ 1 - 0
klish/kscheme.h

@@ -8,6 +8,7 @@
 
 
 #include <klish/kptype.h>
+#include <klish/kaction.h>
 #include <klish/kparam.h>
 #include <klish/kcommand.h>
 #include <klish/kview.h>

+ 1 - 0
klish/kscheme/Makefile.am

@@ -1,5 +1,6 @@
 libklish_la_SOURCES += \
 	klish/kscheme/kptype.c \
+	klish/kscheme/kaction.c \
 	klish/kscheme/kparam.c \
 	klish/kscheme/kcommand.c \
 	klish/kscheme/kview.c \

+ 68 - 0
klish/kscheme/kaction.c

@@ -0,0 +1,68 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#include <faux/str.h>
+#include <faux/list.h>
+#include <klish/kcommand.h>
+#include <klish/kaction.h>
+
+
+struct kaction_s {
+	bool_t is_static;
+	kaction_info_t info;
+	faux_list_t *commands;
+};
+
+
+static kaction_t *kaction_new_internal(kaction_info_t info, bool_t is_static)
+{
+	kaction_t *action = NULL;
+
+	action = faux_zmalloc(sizeof(*action));
+	assert(action);
+	if (!action)
+		return NULL;
+
+	// Initialize
+	action->is_static = is_static;
+	action->info = info;
+
+	return action;
+}
+
+
+kaction_t *kaction_new(kaction_info_t info)
+{
+	return kaction_new_internal(info, BOOL_FALSE);
+}
+
+
+kaction_t *kaction_new_static(kaction_info_t info)
+{
+	return kaction_new_internal(info, BOOL_TRUE);
+}
+
+
+void kaction_free(kaction_t *action)
+{
+	if (!action)
+		return;
+
+	if (!action->is_static) {
+		faux_str_free(action->info.sym);
+	}
+
+	faux_free(action);
+}
+
+
+const char *kaction_sym_str(const kaction_t *action)
+{
+	assert(action);
+	if (!action)
+		return NULL;
+
+	return action->info.sym;
+}