Browse Source

scheme: kscheme_resolve_sym()

Serj Kalichev 3 years ago
parent
commit
8f090139ed
1 changed files with 44 additions and 3 deletions
  1. 44 3
      klish/kscheme/kscheme.c

+ 44 - 3
klish/kscheme/kscheme.c

@@ -178,9 +178,50 @@ 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;
+	char *saveptr = NULL;
+	const char *delim = "@";
+	char *plugin_name = NULL;
+	char *cmd_name = NULL;
+	char *full_name = NULL;
+	ksym_t *sym = NULL;
+
+	assert(scheme);
+	if (!scheme)
+		return NULL;
+	assert(name);
+	if (!name)
+		return NULL;
+
+	// Parse full name to get sym name and optional plugin name
+	full_name = faux_str_dup(name);
+	cmd_name = strtok_r(full_name, delim, &saveptr);
+	if (!cmd_name) {
+		faux_str_free(full_name);
+		return NULL;
+	}
+	plugin_name = strtok_r(NULL, delim, &saveptr);
+
+	// Search for symbol within specified PLUGIN only
+	if (plugin_name) {
+		kplugin_t *plugin = NULL;
+		plugin = kscheme_find_plugin(scheme, plugin_name);
+		if (!plugin)
+			return NULL;
+		sym = kplugin_find_sym(plugin, cmd_name);
+
+	// Search for symbol within all PLUGINs
+	} else {
+		kscheme_plugins_node_t *iter = NULL;
+		kplugin_t *plugin = NULL;
+		iter = kscheme_plugins_iter(scheme);
+		while ((plugin = kscheme_plugins_each(&iter))) {
+			sym = kplugin_find_sym(plugin, cmd_name);
+			if (sym)
+				break;
+		}
+	}
+
+	return sym;
 }