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 Free 4 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 2, or (at your option) 9 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, write to the Free Software Foundation, 18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19 20/* Written by Jim Meyering. */ 21 22#ifdef HAVE_CONFIG_H 23# include <config.h> 24#endif 25 26/* Specification. */ 27#include "long-options.h" 28 29#include <stdarg.h> 30#include <stdio.h> 31#include <stdlib.h> 32#include <getopt.h> 33 34#include "version-etc.h" 35 36static struct option const long_options[] = 37{ 38 {"help", no_argument, NULL, 'h'}, 39 {"version", no_argument, NULL, 'v'}, 40 {NULL, 0, NULL, 0} 41}; 42 43/* Process long options --help and --version, but only if argc == 2. 44 Be careful not to gobble up `--'. */ 45 46void 47parse_long_options (int argc, 48 char **argv, 49 const char *command_name, 50 const char *package, 51 const char *version, 52 void (*usage_func) (int), 53 /* const char *author1, ...*/ ...) 54{ 55 int c; 56 int saved_opterr; 57 58 saved_opterr = opterr; 59 60 /* Don't print an error message for unrecognized options. */ 61 opterr = 0; 62 63 if (argc == 2 64 && (c = getopt_long (argc, argv, "+", long_options, NULL)) != -1) 65 { 66 switch (c) 67 { 68 case 'h': 69 (*usage_func) (EXIT_SUCCESS); 70 71 case 'v': 72 { 73 va_list authors; 74 va_start (authors, usage_func); 75 version_etc_va (stdout, command_name, package, version, authors); 76 exit (0); 77 } 78 79 default: 80 /* Don't process any other long-named options. */ 81 break; 82 } 83 } 84 85 /* Restore previous value. */ 86 opterr = saved_opterr; 87 88 /* Reset this to zero so that getopt internals get initialized from 89 the probably-new parameters when/if getopt is called later. */ 90 optind = 0; 91} 92