Browse Source

scheme: kscheme_prepare_action_list()

Serj Kalichev 3 years ago
parent
commit
a63f89ab4c
3 changed files with 48 additions and 1 deletions
  1. 3 0
      klish/kaction.h
  2. 1 1
      klish/kscheme/kaction.c
  3. 44 0
      klish/kscheme/kscheme.c

+ 3 - 0
klish/kaction.h

@@ -7,6 +7,7 @@
 #define _klish_kaction_h
 
 #include <faux/error.h>
+#include <klish/ksym.h>
 
 
 typedef struct kaction_s kaction_t;
@@ -38,6 +39,8 @@ bool_t kaction_update_retcode(const kaction_t *action);
 bool_t kaction_set_update_retcode(kaction_t *action, bool_t update_retcode);
 const char *kaction_script(const kaction_t *action);
 bool_t kaction_set_script(kaction_t *action, const char *script);
+ksym_t *kaction_sym(const kaction_t *action);
+bool_t kaction_set_sym(kaction_t *action, ksym_t *sym);
 
 C_DECL_END
 

+ 1 - 1
klish/kscheme/kaction.c

@@ -13,13 +13,13 @@
 
 struct kaction_s {
 	char *sym_ref; // Text reference to symbol
+	ksym_t *sym; // Symbol itself
 	char *lock; // Named lock
 	bool_t interrupt;
 	bool_t interactive;
 	kaction_cond_e exec_on;
 	bool_t update_retcode;
 	char *script;
-	ksym_t *sym; // Symbol
 };
 
 

+ 44 - 0
klish/kscheme/kscheme.c

@@ -176,6 +176,47 @@ bool_t kscheme_fini(kscheme_t *scheme, kcontext_t *context, faux_error_t *error)
 }
 
 
+ksym_t *kscheme_resolve_sym(const kscheme_t *scheme, const char *name)
+{
+	scheme = scheme;
+	name = name;
+	return NULL;
+}
+
+
+bool_t kscheme_prepare_action_list(kscheme_t *scheme, faux_list_t *action_list,
+	faux_error_t *error) {
+	faux_list_node_t *iter = NULL;
+	kaction_t *action = NULL;
+	bool_t retcode = BOOL_TRUE;
+
+	assert(scheme);
+	if (!scheme)
+		return BOOL_FALSE;
+	assert(action_list);
+	if (!action_list)
+		return BOOL_FALSE;
+	if (faux_list_is_empty(action_list))
+		return BOOL_TRUE;
+
+	iter = faux_list_head(action_list);
+	while ((action = (kaction_t *)faux_list_each(&iter))) {
+		ksym_t *sym = NULL;
+		const char *sym_ref = kaction_sym_ref(action);
+		sym = kscheme_resolve_sym(scheme, sym_ref);
+		if (!sym) {
+			faux_error_sprintf(error, "Can't resolve symbol \"%s\"",
+				sym_ref);
+			retcode = BOOL_FALSE;
+			continue;
+		}
+		kaction_set_sym(action, sym);
+	}
+
+	return retcode;
+}
+
+
 /** @brief Prepares schema for execution.
  *
  * It loads plugins, link unresolved symbols, then iterates all the
@@ -211,6 +252,9 @@ bool_t kscheme_prepare(kscheme_t *scheme, kcontext_t *context, faux_error_t *err
 //			kcommand_t *command = NULL;
 
 			printf("COMMAND: %s\n", kcommand_name(command));
+			if (!kscheme_prepare_action_list(scheme,
+				kcommand_actions(command), error))
+				return BOOL_FALSE;
 		}
 	}