Index: example_static.c =================================================================== --- example_static.c (revision 28950) +++ example_static.c (revision 28951) @@ -10,6 +10,7 @@ int main() { char s[1024]; + const char *start[3] = {0}; char *tmp, *argv_static[8] = {0}, **argv = argv_static; unsigned int argv_alloced = 8; size_t tmp_len; @@ -29,11 +30,14 @@ /* split and print fields */ printf("Splitting '%s':\n", s); - argc = qparse4(s, &argv, &argv_alloced, SYNTAX, &cons, &tmp, &tmp_len); + argc = qparse4(s, &argv, &argv_alloced, SYNTAX, &cons, &tmp, &tmp_len, start, 3); for(n = 0; n < argc; n++) printf(" [%d] '%s'\n", n, argv[n]); qparse_free_strs(argc, &argv); - printf("consumed: %ld bytes\n", cons); + printf("consumed: %ld bytes, starts at", cons); + for(n = 0; (n < argc) && (n < 3); n++) + printf(" '%s'", start[n]); + printf("\n"); } qparse4_free(&argv, &argv_alloced, SYNTAX, &tmp, &tmp_len); Index: qparse.c =================================================================== --- qparse.c (revision 28950) +++ qparse.c (revision 28951) @@ -32,6 +32,8 @@ #define qpush(chr) \ { \ + if ((buff_used == 0) && (start != NULL) && (argc < start_len)) \ + start[argc] = s; \ if (buff_used >= buff_len) { \ buff_len += 128; \ buff = realloc(buff, buff_len); \ @@ -75,7 +77,7 @@ } \ } while(0) -int qparse4(const char *input, char **argv_ret[], unsigned int *argv_allocated, flags_t flg, size_t *consumed_out, char **buffer, size_t *buffer_alloced) +int qparse4(const char *input, char **argv_ret[], unsigned int *argv_allocated, flags_t flg, size_t *consumed_out, char **buffer, size_t *buffer_alloced, const char **start, int start_len) { int argc, allocated_; qp_state_t state; @@ -253,18 +255,18 @@ int qparse3(const char *input, char **argv_ret[], flags_t flg, size_t *consumed_out) { - return qparse4(input, argv_ret, 0, flg, consumed_out, NULL, NULL); + return qparse4(input, argv_ret, 0, flg, consumed_out, NULL, NULL, NULL, 0); } int qparse2(const char *input, char **argv_ret[], flags_t flg) { - return qparse4(input, argv_ret, 0, flg, NULL, NULL, NULL); + return qparse4(input, argv_ret, 0, flg, NULL, NULL, NULL, NULL, 0); } int qparse(const char *input, char **argv_ret[]) { - return qparse4(input, argv_ret, 0, QPARSE_DOUBLE_QUOTE, NULL, NULL, NULL); + return qparse4(input, argv_ret, 0, QPARSE_DOUBLE_QUOTE, NULL, NULL, NULL, NULL, 0); } Index: qparse.h =================================================================== --- qparse.h (revision 28950) +++ qparse.h (revision 28951) @@ -36,10 +36,12 @@ /* This variant keeps track of argv_ret[] size in user supplied 'argv_allocated' so it can be persistent across calls, can save mallocs and frees. If buffer and buffer_alloced are not NULL, temporary field buffer is persistent - across calls. Call qparse_free_strs() after the call to get rid of the - strings (this won't free argv[] itself). After the last parse, call to + across calls. If start is not NULL, the start of the first start_len + words are saved there. + Call qparse_free_strs() after the call to get rid of the strings (this + won't free argv[] itself). After the last parse, call qparse4_free() to free everything */ -int qparse4(const char *input, char **argv_ret[], unsigned int *argv_allocated, flags_t flg, size_t *consumed_out, char **buffer, size_t *buffer_alloced); +int qparse4(const char *input, char **argv_ret[], unsigned int *argv_allocated, flags_t flg, size_t *consumed_out, char **buffer, size_t *buffer_alloced, const char **start, int start_len); void qparse_free_strs(int argc, char **argv_ret[]); void qparse4_free(char **argv_ret[], unsigned int *argv_allocated, flags_t flg, char **buffer, size_t *buffer_alloced);