Browse Source

scheme: Resolve PTYPEs

Serj Kalichev 3 years ago
parent
commit
e3a412e5bf
2 changed files with 48 additions and 4 deletions
  1. 3 1
      klish/kparam.h
  2. 45 3
      klish/kscheme/kscheme.c

+ 3 - 1
klish/kparam.h

@@ -7,7 +7,7 @@
 #define _klish_kparam_h
 
 #include <faux/list.h>
-#include <klish/ksym.h>
+#include <klish/kptype.h>
 
 typedef struct kparam_s kparam_t;
 
@@ -24,6 +24,8 @@ const char *kparam_help(const kparam_t *param);
 bool_t kparam_set_help(kparam_t *param, const char *help);
 const char *kparam_ptype_ref(const kparam_t *param);
 bool_t kparam_set_ptype_ref(kparam_t *param, const char *ptype_ref);
+kptype_t *kparam_ptype(const kparam_t *param);
+bool_t kparam_set_ptype(kparam_t *param, kptype_t *ptype);
 
 // PARAMs
 faux_list_t *kparam_params(const kparam_t *param);

+ 45 - 3
klish/kscheme/kscheme.c

@@ -181,7 +181,7 @@ 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)
+ksym_t *kscheme_find_sym(const kscheme_t *scheme, const char *name)
 {
 	char *saveptr = NULL;
 	const char *delim = "@";
@@ -249,9 +249,9 @@ bool_t kscheme_prepare_action_list(kscheme_t *scheme, faux_list_t *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);
+		sym = kscheme_find_sym(scheme, sym_ref);
 		if (!sym) {
-			faux_error_sprintf(error, "Can't resolve symbol \"%s\"",
+			faux_error_sprintf(error, "Can't find symbol \"%s\"",
 				sym_ref);
 			retcode = BOOL_FALSE;
 			continue;
@@ -263,6 +263,43 @@ bool_t kscheme_prepare_action_list(kscheme_t *scheme, faux_list_t *action_list,
 }
 
 
+bool_t kscheme_prepare_param_list(kscheme_t *scheme, faux_list_t *param_list,
+	faux_error_t *error) {
+	faux_list_node_t *iter = NULL;
+	kparam_t *param = NULL;
+	bool_t retcode = BOOL_TRUE;
+
+	assert(scheme);
+	if (!scheme)
+		return BOOL_FALSE;
+	assert(param_list);
+	if (!param_list)
+		return BOOL_FALSE;
+	if (faux_list_is_empty(param_list))
+		return BOOL_TRUE;
+
+	iter = faux_list_head(param_list);
+	while ((param = (kparam_t *)faux_list_each(&iter))) {
+		kptype_t *ptype = NULL;
+		const char *ptype_ref = kparam_ptype_ref(param);
+		ptype = kscheme_find_ptype(scheme, ptype_ref);
+		if (!ptype) {
+			faux_error_sprintf(error, "Can't find ptype \"%s\"",
+				ptype_ref);
+			retcode = BOOL_FALSE;
+			continue;
+		}
+		kparam_set_ptype(param, ptype);
+		// Nested PARAMs
+		if (!kscheme_prepare_param_list(scheme, kparam_params(param),
+			error))
+			retcode = BOOL_FALSE;
+	}
+
+	return retcode;
+}
+
+
 /** @brief Prepares schema for execution.
  *
  * It loads plugins, link unresolved symbols, then iterates all the
@@ -298,9 +335,14 @@ 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));
+			// ACTIONs
 			if (!kscheme_prepare_action_list(scheme,
 				kcommand_actions(command), error))
 				return BOOL_FALSE;
+			// PARAMs
+			if (!kscheme_prepare_param_list(scheme,
+				kcommand_params(command), error))
+				return BOOL_FALSE;
 		}
 	}