Added keep_eol flag to string_explode(), updated hook command callback arguments
parent
a98feff2bb
commit
a97e2955be
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 *,
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 **);
|
||||
|
|
|
@ -55,7 +55,7 @@ demo_print_list (void *list, char *item_name)
|
|||
fields = weechat_list_fields (list);
|
||||
if (fields)
|
||||
{
|
||||
argv = weechat_string_explode (fields, ",", 0, &argc);
|
||||
argv = weechat_string_explode (fields, ",", 0, 0, &argc);
|
||||
if (argv && (argc > 0))
|
||||
{
|
||||
for (j = 0; j < argc; j++)
|
||||
|
@ -119,14 +119,15 @@ demo_buffer_infos ()
|
|||
*/
|
||||
|
||||
static int
|
||||
demo_command (void *data, char *args)
|
||||
demo_command (void *data, int argc, char **argv, char **argv_eol)
|
||||
{
|
||||
/* make C compiler happy */
|
||||
(void) data;
|
||||
|
||||
if (args)
|
||||
(void) argv_eol;
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
if (weechat_strcasecmp (args, "buffer") == 0)
|
||||
if (weechat_strcasecmp (argv[1], "buffer") == 0)
|
||||
{
|
||||
demo_buffer_infos ();
|
||||
return PLUGIN_RC_SUCCESS;
|
||||
|
|
|
@ -160,17 +160,14 @@ plugin_api_strncasecmp (struct t_weechat_plugin *plugin,
|
|||
|
||||
char **
|
||||
plugin_api_string_explode (struct t_weechat_plugin *plugin, char *string,
|
||||
char *separators, int num_items_max,
|
||||
int *num_items)
|
||||
char *separators, int keep_eol,
|
||||
int num_items_max, int *num_items)
|
||||
{
|
||||
/* make C compiler happy */
|
||||
(void) plugin;
|
||||
|
||||
if (!plugin || !string || !separators || !num_items)
|
||||
return NULL;
|
||||
|
||||
return string_explode (string, separators, num_items_max,
|
||||
num_items);
|
||||
return string_explode (string, separators, keep_eol,
|
||||
num_items_max, num_items);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -371,7 +368,8 @@ struct t_hook *
|
|||
plugin_api_hook_command (struct t_weechat_plugin *plugin, char *command,
|
||||
char *description, char *args,
|
||||
char *args_desc, char *completion,
|
||||
int (*callback)(void *, char *), void *data)
|
||||
int (*callback)(void *, int, char **, char **),
|
||||
void *data)
|
||||
{
|
||||
if (plugin && callback)
|
||||
return hook_command (plugin, command, description, args,
|
||||
|
|
|
@ -33,7 +33,7 @@ extern int plugin_api_strcasecmp (struct t_weechat_plugin *,char *, char *);
|
|||
extern int plugin_api_strncasecmp (struct t_weechat_plugin *,char *, char *,
|
||||
int);
|
||||
extern char **plugin_api_string_explode (struct t_weechat_plugin *, char *,
|
||||
char *, int, int *);
|
||||
char *, int, int, int *);
|
||||
extern void plugin_api_string_free_exploded (struct t_weechat_plugin *,
|
||||
char **);
|
||||
|
||||
|
@ -54,7 +54,8 @@ extern void plugin_api_infobar_remove (struct t_weechat_plugin *, int);
|
|||
/* hooks */
|
||||
extern struct t_hook *plugin_api_hook_command (struct t_weechat_plugin *,
|
||||
char *, char *, char *, char *,
|
||||
char *, int (*)(void *, char *),
|
||||
char *,
|
||||
int (*)(void *, int, char **, char **),
|
||||
void *);
|
||||
extern struct t_hook *plugin_api_hook_message (struct t_weechat_plugin *,
|
||||
char *, int (*)(void *, char *),
|
||||
|
|
|
@ -64,7 +64,7 @@ struct t_weechat_plugin
|
|||
int (*strcasecmp) (struct t_weechat_plugin *, char *, char *);
|
||||
int (*strncasecmp) (struct t_weechat_plugin *, char *, char *, int);
|
||||
char **(*string_explode) (struct t_weechat_plugin *, char *, char *, int,
|
||||
int *);
|
||||
int, int *);
|
||||
void (*string_free_exploded) (struct t_weechat_plugin *, char **);
|
||||
|
||||
/* directories */
|
||||
|
@ -82,7 +82,8 @@ struct t_weechat_plugin
|
|||
/* hooks */
|
||||
struct t_hook *(*hook_command) (struct t_weechat_plugin *, char *, char *,
|
||||
char *, char *, char *,
|
||||
int (*)(void *, char *),void *);
|
||||
int (*)(void *, int, char **, char **),
|
||||
void *);
|
||||
struct t_hook *(*hook_message) (struct t_weechat_plugin *, char *,
|
||||
int (*)(void *, char *), void *);
|
||||
struct t_hook *(*hook_config) (struct t_weechat_plugin *, char *, char *,
|
||||
|
@ -148,9 +149,10 @@ struct t_weechat_plugin
|
|||
weechat_plugin->strcasecmp(weechat_plugin, string1, string2)
|
||||
#define weechat_strncasecmp(string1, string2, max) \
|
||||
weechat_plugin->strncasecmp(weechat_plugin, string1, string2, max)
|
||||
#define weechat_string_explode(string1, separator, max, num_items) \
|
||||
#define weechat_string_explode(string1, separator, eol, max, \
|
||||
num_items) \
|
||||
weechat_plugin->string_explode(weechat_plugin, string1, separator, \
|
||||
max, num_items)
|
||||
eol, max, num_items)
|
||||
#define weechat_string_free_exploded(array_str) \
|
||||
weechat_plugin->string_free_exploded(weechat_plugin, array_str)
|
||||
|
||||
|
|
Loading…
Reference in New Issue