mirror of
https://github.com/irssi/irssi.git
synced 2025-04-26 04:51:11 -05:00
cmd_get_params() fixes:
- arguments and optional channel flags couldn't be used together - -- argument treats the rest of the text as non-arguments, like /topic -- -hello- sets the topic to -hello-. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@256 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
bf8616ee26
commit
e5385ceb35
@ -160,22 +160,31 @@ static char *get_opt_args(char **data)
|
|||||||
{
|
{
|
||||||
/* -cmd1 -cmd2 -cmd3 ... */
|
/* -cmd1 -cmd2 -cmd3 ... */
|
||||||
char *p, *ret;
|
char *p, *ret;
|
||||||
|
int stopnext;
|
||||||
|
|
||||||
g_return_val_if_fail(data != NULL, NULL);
|
g_return_val_if_fail(data != NULL, NULL);
|
||||||
g_return_val_if_fail(*data != NULL, NULL);
|
g_return_val_if_fail(*data != NULL, NULL);
|
||||||
|
|
||||||
|
stopnext = FALSE;
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
for (p = *data;;) {
|
for (p = *data;;) {
|
||||||
if (*p != '-') {
|
if (*p != '-' || stopnext) {
|
||||||
if (p == *data) return "";
|
if (p == *data) return "";
|
||||||
|
|
||||||
while (isspace(p[-1]) && p > *data) p--;
|
|
||||||
if (*p != '\0') *p++ = '\0';
|
|
||||||
ret = *data;
|
ret = *data;
|
||||||
*data = p;
|
*data = p;
|
||||||
|
|
||||||
|
while (isspace(p[-1]) && p > ret) p--;
|
||||||
|
if (*p != '\0') *p = '\0';
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p[1] == '-') {
|
||||||
|
/* -- argument means end of arguments even if
|
||||||
|
next word starts with - */
|
||||||
|
stopnext = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
while (!isspace(*p) && *p != '\0') p++;
|
while (!isspace(*p) && *p != '\0') p++;
|
||||||
while (isspace(*p)) p++;
|
while (isspace(*p)) p++;
|
||||||
}
|
}
|
||||||
@ -224,7 +233,7 @@ int arg_find(char **array, const char *item)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_multi_args(char **data, va_list va)
|
static int get_multi_args(char **data, int checkonly, va_list va)
|
||||||
{
|
{
|
||||||
/* -cmd1 arg1 -cmd2 "argument two" -cmd3 */
|
/* -cmd1 arg1 -cmd2 "argument two" -cmd3 */
|
||||||
GString *returnargs;
|
GString *returnargs;
|
||||||
@ -256,7 +265,16 @@ static int get_multi_args(char **data, va_list va)
|
|||||||
nextarg = NULL;
|
nextarg = NULL;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (**data == '-') {
|
if (**data == '-') {
|
||||||
(*data)++; arg = cmd_get_param(data);
|
(*data)++;
|
||||||
|
if (**data == '-') {
|
||||||
|
/* -- argument means end of arguments even
|
||||||
|
if next word starts with - */
|
||||||
|
(*data)++;
|
||||||
|
while (isspace(**data)) (*data)++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
arg = cmd_get_param(data);
|
||||||
g_string_sprintfa(returnargs, "-%s ", arg);
|
g_string_sprintfa(returnargs, "-%s ", arg);
|
||||||
|
|
||||||
/* check if this argument can have parameter */
|
/* check if this argument can have parameter */
|
||||||
@ -280,19 +298,22 @@ static int get_multi_args(char **data, va_list va)
|
|||||||
while (isspace(**data)) (*data)++;
|
while (isspace(**data)) (*data)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ok, this is a bit stupid. this will pack the arguments in `data'
|
if (!checkonly) {
|
||||||
like "-arg1 subarg -arg2 sub2\0" -> "-arg1 -arg2\0subarg\0sub2\0"
|
/* ok, this is a bit stupid. this will pack the arguments in
|
||||||
this is because it's easier to free only _one_ string instead of
|
`data' like "-arg1 subarg -arg2 sub2\0" ->
|
||||||
two (`args') when using PARAM_FLAG_MULTIARGS. */
|
"-arg1 -arg2\0subarg\0sub2\0" this is because it's easier
|
||||||
if (origdata == *data)
|
to free only _one_ string instead of two (`args') when
|
||||||
*args = "";
|
using PARAM_FLAG_MULTIARGS. */
|
||||||
else {
|
if (returnargs->len == 0)
|
||||||
cmd_params_pack(subargs, **data == '\0' ? *data : (*data)-1,
|
*args = "";
|
||||||
origdata, origdata+returnargs->len);
|
else {
|
||||||
|
cmd_params_pack(subargs, **data == '\0' ? *data : (*data)-1,
|
||||||
|
origdata, origdata+returnargs->len);
|
||||||
|
|
||||||
g_string_truncate(returnargs, returnargs->len-1);
|
g_string_truncate(returnargs, returnargs->len-1);
|
||||||
strcpy(origdata, returnargs->str);
|
strcpy(origdata, returnargs->str);
|
||||||
*args = origdata;
|
*args = origdata;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_string_free(returnargs, TRUE);
|
g_string_free(returnargs, TRUE);
|
||||||
@ -322,28 +343,51 @@ char *cmd_get_callfuncs(const char *data, int *count, va_list *args)
|
|||||||
|
|
||||||
char *cmd_get_params(const char *data, int count, ...)
|
char *cmd_get_params(const char *data, int count, ...)
|
||||||
{
|
{
|
||||||
char **str, *arg, *ret, *datad;
|
char **str, *arg, *datad, *old;
|
||||||
va_list args;
|
va_list args;
|
||||||
int cnt, eat;
|
int cnt, eat, len;
|
||||||
|
|
||||||
g_return_val_if_fail(data != NULL, NULL);
|
g_return_val_if_fail(data != NULL, NULL);
|
||||||
|
|
||||||
va_start(args, count);
|
va_start(args, count);
|
||||||
ret = datad = cmd_get_callfuncs(data, &count, &args);
|
|
||||||
|
|
||||||
|
/* get the length of the arguments in string */
|
||||||
|
old = datad = g_strdup(data);
|
||||||
|
if (count & PARAM_FLAG_MULTIARGS)
|
||||||
|
get_multi_args(&datad, TRUE, args);
|
||||||
|
else if (count & PARAM_FLAG_OPTARGS)
|
||||||
|
get_opt_args(&datad);
|
||||||
|
len = (int) (datad-old);
|
||||||
|
g_free(old);
|
||||||
|
|
||||||
|
/* send the text to custom functions to handle - skip arguments */
|
||||||
|
old = datad = cmd_get_callfuncs(data+len, &count, &args);
|
||||||
|
|
||||||
|
if (len > 0) {
|
||||||
|
/* put the arguments + the new data to one string */
|
||||||
|
datad = g_malloc(len+1 + strlen(old)+1);
|
||||||
|
memcpy(datad, data, len);
|
||||||
|
datad[len] = ' ';
|
||||||
|
memcpy(datad+len+1, old, strlen(old)+1);
|
||||||
|
g_free(old);
|
||||||
|
|
||||||
|
old = datad;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* and now handle the string */
|
||||||
cnt = PARAM_WITHOUT_FLAGS(count);
|
cnt = PARAM_WITHOUT_FLAGS(count);
|
||||||
while (cnt-- > 0) {
|
while (cnt-- > 0) {
|
||||||
if (count & PARAM_FLAG_OPTARGS) {
|
if (count & PARAM_FLAG_MULTIARGS) {
|
||||||
arg = get_opt_args(&datad);
|
eat = get_multi_args(&datad, FALSE, args)+1;
|
||||||
count &= ~PARAM_FLAG_OPTARGS;
|
|
||||||
} else if (count & PARAM_FLAG_MULTIARGS) {
|
|
||||||
eat = get_multi_args(&datad, args)+1;
|
|
||||||
count &= ~PARAM_FLAG_MULTIARGS;
|
count &= ~PARAM_FLAG_MULTIARGS;
|
||||||
|
|
||||||
cnt -= eat-1;
|
cnt -= eat-1;
|
||||||
while (eat-- > 0)
|
while (eat-- > 0)
|
||||||
str = (char **) va_arg(args, char **);
|
str = (char **) va_arg(args, char **);
|
||||||
continue;
|
continue;
|
||||||
|
} else if (count & PARAM_FLAG_OPTARGS) {
|
||||||
|
arg = get_opt_args(&datad);
|
||||||
|
count &= ~PARAM_FLAG_OPTARGS;
|
||||||
} else if (cnt == 0 && count & PARAM_FLAG_GETREST) {
|
} else if (cnt == 0 && count & PARAM_FLAG_GETREST) {
|
||||||
/* get rest */
|
/* get rest */
|
||||||
arg = datad;
|
arg = datad;
|
||||||
@ -356,7 +400,7 @@ char *cmd_get_params(const char *data, int count, ...)
|
|||||||
}
|
}
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
return ret;
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmd_get_add_func(CMD_GET_FUNC func)
|
void cmd_get_add_func(CMD_GET_FUNC func)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user