|
@@ -65,11 +65,11 @@ static clish_plugin_t *plugin_by_name(clish_shell_t *this, const char *name)
|
|
* mysym@plugin1
|
|
* mysym@plugin1
|
|
* The symbols with prefix will be resolved using specified plugin only.
|
|
* The symbols with prefix will be resolved using specified plugin only.
|
|
*/
|
|
*/
|
|
-static clish_plugin_fn_t *plugins_find_sym(clish_shell_t *this, const char *name)
|
|
|
|
|
|
+static clish_sym_t *plugins_find_sym(clish_shell_t *this, const char *name)
|
|
{
|
|
{
|
|
lub_list_node_t *iter;
|
|
lub_list_node_t *iter;
|
|
clish_plugin_t *plugin;
|
|
clish_plugin_t *plugin;
|
|
- clish_plugin_fn_t *func = NULL;
|
|
|
|
|
|
+ clish_sym_t *sym = NULL;
|
|
/* To parse command name */
|
|
/* To parse command name */
|
|
char *saveptr;
|
|
char *saveptr;
|
|
const char *delim = "@";
|
|
const char *delim = "@";
|
|
@@ -90,19 +90,19 @@ static clish_plugin_fn_t *plugins_find_sym(clish_shell_t *this, const char *name
|
|
plugin = plugin_by_name(this, plugin_name);
|
|
plugin = plugin_by_name(this, plugin_name);
|
|
if (!plugin)
|
|
if (!plugin)
|
|
goto end;
|
|
goto end;
|
|
- func = clish_plugin_get_sym(plugin, cmdn);
|
|
|
|
|
|
+ sym = clish_plugin_get_sym(plugin, cmdn);
|
|
} else {
|
|
} else {
|
|
/* Iterate all plugins */
|
|
/* Iterate all plugins */
|
|
for(iter = lub_list__get_head(this->plugins);
|
|
for(iter = lub_list__get_head(this->plugins);
|
|
iter; iter = lub_list_node__get_next(iter)) {
|
|
iter; iter = lub_list_node__get_next(iter)) {
|
|
plugin = (clish_plugin_t *)lub_list_node__get_data(iter);
|
|
plugin = (clish_plugin_t *)lub_list_node__get_data(iter);
|
|
- if ((func = clish_plugin_get_sym(plugin, cmdn)))
|
|
|
|
|
|
+ if ((sym = clish_plugin_get_sym(plugin, cmdn)))
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
end:
|
|
end:
|
|
lub_string_free(str);
|
|
lub_string_free(str);
|
|
- return func;
|
|
|
|
|
|
+ return sym;
|
|
}
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------- */
|
|
/*--------------------------------------------------------- */
|
|
@@ -156,23 +156,24 @@ clish_sym_t *clish_shell_add_unresolved_sym(clish_shell_t *this,
|
|
/* Link unresolved symbols */
|
|
/* Link unresolved symbols */
|
|
int clish_shell_link_plugins(clish_shell_t *this)
|
|
int clish_shell_link_plugins(clish_shell_t *this)
|
|
{
|
|
{
|
|
- clish_sym_t *sym;
|
|
|
|
|
|
+ clish_sym_t *sym, *plugin_sym;
|
|
lub_list_node_t *iter;
|
|
lub_list_node_t *iter;
|
|
char *sym_name = NULL;
|
|
char *sym_name = NULL;
|
|
- clish_plugin_fn_t *fn = NULL;
|
|
|
|
|
|
|
|
/* Iterate elements */
|
|
/* Iterate elements */
|
|
for(iter = lub_list__get_head(this->syms);
|
|
for(iter = lub_list__get_head(this->syms);
|
|
iter; iter = lub_list_node__get_next(iter)) {
|
|
iter; iter = lub_list_node__get_next(iter)) {
|
|
sym = (clish_sym_t *)lub_list_node__get_data(iter);
|
|
sym = (clish_sym_t *)lub_list_node__get_data(iter);
|
|
sym_name = clish_sym__get_name(sym);
|
|
sym_name = clish_sym__get_name(sym);
|
|
- fn = plugins_find_sym(this, sym_name);
|
|
|
|
- if (!fn) {
|
|
|
|
|
|
+ plugin_sym = plugins_find_sym(this, sym_name);
|
|
|
|
+ if (!plugin_sym) {
|
|
fprintf(stderr, "Error: Can't resolve symbol %s.\n",
|
|
fprintf(stderr, "Error: Can't resolve symbol %s.\n",
|
|
sym_name);
|
|
sym_name);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
- clish_sym__set_func(sym, fn);
|
|
|
|
|
|
+ /* Copy symbol attributes */
|
|
|
|
+ clish_sym__set_func(sym, clish_sym__get_func(plugin_sym));
|
|
|
|
+ clish_sym__set_permanent(sym, clish_sym__get_permanent(plugin_sym));
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|