summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/command.c35
-rw-r--r--src/common/command.h2
-rw-r--r--src/common/completion.c18
3 files changed, 51 insertions, 4 deletions
diff --git a/src/common/command.c b/src/common/command.c
index ea308b631..a2077dcdc 100644
--- a/src/common/command.c
+++ b/src/common/command.c
@@ -353,6 +353,38 @@ alias_new (char *alias_name, char *alias_command)
}
/*
+ * alias_get_final_command: get final command pointer by an alias
+ */
+
+char *
+alias_get_final_command (t_weechat_alias *alias)
+{
+ t_weechat_alias *ptr_alias;
+ char *result;
+
+ if (alias->running)
+ {
+ irc_display_prefix (NULL, NULL, PREFIX_ERROR);
+ gui_printf (NULL,
+ _("%s circular reference when calling alias \"/%s\"\n"),
+ WEECHAT_ERROR, alias->alias_name);
+ return NULL;
+ }
+
+ ptr_alias = alias_search ((alias->alias_command[0] == '/') ?
+ alias->alias_command + 1 : alias->alias_command);
+ if (ptr_alias)
+ {
+ alias->running = 1;
+ result = alias_get_final_command (ptr_alias);
+ alias->running = 0;
+ return result;
+ }
+ return (alias->alias_command[0] == '/') ?
+ alias->alias_command + 1 : alias->alias_command;
+}
+
+/*
* alias_free: free an alias and reomve it from list
*/
@@ -802,7 +834,8 @@ exec_weechat_command (t_irc_server *server, t_irc_channel *channel, char *string
if (ascii_strcasecmp (ptr_alias->alias_name, command + 1) == 0)
{
if (ptr_alias->running == 1)
- {
+ {
+ irc_display_prefix (NULL, NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s circular reference when calling alias \"/%s\"\n"),
WEECHAT_ERROR, ptr_alias->alias_name);
diff --git a/src/common/command.h b/src/common/command.h
index c87d31061..486de9b58 100644
--- a/src/common/command.h
+++ b/src/common/command.h
@@ -63,7 +63,9 @@ extern t_weelist *last_index_command;
extern void command_index_build ();
extern void command_index_free ();
+extern t_weechat_alias *alias_search (char *);
extern t_weechat_alias *alias_new (char *, char *);
+extern char *alias_get_final_command (t_weechat_alias *);
extern void alias_free_all ();
extern char **explode_string (char *, char *, int, int *);
extern void free_exploded_string (char **);
diff --git a/src/common/completion.c b/src/common/completion.c
index 1be1473ee..9e1db9b60 100644
--- a/src/common/completion.c
+++ b/src/common/completion.c
@@ -107,6 +107,8 @@ void
completion_get_command_infos (t_completion *completion,
char **template, int *max_arg)
{
+ t_weechat_alias *ptr_alias;
+ char *ptr_command;
int i;
#ifdef PLUGINS
t_weechat_plugin *ptr_plugin;
@@ -116,6 +118,16 @@ completion_get_command_infos (t_completion *completion,
*template = NULL;
*max_arg = MAX_ARGS;
+ ptr_alias = alias_search (completion->base_command);
+ if (ptr_alias)
+ {
+ ptr_command = alias_get_final_command (ptr_alias);
+ if (!ptr_command)
+ return;
+ }
+ else
+ ptr_command = completion->base_command;
+
#ifdef PLUGINS
/* look for plugin command handler */
for (ptr_plugin = weechat_plugins; ptr_plugin;
@@ -126,7 +138,7 @@ completion_get_command_infos (t_completion *completion,
{
if ((ptr_handler->type == HANDLER_COMMAND)
&& (ascii_strcasecmp (ptr_handler->command,
- completion->base_command) == 0))
+ ptr_command) == 0))
{
*template = ptr_handler->completion_template;
*max_arg = MAX_ARGS;
@@ -140,7 +152,7 @@ completion_get_command_infos (t_completion *completion,
for (i = 0; weechat_commands[i].command_name; i++)
{
if (ascii_strcasecmp (weechat_commands[i].command_name,
- completion->base_command) == 0)
+ ptr_command) == 0)
{
*template = weechat_commands[i].completion_template;
*max_arg = weechat_commands[i].max_arg;
@@ -153,7 +165,7 @@ completion_get_command_infos (t_completion *completion,
{
if ((irc_commands[i].cmd_function_args || irc_commands[i].cmd_function_1arg)
&& (ascii_strcasecmp (irc_commands[i].command_name,
- completion->base_command) == 0))
+ ptr_command) == 0))
{
*template = irc_commands[i].completion_template;
*max_arg = irc_commands[i].max_arg;