Index: trunk/src_3rd/qparse/qparse.c =================================================================== --- trunk/src_3rd/qparse/qparse.c (revision 8900) +++ trunk/src_3rd/qparse/qparse.c (revision 8901) @@ -25,7 +25,8 @@ typedef enum qp_state_e { qp_normal, qp_dquote, - qp_squote + qp_squote, + qp_paren } qp_state_t; #define qpush(chr) \ @@ -105,6 +106,12 @@ else qpush(*s); break; + case '(': + if (flg & QPARSE_PAREN) + state = qp_paren; + else + qpush(*s); + break; case ' ': case '\t': case '\n': @@ -148,6 +155,21 @@ } /* End of qp_dquote */ break; + + case qp_paren: + switch (*s) { + case '\\': + s++; + qbackslash(*s); + break; + case ')': + state = qp_normal; + break; + default: + qpush(*s); + } + /* End of qp_paren */ + break; } } Index: trunk/src_3rd/qparse/qparse.h =================================================================== --- trunk/src_3rd/qparse/qparse.h (revision 8900) +++ trunk/src_3rd/qparse/qparse.h (revision 8901) @@ -14,7 +14,8 @@ typedef enum { QPARSE_DOUBLE_QUOTE = 1, QPARSE_SINGLE_QUOTE = 2, - QPARSE_MULTISEP = 4 /* multiple separators are taken as a single separator */ + QPARSE_PAREN = 4, + QPARSE_MULTISEP = 8 /* multiple separators are taken as a single separator */ } flags_t; int qparse2(const char *input, char **argv_ret[], flags_t flg);