Line data Source code
1 : /* Utility to accept --help and --version options as unobtrusively as possible.
2 :
3 : Copyright (C) 1993, 1994, 1998, 1999, 2000, 2002, 2003, 2004, 2005,
4 : 2006 Free Software Foundation, Inc.
5 :
6 : This program is free software: you can redistribute it and/or modify
7 : it under the terms of the GNU General Public License as published by
8 : the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
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
17 : along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 :
19 : /* Written by Jim Meyering. */
20 :
21 : #include <config.h>
22 :
23 : /* Specification. */
24 : #include "long-options.h"
25 :
26 : #include <stdarg.h>
27 : #include <stdio.h>
28 : #include <stdlib.h>
29 : #include <getopt.h>
30 :
31 : #include "version-etc.h"
32 :
33 : static struct option const long_options[] =
34 : {
35 : {"help", no_argument, NULL, 'h'},
36 : {"version", no_argument, NULL, 'v'},
37 : {NULL, 0, NULL, 0}
38 : };
39 :
40 : /* Process long options --help and --version, but only if argc == 2.
41 : Be careful not to gobble up `--'. */
42 :
43 : void
44 1107 : parse_long_options (int argc,
45 : char **argv,
46 : const char *command_name,
47 : const char *package,
48 : const char *version,
49 : void (*usage_func) (int),
50 : /* const char *author1, ...*/ ...)
51 : {
52 : int c;
53 : int saved_opterr;
54 :
55 1107 : saved_opterr = opterr;
56 :
57 : /* Don't print an error message for unrecognized options. */
58 1107 : opterr = 0;
59 :
60 1107 : if (argc == 2
61 478 : && (c = getopt_long (argc, argv, "+", long_options, NULL)) != -1)
62 : {
63 227 : switch (c)
64 : {
65 51 : case 'h':
66 51 : (*usage_func) (EXIT_SUCCESS);
67 :
68 27 : case 'v':
69 : {
70 : va_list authors;
71 27 : va_start (authors, usage_func);
72 27 : version_etc_va (stdout, command_name, package, version, authors);
73 27 : exit (0);
74 : }
75 :
76 149 : default:
77 : /* Don't process any other long-named options. */
78 149 : break;
79 : }
80 880 : }
81 :
82 : /* Restore previous value. */
83 1029 : opterr = saved_opterr;
84 :
85 : /* Reset this to zero so that getopt internals get initialized from
86 : the probably-new parameters when/if getopt is called later. */
87 1029 : optind = 0;
88 1029 : }
|