Mercurial > gnulib
annotate lib/long-options.c @ 40198:5a34193cbc07
long-options: add parse_gnu_standard_options_only
Discussed in https://bugs.gnu.org/33468 .
* lib/long-options.c (parse_long_options): Use EXIT_SUCCESS instead
of 0.
(parse_gnu_standard_options_only): Add function to
process the GNU default options --help and --version and fail for any other
unknown long or short option. See
https://gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html .
* lib/long-options.h (parse_gnu_standard_options_only): Declare it.
* modules/long-options (depends-on): Add stdbool, exitfail.
* top/maint.mk (sc_prohibit_long_options_without_use): Update
syntax-check rule, add new function name.
author | Bernhard Voelker <mail@bernhard-voelker.de> |
---|---|
date | Thu, 29 Nov 2018 09:06:26 +0100 |
parents | b06060465f09 |
children |
rev | line source |
---|---|
317 | 1 /* Utility to accept --help and --version options as unobtrusively as possible. |
4659 | 2 |
40057
b06060465f09
maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents:
19484
diff
changeset
|
3 Copyright (C) 1993-1994, 1998-2000, 2002-2006, 2009-2019 Free Software |
12518
b5e42ef33b49
update nearly all FSF copyright year lists to include 2009
Jim Meyering <meyering@redhat.com>
parents:
12421
diff
changeset
|
4 Foundation, Inc. |
317 | 5 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7302
diff
changeset
|
6 This program is free software: you can redistribute it and/or modify |
317 | 7 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7302
diff
changeset
|
8 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7302
diff
changeset
|
9 (at your option) any later version. |
317 | 10 |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
19190 | 17 along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
317 | 18 |
649
89f4c1937ac7
update FSF address in copyright and remove any trailing blanks
Jim Meyering <jim@meyering.net>
parents:
446
diff
changeset
|
19 /* Written by Jim Meyering. */ |
317 | 20 |
7302
8a1a9361108c
* _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
21 #include <config.h> |
317 | 22 |
4771
ffc6ac581833
Merge version-etc-2 back into version-etc: Better way to internationalize
Bruno Haible <bruno@clisp.org>
parents:
4659
diff
changeset
|
23 /* Specification. */ |
4659 | 24 #include "long-options.h" |
25 | |
4771
ffc6ac581833
Merge version-etc-2 back into version-etc: Better way to internationalize
Bruno Haible <bruno@clisp.org>
parents:
4659
diff
changeset
|
26 #include <stdarg.h> |
317 | 27 #include <stdio.h> |
4771
ffc6ac581833
Merge version-etc-2 back into version-etc: Better way to internationalize
Bruno Haible <bruno@clisp.org>
parents:
4659
diff
changeset
|
28 #include <stdlib.h> |
317 | 29 #include <getopt.h> |
2669
3668079f961d
Include <stdlib.h>, for declaration of exit.
Jim Meyering <jim@meyering.net>
parents:
2507
diff
changeset
|
30 |
1755
f486d0e61ad0
(parse_long_options): Remove version-, copyright-,
Jim Meyering <jim@meyering.net>
parents:
1727
diff
changeset
|
31 #include "version-etc.h" |
40198
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
32 #include "exitfail.h" |
317 | 33 |
34 static struct option const long_options[] = | |
35 { | |
5813 | 36 {"help", no_argument, NULL, 'h'}, |
37 {"version", no_argument, NULL, 'v'}, | |
38 {NULL, 0, NULL, 0} | |
317 | 39 }; |
40 | |
41 /* Process long options --help and --version, but only if argc == 2. | |
16235
18a38c9615f0
In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents:
16201
diff
changeset
|
42 Be careful not to gobble up "--". */ |
317 | 43 |
44 void | |
1719 | 45 parse_long_options (int argc, |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
46 char **argv, |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
47 const char *command_name, |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
48 const char *package, |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
49 const char *version, |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
50 void (*usage_func) (int), |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
51 /* const char *author1, ...*/ ...) |
317 | 52 { |
53 int c; | |
54 int saved_opterr; | |
55 | |
56 saved_opterr = opterr; | |
57 | |
58 /* Don't print an error message for unrecognized options. */ | |
59 opterr = 0; | |
60 | |
61 if (argc == 2 | |
880
3bee11a1c21d
(parse_long_options): Compare getopt_long return
Jim Meyering <jim@meyering.net>
parents:
869
diff
changeset
|
62 && (c = getopt_long (argc, argv, "+", long_options, NULL)) != -1) |
317 | 63 { |
64 switch (c) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
65 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
66 case 'h': |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
67 (*usage_func) (EXIT_SUCCESS); |
18442
5a47f1f1de9b
long-options: avoid new GCC 7 warning from -Wimplicit-fallthrough
Jim Meyering <meyering@fb.com>
parents:
18189
diff
changeset
|
68 break; |
317 | 69 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
70 case 'v': |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
71 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
72 va_list authors; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
73 va_start (authors, usage_func); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
74 version_etc_va (stdout, command_name, package, version, authors); |
40198
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
75 exit (EXIT_SUCCESS); |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
76 } |
446
8461c3b8595a
Remove trailing white space.
Jim Meyering <jim@meyering.net>
parents:
317
diff
changeset
|
77 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
78 default: |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
79 /* Don't process any other long-named options. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
80 break; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
81 } |
317 | 82 } |
83 | |
84 /* Restore previous value. */ | |
85 opterr = saved_opterr; | |
86 | |
869
ca8a87089389
(parse_long_options): Reset optind to zero
Jim Meyering <jim@meyering.net>
parents:
706
diff
changeset
|
87 /* Reset this to zero so that getopt internals get initialized from |
ca8a87089389
(parse_long_options): Reset optind to zero
Jim Meyering <jim@meyering.net>
parents:
706
diff
changeset
|
88 the probably-new parameters when/if getopt is called later. */ |
ca8a87089389
(parse_long_options): Reset optind to zero
Jim Meyering <jim@meyering.net>
parents:
706
diff
changeset
|
89 optind = 0; |
317 | 90 } |
40198
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
91 |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
92 /* Process the GNU default long options --help and --version (see also |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
93 https://gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html), |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
94 and fail for any other unknown long or short option. |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
95 Use with SCAN_ALL=true to scan until "--", or with SCAN_ALL=false to stop |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
96 at the first non-option argument (or "--", whichever comes first). */ |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
97 void |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
98 parse_gnu_standard_options_only (int argc, |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
99 char **argv, |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
100 const char *command_name, |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
101 const char *package, |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
102 const char *version, |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
103 bool scan_all, |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
104 void (*usage_func) (int), |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
105 /* const char *author1, ...*/ ...) |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
106 { |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
107 int c; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
108 int saved_opterr = opterr; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
109 |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
110 /* Print an error message for unrecognized options. */ |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
111 opterr = 1; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
112 |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
113 const char *optstring = scan_all ? "" : "+"; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
114 |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
115 if ((c = getopt_long (argc, argv, optstring, long_options, NULL)) != -1) |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
116 { |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
117 switch (c) |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
118 { |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
119 case 'h': |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
120 (*usage_func) (EXIT_SUCCESS); |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
121 break; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
122 |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
123 case 'v': |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
124 { |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
125 va_list authors; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
126 va_start (authors, usage_func); |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
127 version_etc_va (stdout, command_name, package, version, authors); |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
128 exit (EXIT_SUCCESS); |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
129 } |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
130 |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
131 default: |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
132 (*usage_func) (exit_failure); |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
133 break; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
134 } |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
135 } |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
136 |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
137 /* Restore previous value. */ |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
138 opterr = saved_opterr; |
5a34193cbc07
long-options: add parse_gnu_standard_options_only
Bernhard Voelker <mail@bernhard-voelker.de>
parents:
40057
diff
changeset
|
139 } |