Skip to content

Commit 08c5236

Browse files
committed
Merge pull request #20 from ffunenga/simplify-parse-functions
Simplify parse functions
2 parents e475b31 + c7b8a96 commit 08c5236

File tree

3 files changed

+82
-60
lines changed

3 files changed

+82
-60
lines changed

Diff for: docopt.c

+25-20
Original file line numberDiff line numberDiff line change
@@ -124,19 +124,24 @@ Tokens* tokens_move(Tokens *ts) {
124124
* ARGV parsing functions
125125
*/
126126

127-
int parse_doubledash(Tokens *ts,
128-
int n_commands, Command *commands,
129-
int n_arguments, Argument *arguments) {
127+
int parse_doubledash(Tokens *ts, Elements *elements) {
128+
//int n_commands = elements->n_commands;
129+
//int n_arguments = elements->n_arguments;
130+
//Command *commands = elements->commands;
131+
//Argument *arguments = elements->arguments;
132+
130133
// not implemented yet
131134
// return parsed + [Argument(None, v) for v in tokens]
132135
return 0;
133136
}
134137

135-
int parse_long(Tokens *ts, int n_options, Option *options) {
136-
char *eq = strchr(ts->current, '=');
138+
int parse_long(Tokens *ts, Elements *elements) {
137139
int i;
138140
int len_prefix;
141+
int n_options = elements->n_options;
142+
char *eq = strchr(ts->current, '=');
139143
Option *option;
144+
Option *options = elements->options;
140145

141146
len_prefix = (eq-(ts->current))/sizeof(char);
142147
for (i=0; i < n_options; i++) {
@@ -171,10 +176,12 @@ int parse_long(Tokens *ts, int n_options, Option *options) {
171176
return 0;
172177
}
173178

174-
int parse_shorts(Tokens *ts, int n_options, Option *options) {
175-
Option *option;
179+
int parse_shorts(Tokens *ts, Elements *elements) {
176180
char *raw;
177181
int i;
182+
int n_options = elements->n_options;
183+
Option *option;
184+
Option *options = elements->options;
178185

179186
raw = &ts->current[1];
180187
tokens_move(ts);
@@ -208,11 +215,13 @@ int parse_shorts(Tokens *ts, int n_options, Option *options) {
208215
return 0;
209216
}
210217

211-
int parse_argcmd(Tokens *ts,
212-
int n_commands, Command *commands,
213-
int n_arguments, Argument *arguments) {
214-
Command *command;
218+
int parse_argcmd(Tokens *ts, Elements *elements) {
215219
int i;
220+
int n_commands = elements->n_commands;
221+
//int n_arguments = elements->n_arguments;
222+
Command *command;
223+
Command *commands = elements->commands;
224+
//Argument *arguments = elements->arguments;
216225

217226
for (i=0; i < n_commands; i++) {
218227
command = &commands[i];
@@ -238,18 +247,14 @@ int parse_args(Tokens *ts, Elements *elements) {
238247

239248
while (ts->current != NULL) {
240249
if (strcmp(ts->current, "--") == 0) {
241-
ret = parse_doubledash(ts, elements->n_commands,
242-
elements->commands, elements->n_arguments,
243-
elements->arguments);
250+
ret = parse_doubledash(ts, elements);
244251
if (!ret) break;
245252
} else if (ts->current[0] == '-' && ts->current[1] == '-') {
246-
ret = parse_long(ts, elements->n_options, elements->options);
253+
ret = parse_long(ts, elements);
247254
} else if (ts->current[0] == '-' && ts->current[1] != '\0') {
248-
ret = parse_shorts(ts, elements->n_options, elements->options);
249-
} else {
250-
ret = parse_argcmd(ts, elements->n_commands, elements->commands,
251-
elements->n_arguments, elements->arguments);
252-
}
255+
ret = parse_shorts(ts, elements);
256+
} else
257+
ret = parse_argcmd(ts, elements);
253258
if (ret) return ret;
254259
}
255260
return 0;

Diff for: template.c

+25-20
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,24 @@ Tokens* tokens_move(Tokens *ts) {
8282
* ARGV parsing functions
8383
*/
8484

85-
int parse_doubledash(Tokens *ts,
86-
int n_commands, Command *commands,
87-
int n_arguments, Argument *arguments) {
85+
int parse_doubledash(Tokens *ts, Elements *elements) {
86+
//int n_commands = elements->n_commands;
87+
//int n_arguments = elements->n_arguments;
88+
//Command *commands = elements->commands;
89+
//Argument *arguments = elements->arguments;
90+
8891
// not implemented yet
8992
// return parsed + [Argument(None, v) for v in tokens]
9093
return 0;
9194
}
9295

93-
int parse_long(Tokens *ts, int n_options, Option *options) {
94-
char *eq = strchr(ts->current, '=');
96+
int parse_long(Tokens *ts, Elements *elements) {
9597
int i;
9698
int len_prefix;
99+
int n_options = elements->n_options;
100+
char *eq = strchr(ts->current, '=');
97101
Option *option;
102+
Option *options = elements->options;
98103

99104
len_prefix = (eq-(ts->current))/sizeof(char);
100105
for (i=0; i < n_options; i++) {
@@ -129,10 +134,12 @@ int parse_long(Tokens *ts, int n_options, Option *options) {
129134
return 0;
130135
}
131136

132-
int parse_shorts(Tokens *ts, int n_options, Option *options) {
133-
Option *option;
137+
int parse_shorts(Tokens *ts, Elements *elements) {
134138
char *raw;
135139
int i;
140+
int n_options = elements->n_options;
141+
Option *option;
142+
Option *options = elements->options;
136143

137144
raw = &ts->current[1];
138145
tokens_move(ts);
@@ -166,11 +173,13 @@ int parse_shorts(Tokens *ts, int n_options, Option *options) {
166173
return 0;
167174
}
168175

169-
int parse_argcmd(Tokens *ts,
170-
int n_commands, Command *commands,
171-
int n_arguments, Argument *arguments) {
172-
Command *command;
176+
int parse_argcmd(Tokens *ts, Elements *elements) {
173177
int i;
178+
int n_commands = elements->n_commands;
179+
//int n_arguments = elements->n_arguments;
180+
Command *command;
181+
Command *commands = elements->commands;
182+
//Argument *arguments = elements->arguments;
174183

175184
for (i=0; i < n_commands; i++) {
176185
command = &commands[i];
@@ -196,18 +205,14 @@ int parse_args(Tokens *ts, Elements *elements) {
196205

197206
while (ts->current != NULL) {
198207
if (strcmp(ts->current, "--") == 0) {
199-
ret = parse_doubledash(ts, elements->n_commands,
200-
elements->commands, elements->n_arguments,
201-
elements->arguments);
208+
ret = parse_doubledash(ts, elements);
202209
if (!ret) break;
203210
} else if (ts->current[0] == '-' && ts->current[1] == '-') {
204-
ret = parse_long(ts, elements->n_options, elements->options);
211+
ret = parse_long(ts, elements);
205212
} else if (ts->current[0] == '-' && ts->current[1] != '\0') {
206-
ret = parse_shorts(ts, elements->n_options, elements->options);
207-
} else {
208-
ret = parse_argcmd(ts, elements->n_commands, elements->commands,
209-
elements->n_arguments, elements->arguments);
210-
}
213+
ret = parse_shorts(ts, elements);
214+
} else
215+
ret = parse_argcmd(ts, elements);
211216
if (ret) return ret;
212217
}
213218
return 0;

Diff for: test_docopt.c

+32-20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
#include "docopt.c"
22

3-
#define assert(x) printf("%c", x ? '.' : 'F')
3+
#define assert(x) \
4+
if (x) \
5+
printf("."); \
6+
else \
7+
printf("\n[%s, line %d] test failed", __FILE__, __LINE__)
48

59
/*
610
* TokenStream
@@ -25,17 +29,17 @@ int test_tokens(void) {
2529
*/
2630

2731
int test_parse_shorts_1(void) {
32+
int ret;
2833
char *argv[] = {"-a"};
2934
Tokens ts = tokens_new(1, argv);
3035
Option options[] = {
3136
{"-a", NULL, false, false, NULL}
3237
};
3338
Option option;
34-
int ret;
39+
Elements elements = {0, 0, 1, NULL, NULL, options};
3540

36-
ret = parse_shorts(&ts, 1, options);
41+
ret = parse_shorts(&ts, &elements);
3742
option = options[0];
38-
3943
assert(!ret);
4044
if (ret) return ret;
4145
assert(!strcmp(option.oshort, "-a"));
@@ -47,16 +51,17 @@ int test_parse_shorts_1(void) {
4751
}
4852

4953
int test_parse_shorts_2(void) {
54+
int ret;
5055
char *argv[] = {"-ab"};
5156
Tokens ts = tokens_new(1, argv);
5257
Option options[] = {
5358
{"-a", NULL, false, false, NULL},
5459
{"-b", NULL, false, false, NULL}
5560
};
5661
Option option1, option2;
57-
int ret;
62+
Elements elements = {0, 0, 2, NULL, NULL, options};
5863

59-
ret = parse_shorts(&ts, 2, options);
64+
ret = parse_shorts(&ts, &elements);
6065
option1 = options[0];
6166
option2 = options[1];
6267
assert(!ret);
@@ -69,16 +74,17 @@ int test_parse_shorts_2(void) {
6974
}
7075

7176
int test_parse_shorts_3(void) {
77+
int ret;
7278
char *argv[] = {"-b"};
7379
Tokens ts = tokens_new(1, argv);
7480
Option options[] = {
7581
{"-a", NULL, false, false, NULL},
7682
{"-b", NULL, false, false, NULL}
7783
};
7884
Option option1, option2;
79-
int ret;
85+
Elements elements = {0, 0, 2, NULL, NULL, options};
8086

81-
ret = parse_shorts(&ts, 2, options);
87+
ret = parse_shorts(&ts, &elements);
8288
option1 = options[0];
8389
option2 = options[1];
8490
assert(!ret);
@@ -91,15 +97,16 @@ int test_parse_shorts_3(void) {
9197
}
9298

9399
int test_parse_shorts_4(void) {
100+
int ret;
94101
char *argv[] = {"-aARG"};
95102
Tokens ts = tokens_new(1, argv);
96103
Option options[] = {
97104
{"-a", NULL, true, false, NULL}
98105
};
99106
Option option;
100-
int ret;
107+
Elements elements = {0, 0, 1, NULL, NULL, options};
101108

102-
ret = parse_shorts(&ts, 1, options);
109+
ret = parse_shorts(&ts, &elements);
103110
option = options[0];
104111
assert(!ret);
105112
if (ret) return ret;
@@ -110,15 +117,16 @@ int test_parse_shorts_4(void) {
110117
}
111118

112119
int test_parse_shorts_5(void) {
120+
int ret;
113121
char *argv[] = {"-a", "ARG"};
114122
Tokens ts = tokens_new(2, argv);
115123
Option options[] = {
116124
{"-a", NULL, true, false, NULL}
117125
};
118126
Option option;
119-
int ret;
127+
Elements elements = {0, 0, 1, NULL, NULL, options};
120128

121-
ret = parse_shorts(&ts, 1, options);
129+
ret = parse_shorts(&ts, &elements);
122130
option = options[0];
123131
assert(!ret);
124132
if (ret) return ret;
@@ -133,15 +141,16 @@ int test_parse_shorts_5(void) {
133141
*/
134142

135143
int test_parse_long_1(void) {
144+
int ret;
136145
char *argv[] = {"--all"};
137146
Tokens ts = tokens_new(1, argv);
138147
Option options[] = {
139148
{NULL, "--all", false, false, NULL}
140149
};
141150
Option option;
142-
int ret;
151+
Elements elements = {0, 0, 1, NULL, NULL, options};
143152

144-
ret = parse_long(&ts, 1, options);
153+
ret = parse_long(&ts, &elements);
145154
option = options[0];
146155
assert(!ret);
147156
if (ret) return ret;
@@ -154,6 +163,7 @@ int test_parse_long_1(void) {
154163
}
155164

156165
int test_parse_long_2(void) {
166+
int ret;
157167
char *argv[] = {"--all"};
158168
Tokens ts = tokens_new(1, argv);
159169
Option options[] = {
@@ -162,9 +172,9 @@ int test_parse_long_2(void) {
162172
};
163173
Option option1;
164174
Option option2;
165-
int ret;
175+
Elements elements = {0, 0, 2, NULL, NULL, options};
166176

167-
ret = parse_long(&ts, 2, options);
177+
ret = parse_long(&ts, &elements);
168178
option1 = options[0];
169179
option2 = options[1];
170180
assert(!ret);
@@ -183,15 +193,16 @@ int test_parse_long_2(void) {
183193
}
184194

185195
int test_parse_long_3(void) {
196+
int ret;
186197
char *argv[] = {"--all=ARG"};
187198
Tokens ts = tokens_new(1, argv);
188199
Option options[] = {
189200
{NULL, "--all", true, false, NULL}
190201
};
191202
Option option;
192-
int ret;
203+
Elements elements = {0, 0, 1, NULL, NULL, options};
193204

194-
ret = parse_long(&ts, 1, options);
205+
ret = parse_long(&ts, &elements);
195206
option = options[0];
196207
assert(!ret);
197208
if (ret) return ret;
@@ -204,15 +215,16 @@ int test_parse_long_3(void) {
204215
}
205216

206217
int test_parse_long_4(void) {
218+
int ret;
207219
char *argv[] = {"--all", "ARG"};
208220
Tokens ts = tokens_new(2, argv);
209221
Option options[] = {
210222
{NULL, "--all", true, false, NULL}
211223
};
212224
Option option;
213-
int ret;
225+
Elements elements = {0, 0, 1, NULL, NULL, options};
214226

215-
ret = parse_long(&ts, 1, options);
227+
ret = parse_long(&ts, &elements);
216228
option = options[0];
217229
assert(!ret);
218230
if (ret) return ret;

0 commit comments

Comments
 (0)