Index: trunk/src_3rd/qparse/qparse.c =================================================================== --- trunk/src_3rd/qparse/qparse.c (revision 28949) +++ trunk/src_3rd/qparse/qparse.c (revision 28950) @@ -83,6 +83,7 @@ char *buff; size_t buff_len, buff_used; char **argv; + int num_fparens = 0; if (argv_allocated == NULL) { argv = NULL; @@ -131,7 +132,17 @@ else qpush(*s); break; + case ')': + if ((flg & QPARSE_PAREN_FUNC) && (num_fparens == 1)) + goto stop; + qpush(*s); /* plain ')', don't care */ + break; case '(': + if ((flg & QPARSE_PAREN_FUNC) && (num_fparens == 0)) { + num_fparens++; + qnext(); + break; + } if (flg & QPARSE_PAREN) state = qp_paren; else Index: trunk/src_3rd/qparse/qparse.h =================================================================== --- trunk/src_3rd/qparse/qparse.h (revision 28949) +++ trunk/src_3rd/qparse/qparse.h (revision 28950) @@ -22,8 +22,9 @@ QPARSE_TERM_SEMICOLON = 32, /* terminate parsing at semicolon */ QPARSE_SEP_COMMA = 64, /* comma is a separator, like whitespace */ QPARSE_COLON_LAST = 128, /* if an argument starts with a colon, it's the last argument until the end of the message or line (IRC) */ + QPARSE_PAREN_FUNC = 256, /* func(...) where func will be argv[0] */ - QPARSE_NO_ARGV_REALLOC = 256 /* in qparse4: do not realloc() argv_ret (caller uses a static variant); if argc == *allocated, extra arguments are concatenated */ + QPARSE_NO_ARGV_REALLOC = 512 /* in qparse4: do not realloc() argv_ret (caller uses a static variant); if argc == *allocated, extra arguments are concatenated */ } flags_t; int qparse2(const char *input, char **argv_ret[], flags_t flg);