Mercurial > hg > toybox
annotate lib/args.c @ 1776:7bf68329eb3b draft default tip
Repository switched to git at https://github.com/landley/toybox
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 09 Apr 2015 02:28:32 -0500 |
parents | 10922d83392a |
children |
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: |
1071
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
9 // Don't use getopt() out of libc. |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
10 // Don't permute original arguments (screwing up ps/top output). |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
11 // Integrated --long options "(noshort)a(along)b(blong1)(blong2)" |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 |
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
|
13 /* 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
|
14 * 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
|
15 * |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
16 * 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
|
17 * 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
|
18 * 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
|
19 * |
cd1f36a96185
Update args.c to implement numeric arguments.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
20 * 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
|
21 * 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
|
22 * (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
|
23 * |
cd1f36a96185
Update args.c to implement numeric arguments.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
24 * 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
|
25 * 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
|
26 * |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 * Example: |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
28 * 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
|
29 * 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
|
30 * |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
31 * Changes to struct toys: |
1071
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
32 * toys.optflags = 5 (I.E. 0101 so -b = 4 | -d = 1) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
33 * toys.optargs[0] = "walrus" (leftover argument) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
34 * toys.optargs[1] = NULL (end of list) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
35 * toys.optc = 1 (there was 1 leftover argument) |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
36 * |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
37 * Changes to union this: |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
38 * 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
|
39 * 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
|
40 */ |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 |
1071
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
42 // Enabling TOYBOX_DEBUG in .config adds syntax checks to option string parsing |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
43 // which aren't needed in the final code (your option string is hardwired and |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
44 // should be correct when you ship), but are useful for development. |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
45 |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
46 // What you can put in a get_opt string: |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
47 // Any otherwise unused character (all letters, unprefixed numbers) specify |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
48 // an option that sets a flag. The bit value is the same as the binary digit |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
49 // if you string the option characters together in order. |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
50 // So in "abcdefgh" a = 128, h = 1 |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
51 // |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
52 // Suffixes specify that this option takes an argument (stored in GLOBALS): |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
53 // Note that pointer and long are always the same size, even on 64 bit. |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
54 // : plus a string argument, keep most recent if more than one |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
55 // * plus a string argument, appended to a list |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
56 // # plus a signed long argument |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
57 // <LOW - die if less than LOW |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
58 // >HIGH - die if greater than HIGH |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
59 // =DEFAULT - value if not specified |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
60 // - plus a signed long argument defaulting to negative (say + for positive) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
61 // . plus a double precision floating point argument (with CFG_TOYBOX_FLOAT) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
62 // Chop this option out with USE_TOYBOX_FLOAT() in option string |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
63 // Same <LOW>HIGH=DEFAULT as # |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
64 // @ plus an occurrence counter (which is a long) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
65 // (longopt) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
66 // | this is required. If more than one marked, only one required. |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
67 // ; long option's argument is optional (can only be supplied with --opt=) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
68 // ^ Stop parsing after encountering this argument |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
69 // " " (space char) the "plus an argument" must be separate |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
70 // I.E. "-j 3" not "-j3". So "kill -stop" != "kill -s top" |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
71 // |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
72 // At the beginning of the get_opt string (before any options): |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
73 // ^ stop at first nonoption argument |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
74 // <0 die if less than # leftover arguments (default 0) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
75 // >9 die if > # leftover arguments (default MAX_INT) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
76 // ? Allow unknown arguments (pass them through to command). |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
77 // & first argument has imaginary dash (ala tar/ps) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
78 // If given twice, all arguments have imaginary dash |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
79 // |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
80 // At the end: [groups] of previously seen options |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
81 // - Only one in group (switch off) [-abc] means -ab=-b, -ba=-a, -abc=-c |
1072
7a45b9b54d3d
Tweak args (yank old + that never worked, rename | to +), and add uname -o as a synonym for -s.
Rob Landley <rob@landley.net>
parents:
1071
diff
changeset
|
82 // + Synonyms (switch on all) [+abc] means -ab=-abc, -c=-abc |
1071
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
83 // ! More than one in group is error [!abc] means -ab calls error_exit() |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
84 // primarily useful if you can switch things back off again. |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
85 |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
86 // Notes from getopt man page |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
87 // - and -- cannot be arguments. |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
88 // -- force end of arguments |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
89 // - is a synonym for stdin in file arguments |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
90 // -abcd means -a -b -c -d (but if -b takes an argument, then it's -a -b cd) |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
91 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
92 // Linked list of all known options (option string parsed into this). |
1071
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
93 // Hangs off getoptflagstate, freed at end of option parsing. |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 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
|
95 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
|
96 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
|
97 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
|
98 int flags; // |=1, ^=2 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
99 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 } 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
|
105 }; |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 |
1071
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
107 // linked list of long options. (Hangs off getoptflagstate, free at end of |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
108 // option parsing, details about flag to set and global slot to fill out |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
109 // stored in related short option struct, but if opt->c = -1 the long option |
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
110 // is "bare" (has no corresponding short option). |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
111 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
|
112 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
|
113 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
|
114 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
|
115 int len; |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
116 }; |
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
117 |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
118 // State during argument parsing. |
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
119 struct getoptflagstate |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 { |
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
|
121 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
|
122 char *arg; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
123 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
|
124 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
|
125 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
|
126 unsigned excludes, requires; |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
127 }; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
129 // 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
|
130 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
|
131 { |
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
|
132 int type; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 |
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
|
134 // 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
|
135 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
|
136 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
|
137 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
|
138 } |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
139 |
1437
1d79c0c23f69
Fix bug reported by Ashwini Sharma: [-abc] syntax to switch off a command forget
Rob Landley <rob@landley.net>
parents:
1072
diff
changeset
|
140 // Might enabling this switch off something else? |
1054
0d8a664f9941
Make [-abc] exclude logic clear argument slots when disabling options.
Rob Landley <rob@landley.net>
parents:
1036
diff
changeset
|
141 if (toys.optflags & opt->dex[0]) { |
0d8a664f9941
Make [-abc] exclude logic clear argument slots when disabling options.
Rob Landley <rob@landley.net>
parents:
1036
diff
changeset
|
142 struct opts *clr; |
0d8a664f9941
Make [-abc] exclude logic clear argument slots when disabling options.
Rob Landley <rob@landley.net>
parents:
1036
diff
changeset
|
143 unsigned i = 1; |
0d8a664f9941
Make [-abc] exclude logic clear argument slots when disabling options.
Rob Landley <rob@landley.net>
parents:
1036
diff
changeset
|
144 |
1437
1d79c0c23f69
Fix bug reported by Ashwini Sharma: [-abc] syntax to switch off a command forget
Rob Landley <rob@landley.net>
parents:
1072
diff
changeset
|
145 // Forget saved argument for flag we switch back off |
1058
de0ecfb36b7c
Fix [-group] argument dropping.
Rob Landley <rob@landley.net>
parents:
1054
diff
changeset
|
146 for (clr=gof->opts, i=1; clr; clr = clr->next, i<<=1) |
1437
1d79c0c23f69
Fix bug reported by Ashwini Sharma: [-abc] syntax to switch off a command forget
Rob Landley <rob@landley.net>
parents:
1072
diff
changeset
|
147 if (clr->arg && (i & toys.optflags & opt->dex[0])) *clr->arg = 0; |
1054
0d8a664f9941
Make [-abc] exclude logic clear argument slots when disabling options.
Rob Landley <rob@landley.net>
parents:
1036
diff
changeset
|
148 toys.optflags &= ~opt->dex[0]; |
0d8a664f9941
Make [-abc] exclude logic clear argument slots when disabling options.
Rob Landley <rob@landley.net>
parents:
1036
diff
changeset
|
149 } |
1437
1d79c0c23f69
Fix bug reported by Ashwini Sharma: [-abc] syntax to switch off a command forget
Rob Landley <rob@landley.net>
parents:
1072
diff
changeset
|
150 |
1d79c0c23f69
Fix bug reported by Ashwini Sharma: [-abc] syntax to switch off a command forget
Rob Landley <rob@landley.net>
parents:
1072
diff
changeset
|
151 // Set flags |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
152 toys.optflags |= opt->dex[1]; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
153 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
|
154 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
|
155 |
709 | 156 if (toys.optflags & gof->excludes) { |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
157 struct opts *bad; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
158 unsigned i = 1; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
159 |
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
|
160 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
|
161 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
|
162 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
|
163 } |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
164 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
|
165 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
166 |
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
|
167 // Does this option take an argument? |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
168 if (!gof->arg) { |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
169 if (opt->flags & 8) return 0; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
170 gof->arg = ""; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
171 } else gof->arg++; |
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 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
|
173 |
011df43e35d5
Option type @ counts number of occurrences, it doesn't take an argument.
Rob Landley <rob@landley.net>
parents:
891
diff
changeset
|
174 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
|
175 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
|
176 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
|
177 |
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
|
178 // 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
|
179 // 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
|
180 // "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
|
181 |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
182 if (gof->nodash_now || (!arg[0] && !(opt->flags & 8))) |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
183 arg = toys.argv[++gof->argc]; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
184 if (!arg) { |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
185 char *s = "Missing argument to "; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
186 struct longopts *lo; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
187 |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
188 if (opt->c != -1) error_exit("%s-%c", s, opt->c); |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
189 |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
190 for (lo = gof->longopts; lo->opt != opt; lo = lo->next); |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
191 error_exit("%s--%.*s", s, lo->len, lo->str); |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
192 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 |
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
|
194 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
|
195 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
|
196 struct arg_list **list; |
298
1bb9f53a7101
Assemble '*' repeated argument list in order. Also implement '@' counter.
Rob Landley <rob@landley.net>
parents:
294
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 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
|
199 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
|
200 *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
|
201 (*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
|
202 } 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
|
203 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
|
204 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
|
205 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
|
206 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
|
207 |
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
|
208 *(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
|
209 } 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
|
210 FLOAT *f = (FLOAT *)(opt->arg); |
415
2cbbd4c5eaaa
Add <>= to lib/args.c, with documentation.
Rob Landley <rob@landley.net>
parents:
393
diff
changeset
|
211 |
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
|
212 *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
|
213 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
|
214 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
|
215 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
|
216 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
|
217 } |
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
|
218 |
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
|
219 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
|
220 } |
32
993eab821bd5
More work on option parsing. "df -t tmpfs" actually seems to work now.
Rob Landley <rob@landley.net>
parents:
29
diff
changeset
|
221 |
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
|
222 return 0; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 } |
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
225 // 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
|
226 // 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
|
227 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
|
228 { |
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
|
229 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
|
230 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
|
231 struct opts *new = 0; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
232 int idx; |
28
be59ed005902
Allocate a more sane amount of memory.
Rob Landley <rob@landley.net>
parents:
26
diff
changeset
|
233 |
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
|
234 // 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
|
235 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
|
236 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
|
237 if (!options) return; |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
238 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
239 // 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
|
240 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
|
241 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
|
242 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
|
243 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
250 // 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
|
251 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
252 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
|
253 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
|
254 char *temp; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
255 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
256 // 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
|
257 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
|
258 |
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
|
259 // 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 // 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
|
268 // longopts only come at the start of the string.) |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
269 if (*options == '(' && new->c != -1) { |
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
|
270 char *end; |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
271 struct longopts *lo; |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
272 |
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
|
273 // 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
|
274 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
|
275 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
|
276 |
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
|
277 // init a new struct longopts |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
278 lo = xmalloc(sizeof(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
|
279 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
|
280 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
|
281 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
|
282 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
|
283 gof->longopts = lo; |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
284 options = ++end; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
286 // Mark this struct opt as used, even when no short opt. |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
287 if (!new->c) new->c = -1; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
288 |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
289 continue; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 |
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 // 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
|
292 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
293 } 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
|
294 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
|
295 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
|
296 new->type = *options; |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
297 } else if (-1 != (idx = stridx("|^ ;", *options))) new->flags |= 1<<idx; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
298 // 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
|
299 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
|
300 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
|
301 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
|
302 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
|
303 } 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
|
304 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
|
305 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
|
306 } 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
|
307 options = --temp; |
261
ae693c7bf2f7
Add enable/disable/exclude logic, update docs.
Rob Landley <rob@landley.net>
parents:
255
diff
changeset
|
308 |
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
|
309 // 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
|
310 // 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
|
311 // 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
|
312 // (It'll get back here afterwards and fall through to next else.) |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
313 } else if (new->c) { |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
314 new = 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
|
315 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
|
316 |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
317 // 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
|
318 } 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
|
319 |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
320 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
|
321 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 |
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
|
323 // 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
|
324 // (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
|
325 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
|
326 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
|
327 unsigned u = 1<<idx++; |
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
328 |
1637
2c86e2cc1fd7
Debris from flag handling rewrite: don't allow -^A to actually trigger.
Rob Landley <rob@landley.net>
parents:
1437
diff
changeset
|
329 if (new->c == 1) new->c = 0; |
978
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
330 new->dex[1] = u; |
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
331 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
|
332 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
|
333 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
|
334 *(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
|
335 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
336 } |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
337 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
338 // Parse trailing group indicators |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
339 while (*options) { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
340 unsigned bits = 0; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
341 |
770 | 342 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
|
343 |
1072
7a45b9b54d3d
Tweak args (yank old + that never worked, rename | to +), and add uname -o as a synonym for -s.
Rob Landley <rob@landley.net>
parents:
1071
diff
changeset
|
344 idx = stridx("-+!", *++options); |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
345 if (CFG_TOYBOX_DEBUG && idx == -1) error_exit("[ needs +-!"); |
1072
7a45b9b54d3d
Tweak args (yank old + that never worked, rename | to +), and add uname -o as a synonym for -s.
Rob Landley <rob@landley.net>
parents:
1071
diff
changeset
|
346 if (CFG_TOYBOX_DEBUG && (options[1] == ']' || !options[1])) |
1071
e7454bb7af5a
Fluff out option parsing documentation, add another DEBUG test.
Rob Landley <rob@landley.net>
parents:
1058
diff
changeset
|
347 error_exit("empty []"); |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
348 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
349 // Don't advance past ] but do process it once in loop. |
1072
7a45b9b54d3d
Tweak args (yank old + that never worked, rename | to +), and add uname -o as a synonym for -s.
Rob Landley <rob@landley.net>
parents:
1071
diff
changeset
|
350 while (*options++ != ']') { |
7a45b9b54d3d
Tweak args (yank old + that never worked, rename | to +), and add uname -o as a synonym for -s.
Rob Landley <rob@landley.net>
parents:
1071
diff
changeset
|
351 struct opts *opt; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
352 int i; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
353 |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
354 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
|
355 // 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
|
356 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
|
357 if (*options == ']') { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
358 if (!opt) break; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
359 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
|
360 } else { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
361 if (CFG_TOYBOX_DEBUG && !opt) |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
362 error_exit("[] unknown target %c", *options); |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
363 if (opt->c == *options) { |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
364 bits |= 1<<i; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
365 break; |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
366 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
367 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
368 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
369 } |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
370 } |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
371 } |
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
372 |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
373 // 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
|
374 |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
375 void get_optflags(void) |
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
376 { |
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
|
377 struct getoptflagstate gof; |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
378 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
|
379 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
|
380 char *letters[]={"s",""}; |
393
bfc208c5ac79
Split out parse_optflaglist(), and move local variables to optflagstate.
Rob Landley <rob@landley.net>
parents:
392
diff
changeset
|
381 |
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
|
382 // 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
|
383 // 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
|
384 |
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
|
385 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
|
386 // 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
|
387 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
|
388 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
|
389 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
|
390 |
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
|
391 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
|
392 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
393 // 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
|
394 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
|
395 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
|
396 catch = NULL; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
398 // 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
|
399 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
|
400 |
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
|
401 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
|
402 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
403 // 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
|
404 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
|
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 // 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
|
407 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
|
408 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
|
409 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
|
410 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
|
411 |
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
|
412 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
|
413 // 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
|
414 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
|
415 gof.stopearly += 2; |
845
44ed476d5c87
Fix argument parsing so -- doesn't include itself in output.
Rob Landley <rob@landley.net>
parents:
773
diff
changeset
|
416 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
|
417 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
419 // do we match a known --longopt? |
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
|
420 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
|
421 if (!strncmp(gof.arg, lo->str, lo->len)) { |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
422 if (!gof.arg[lo->len]) gof.arg = 0; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
423 else if (gof.arg[lo->len] == '=' && lo->opt->type) |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
424 gof.arg += lo->len; |
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
425 else 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
|
426 // It's a match. |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
427 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
|
428 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
|
429 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
430 } |
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
|
431 |
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
|
432 // 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
|
433 if (!lo && gof.noerror) { |
1036
a25239480e7a
Improve --longopt parsing: general bugfixes, better error reporting, new ; option for optional arguments only suppliable with =.
Rob Landley <rob@landley.net>
parents:
978
diff
changeset
|
434 gof.arg -= 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
|
435 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
|
436 } |
294
3de1ea4d6b56
Fix command line option parsing so "echo -xen" actually prints "-xen". Add
Rob Landley <rob@landley.net>
parents:
289
diff
changeset
|
437 |
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
|
438 // Long option parsed, handle option. |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
439 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
|
440 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
|
441 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 |
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
|
443 // 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
|
444 } 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
|
445 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
|
446 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
|
447 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
448 |
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
|
449 // 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
|
450 // 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
|
451 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
|
452 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
|
453 |
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
|
454 // Identify next option char. |
705
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
455 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
|
456 if (*gof.arg == catch->c) |
3e81cd0bad4b
Teach option parsing about [groups] of related options.
Rob Landley <rob@landley.net>
parents:
694
diff
changeset
|
457 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
|
458 |
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 // 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
|
460 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
|
461 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
|
462 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
|
463 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
|
464 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
465 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
466 continue; |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
467 |
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
|
468 // 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
|
469 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
|
470 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
|
471 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
|
472 } |
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
|
473 |
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
|
474 // 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
|
475 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
|
476 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
|
477 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
|
478 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
|
479 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
|
480 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
|
481 struct opts *req; |
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
482 char needs[32], *s = needs; |
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
483 |
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
484 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
|
485 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
|
486 *s = 0; |
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
487 |
6d3c39cb8a9d
Cleanup renice and implement '|' (required option) in argument parsing.
Rob Landley <rob@landley.net>
parents:
931
diff
changeset
|
488 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
|
489 } |
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
|
490 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
|
491 |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
684
diff
changeset
|
492 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
|
493 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
|
494 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
|
495 } |
25
eb46bb5626cb
New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 } |