1*9663SMark.Logan@Sun.COM /* Utility to accept --help and --version options as unobtrusively as possible.
2*9663SMark.Logan@Sun.COM
3*9663SMark.Logan@Sun.COM Copyright (C) 1993, 1994, 1998, 1999, 2000, 2002, 2003, 2004, 2005,
4*9663SMark.Logan@Sun.COM 2006 Free Software Foundation, Inc.
5*9663SMark.Logan@Sun.COM
6*9663SMark.Logan@Sun.COM This program is free software; you can redistribute it and/or modify
7*9663SMark.Logan@Sun.COM it under the terms of the GNU General Public License as published by
8*9663SMark.Logan@Sun.COM the Free Software Foundation; either version 2, or (at your option)
9*9663SMark.Logan@Sun.COM any later version.
10*9663SMark.Logan@Sun.COM
11*9663SMark.Logan@Sun.COM This program is distributed in the hope that it will be useful,
12*9663SMark.Logan@Sun.COM but WITHOUT ANY WARRANTY; without even the implied warranty of
13*9663SMark.Logan@Sun.COM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*9663SMark.Logan@Sun.COM GNU General Public License for more details.
15*9663SMark.Logan@Sun.COM
16*9663SMark.Logan@Sun.COM You should have received a copy of the GNU General Public License
17*9663SMark.Logan@Sun.COM along with this program; if not, write to the Free Software Foundation,
18*9663SMark.Logan@Sun.COM Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19*9663SMark.Logan@Sun.COM
20*9663SMark.Logan@Sun.COM /* Written by Jim Meyering. */
21*9663SMark.Logan@Sun.COM
22*9663SMark.Logan@Sun.COM #include <config.h>
23*9663SMark.Logan@Sun.COM
24*9663SMark.Logan@Sun.COM /* Specification. */
25*9663SMark.Logan@Sun.COM #include "long-options.h"
26*9663SMark.Logan@Sun.COM
27*9663SMark.Logan@Sun.COM #include <stdarg.h>
28*9663SMark.Logan@Sun.COM #include <stdio.h>
29*9663SMark.Logan@Sun.COM #include <stdlib.h>
30*9663SMark.Logan@Sun.COM #include <getopt.h>
31*9663SMark.Logan@Sun.COM
32*9663SMark.Logan@Sun.COM #include "version-etc.h"
33*9663SMark.Logan@Sun.COM
34*9663SMark.Logan@Sun.COM static struct option const long_options[] =
35*9663SMark.Logan@Sun.COM {
36*9663SMark.Logan@Sun.COM {"help", no_argument, NULL, 'h'},
37*9663SMark.Logan@Sun.COM {"version", no_argument, NULL, 'v'},
38*9663SMark.Logan@Sun.COM {NULL, 0, NULL, 0}
39*9663SMark.Logan@Sun.COM };
40*9663SMark.Logan@Sun.COM
41*9663SMark.Logan@Sun.COM /* Process long options --help and --version, but only if argc == 2.
42*9663SMark.Logan@Sun.COM Be careful not to gobble up `--'. */
43*9663SMark.Logan@Sun.COM
44*9663SMark.Logan@Sun.COM void
parse_long_options(int argc,char ** argv,const char * command_name,const char * package,const char * version,void (* usage_func)(int),...)45*9663SMark.Logan@Sun.COM parse_long_options (int argc,
46*9663SMark.Logan@Sun.COM char **argv,
47*9663SMark.Logan@Sun.COM const char *command_name,
48*9663SMark.Logan@Sun.COM const char *package,
49*9663SMark.Logan@Sun.COM const char *version,
50*9663SMark.Logan@Sun.COM void (*usage_func) (int),
51*9663SMark.Logan@Sun.COM /* const char *author1, ...*/ ...)
52*9663SMark.Logan@Sun.COM {
53*9663SMark.Logan@Sun.COM int c;
54*9663SMark.Logan@Sun.COM int saved_opterr;
55*9663SMark.Logan@Sun.COM
56*9663SMark.Logan@Sun.COM saved_opterr = opterr;
57*9663SMark.Logan@Sun.COM
58*9663SMark.Logan@Sun.COM /* Don't print an error message for unrecognized options. */
59*9663SMark.Logan@Sun.COM opterr = 0;
60*9663SMark.Logan@Sun.COM
61*9663SMark.Logan@Sun.COM if (argc == 2
62*9663SMark.Logan@Sun.COM && (c = getopt_long (argc, argv, "+", long_options, NULL)) != -1)
63*9663SMark.Logan@Sun.COM {
64*9663SMark.Logan@Sun.COM switch (c)
65*9663SMark.Logan@Sun.COM {
66*9663SMark.Logan@Sun.COM case 'h':
67*9663SMark.Logan@Sun.COM (*usage_func) (EXIT_SUCCESS);
68*9663SMark.Logan@Sun.COM
69*9663SMark.Logan@Sun.COM case 'v':
70*9663SMark.Logan@Sun.COM {
71*9663SMark.Logan@Sun.COM va_list authors;
72*9663SMark.Logan@Sun.COM va_start (authors, usage_func);
73*9663SMark.Logan@Sun.COM version_etc_va (stdout, command_name, package, version, authors);
74*9663SMark.Logan@Sun.COM exit (0);
75*9663SMark.Logan@Sun.COM }
76*9663SMark.Logan@Sun.COM
77*9663SMark.Logan@Sun.COM default:
78*9663SMark.Logan@Sun.COM /* Don't process any other long-named options. */
79*9663SMark.Logan@Sun.COM break;
80*9663SMark.Logan@Sun.COM }
81*9663SMark.Logan@Sun.COM }
82*9663SMark.Logan@Sun.COM
83*9663SMark.Logan@Sun.COM /* Restore previous value. */
84*9663SMark.Logan@Sun.COM opterr = saved_opterr;
85*9663SMark.Logan@Sun.COM
86*9663SMark.Logan@Sun.COM /* Reset this to zero so that getopt internals get initialized from
87*9663SMark.Logan@Sun.COM the probably-new parameters when/if getopt is called later. */
88*9663SMark.Logan@Sun.COM optind = 0;
89*9663SMark.Logan@Sun.COM }
90