xref: /onnv-gate/usr/src/lib/libparted/common/lib/long-options.c (revision 9663:ace9a2ac3683)
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