summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2000-11-30 22:58:45 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2000-11-30 22:58:45 +0000
commita01275959deb5c8936bf90a3c51e4f9771a59819 (patch)
tree34f04f6583ecf932f0c7f83d3d2cea6958c57ebb
parent2ea411093ad0e6808cac86caf9dffd6f36d36c0f (diff)
downloadirssi-a01275959deb5c8936bf90a3c51e4f9771a59819.zip
cmd_options_get_server() : allow NULL cmd argument
eval_special_string() : if any of the commands separated with ; used the arguments ($0, $1, etc.) don't anymore append all the arguments after other commands. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@903 dbcabf3a-b0e7-0310-adc4-f8d773084564
-rw-r--r--src/core/servers.c12
-rw-r--r--src/core/special-vars.c28
2 files changed, 28 insertions, 12 deletions
diff --git a/src/core/servers.c b/src/core/servers.c
index 9ec53902..fa9e6666 100644
--- a/src/core/servers.c
+++ b/src/core/servers.c
@@ -429,12 +429,14 @@ SERVER_REC *cmd_options_get_server(const char *cmd,
/* get all the options, then remove the known ones. there should
be only one left - the server tag. */
list = hashtable_get_keys(optlist);
- for (tmp = list; tmp != NULL; tmp = next) {
- char *option = tmp->data;
- next = tmp->next;
+ if (cmd != NULL) {
+ for (tmp = list; tmp != NULL; tmp = next) {
+ char *option = tmp->data;
+ next = tmp->next;
- if (command_have_option(cmd, option))
- list = g_slist_remove(list, option);
+ if (command_have_option(cmd, option))
+ list = g_slist_remove(list, option);
+ }
}
if (list == NULL)
diff --git a/src/core/special-vars.c b/src/core/special-vars.c
index 0b83658f..72949c18 100644
--- a/src/core/special-vars.c
+++ b/src/core/special-vars.c
@@ -476,9 +476,14 @@ void eval_special_string(const char *cmd, const char *data,
{
const char *cmdchars;
char *orig, *str, *start, *ret;
- int arg_used;
+ int arg_used, arg_used_ever;
+ GSList *commands;
+ commands = NULL;
+ arg_used_ever = FALSE;
cmdchars = settings_get_str("cmdchars");
+
+ /* get a list of all the commands to run */
orig = start = str = g_strdup(cmd);
do {
if (is_split_char(str, start))
@@ -490,6 +495,8 @@ void eval_special_string(const char *cmd, const char *data,
ret = parse_special_string(start, server, item,
data, &arg_used);
+ if (arg_used) arg_used_ever = TRUE;
+
if (strchr(cmdchars, *ret) == NULL) {
/* no command char - let's put it there.. */
char *old = ret;
@@ -497,19 +504,26 @@ void eval_special_string(const char *cmd, const char *data,
ret = g_strdup_printf("%c%s", *cmdchars, old);
g_free(old);
}
- if (!arg_used && *data != '\0') {
- /* append the string with all the arguments */
+ commands = g_slist_append(commands, ret);
+ start = str;
+ } while (*start != '\0');
+
+ /* run the command, if no arguments were ever used, append all of them
+ after each command */
+ while (commands != NULL) {
+ ret = commands->data;
+
+ if (!arg_used_ever && *data != '\0') {
char *old = ret;
ret = g_strconcat(old, " ", data, NULL);
g_free(old);
}
signal_emit("send command", 3, ret, server, item);
- g_free(ret);
-
- start = str;
- } while (*start != '\0');
+ g_free(ret);
+ commands = g_slist_remove(commands, commands->data);
+ }
g_free(orig);
}