annotate lib/args.c @ 983:c38c25282b88

Cleanup grep: help text, whitespace, add parentheses.
author Rob Landley <rob@landley.net>
date Thu, 01 Aug 2013 17:21:38 -0500
parents 6d3c39cb8a9d
children a25239480e7a
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;
978
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
111 unsigned excludes, requires;
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;
931
011df43e35d5 Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents: 891
diff changeset
145
011df43e35d5 Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents: 891
diff changeset
146 if (type == '@') ++*(opt->arg);
011df43e35d5 Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents: 891
diff changeset
147 else if (type) {
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
148 char *arg = gof->arg;
32
993eab821bd5 More work on option parsing. "df -t tmpfs" actually seems to work now.
Rob Landley <rob@landley.net>
parents: 29
diff changeset
149
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
150 // Handle "-xblah" and "-x blah", but also a third case: "abxc blah"
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
151 // to make "tar xCjfv blah1 blah2 thingy" work like
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
152 // "tar -x -C blah1 -j -f blah2 -v thingy"
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
153
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
154 if (gof->nodash_now || !arg[0]) arg = toys.argv[++gof->argc];
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
155 // TODO: The following line doesn't display --longopt correctly
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
156 if (!arg) error_exit("Missing argument to -%c", opt->c);
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
157
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
158 if (type == ':') *(opt->arg) = (long)arg;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
159 else if (type == '*') {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
160 struct arg_list **list;
298
1bb9f53a7101 Assemble '*' repeated argument list in order. Also implement '@' counter.
Rob Landley <rob@landley.net>
parents: 294
diff changeset
161
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
162 list = (struct arg_list **)opt->arg;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
163 while (*list) list=&((*list)->next);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
164 *list = xzalloc(sizeof(struct arg_list));
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
165 (*list)->arg = arg;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
166 } else if (type == '#' || type == '-') {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
167 long l = atolx(arg);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
168 if (type == '-' && !ispunct(*arg)) l*=-1;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
169 if (l < opt->val[0].l) error_exit("-%c < %ld", opt->c, opt->val[0].l);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
170 if (l > opt->val[1].l) error_exit("-%c > %ld", opt->c, opt->val[1].l);
415
2cbbd4c5eaaa Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents: 393
diff changeset
171
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
172 *(opt->arg) = l;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
173 } else if (CFG_TOYBOX_FLOAT && type == '.') {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
174 FLOAT *f = (FLOAT *)(opt->arg);
415
2cbbd4c5eaaa Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents: 393
diff changeset
175
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
176 *f = strtod(arg, &arg);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
177 if (opt->val[0].l != LONG_MIN && *f < opt->val[0].f)
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
178 error_exit("-%c < %lf", opt->c, (double)opt->val[0].f);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
179 if (opt->val[1].l != LONG_MAX && *f > opt->val[1].f)
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
180 error_exit("-%c > %lf", opt->c, (double)opt->val[1].f);
931
011df43e35d5 Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents: 891
diff changeset
181 }
29
5566beb17d5a Fix a half-dozen bugs in argument parsing. More seems to work than not now.
Rob Landley <rob@landley.net>
parents: 28
diff changeset
182
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
183 if (!gof->nodash_now) gof->arg = "";
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
184 }
32
993eab821bd5 More work on option parsing. "df -t tmpfs" actually seems to work now.
Rob Landley <rob@landley.net>
parents: 29
diff changeset
185
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
186 return 0;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
187 }
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
188
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
189 // Parse this command's options string into struct getoptflagstate, which
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
190 // includes a struct opts linked list in reverse order (I.E. right-to-left)
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
191 void parse_optflaglist(struct getoptflagstate *gof)
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
192 {
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
193 char *options = toys.which->options;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
194 long *nextarg = (long *)&this;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
195 struct opts *new = 0;
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
196 int idx;
28
be59ed005902 Allocate a more sane amount of memory.
Rob Landley <rob@landley.net>
parents: 26
diff changeset
197
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
198 // Parse option format string
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
199 memset(gof, 0, sizeof(struct getoptflagstate));
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
200 gof->maxargs = INT_MAX;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
201 if (!options) return;
261
ae693c7bf2f7 Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents: 255
diff changeset
202
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
203 // Parse leading special behavior indicators
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
204 for (;;) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
205 if (*options == '^') gof->stopearly++;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
206 else if (*options == '<') gof->minargs=*(++options)-'0';
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
207 else if (*options == '>') gof->maxargs=*(++options)-'0';
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
208 else if (*options == '?') gof->noerror++;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
209 else if (*options == '&') gof->nodash++;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
210 else break;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
211 options++;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
212 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
213
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
214 // Parse option string into a linked list of options with attributes.
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
215
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
216 if (!*options) gof->stopearly++;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
217 while (*options) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
218 char *temp;
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
219
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
220 // Option groups come after all options are defined
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
221 if (*options == '[') break;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
222
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
223 // Allocate a new list entry when necessary
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
224 if (!new) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
225 new = xzalloc(sizeof(struct opts));
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
226 new->next = gof->opts;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
227 gof->opts = new;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
228 new->val[0].l = LONG_MIN;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
229 new->val[1].l = LONG_MAX;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
230 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
231 // Each option must start with "(" or an option character. (Bare
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
232 // longopts only come at the start of the string.)
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
233 if (*options == '(') {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
234 char *end;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
235 struct longopts *lo = xmalloc(sizeof(struct longopts));
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
236
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
237 // Find the end of the longopt
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
238 for (end = ++options; *end && *end != ')'; end++);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
239 if (CFG_TOYBOX_DEBUG && !*end) error_exit("(longopt) didn't end");
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
240
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
241 // init a new struct longopts
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
242 lo->next = gof->longopts;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
243 lo->opt = new;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
244 lo->str = options;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
245 lo->len = end-options;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
246 gof->longopts = lo;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
247 options = end;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
248
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
249 // Mark this struct opt as used, even when no short opt.
891
5735c500f835 Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents: 858
diff changeset
250 if (!new->c) {
5735c500f835 Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents: 858
diff changeset
251 new->c = -1;
5735c500f835 Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents: 858
diff changeset
252 new = 0;
5735c500f835 Fix bare longopts to set unique optflag bits.
Rob Landley <rob@landley.net>
parents: 858
diff changeset
253 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
254
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
255 // If this is the start of a new option that wasn't a longopt,
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
256
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
257 } else if (strchr(":*#@.-", *options)) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
258 if (CFG_TOYBOX_DEBUG && new->type)
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
259 error_exit("multiple types %c:%c%c", new->c, new->type, *options);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
260 new->type = *options;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
261 } else if (-1 != (idx = stridx("|^ ", *options))) new->flags |= 1<<idx;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
262 // bounds checking
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
263 else if (-1 != (idx = stridx("<>=", *options))) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
264 if (new->type == '#') {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
265 long l = strtol(++options, &temp, 10);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
266 if (temp != options) new->val[idx].l = l;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
267 } else if (CFG_TOYBOX_FLOAT && new->type == '.') {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
268 FLOAT f = strtod(++options, &temp);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
269 if (temp != options) new->val[idx].f = f;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
270 } else if (CFG_TOYBOX_DEBUG) error_exit("<>= only after .#");
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
271 options = --temp;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
272 }
261
ae693c7bf2f7 Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents: 255
diff changeset
273
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
274 // At this point, we've hit the end of the previous option. The
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
275 // current character is the start of a new option. If we've already
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
276 // assigned an option to this struct, loop to allocate a new one.
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
277 // (It'll get back here afterwards and fall through to next else.)
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
278 else if (new->c) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
279 new = NULL;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
280 continue;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
281
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
282 // Claim this option, loop to see what's after it.
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
283 } else new->c = *options;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
284
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
285 options++;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
286 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
287
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
288 // Initialize enable/disable/exclude masks and pointers to store arguments.
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
289 // (This goes right to left so we need the whole list before we can start.)
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
290 idx = 0;
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
291 for (new = gof->opts; new; new = new->next) {
978
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
292 unsigned u = 1<<idx++;
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
293
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
294 new->dex[1] = u;
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
295 if (new->flags & 1) gof->requires |= u;
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
296 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
297 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
298 *(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
299 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
300 }
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
301
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
302 // Parse trailing group indicators
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
303 while (*options) {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
304 unsigned bits = 0;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
305
770
1455c09e3f8a Fix option grouping.
Rob Landley <rob@landley.net>
parents: 709
diff changeset
306 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
307
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
308 idx = stridx("-|!+", *++options);
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
309 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
310
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
311 // 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
312 while (*(options++) != ']') {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
313 struct opts *opt, *opt2 = 0;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
314 int i;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
315
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
316 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
317 // 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
318 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
319 if (*options == ']') {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
320 if (!opt) break;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
321 if (idx == 3) {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
322 opt2->dex[1] |= bits;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
323 break;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
324 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
325 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
326 } else {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
327 if (CFG_TOYBOX_DEBUG && !opt)
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
328 error_exit("[] unknown target %c", *options);
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
329 if (opt->c == *options) {
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
330 bits |= 1<<i;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
331 if (!opt2) opt2=opt;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
332 break;
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
333 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
334 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
335 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
336 }
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
337 }
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
338 }
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
339
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
340 // 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
341
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
342 void get_optflags(void)
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 struct getoptflagstate gof;
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
345 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
346 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
347 char *letters[]={"s",""};
393
bfc208c5ac79 Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents: 392
diff changeset
348
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
349 // 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
350 // 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
351
858
34ac05521d94 Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
Rob Landley <rob@landley.net>
parents: 845
diff changeset
352 toys.exithelp++;
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
353 // 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
354 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
355 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
356 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
357
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
358 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
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 // 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
361 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
362 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
363 catch = NULL;
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 // 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
366 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
367
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
368 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
369
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
370 // 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
371 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
372
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
373 // 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
374 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
375 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
376 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
377 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
378
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
379 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
380 // 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
381 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
382 gof.stopearly += 2;
845
44ed476d5c87 Fix argument parsing so -- doesn't include itself in output.
Rob Landley <rob@landley.net>
parents: 773
diff changeset
383 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
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 // 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
386
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
387 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
388 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
389 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
390 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
391 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
392 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 // 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
394 gof.arg = "";
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
395 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
396 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
397 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 }
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
399
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 // 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
401 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
402 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
403 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
404 }
294
3de1ea4d6b56 Fix command line option parsing so "echo -xen" actually prints "-xen". Add
Rob Landley <rob@landley.net>
parents: 289
diff changeset
405
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
406 // Long option parsed, handle option.
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
407 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
408 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
409 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
410
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
411 // 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
412 } 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
413 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
414 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
415 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
416
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
417 // 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
418 // 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
419 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
420 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
421
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
422 // Identify next option char.
705
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
423 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
424 if (*gof.arg == catch->c)
3e81cd0bad4b Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
425 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
426
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
427 // 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
428 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
429 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
430 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
431 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
432 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
433 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 continue;
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
435
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
436 // 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
437 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
438 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
439 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
440 }
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
441
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
442 // 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
443 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
444 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
445 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
446 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
447 error_exit("Max %d argument%s", gof.maxargs, letters[!(gof.maxargs-1)]);
978
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
448 if (gof.requires && !(gof.requires & toys.optflags)) {
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
449 struct opts *req;
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
450 char needs[32], *s = needs;
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
451
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
452 for (req = gof.opts; req; req = req->next)
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
453 if (req->flags & 1) *(s++) = req->c;
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
454 *s = 0;
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
455
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
456 error_exit("Needs %s-%s", s[1] ? "one of " : "", needs);
6d3c39cb8a9d Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents: 931
diff changeset
457 }
858
34ac05521d94 Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
Rob Landley <rob@landley.net>
parents: 845
diff changeset
458 toys.exithelp = 0;
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
459
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
460 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
461 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
462 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
463 }
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
464 }