annotate lib/args.c @ 845:44ed476d5c87

Fix argument parsing so -- doesn't include itself in output.
author Rob Landley <rob@landley.net>
date Sat, 06 Apr 2013 19:57:54 -0500
parents edde4d30e98c
children 34ac05521d94
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
6164dcc7384d Fix typo.
Rob Landley <rob@landley.net>
parents: 705
diff changeset
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;
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
145 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
146 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
147
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 // 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
149 // 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
150 // "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
151
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
152 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
153 // 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
154 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
155
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
156 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
157 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
158 struct arg_list **list;
298
1bb9f53a7101 Assemble '*' repeated argument list in order. Also implement '@' counter.
Rob Landley <rob@landley.net>
parents: 294
diff changeset
159
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
160 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
161 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
162 *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
163 (*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
164 } 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
165 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
166 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
167 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
168 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
169
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
170 *(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
171 } 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
172 FLOAT *f = (FLOAT *)(opt->arg);
415
2cbbd4c5eaaa Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents: 393
diff changeset
173
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
174 *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
175 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
176 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
177 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
178 error_exit("-%c > %lf", opt->c, (double)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
179 } else if (type == '@') ++*(opt->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
180
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
181 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
182 }
32
993eab821bd5 More work on option parsing. "df -t tmpfs" actually seems to work now.
Rob Landley <rob@landley.net>
parents: 29
diff changeset
183
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
184 return 0;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
185 }
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
186
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
187 // 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
188 // 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
189 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
190 {
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
191 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
192 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
193 struct opts *new = 0;
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
194 int idx;
28
be59ed005902 Allocate a more sane amount of memory.
Rob Landley <rob@landley.net>
parents: 26
diff changeset
195
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
196 // 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
197 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
198 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
199 if (!options) return;
261
ae693c7bf2f7 Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents: 255
diff changeset
200
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
201 // 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
202 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
203 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
204 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
205 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
206 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
207 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
208 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
209 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
210 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
211
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
212 // 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
213
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
214 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
215 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
216 char *temp;
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
217
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
218 // 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
219 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
220
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
221 // 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
222 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
223 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
224 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
225 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
226 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
227 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
228 }
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 // 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
230 // 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
231 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
232 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
233 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
234
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
235 // 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
236 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
237 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
238
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
239 // 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
240 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
241 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
242 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
243 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
244 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
245 options = end;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
246
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
247 // Mark this struct opt as used, even when no short 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
248 if (!new->c) new->c = -1;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
249
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
250 // 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
251
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
252 } 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
253 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
254 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
255 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
256 } 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
257 // 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
258 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
259 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
260 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
261 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
262 } 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
263 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
264 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
265 } 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
266 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
267 }
261
ae693c7bf2f7 Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents: 255
diff changeset
268
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
269 // 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
270 // 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
271 // 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
272 // (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
273 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
274 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
275 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
276
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 // 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
278 } 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
279
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 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
281 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
282
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
283 // 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
284 // (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
285 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
286 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
287 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
288 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
289 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
290 *(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
291 }
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
292 }
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
293
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
294 // Parse trailing group indicators
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
295 while (*options) {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
296 unsigned bits = 0;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
297
770
1455c09e3f8a Fix option grouping.
Rob Landley <rob@landley.net>
parents: 709
diff changeset
298 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
299
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
300 idx = stridx("-|!+", *++options);
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
301 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
302
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
303 // 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
304 while (*(options++) != ']') {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
305 struct opts *opt, *opt2 = 0;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
306 int i;
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 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
309 // 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
310 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
311 if (*options == ']') {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
312 if (!opt) break;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
313 if (idx == 3) {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
314 opt2->dex[1] |= bits;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
315 break;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
316 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
317 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
318 } else {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
319 if (CFG_TOYBOX_DEBUG && !opt)
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
320 error_exit("[] unknown target %c", *options);
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
321 if (opt->c == *options) {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
322 bits |= 1<<i;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
323 if (!opt2) opt2=opt;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
324 break;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
325 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
326 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
327 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
328 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
329 }
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
330 }
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
331
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
332 // 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
333
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
334 void get_optflags(void)
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
335 {
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
336 struct getoptflagstate gof;
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
337 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
338 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
339 char *letters[]={"s",""};
393
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 // 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
342 // 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
343
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
344 if (CFG_HELP) toys.exithelp++;
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
345 // 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
346 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
347 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
348 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
349
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 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
351
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
352 // 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
353 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
354 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
355 catch = NULL;
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 // 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
358 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
359
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
360 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
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 // 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
363 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
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 // 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
366 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
367 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
368 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
369 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
370
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
371 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
372 // 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
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 gof.stopearly += 2;
845
44ed476d5c87 Fix argument parsing so -- doesn't include itself in output.
Rob Landley <rob@landley.net>
parents: 773
diff changeset
375 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
376 }
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 --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
378
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 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
380 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
381 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
382 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
383 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
384 }
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 // 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
386 gof.arg = "";
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
387 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
388 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
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 }
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
391
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
392 // 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
393 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
394 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
395 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
396 }
294
3de1ea4d6b56 Fix command line option parsing so "echo -xen" actually prints "-xen". Add
Rob Landley <rob@landley.net>
parents: 289
diff changeset
397
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
398 // Long option parsed, handle option.
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
399 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
400 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
401 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
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 // 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
404 } 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
405 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
406 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
407 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
408
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
409 // 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
410 // 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
411 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
412 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
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 // Identify next option char.
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
415 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
416 if (*gof.arg == catch->c)
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
417 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
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 // 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
420 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
421 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
422 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
423 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
424 }
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
425 }
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 continue;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
427
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
428 // 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
429 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
430 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
431 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
432 }
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
433
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
434 // 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
435 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
436 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
437 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
438 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
439 error_exit("Max %d argument%s", gof.maxargs, letters[!(gof.maxargs-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
440 if (CFG_HELP) toys.exithelp = 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
441
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 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
443 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
444 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
445 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
446 }