summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/alias/alias.c173
1 files changed, 51 insertions, 122 deletions
diff --git a/src/plugins/alias/alias.c b/src/plugins/alias/alias.c
index 83dcfe06e..9e5601047 100644
--- a/src/plugins/alias/alias.c
+++ b/src/plugins/alias/alias.c
@@ -97,103 +97,37 @@ alias_search (const char *alias_name)
}
/*
- * Adds a word to string and increments length.
+ * Adds word (in range) to alias string.
*/
void
-alias_string_add_word (char **alias, int *length, const char *word, int autoesc)
-{
- int length_word;
- char *alias2, *ac;
- const char *c;
-
- if (!word)
- return;
-
- length_word = strlen (word);
- if (length_word == 0)
- return;
-
- if (autoesc)
- {
- c = word;
- while (*c)
- if (*c++ == '"')
- length_word++;
- c = word;
- }
- if (*alias == NULL)
- {
- *alias = malloc (length_word + 1);
- if (autoesc)
- ac = *alias;
- else
- strcpy (*alias, word);
- }
- else
- {
- alias2 = realloc (*alias, strlen (*alias) + length_word + 1);
- if (!alias2)
- {
- if (*alias)
- {
- free (*alias);
- *alias = NULL;
- }
- return;
- }
- *alias = alias2;
- if (autoesc)
- ac = *alias + strlen (*alias);
- else
- strcat (*alias, word);
- }
- if (autoesc)
- {
- while (*c)
- {
- if (*c == '"')
- *ac++ = '\\';
- *ac++ = *c++;
- }
- *ac = '\0';
- }
- *length += length_word;
-}
-
-/*
- * Adds word (in range) to string and increments length.
- */
-
-void
-alias_string_add_word_range (char **alias, int *length, const char *start,
- const char *end)
+alias_string_add_word_range (char **alias, const char *start, const char *end)
{
char *word;
word = weechat_strndup (start, end - start);
if (word)
{
- alias_string_add_word (alias, length, word, 0);
+ weechat_string_dyn_concat (alias, word, -1);
free (word);
}
}
/*
- * Adds some arguments to string and increments length.
+ * Adds some arguments to alias string.
*/
void
-alias_string_add_arguments (char **alias, int *length, char **argv, int start,
- int end)
+alias_string_add_arguments (char **alias, char **argv,
+ int arg_start, int arg_end)
{
int i;
- for (i = start; i <= end; i++)
+ for (i = arg_start; i <= arg_end; i++)
{
- if (i != start)
- alias_string_add_word (alias, length, " ", 0);
- alias_string_add_word (alias, length, argv[i], 0);
+ if (i != arg_start)
+ weechat_string_dyn_concat (alias, " ", -1);
+ weechat_string_dyn_concat (alias, argv[i], -1);
}
}
@@ -223,9 +157,9 @@ alias_string_add_arguments (char **alias, int *length, char **argv, int start,
char *
alias_replace_args (const char *alias_args, const char *user_args)
{
- char **argv, *res;
+ char **argv, **result, *temp;
const char *start, *pos;
- int n, m, argc, length_res, args_count, offset;
+ int n, m, argc, args_count, offset;
if (!alias_args || !user_args)
return NULL;
@@ -236,8 +170,7 @@ alias_replace_args (const char *alias_args, const char *user_args)
| WEECHAT_STRING_SPLIT_COLLAPSE_SEPS,
0, &argc);
- res = NULL;
- length_res = 0;
+ result = weechat_string_dyn_alloc (128);
args_count = 0;
start = alias_args;
pos = start;
@@ -248,8 +181,8 @@ alias_replace_args (const char *alias_args, const char *user_args)
if ((pos[0] == '\\') && (pos[1] == '$'))
{
offset = 2;
- alias_string_add_word_range (&res, &length_res, start, pos);
- alias_string_add_word (&res, &length_res, "$", 0);
+ alias_string_add_word_range (result, start, pos);
+ weechat_string_dyn_concat (result, "$", -1);
}
else
{
@@ -261,8 +194,8 @@ alias_replace_args (const char *alias_args, const char *user_args)
args_count++;
offset = 2;
if (pos > start)
- alias_string_add_word_range (&res, &length_res, start, pos);
- alias_string_add_word (&res, &length_res, user_args, 0);
+ alias_string_add_word_range (result, start, pos);
+ weechat_string_dyn_concat (result, user_args, -1);
}
else if (pos[1] == '&')
{
@@ -270,8 +203,13 @@ alias_replace_args (const char *alias_args, const char *user_args)
args_count++;
offset = 2;
if (pos > start)
- alias_string_add_word_range (&res, &length_res, start, pos);
- alias_string_add_word (&res, &length_res, user_args, 1);
+ alias_string_add_word_range (result, start, pos);
+ temp = weechat_string_replace (user_args, "\"", "\\\"");
+ if (temp)
+ {
+ weechat_string_dyn_concat (result, temp, -1);
+ free (temp);
+ }
}
else if (pos[1] == '~')
{
@@ -279,9 +217,9 @@ alias_replace_args (const char *alias_args, const char *user_args)
args_count++;
offset = 2;
if (pos > start)
- alias_string_add_word_range (&res, &length_res, start, pos);
+ alias_string_add_word_range (result, start, pos);
if (argc > 0)
- alias_string_add_word (&res, &length_res, argv[argc - 1], 0);
+ weechat_string_dyn_concat (result, argv[argc - 1], -1);
}
else if ((pos[1] == '-') && ALIAS_IS_ARG_NUMBER(pos[2]))
{
@@ -289,25 +227,25 @@ alias_replace_args (const char *alias_args, const char *user_args)
args_count++;
offset = 3;
if (pos > start)
- alias_string_add_word_range (&res, &length_res, start, pos);
+ alias_string_add_word_range (result, start, pos);
if (pos[2] - '1' < argc)
m = pos[2] - '1';
else
m = argc - 1;
- alias_string_add_arguments (&res, &length_res, argv, 0, m);
+ alias_string_add_arguments (result, argv, 0, m);
}
else if (ALIAS_IS_ARG_NUMBER(pos[1]))
{
args_count++;
n = pos[1] - '1';
if (pos > start)
- alias_string_add_word_range (&res, &length_res, start, pos);
+ alias_string_add_word_range (result, start, pos);
if (pos[2] != '-')
{
/* replace with argument n */
offset = 2;
if (n < argc)
- alias_string_add_word (&res, &length_res, argv[n], 0);
+ weechat_string_dyn_concat (result, argv[n], -1);
}
else
{
@@ -327,10 +265,7 @@ alias_replace_args (const char *alias_args, const char *user_args)
m = argc - 1;
}
if (n < argc)
- {
- alias_string_add_arguments (&res, &length_res,
- argv, n, m);
- }
+ alias_string_add_arguments (result, argv, n, m);
}
}
}
@@ -346,12 +281,12 @@ alias_replace_args (const char *alias_args, const char *user_args)
}
if (pos > start)
- alias_string_add_word (&res, &length_res, start, 0);
+ weechat_string_dyn_concat (result, start, -1);
if (argv)
weechat_string_free_split (argv);
- return (res) ? res : strdup ("");
+ return weechat_string_dyn_free (result, 0);
}
/*
@@ -396,8 +331,8 @@ alias_cb (const void *pointer, void *data,
{
struct t_alias *ptr_alias;
char **commands, **ptr_cmd, **ptr_next_cmd;
- char *args_replaced, *alias_command;
- int some_args_replaced, length1, length2;
+ char *args_replaced, **alias_command;
+ int some_args_replaced;
/* make C compiler happy */
(void) data;
@@ -437,26 +372,18 @@ alias_cb (const void *pointer, void *data,
* arguments of the last command in the list (if no $1,$2,..$*)
* was found
*/
- if ((*ptr_next_cmd == NULL) && argv_eol[1] && (!some_args_replaced))
+ if ((*ptr_next_cmd == NULL) && argv_eol[1] && !some_args_replaced)
{
- length1 = strlen (*ptr_cmd);
- length2 = strlen (argv_eol[1]);
-
- alias_command = malloc (1 + length1 + 1 + length2 + 1);
+ alias_command = weechat_string_dyn_alloc (128);
if (alias_command)
{
if (!weechat_string_is_command_char (*ptr_cmd))
- strcpy (alias_command, "/");
- else
- alias_command[0] = '\0';
-
- strcat (alias_command, *ptr_cmd);
- strcat (alias_command, " ");
- strcat (alias_command, argv_eol[1]);
-
- alias_run_command (&buffer,
- alias_command);
- free (alias_command);
+ weechat_string_dyn_concat (alias_command, "/", -1);
+ weechat_string_dyn_concat (alias_command, *ptr_cmd, -1);
+ weechat_string_dyn_concat (alias_command, " ", -1);
+ weechat_string_dyn_concat (alias_command, argv_eol[1], -1);
+ alias_run_command (&buffer, *alias_command);
+ weechat_string_dyn_free (alias_command, 1);
}
}
else
@@ -468,14 +395,16 @@ alias_cb (const void *pointer, void *data,
}
else
{
- alias_command = malloc (1 + strlen ((args_replaced) ? args_replaced : *ptr_cmd) + 1);
+ alias_command = weechat_string_dyn_alloc (128);
if (alias_command)
{
- strcpy (alias_command, "/");
- strcat (alias_command, (args_replaced) ? args_replaced : *ptr_cmd);
- alias_run_command (&buffer,
- alias_command);
- free (alias_command);
+ weechat_string_dyn_concat (alias_command, "/", -1);
+ weechat_string_dyn_concat (
+ alias_command,
+ (args_replaced) ? args_replaced : *ptr_cmd,
+ -1);
+ alias_run_command (&buffer, *alias_command);
+ weechat_string_dyn_free (alias_command, 1);
}
}
}