From 2370d2d63031a92b0b8c53b0a1b3c8e7614506a2 Mon Sep 17 00:00:00 2001 From: Filipe Funenga Date: Fri, 28 Jun 2013 01:23:12 +0100 Subject: [PATCH 1/2] Simplifies parse_* function's arguments -makes these functions receive only two arguments: ts and elements -`parse_args` becomes simpler --- docopt.c | 45 ++++++++++++++++++++++++-------------------- template.c | 45 ++++++++++++++++++++++++-------------------- test_docopt.c | 52 +++++++++++++++++++++++++++++++-------------------- 3 files changed, 82 insertions(+), 60 deletions(-) diff --git a/docopt.c b/docopt.c index 882da0e..8685b1f 100644 --- a/docopt.c +++ b/docopt.c @@ -124,19 +124,24 @@ Tokens* tokens_move(Tokens *ts) { * ARGV parsing functions */ -int parse_doubledash(Tokens *ts, - int n_commands, Command *commands, - int n_arguments, Argument *arguments) { +int parse_doubledash(Tokens *ts, Elements *elements) { + //int n_commands = elements->n_commands; + //int n_arguments = elements->n_arguments; + //Command *commands = elements->commands; + //Argument *arguments = elements->arguments; + // not implemented yet // return parsed + [Argument(None, v) for v in tokens] return 0; } -int parse_long(Tokens *ts, int n_options, Option *options) { - char *eq = strchr(ts->current, '='); +int parse_long(Tokens *ts, Elements *elements) { int i; int len_prefix; + int n_options = elements->n_options; + char *eq = strchr(ts->current, '='); Option *option; + Option *options = elements->options; len_prefix = (eq-(ts->current))/sizeof(char); for (i=0; i < n_options; i++) { @@ -171,10 +176,12 @@ int parse_long(Tokens *ts, int n_options, Option *options) { return 0; } -int parse_shorts(Tokens *ts, int n_options, Option *options) { - Option *option; +int parse_shorts(Tokens *ts, Elements *elements) { char *raw; int i; + int n_options = elements->n_options; + Option *option; + Option *options = elements->options; raw = &ts->current[1]; tokens_move(ts); @@ -208,11 +215,13 @@ int parse_shorts(Tokens *ts, int n_options, Option *options) { return 0; } -int parse_argcmd(Tokens *ts, - int n_commands, Command *commands, - int n_arguments, Argument *arguments) { - Command *command; +int parse_argcmd(Tokens *ts, Elements *elements) { int i; + int n_commands = elements->n_commands; + int n_arguments = elements->n_arguments; + Command *command; + Command *commands = elements->commands; + Argument *arguments = elements->arguments; for (i=0; i < n_commands; i++) { command = &commands[i]; @@ -238,18 +247,14 @@ int parse_args(Tokens *ts, Elements *elements) { while (ts->current != NULL) { if (strcmp(ts->current, "--") == 0) { - ret = parse_doubledash(ts, elements->n_commands, - elements->commands, elements->n_arguments, - elements->arguments); + ret = parse_doubledash(ts, elements); if (!ret) break; } else if (ts->current[0] == '-' && ts->current[1] == '-') { - ret = parse_long(ts, elements->n_options, elements->options); + ret = parse_long(ts, elements); } else if (ts->current[0] == '-' && ts->current[1] != '\0') { - ret = parse_shorts(ts, elements->n_options, elements->options); - } else { - ret = parse_argcmd(ts, elements->n_commands, elements->commands, - elements->n_arguments, elements->arguments); - } + ret = parse_shorts(ts, elements); + } else + ret = parse_argcmd(ts, elements); if (ret) return ret; } return 0; diff --git a/template.c b/template.c index d20e822..7bd4246 100644 --- a/template.c +++ b/template.c @@ -82,19 +82,24 @@ Tokens* tokens_move(Tokens *ts) { * ARGV parsing functions */ -int parse_doubledash(Tokens *ts, - int n_commands, Command *commands, - int n_arguments, Argument *arguments) { +int parse_doubledash(Tokens *ts, Elements *elements) { + //int n_commands = elements->n_commands; + //int n_arguments = elements->n_arguments; + //Command *commands = elements->commands; + //Argument *arguments = elements->arguments; + // not implemented yet // return parsed + [Argument(None, v) for v in tokens] return 0; } -int parse_long(Tokens *ts, int n_options, Option *options) { - char *eq = strchr(ts->current, '='); +int parse_long(Tokens *ts, Elements *elements) { int i; int len_prefix; + int n_options = elements->n_options; + char *eq = strchr(ts->current, '='); Option *option; + Option *options = elements->options; len_prefix = (eq-(ts->current))/sizeof(char); for (i=0; i < n_options; i++) { @@ -129,10 +134,12 @@ int parse_long(Tokens *ts, int n_options, Option *options) { return 0; } -int parse_shorts(Tokens *ts, int n_options, Option *options) { - Option *option; +int parse_shorts(Tokens *ts, Elements *elements) { char *raw; int i; + int n_options = elements->n_options; + Option *option; + Option *options = elements->options; raw = &ts->current[1]; tokens_move(ts); @@ -166,11 +173,13 @@ int parse_shorts(Tokens *ts, int n_options, Option *options) { return 0; } -int parse_argcmd(Tokens *ts, - int n_commands, Command *commands, - int n_arguments, Argument *arguments) { - Command *command; +int parse_argcmd(Tokens *ts, Elements *elements) { int i; + int n_commands = elements->n_commands; + int n_arguments = elements->n_arguments; + Command *command; + Command *commands = elements->commands; + Argument *arguments = elements->arguments; for (i=0; i < n_commands; i++) { command = &commands[i]; @@ -196,18 +205,14 @@ int parse_args(Tokens *ts, Elements *elements) { while (ts->current != NULL) { if (strcmp(ts->current, "--") == 0) { - ret = parse_doubledash(ts, elements->n_commands, - elements->commands, elements->n_arguments, - elements->arguments); + ret = parse_doubledash(ts, elements); if (!ret) break; } else if (ts->current[0] == '-' && ts->current[1] == '-') { - ret = parse_long(ts, elements->n_options, elements->options); + ret = parse_long(ts, elements); } else if (ts->current[0] == '-' && ts->current[1] != '\0') { - ret = parse_shorts(ts, elements->n_options, elements->options); - } else { - ret = parse_argcmd(ts, elements->n_commands, elements->commands, - elements->n_arguments, elements->arguments); - } + ret = parse_shorts(ts, elements); + } else + ret = parse_argcmd(ts, elements); if (ret) return ret; } return 0; diff --git a/test_docopt.c b/test_docopt.c index b91e3aa..850f769 100644 --- a/test_docopt.c +++ b/test_docopt.c @@ -1,6 +1,10 @@ #include "docopt.c" -#define assert(x) printf("%c", x ? '.' : 'F') +#define assert(x) \ + if (x) \ + printf("."); \ + else \ + printf("\n[%s, line %d] test failed", __FILE__, __LINE__) /* * TokenStream @@ -25,17 +29,17 @@ int test_tokens(void) { */ int test_parse_shorts_1(void) { + int ret; char *argv[] = {"-a"}; Tokens ts = tokens_new(1, argv); Option options[] = { {"-a", NULL, false, false, NULL} }; Option option; - int ret; + Elements elements = {0, 0, 1, NULL, NULL, options}; - ret = parse_shorts(&ts, 1, options); + ret = parse_shorts(&ts, &elements); option = options[0]; - assert(!ret); if (ret) return ret; assert(!strcmp(option.oshort, "-a")); @@ -47,6 +51,7 @@ int test_parse_shorts_1(void) { } int test_parse_shorts_2(void) { + int ret; char *argv[] = {"-ab"}; Tokens ts = tokens_new(1, argv); Option options[] = { @@ -54,9 +59,9 @@ int test_parse_shorts_2(void) { {"-b", NULL, false, false, NULL} }; Option option1, option2; - int ret; + Elements elements = {0, 0, 2, NULL, NULL, options}; - ret = parse_shorts(&ts, 2, options); + ret = parse_shorts(&ts, &elements); option1 = options[0]; option2 = options[1]; assert(!ret); @@ -69,6 +74,7 @@ int test_parse_shorts_2(void) { } int test_parse_shorts_3(void) { + int ret; char *argv[] = {"-b"}; Tokens ts = tokens_new(1, argv); Option options[] = { @@ -76,9 +82,9 @@ int test_parse_shorts_3(void) { {"-b", NULL, false, false, NULL} }; Option option1, option2; - int ret; + Elements elements = {0, 0, 2, NULL, NULL, options}; - ret = parse_shorts(&ts, 2, options); + ret = parse_shorts(&ts, &elements); option1 = options[0]; option2 = options[1]; assert(!ret); @@ -91,15 +97,16 @@ int test_parse_shorts_3(void) { } int test_parse_shorts_4(void) { + int ret; char *argv[] = {"-aARG"}; Tokens ts = tokens_new(1, argv); Option options[] = { {"-a", NULL, true, false, NULL} }; Option option; - int ret; + Elements elements = {0, 0, 1, NULL, NULL, options}; - ret = parse_shorts(&ts, 1, options); + ret = parse_shorts(&ts, &elements); option = options[0]; assert(!ret); if (ret) return ret; @@ -110,15 +117,16 @@ int test_parse_shorts_4(void) { } int test_parse_shorts_5(void) { + int ret; char *argv[] = {"-a", "ARG"}; Tokens ts = tokens_new(2, argv); Option options[] = { {"-a", NULL, true, false, NULL} }; Option option; - int ret; + Elements elements = {0, 0, 1, NULL, NULL, options}; - ret = parse_shorts(&ts, 1, options); + ret = parse_shorts(&ts, &elements); option = options[0]; assert(!ret); if (ret) return ret; @@ -133,15 +141,16 @@ int test_parse_shorts_5(void) { */ int test_parse_long_1(void) { + int ret; char *argv[] = {"--all"}; Tokens ts = tokens_new(1, argv); Option options[] = { {NULL, "--all", false, false, NULL} }; Option option; - int ret; + Elements elements = {0, 0, 1, NULL, NULL, options}; - ret = parse_long(&ts, 1, options); + ret = parse_long(&ts, &elements); option = options[0]; assert(!ret); if (ret) return ret; @@ -154,6 +163,7 @@ int test_parse_long_1(void) { } int test_parse_long_2(void) { + int ret; char *argv[] = {"--all"}; Tokens ts = tokens_new(1, argv); Option options[] = { @@ -162,9 +172,9 @@ int test_parse_long_2(void) { }; Option option1; Option option2; - int ret; + Elements elements = {0, 0, 2, NULL, NULL, options}; - ret = parse_long(&ts, 2, options); + ret = parse_long(&ts, &elements); option1 = options[0]; option2 = options[1]; assert(!ret); @@ -183,15 +193,16 @@ int test_parse_long_2(void) { } int test_parse_long_3(void) { + int ret; char *argv[] = {"--all=ARG"}; Tokens ts = tokens_new(1, argv); Option options[] = { {NULL, "--all", true, false, NULL} }; Option option; - int ret; + Elements elements = {0, 0, 1, NULL, NULL, options}; - ret = parse_long(&ts, 1, options); + ret = parse_long(&ts, &elements); option = options[0]; assert(!ret); if (ret) return ret; @@ -204,15 +215,16 @@ int test_parse_long_3(void) { } int test_parse_long_4(void) { + int ret; char *argv[] = {"--all", "ARG"}; Tokens ts = tokens_new(2, argv); Option options[] = { {NULL, "--all", true, false, NULL} }; Option option; - int ret; + Elements elements = {0, 0, 1, NULL, NULL, options}; - ret = parse_long(&ts, 1, options); + ret = parse_long(&ts, &elements); option = options[0]; assert(!ret); if (ret) return ret; From c7b8a963a47d6292086cc0166981619d2c1c1377 Mon Sep 17 00:00:00 2001 From: Filipe Funenga Date: Fri, 28 Jun 2013 01:25:11 +0100 Subject: [PATCH 2/2] Removes warnings when -Wall is used --- docopt.c | 4 ++-- template.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docopt.c b/docopt.c index 8685b1f..b032320 100644 --- a/docopt.c +++ b/docopt.c @@ -218,10 +218,10 @@ int parse_shorts(Tokens *ts, Elements *elements) { int parse_argcmd(Tokens *ts, Elements *elements) { int i; int n_commands = elements->n_commands; - int n_arguments = elements->n_arguments; + //int n_arguments = elements->n_arguments; Command *command; Command *commands = elements->commands; - Argument *arguments = elements->arguments; + //Argument *arguments = elements->arguments; for (i=0; i < n_commands; i++) { command = &commands[i]; diff --git a/template.c b/template.c index 7bd4246..39196a8 100644 --- a/template.c +++ b/template.c @@ -176,10 +176,10 @@ int parse_shorts(Tokens *ts, Elements *elements) { int parse_argcmd(Tokens *ts, Elements *elements) { int i; int n_commands = elements->n_commands; - int n_arguments = elements->n_arguments; + //int n_arguments = elements->n_arguments; Command *command; Command *commands = elements->commands; - Argument *arguments = elements->arguments; + //Argument *arguments = elements->arguments; for (i=0; i < n_commands; i++) { command = &commands[i];