Index: example.c =================================================================== --- example.c (revision 28451) +++ example.c (revision 28452) @@ -18,7 +18,7 @@ /* split and print fields */ printf("Splitting '%s':\n", s); - argc = qparse3(s, &argv, QPARSE_DOUBLE_QUOTE | QPARSE_SINGLE_QUOTE, &cons); + argc = qparse3(s, &argv, QPARSE_DOUBLE_QUOTE | QPARSE_SINGLE_QUOTE | QPARSE_TERM_SEMICOLON, &cons); for(n = 0; n < argc; n++) printf(" [%d] '%s'\n", n, argv[n]); qparse_free(argc, &argv); Index: qparse.c =================================================================== --- qparse.c (revision 28451) +++ qparse.c (revision 28452) @@ -112,10 +112,19 @@ else qpush(*s); break; + + case ';': + if (flg & QPARSE_TERM_SEMICOLON) + goto stop; + qpush(*s); /* plain ';', don't care */ + break; + + case '\n': + case '\r': + if (flg & QPARSE_TERM_NEWLINE) + goto stop; case ' ': case '\t': - case '\n': - case '\r': if (flg & QPARSE_MULTISEP) while(isspace(s[1])) s++; qnext(); @@ -173,6 +182,8 @@ } } + stop:; + qnext(); if (buff != NULL) Index: qparse.h =================================================================== --- qparse.h (revision 28451) +++ qparse.h (revision 28452) @@ -15,7 +15,9 @@ QPARSE_DOUBLE_QUOTE = 1, QPARSE_SINGLE_QUOTE = 2, QPARSE_PAREN = 4, - QPARSE_MULTISEP = 8 /* multiple separators are taken as a single separator */ + QPARSE_MULTISEP = 8, /* multiple separators are taken as a single separator */ + QPARSE_TERM_NEWLINE = 16, /* terminate parsing at newline */ + QPARSE_TERM_SEMICOLON = 32, /* terminate parsing at semicolon */ } flags_t; int qparse2(const char *input, char **argv_ret[], flags_t flg);