diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2007-11-05 13:29:54 +0100 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2007-11-05 13:29:54 +0100 |
commit | a97e2955be68a91f0e55bbced190e5966bf3391d (patch) | |
tree | aac727043dd76feb0c23f4f5d0c4afbf18b9ff24 /src/core | |
parent | a98feff2bb2b85d1fff33f511ca645f04f2af1ff (diff) | |
download | weechat-a97e2955be68a91f0e55bbced190e5966bf3391d.zip |
Added keep_eol flag to string_explode(), updated hook command callback arguments
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/wee-alias.c | 2 | ||||
-rw-r--r-- | src/core/wee-hook.c | 25 | ||||
-rw-r--r-- | src/core/wee-hook.h | 6 | ||||
-rw-r--r-- | src/core/wee-input.c | 26 | ||||
-rw-r--r-- | src/core/wee-string.c | 28 | ||||
-rw-r--r-- | src/core/wee-string.h | 2 |
6 files changed, 61 insertions, 28 deletions
diff --git a/src/core/wee-alias.c b/src/core/wee-alias.c index fd7829d0c..d801c4ce8 100644 --- a/src/core/wee-alias.c +++ b/src/core/wee-alias.c @@ -225,7 +225,7 @@ alias_replace_args (char *alias_args, char *user_args) char **argv, *start, *pos, *res; int argc, length_res, args_count; - argv = string_explode (user_args, " ", 0, &argc); + argv = string_explode (user_args, " ", 0, 0, &argc); res = NULL; length_res = 0; diff --git a/src/core/wee-hook.c b/src/core/wee-hook.c index bdf228ed8..cea271b7d 100644 --- a/src/core/wee-hook.c +++ b/src/core/wee-hook.c @@ -150,26 +150,45 @@ hook_command (void *plugin, char *command, char *description, */ int -hook_command_exec (void *plugin, char *command, char *args) +hook_command_exec (void *plugin, char *string) { struct t_hook *ptr_hook; + char **argv, **argv_eol; + int argc; + + if (!string || !string[0]) + return -1; + + argv = string_explode (string, " ", 0, 0, &argc); + if (argc == 0) + { + if (argv) + string_free_exploded (argv); + return -1; + } + argv_eol = string_explode (string, " ", 1, 0, NULL); for (ptr_hook = weechat_hooks; ptr_hook; ptr_hook = ptr_hook->next_hook) { if ((ptr_hook->type == HOOK_TYPE_COMMAND) && (!plugin || (plugin == ptr_hook->plugin)) - && (string_strcasecmp (command, + && (string_strcasecmp (argv[0] + 1, HOOK_COMMAND(ptr_hook, command)) == 0)) { if ((int) (HOOK_COMMAND(ptr_hook, callback)) - (ptr_hook->callback_data, args) == PLUGIN_RC_FAILED) + (ptr_hook->callback_data, argc, argv, argv_eol) == PLUGIN_RC_FAILED) return 0; else return 1; } } + if (argv) + string_free_exploded (argv); + if (argv_eol) + string_free_exploded (argv_eol); + /* no hook found */ return -1; } diff --git a/src/core/wee-hook.h b/src/core/wee-hook.h index a080e9fae..f14eba1b7 100644 --- a/src/core/wee-hook.h +++ b/src/core/wee-hook.h @@ -43,8 +43,6 @@ enum t_hook_type #define HOOK_TIMER(hook, var) (((struct t_hook_timer *)hook->hook_data)->var) #define HOOK_FD(hook, var) (((struct t_hook_fd *)hook->hook_data)->var) -typedef int (t_hook_callback) (void *); - struct t_hook { /* data common to all hooks */ @@ -61,7 +59,7 @@ struct t_hook struct t_hook *next_hook; /* pointer to next hook */ }; -typedef int (t_hook_callback_command)(void *, char *); +typedef int (t_hook_callback_command)(void *, int, char **, char **); struct t_hook_command { @@ -120,7 +118,7 @@ extern struct t_hook *last_weechat_hook; extern int hook_valid_for_plugin (void *, struct t_hook *); extern struct t_hook *hook_command (void *, char *, char *, char *, char *, char *, t_hook_callback_command *, void *); -extern int hook_command_exec (void *, char *, char *); +extern int hook_command_exec (void *, char *); extern struct t_hook *hook_message (void *, char *, t_hook_callback_message *, void *); extern struct t_hook *hook_config (void *, char *, char *, diff --git a/src/core/wee-input.c b/src/core/wee-input.c index 0ce9260dc..faad27150 100644 --- a/src/core/wee-input.c +++ b/src/core/wee-input.c @@ -73,6 +73,17 @@ input_exec_command (struct t_gui_buffer *buffer, char *string, pos[1] = '\0'; } + rc = -1; + if (!only_builtin) + { + rc = hook_command_exec (buffer->plugin, command); + /*vars_replaced = alias_replace_vars (window, ptr_args); + rc = plugin_cmd_handler_exec (window->buffer->protocol, command + 1, + (vars_replaced) ? vars_replaced : ptr_args); + if (vars_replaced) + free (vars_replaced);*/ + } + pos = strchr (command, ' '); if (pos) { @@ -84,17 +95,6 @@ input_exec_command (struct t_gui_buffer *buffer, char *string, if (!ptr_args[0]) ptr_args = NULL; } - - rc = -1; - if (!only_builtin) - { - rc = hook_command_exec (buffer->plugin, command + 1, ptr_args); - /*vars_replaced = alias_replace_vars (window, ptr_args); - rc = plugin_cmd_handler_exec (window->buffer->protocol, command + 1, - (vars_replaced) ? vars_replaced : ptr_args); - if (vars_replaced) - free (vars_replaced);*/ - } switch (rc) { @@ -107,7 +107,7 @@ input_exec_command (struct t_gui_buffer *buffer, char *string, case 1: /* plugin handler OK, executed */ break; default: /* plugin handler not found */ - argv = string_explode (ptr_args, " ", 0, &argc); + argv = string_explode (ptr_args, " ", 0, 0, &argc); /* look for alias */ if (!only_builtin) @@ -380,7 +380,7 @@ input_data (struct t_gui_buffer *buffer, char *data, int only_builtin) if ((ptr_data[0] == '/') && (ptr_data[1] == '/')) ptr_data++; - hook_command_exec (buffer->plugin, "", ptr_data); + hook_command_exec (buffer->plugin, ptr_data); if (buffer->input_data_cb) { diff --git a/src/core/wee-string.c b/src/core/wee-string.c index 7b9e70ff7..54f9c641e 100644 --- a/src/core/wee-string.c +++ b/src/core/wee-string.c @@ -326,11 +326,22 @@ string_convert_hex_chars (char *string) /* * string_explode: explode a string according to separators + * examples: + * string_explode ("abc de fghi", " ", 0, 0, NULL) + * ==> array[0] = "abc" + * array[1] = "de" + * array[2] = "fghi" + * array[3] = NULL + * string_explode ("abc de fghi", " ", 1, 0, NULL) + * ==> array[0] = "abc de fghi" + * array[1] = "de fghi" + * array[2] = "fghi" + * array[3] = NULL */ char ** -string_explode (char *string, char *separators, int num_items_max, - int *num_items) +string_explode (char *string, char *separators, int keep_eol, + int num_items_max, int *num_items) { int i, n_items; char **array; @@ -379,10 +390,15 @@ string_explode (char *string, char *separators, int num_items_max, { if (ptr2 - ptr1 > 0) { - array[i] = - (char *) malloc ((ptr2 - ptr1 + 1) * sizeof (char)); - array[i] = strncpy (array[i], ptr1, ptr2 - ptr1); - array[i][ptr2 - ptr1] = '\0'; + if (keep_eol) + array[i] = strdup (ptr1); + else + { + array[i] = + (char *) malloc ((ptr2 - ptr1 + 1) * sizeof (char)); + array[i] = strncpy (array[i], ptr1, ptr2 - ptr1); + array[i][ptr2 - ptr1] = '\0'; + } ptr1 = ++ptr2; } else diff --git a/src/core/wee-string.h b/src/core/wee-string.h index c7ca959db..94ed642d0 100644 --- a/src/core/wee-string.h +++ b/src/core/wee-string.h @@ -30,7 +30,7 @@ extern int string_strncasecmp (char *, char *, int); extern char *string_strcasestr (char *, char *); extern char *string_replace (char *, char *, char *); extern char *string_convert_hex_chars (char *); -extern char **string_explode (char *, char *, int, int *); +extern char **string_explode (char *, char *, int, int, int *); extern void string_free_exploded (char **); extern char **string_split_multi_command (char *, char); extern void string_free_multi_command (char **); |