bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: option abbreviation exceptions


From: Eric Blake
Subject: Re: option abbreviation exceptions
Date: Sat, 10 Jan 2009 10:18:03 -0700
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081209 Thunderbird/2.0.0.19 Mnenhy/0.7.5.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Jim Meyering on 12/29/2008 10:02 AM:
>> $ /bin/[ --help me | head -n1
>> /bin/[: missing `]'
>> $ /bin/[ --help | head -n1
>> Usage: test EXPRESSION
>> $ /bin/[ --hel | head -n1
>> Usage: test EXPRESSION
>>
>> Should the last example also complain about missing `]', rather than printing
>> help text?
> 
> test and [ have always had a conflicted relationship
> with --help/--version.
> 
> Making [ accept no abbreviations does seem like it'd be an improvement.
> 

What do you think of this patch?  It changes programs that take exactly
one of the two mandated options to only recognize exactly "--help" or
"--version" but not abbreviations.  After the patch, I get:

$ src/basename --oops
src/basename: invalid option -- -
Try `src/basename --help' for more information.
$ src/basename --help me
src/basename: invalid option -- -
Try `src/basename --help' for more information.
$ src/basename --hel
src/basename: invalid option -- -
Try `src/basename --help' for more information.
$ src/basename --help | head -n2
Usage: src/basename NAME [SUFFIX]
  or:  src/basename OPTION
$ src/echo --he
- --he

In other words, most programs will treat --h identically to --oops,
diagnosing it as an invalid option (since the application only takes one
of two specific options), and exceptional programs, like echo or [, which
react differently to invalid options, will react the same way to an
abbreviation as to any other invalid option.

- --
Don't work too hard, make some time for fun as well!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAklo2EsACgkQ84KuGfSFAYCI7wCgxOjDYYv1iklsomt/HVvMr2dE
nZgAoMw8w66MjdbPSyw9h90CtS8k4goE
=HKir
-----END PGP SIGNATURE-----
>From b8f77e710856f8996cf0f149826691a0f75e71ec Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Sat, 10 Jan 2009 10:07:46 -0700
Subject: [PATCH] parse_long_options: don't accept abbreviations

* long-options.c (long_options): Ignore abbreviations, so that
/bin/echo --h prints --h rather than usage.
---
 ChangeLog          |    6 ++++++
 lib/long-options.c |   13 +++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0c9bcfb..fad1240 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-01-10  Eric Blake  <address@hidden>
+
+       parse_long_options: don't accept abbreviations
+       * long-options.c (long_options): Ignore abbreviations, so that
+       /bin/echo --h prints --h rather than usage.
+
 2009-01-09  Paolo Bonzini  <address@hidden>
 
        regex: fix glibc bug 9697
diff --git a/lib/long-options.c b/lib/long-options.c
index 0286bdf..b605b68 100644
--- a/lib/long-options.c
+++ b/lib/long-options.c
@@ -1,7 +1,7 @@
 /* Utility to accept --help and --version options as unobtrusively as possible.
 
    Copyright (C) 1993, 1994, 1998, 1999, 2000, 2002, 2003, 2004, 2005,
-   2006 Free Software Foundation, Inc.
+   2006, 2009 Free Software Foundation, Inc.
 
    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
@@ -33,12 +33,21 @@
 static struct option const long_options[] =
 {
   {"help", no_argument, NULL, 'h'},
+  {"hel", no_argument, NULL, ' '},
+  {"he", no_argument, NULL, ' '},
+  {"h", no_argument, NULL, ' '},
   {"version", no_argument, NULL, 'v'},
+  {"versio", no_argument, NULL, ' '},
+  {"versi", no_argument, NULL, ' '},
+  {"vers", no_argument, NULL, ' '},
+  {"ver", no_argument, NULL, ' '},
+  {"ve", no_argument, NULL, ' '},
+  {"v", no_argument, NULL, ' '},
   {NULL, 0, NULL, 0}
 };
 
 /* Process long options --help and --version, but only if argc == 2.
-   Be careful not to gobble up `--'.  */
+   Be careful not to gobble up `--'.  Ignore abbreviations.  */
 
 void
 parse_long_options (int argc,
-- 
1.6.0.4


reply via email to

[Prev in Thread] Current Thread [Next in Thread]