annotate lib/args.c @ 1766:190ecf70fbe5 draft

Fix an obvious typo in Makefile.
author Elliott Hughes <enh@google.com>
date Sat, 28 Mar 2015 13:13:42 -0500
parents 10922d83392a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 684
diff changeset
1 /* args.c - Command line argument parsing.
25
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2006 Rob Landley <rob@landley.net>
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
4 */
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
5
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
6 #include "toys.h"
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
7
eb46bb5626cb New option parsing infrastructure (doesn't use getopt). Hook it up to
Rob Landley <rob@landley.net>
parents:
diff changeset
8 // Design goals:
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
6164dcc7384d Fix typo.
Rob Landley <rob@landley.net>
parents: 705
diff changeset
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
1455c09e3f8a Fix option grouping.
Rob Landley <rob@landley.net>
parents: 709
diff changeset
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 }