Skip to content

Commit

Permalink
Merge pull request docopt#20 from ffunenga/simplify-parse-functions
Browse files Browse the repository at this point in the history
Simplify parse functions
  • Loading branch information
kblomqvist committed Jun 28, 2013
2 parents e475b31 + c7b8a96 commit 08c5236
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 60 deletions.
45 changes: 25 additions & 20 deletions docopt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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];
Expand All @@ -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;
Expand Down
45 changes: 25 additions & 20 deletions template.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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];
Expand All @@ -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;
Expand Down
52 changes: 32 additions & 20 deletions test_docopt.c
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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"));
Expand All @@ -47,16 +51,17 @@ 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[] = {
{"-a", NULL, false, false, NULL},
{"-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);
Expand All @@ -69,16 +74,17 @@ 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[] = {
{"-a", NULL, false, false, NULL},
{"-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);
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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[] = {
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 08c5236

Please sign in to comment.