Mercurial > hg > toybox
annotate lib/args.c @ 931:011df43e35d5
Option type @ counts number of occurrences, it doesn't take an argument.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sat, 22 Jun 2013 15:36:25 -0500 |
parents | 5735c500f835 |
children | 6d3c39cb8a9d |
rev | line source |
---|---|
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
1 /* args.c - Command line argument parsing. |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2006 Rob Landley <rob@landley.net> |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 */ |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 #include "toys.h" |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 // Design goals: |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 // Don't use getopt() |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 // Don't permute original arguments. |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 // handle --long gracefully "(noshort)a(along)b(blong1)(blong2)" |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 // After each argument: |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 // Note that pointer and long are always the same size, even on 64 bit. |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 // : plus a string argument, keep most recent if more than one |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 // * plus a string argument, appended to a list |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
16 // # plus a signed long argument |
415
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
17 // <LOW - die if less than LOW |
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
18 // >HIGH - die if greater than HIGH |
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
19 // =DEFAULT - value if not specified |
504
a497beb97eee
Add "-" type to optargs and teach tail.c to use it. Tighten up help text, use xzalloc() and xputc() as appropriate.
Rob Landley <rob@landley.net>
parents:
499
diff
changeset
|
20 // - plus a signed long argument defaulting to negative |
415
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
21 // . plus a double precision floating point argument (with CFG_TOYBOX_FLOAT) |
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
22 // Chop this out with USE_TOYBOX_FLOAT() around option string |
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
23 // Same <LOW>HIGH=DEFAULT as # |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 // @ plus an occurrence counter (which is a long) |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
25 // (longopt) |
499
bc4615e2e339
Teach lib/args.c that " " this option must take a _separate_ argument, so "kill -stop" and "kill -s top" aren't the same thing. Make kill.c use it, and remove leftover debug printfs.
Rob Landley <rob@landley.net>
parents:
480
diff
changeset
|
26 // | this is required. If more than one marked, only one required. TODO |
306
523441f8ed01
Teach option parsing logic that ^ means stop parsing after this option.
Rob Landley <rob@landley.net>
parents:
304
diff
changeset
|
27 // ^ Stop parsing after encountering this argument |
499
bc4615e2e339
Teach lib/args.c that " " this option must take a _separate_ argument, so "kill -stop" and "kill -s top" aren't the same thing. Make kill.c use it, and remove leftover debug printfs.
Rob Landley <rob@landley.net>
parents:
480
diff
changeset
|
28 // " " (space char) the "plus an argument" must be separate |
bc4615e2e339
Teach lib/args.c that " " this option must take a _separate_ argument, so "kill -stop" and "kill -s top" aren't the same thing. Make kill.c use it, and remove leftover debug printfs.
Rob Landley <rob@landley.net>
parents:
480
diff
changeset
|
29 // I.E. "-j 3" not "-j3". So "kill -stop" != "kill -s top" |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
30 // |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 // at the beginning: |
304
93223118c813
Option parsing: stopearly is now a ^ prefix (not +), and an option string with
Rob Landley <rob@landley.net>
parents:
298
diff
changeset
|
32 // ^ stop at first nonoption argument |
540
c2f39708a4c4
Redo tail to use optargs and optionally support lseek. Add support to optargs and llist.c, plus add a test suite entry. Still no -f support though.
Rob Landley <rob@landley.net>
parents:
504
diff
changeset
|
33 // <0 die if less than # leftover arguments (default 0) |
415
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
34 // >9 die if > # leftover arguments (default MAX_INT) |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
35 // ? Allow unknown arguments (pass them through to command). |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 // & first argument has imaginary dash (ala tar/ps) |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 // If given twice, all arguments have imaginary dash |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
38 // |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
39 // At the end: [groups] of previously seen options |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
40 // - Only one in group (switch off) [-abc] means -ab=-b, -ba=-a, -abc=-c |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
41 // | Synonyms (switch on all) [|abc] means -ab=-abc, -c=-abc |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
42 // ! More than one in group is error [!abc] means -ab calls error_exit() |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
43 // + First in group switches rest on [+abc] means -a=-abc, -b=-b, -c=-c |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
44 // primarily useful if you can switch things back off again. |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
45 // |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 // Notes from getopt man page |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 // - and -- cannot be arguments. |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 // -- force end of arguments |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 // - is a synonym for stdin in file arguments |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 // -abc means -a -b -c |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
53 /* This uses a getopt-like option string, but not getopt() itself. We call |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
54 * it the get_opt string. |
156
1e8f4b05cb65
Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents:
144
diff
changeset
|
55 * |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
56 * Each option in the get_opt string corresponds to a bit position in the |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
57 * return value. The rightmost argument is (1<<0), the next to last is (1<<1) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
58 * and so on. If the option isn't seen in argv[], its bit remains 0. |
78
cd1f36a96185
Update args.c to implement numeric arguments.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
59 * |
cd1f36a96185
Update args.c to implement numeric arguments.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
60 * Options which have an argument fill in the corresponding slot in the global |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
61 * union "this" (see generated/globals.h), which it treats as an array of longs |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
62 * (note that sizeof(long)==sizeof(pointer) is guaranteed by LP64). |
78
cd1f36a96185
Update args.c to implement numeric arguments.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
63 * |
cd1f36a96185
Update args.c to implement numeric arguments.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
64 * You don't have to free the option strings, which point into the environment |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
65 * space. List objects should be freed by main() when command_main() returns. |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 * |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 * Example: |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
68 * Calling get_optflags() when toys.which->options="ab:c:d" and |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
69 * argv = ["command", "-b", "fruit", "-d", "walrus"] results in: |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
70 * |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
71 * Changes to struct toys: |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
72 * toys.optflags = 5 (-b=4 | -d=1) |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
73 * toys.optargs[0]="walrus" (leftover argument) |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
74 * toys.optargs[1]=NULL (end of list) |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
75 * toys.optc=1 (there was 1 leftover argument) |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
76 * |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
77 * Changes to union this: |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
78 * this[0]=NULL (because -c didn't get an argument this time) |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
79 * this[1]="fruit" (argument to -b) |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 */ |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
82 // Linked list of all known options (option string parsed into this). |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 struct opts { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
84 struct opts *next; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
85 long *arg; // Pointer into union "this" to store arguments at. |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
86 int c; // Argument character to match |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
87 int flags; // |=1, ^=2 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
88 unsigned dex[3]; // which bits to disable/enable/exclude in toys.optflags |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
89 char type; // Type of arguments to store union "this" |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
90 union { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
91 long l; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
92 FLOAT f; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
93 } val[3]; // low, high, default - range of allowed values |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 }; |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
96 struct longopts { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
97 struct longopts *next; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
98 struct opts *opt; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
99 char *str; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
100 int len; |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
101 }; |
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
102 |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
103 // State during argument parsing. |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
104 struct getoptflagstate |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
106 int argc, minargs, maxargs, nodash; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
107 char *arg; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
108 struct opts *opts; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
109 struct longopts *longopts; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
110 int noerror, nodash_now, stopearly; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
111 unsigned excludes; |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
112 }; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
114 // Use getoptflagstate to parse parse one command line option from argv |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
115 static int gotflag(struct getoptflagstate *gof, struct opts *opt) |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
117 int type; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
119 // Did we recognize this option? |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
120 if (!opt) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
121 if (gof->noerror) return 1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
122 error_exit("Unknown option %s", gof->arg); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
123 } |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
124 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
125 // Set flags |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
126 toys.optflags &= ~opt->dex[0]; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
127 toys.optflags |= opt->dex[1]; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
128 gof->excludes |= opt->dex[2]; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
129 if (opt->flags&2) gof->stopearly=2; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 |
709 | 131 if (toys.optflags & gof->excludes) { |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
132 struct opts *bad; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
133 unsigned i = 1; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
134 |
773
edde4d30e98c
Ashwini Sharma pointed out that my previous tweak to [!abc] groups still didn't get the error reporting right (test case "touch -d 12 -r f2 f1"). This says "no 'r' with 'd'" for that, and still shouldn't be able to fall off the end of the list (segfault) because an option can't conflict with itself (that's what the ~(1<<i) on lib/args.c line 317 is for).
Rob Landley <rob@landley.net>
parents:
770
diff
changeset
|
135 for (bad=gof->opts, i=1; ;bad = bad->next, i<<=1) { |
edde4d30e98c
Ashwini Sharma pointed out that my previous tweak to [!abc] groups still didn't get the error reporting right (test case "touch -d 12 -r f2 f1"). This says "no 'r' with 'd'" for that, and still shouldn't be able to fall off the end of the list (segfault) because an option can't conflict with itself (that's what the ~(1<<i) on lib/args.c line 317 is for).
Rob Landley <rob@landley.net>
parents:
770
diff
changeset
|
136 if (opt == bad || !(i & toys.optflags)) continue; |
edde4d30e98c
Ashwini Sharma pointed out that my previous tweak to [!abc] groups still didn't get the error reporting right (test case "touch -d 12 -r f2 f1"). This says "no 'r' with 'd'" for that, and still shouldn't be able to fall off the end of the list (segfault) because an option can't conflict with itself (that's what the ~(1<<i) on lib/args.c line 317 is for).
Rob Landley <rob@landley.net>
parents:
770
diff
changeset
|
137 if (toys.optflags & bad->dex[2]) break; |
edde4d30e98c
Ashwini Sharma pointed out that my previous tweak to [!abc] groups still didn't get the error reporting right (test case "touch -d 12 -r f2 f1"). This says "no 'r' with 'd'" for that, and still shouldn't be able to fall off the end of the list (segfault) because an option can't conflict with itself (that's what the ~(1<<i) on lib/args.c line 317 is for).
Rob Landley <rob@landley.net>
parents:
770
diff
changeset
|
138 } |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
139 error_exit("No '%c' with '%c'", opt->c, bad->c); |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
140 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
141 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
142 // Does this option take an argument? |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
143 gof->arg++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
144 type = opt->type; |
931
011df43e35d5
Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents:
891
diff
changeset
|
145 |
011df43e35d5
Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents:
891
diff
changeset
|
146 if (type == '@') ++*(opt->arg); |
011df43e35d5
Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents:
891
diff
changeset
|
147 else if (type) { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
148 char *arg = gof->arg; |
32
993eab821bd5
More work on option parsing. "df -t tmpfs" actually seems to work now.
Rob Landley <rob@landley.net>
parents:
29
diff
changeset
|
149 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
150 // Handle "-xblah" and "-x blah", but also a third case: "abxc blah" |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
151 // to make "tar xCjfv blah1 blah2 thingy" work like |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
152 // "tar -x -C blah1 -j -f blah2 -v thingy" |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
153 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
154 if (gof->nodash_now || !arg[0]) arg = toys.argv[++gof->argc]; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
155 // TODO: The following line doesn't display --longopt correctly |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
156 if (!arg) error_exit("Missing argument to -%c", opt->c); |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
158 if (type == ':') *(opt->arg) = (long)arg; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
159 else if (type == '*') { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
160 struct arg_list **list; |
298
1bb9f53a7101
Assemble '*' repeated argument list in order. Also implement '@' counter.
Rob Landley <rob@landley.net>
parents:
294
diff
changeset
|
161 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
162 list = (struct arg_list **)opt->arg; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
163 while (*list) list=&((*list)->next); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
164 *list = xzalloc(sizeof(struct arg_list)); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
165 (*list)->arg = arg; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
166 } else if (type == '#' || type == '-') { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
167 long l = atolx(arg); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
168 if (type == '-' && !ispunct(*arg)) l*=-1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
169 if (l < opt->val[0].l) error_exit("-%c < %ld", opt->c, opt->val[0].l); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
170 if (l > opt->val[1].l) error_exit("-%c > %ld", opt->c, opt->val[1].l); |
415
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
171 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
172 *(opt->arg) = l; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
173 } else if (CFG_TOYBOX_FLOAT && type == '.') { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
174 FLOAT *f = (FLOAT *)(opt->arg); |
415
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
175 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
176 *f = strtod(arg, &arg); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
177 if (opt->val[0].l != LONG_MIN && *f < opt->val[0].f) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
178 error_exit("-%c < %lf", opt->c, (double)opt->val[0].f); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
179 if (opt->val[1].l != LONG_MAX && *f > opt->val[1].f) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
180 error_exit("-%c > %lf", opt->c, (double)opt->val[1].f); |
931
011df43e35d5
Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents:
891
diff
changeset
|
181 } |
29
5566beb17d5a
Fix a half-dozen bugs in argument parsing. More seems to work than not now.
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
182 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
183 if (!gof->nodash_now) gof->arg = ""; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
184 } |
32
993eab821bd5
More work on option parsing. "df -t tmpfs" actually seems to work now.
Rob Landley <rob@landley.net>
parents:
29
diff
changeset
|
185 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
186 return 0; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 } |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
189 // Parse this command's options string into struct getoptflagstate, which |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
190 // includes a struct opts linked list in reverse order (I.E. right-to-left) |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
191 void parse_optflaglist(struct getoptflagstate *gof) |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
193 char *options = toys.which->options; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
194 long *nextarg = (long *)&this; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
195 struct opts *new = 0; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
196 int idx; |
28
be59ed005902
Allocate a more sane amount of memory.
Rob Landley <rob@landley.net>
parents:
26
diff
changeset
|
197 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
198 // Parse option format string |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
199 memset(gof, 0, sizeof(struct getoptflagstate)); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
200 gof->maxargs = INT_MAX; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
201 if (!options) return; |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
202 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
203 // Parse leading special behavior indicators |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
204 for (;;) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
205 if (*options == '^') gof->stopearly++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
206 else if (*options == '<') gof->minargs=*(++options)-'0'; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
207 else if (*options == '>') gof->maxargs=*(++options)-'0'; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
208 else if (*options == '?') gof->noerror++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
209 else if (*options == '&') gof->nodash++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
210 else break; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
211 options++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
212 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
214 // Parse option string into a linked list of options with attributes. |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
216 if (!*options) gof->stopearly++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
217 while (*options) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
218 char *temp; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
219 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
220 // Option groups come after all options are defined |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
221 if (*options == '[') break; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
223 // Allocate a new list entry when necessary |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
224 if (!new) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
225 new = xzalloc(sizeof(struct opts)); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
226 new->next = gof->opts; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
227 gof->opts = new; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
228 new->val[0].l = LONG_MIN; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
229 new->val[1].l = LONG_MAX; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
230 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
231 // Each option must start with "(" or an option character. (Bare |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
232 // longopts only come at the start of the string.) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
233 if (*options == '(') { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
234 char *end; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
235 struct longopts *lo = xmalloc(sizeof(struct longopts)); |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
236 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
237 // Find the end of the longopt |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
238 for (end = ++options; *end && *end != ')'; end++); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
239 if (CFG_TOYBOX_DEBUG && !*end) error_exit("(longopt) didn't end"); |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
241 // init a new struct longopts |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
242 lo->next = gof->longopts; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
243 lo->opt = new; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
244 lo->str = options; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
245 lo->len = end-options; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
246 gof->longopts = lo; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
247 options = end; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
249 // Mark this struct opt as used, even when no short opt. |
891
5735c500f835
Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents:
858
diff
changeset
|
250 if (!new->c) { |
5735c500f835
Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents:
858
diff
changeset
|
251 new->c = -1; |
5735c500f835
Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents:
858
diff
changeset
|
252 new = 0; |
5735c500f835
Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents:
858
diff
changeset
|
253 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
255 // If this is the start of a new option that wasn't a longopt, |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
257 } else if (strchr(":*#@.-", *options)) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
258 if (CFG_TOYBOX_DEBUG && new->type) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
259 error_exit("multiple types %c:%c%c", new->c, new->type, *options); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
260 new->type = *options; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
261 } else if (-1 != (idx = stridx("|^ ", *options))) new->flags |= 1<<idx; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
262 // bounds checking |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
263 else if (-1 != (idx = stridx("<>=", *options))) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
264 if (new->type == '#') { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
265 long l = strtol(++options, &temp, 10); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
266 if (temp != options) new->val[idx].l = l; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
267 } else if (CFG_TOYBOX_FLOAT && new->type == '.') { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
268 FLOAT f = strtod(++options, &temp); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
269 if (temp != options) new->val[idx].f = f; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
270 } else if (CFG_TOYBOX_DEBUG) error_exit("<>= only after .#"); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
271 options = --temp; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
272 } |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
273 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
274 // At this point, we've hit the end of the previous option. The |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
275 // current character is the start of a new option. If we've already |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
276 // assigned an option to this struct, loop to allocate a new one. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
277 // (It'll get back here afterwards and fall through to next else.) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
278 else if (new->c) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
279 new = NULL; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
280 continue; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
281 |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
282 // Claim this option, loop to see what's after it. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
283 } else new->c = *options; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
284 |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
285 options++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
286 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
288 // Initialize enable/disable/exclude masks and pointers to store arguments. |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
289 // (This goes right to left so we need the whole list before we can start.) |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
290 idx = 0; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
291 for (new = gof->opts; new; new = new->next) { |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
292 new->dex[1] = 1<<idx++; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
293 if (new->type) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
294 new->arg = (void *)nextarg; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
295 *(nextarg++) = new->val[2].l; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
296 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
297 } |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
298 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
299 // Parse trailing group indicators |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
300 while (*options) { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
301 unsigned bits = 0; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
302 |
770 | 303 if (CFG_TOYBOX_DEBUG && *options != '[') error_exit("trailing %s", options); |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
304 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
305 idx = stridx("-|!+", *++options); |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
306 if (CFG_TOYBOX_DEBUG && idx == -1) error_exit("[ needs +-!"); |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
307 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
308 // Don't advance past ] but do process it once in loop. |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
309 while (*(options++) != ']') { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
310 struct opts *opt, *opt2 = 0; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
311 int i; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
312 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
313 if (CFG_TOYBOX_DEBUG && !*options) error_exit("[ without ]"); |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
314 // Find this option flag (in previously parsed struct opt) |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
315 for (i=0, opt = gof->opts; ; i++, opt = opt->next) { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
316 if (*options == ']') { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
317 if (!opt) break; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
318 if (idx == 3) { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
319 opt2->dex[1] |= bits; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
320 break; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
321 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
322 if (bits&(1<<i)) opt->dex[idx] |= bits&~(1<<i); |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
323 } else { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
324 if (CFG_TOYBOX_DEBUG && !opt) |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
325 error_exit("[] unknown target %c", *options); |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
326 if (opt->c == *options) { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
327 bits |= 1<<i; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
328 if (!opt2) opt2=opt; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
329 break; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
330 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
331 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
332 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
333 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
334 } |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
335 } |
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
336 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
337 // Fill out toys.optflags, toys.optargs, and this[] from toys.argv |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
338 |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
339 void get_optflags(void) |
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
340 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
341 struct getoptflagstate gof; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
342 struct opts *catch; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
343 long saveflags; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
344 char *letters[]={"s",""}; |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
345 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
346 // Option parsing is a two stage process: parse the option string into |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
347 // a struct opts list, then use that list to process argv[]; |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
348 |
858
34ac05521d94
Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
Rob Landley <rob@landley.net>
parents:
845
diff
changeset
|
349 toys.exithelp++; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
350 // Allocate memory for optargs |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
351 saveflags = 0; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
352 while (toys.argv[saveflags++]); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
353 toys.optargs = xzalloc(sizeof(char *)*saveflags); |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
355 parse_optflaglist(&gof); |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
357 // Iterate through command line arguments, skipping argv[0] |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
358 for (gof.argc=1; toys.argv[gof.argc]; gof.argc++) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
359 gof.arg = toys.argv[gof.argc]; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
360 catch = NULL; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
362 // Parse this argument |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
363 if (gof.stopearly>1) goto notflag; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
365 gof.nodash_now = 0; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
367 // Various things with dashes |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
368 if (*gof.arg == '-') { |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
370 // Handle - |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
371 if (!gof.arg[1]) goto notflag; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
372 gof.arg++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
373 if (*gof.arg=='-') { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
374 struct longopts *lo; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
376 gof.arg++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
377 // Handle -- |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
378 if (!*gof.arg) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
379 gof.stopearly += 2; |
845
44ed476d5c87
Fix argument parsing so -- doesn't include itself in output.
Rob Landley <rob@landley.net>
parents:
773
diff
changeset
|
380 continue; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
381 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
382 // Handle --longopt |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
383 |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
384 for (lo = gof.longopts; lo; lo = lo->next) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
385 if (!strncmp(gof.arg, lo->str, lo->len)) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
386 if (gof.arg[lo->len]) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
387 if (gof.arg[lo->len]=='=' && lo->opt->type) gof.arg += lo->len; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
388 else continue; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
389 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
390 // It's a match. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
391 gof.arg = ""; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
392 catch = lo->opt; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
393 break; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
394 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
395 } |
29
5566beb17d5a
Fix a half-dozen bugs in argument parsing. More seems to work than not now.
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
396 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
397 // Should we handle this --longopt as a non-option argument? |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
398 if (!lo && gof.noerror) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
399 gof.arg-=2; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
400 goto notflag; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
401 } |
294
3de1ea4d6b56
Fix command line option parsing so "echo -xen" actually prints "-xen". Add
Rob Landley <rob@landley.net>
parents:
289
diff
changeset
|
402 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
403 // Long option parsed, handle option. |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
404 gotflag(&gof, catch); |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
405 continue; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
406 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
408 // Handle things that don't start with a dash. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
409 } else { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
410 if (gof.nodash && (gof.nodash>1 || gof.argc == 1)) gof.nodash_now = 1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
411 else goto notflag; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
412 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
414 // At this point, we have the args part of -args. Loop through |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
415 // each entry (could be -abc meaning -a -b -c) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
416 saveflags = toys.optflags; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
417 while (*gof.arg) { |
29
5566beb17d5a
Fix a half-dozen bugs in argument parsing. More seems to work than not now.
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
418 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
419 // Identify next option char. |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
420 for (catch = gof.opts; catch; catch = catch->next) |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
421 if (*gof.arg == catch->c) |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
422 if (!((catch->flags&4) && gof.arg[1])) break; |
29
5566beb17d5a
Fix a half-dozen bugs in argument parsing. More seems to work than not now.
Rob Landley <rob@landley.net>
parents:
28
diff
changeset
|
423 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
424 // Handle option char (advancing past what was used) |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
425 if (gotflag(&gof, catch) ) { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
426 toys.optflags = saveflags; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
427 gof.arg = toys.argv[gof.argc]; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
428 goto notflag; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
429 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
430 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
431 continue; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
433 // Not a flag, save value in toys.optargs[] |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
434 notflag: |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
435 if (gof.stopearly) gof.stopearly++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
436 toys.optargs[toys.optc++] = toys.argv[gof.argc]; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
437 } |
624
1e8b9acdafeb
Genericize llist code a bit: rename llist_free() to llist_traverse(), and no longer accept NULL as a synonym for free.
Rob Landley <rob@landley.net>
parents:
540
diff
changeset
|
438 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
439 // Sanity check |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
440 if (toys.optc<gof.minargs) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
441 error_exit("Need%s %d argument%s", letters[!!(gof.minargs-1)], |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
442 gof.minargs, letters[!(gof.minargs-1)]); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
443 if (toys.optc>gof.maxargs) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
444 error_exit("Max %d argument%s", gof.maxargs, letters[!(gof.maxargs-1)]); |
858
34ac05521d94
Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
Rob Landley <rob@landley.net>
parents:
845
diff
changeset
|
445 toys.exithelp = 0; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
446 |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
447 if (CFG_TOYBOX_FREE) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
448 llist_traverse(gof.opts, free); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
449 llist_traverse(gof.longopts, free); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
450 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
451 } |