Index: example.c =================================================================== --- example.c (revision 28449) +++ example.c (revision 28450) @@ -10,6 +10,7 @@ while(fgets(s, sizeof(s), stdin) != NULL) { int n, argc; char *end, **argv; + size_t cons = 424242; /* remove trailing newline (if we don't we just get an extra empty field at the end) */ for(end = s + strlen(s) - 1; (end >= s) && ((*end == '\r') || (*end == '\n')); end--) @@ -17,10 +18,11 @@ /* split and print fields */ printf("Splitting '%s':\n", s); - argc = qparse2(s, &argv, QPARSE_DOUBLE_QUOTE | QPARSE_SINGLE_QUOTE); + argc = qparse3(s, &argv, QPARSE_DOUBLE_QUOTE | QPARSE_SINGLE_QUOTE, &cons); for(n = 0; n < argc; n++) printf(" [%d] '%s'\n", n, argv[n]); qparse_free(argc, &argv); + printf("consumed: %ld bytes\n", cons); } return 0; } Index: qparse.c =================================================================== --- qparse.c (revision 28449) +++ qparse.c (revision 28450) @@ -67,7 +67,7 @@ buff_used = 0; \ } -int qparse2(const char *input, char **argv_ret[], flags_t flg) +int qparse3(const char *input, char **argv_ret[], flags_t flg, size_t *consumed_out) { int argc; int allocated; @@ -178,10 +178,17 @@ if (buff != NULL) free(buff); + if (consumed_out != NULL) + *consumed_out = s-input; *argv_ret = argv; return argc; } +int qparse2(const char *input, char **argv_ret[], flags_t flg) +{ + return qparse3(input, argv_ret, flg, NULL); +} + int qparse(const char *input, char **argv_ret[]) { return qparse2(input, argv_ret, QPARSE_DOUBLE_QUOTE); Index: qparse.h =================================================================== --- qparse.h (revision 28449) +++ qparse.h (revision 28450) @@ -20,3 +20,6 @@ int qparse2(const char *input, char **argv_ret[], flags_t flg); +/* This variant returns the number of characters consumed from the input + so it can be used for multi-command parsing */ +int qparse3(const char *input, char **argv_ret[], flags_t flg, size_t *consumed_out);