--- getopt/trunk/getopt.c 2012/08/12 10:18:02 327 +++ getopt/trunk/getopt.c 2014/11/23 10:49:55 367 @@ -1,6 +1,6 @@ /* * getopt.c - Enhanced implementation of BSD getopt(1) - * Copyright (c) 1997-2005 Frodo Looijaard + * Copyright (c) 1997-2014 Frodo Looijaard * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -12,14 +12,14 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* +/* * Version 1.0-b4: Tue Sep 23 1997. First public release. - * Version 1.0: Wed Nov 19 1997. + * Version 1.0: Wed Nov 19 1997. * Bumped up the version number to 1.0 * Fixed minor typo (CSH instead of TCSH) * Version 1.0.1: Tue Jun 3 1998 @@ -33,16 +33,16 @@ * Version 1.0.6: Tue Jun 27 2000 * No important changes * Version 1.1.0: Tue Jun 30 2000 - * Added NLS support (partly written by Arkadiusz Mikiewicz + * Added NLS support (partly written by Arkadiusz Miƛkiewicz * ) * Version 1.1.4: Mon Nov 7 2005 * Fixed a few type's in the manpage - * Version 1.1.5: Mon Nov 7 2005 + * Version 1.1.5: Sun Aug 12 2012 * Sync with util-linux-2.21, fixed build problems, many new translations */ /* Exit codes: - * 0) No errors, succesful operation. + * 0) No errors, successful operation. * 1) getopt(3) returned an error. * 2) A problem with parameter parsing for getopt(1). * 3) Internal error, out of memory @@ -65,10 +65,11 @@ #include "getopt.h" #endif +#include "util-linux-compat.h" #include "nls.h" #include "xalloc.h" -/* NON_OPT is the code that is returned when a non-option is found in '+' +/* NON_OPT is the code that is returned when a non-option is found in '+' * mode */ #define NON_OPT 1 /* LONG_OPT is the code that is returned when a long option is found. */ @@ -92,7 +93,6 @@ static const char *normalize(const char *arg); static int generate_output(char *argv[], int argc, const char *optstr, const struct option *longopts); -int main(int argc, char *argv[]); static void parse_error(const char *message); static void add_long_options(char *options); static void add_longopt(const char *name, int has_arg); @@ -124,7 +124,7 @@ } /* - * Each character in arg may take upto four characters in the + * Each character in arg may take up to four characters in the * result: For a quote we need a closing quote, a backslash, a quote * and an opening quote! We need also the global opening and closing * quote, and one extra character for '\0'. @@ -167,7 +167,7 @@ return BUFFER; } -/* +/* * Generate the output. argv[0] is the program name (used for reporting errors). * argv[1..] contains the options to be parsed. argc must be the number of * elements in argv (ie. 1 if there are no options, only the program name), @@ -199,7 +199,7 @@ if (longopts[longindex].has_arg) printf(" %s", normalize(optarg ? optarg : "")); } else if (opt == NON_OPT) - printf(" %s", normalize(optarg)); + printf(" %s", normalize(optarg ? optarg : "")); else { printf(" -%c", opt); charptr = strchr(optstr, opt); @@ -224,7 +224,7 @@ static void __attribute__ ((__noreturn__)) parse_error(const char *message) { if (message) - fprintf(stderr, "%s: %s\n", program_invocation_short_name, message); + warnx("%s", message); fprintf(stderr, _("Try `%s --help' for more information.\n"), program_invocation_short_name); exit(PARAMETER_EXIT_CODE); @@ -260,7 +260,7 @@ long_options[long_options_nr].flag = NULL; long_options[long_options_nr].val = 0; - if (long_options_nr) { + if (long_options_nr && name) { /* Not for init! */ long_options[long_options_nr - 1].has_arg = has_arg; long_options[long_options_nr - 1].flag = NULL; @@ -273,7 +273,7 @@ } -/* +/* * Register several long options. options is a string of long options, * separated by commas or whitespace. This nukes options! */ @@ -320,13 +320,15 @@ static void __attribute__ ((__noreturn__)) print_help(void) { - fputs(_("Usage: getopt optstring parameters\n"), stderr); - fputs(_(" getopt [options] [--] optstring parameters\n"), stderr); - fputs(_(" getopt [options] -o|--options optstring [options] [--]\n"), stderr); - fputs(_(" parameters\n"), stderr); - fputs(_("\nOptions:\n"), stderr); + fputs(USAGE_HEADER, stderr); + fprintf(stderr, _( + " %1$s optstring parameters\n" + " %1$s [options] [--] optstring parameters\n" + " %1$s [options] -o|--options optstring [options] [--] parameters\n"), + program_invocation_short_name); + + fputs(USAGE_OPTIONS, stderr); fputs(_(" -a, --alternative Allow long options starting with single -\n"), stderr); - fputs(_(" -h, --help This small usage guide\n"), stderr); fputs(_(" -l, --longoptions Long options to be recognized\n"), stderr); fputs(_(" -n, --name The name under which errors are reported\n"), stderr); fputs(_(" -o, --options Short options to be recognized\n"), stderr); @@ -334,10 +336,11 @@ fputs(_(" -Q, --quiet-output No normal output\n"), stderr); fputs(_(" -s, --shell Set shell quoting conventions\n"), stderr); fputs(_(" -T, --test Test for getopt(1) version\n"), stderr); - fputs(_(" -u, --unquote Do not quote the output\n"), stderr); - fputs(_(" -V, --version Output version information\n"), stderr); - fputc('\n', stderr); - + fputs(_(" -u, --unquoted Do not quote the output\n"), stderr); + fputs(USAGE_SEPARATOR, stderr); + fputs(USAGE_HELP, stderr); + fputs(USAGE_VERSION, stderr); + fprintf(stderr, USAGE_MAN_TAIL("getopt(1)")); exit(PARAMETER_EXIT_CODE); } @@ -364,6 +367,7 @@ {"version", no_argument, NULL, 'V'}, {NULL, 0, NULL, 0} }; + setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -386,7 +390,6 @@ parse_error(_("missing optstring argument")); } - if (argv[1][0] != '-' || compatible) { quote = 0; optstr = xmalloc(strlen(argv[1]) + 1); @@ -432,7 +435,7 @@ quote = 0; break; case 'V': - printf(_("%s (enhanced) %s\n"), program_invocation_short_name, program_version); + printf(UTIL_LINUX_VERSION); return EXIT_SUCCESS; case '?': case ':': @@ -440,7 +443,7 @@ default: parse_error(_("internal error, contact the author.")); } - + if (!optstr) { if (optind >= argc) parse_error(_("missing optstring argument")); @@ -454,6 +457,7 @@ argv[optind - 1] = name; else argv[optind - 1] = argv[0]; + return generate_output(argv + optind - 1, argc-optind + 1, optstr, long_options); }