bug-gnulib
[Top][All Lists]
Advanced

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

Argp fix


From: Sergey Poznyakoff
Subject: Argp fix
Date: Fri, 05 Feb 2010 13:39:34 +0200

Hello,

Argp failed to properly recognize alias options that have
short option letters. For instance, in this setup:

  { "dstaddr", 'd', "ADDR", 0,
    "set destination (peer) address to ADDR" },
  { "peer", 'p', "ADDR", OPTION_ALIAS },

both --peer and -p failed to work.

I have installed the attached fix.

Regards,
Sergey

>From 11fbc57405a118e6ec9a3ebc19bbf5ececdae4d6 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <address@hidden>
Date: Fri, 5 Feb 2010 13:33:15 +0200
Subject: [PATCH] Argp: fix recognition of short alias options.

* lib/argp-parse.c (convert_options): Fix improper use of
`|' between character values.
* tests/test-argp.c (group1_option): New alias option
--read (-r).
(group1_parser): Special handling for 'r'.
(test15): New test case.
(test_fun): Add test15.
* tests/test-argp-2.sh: Update expected --help and --usage
outputs.
---
 ChangeLog            |   16 +++++++++++++++-
 lib/argp-parse.c     |    2 +-
 tests/test-argp-2.sh |   18 ++++++++++--------
 tests/test-argp.c    |   15 ++++++++++++++-
 4 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 064c086..4f4ffb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2010-02-05  Sergey Poznyakoff  <address@hidden>
 
+       Argp: fix recognition of short alias options.
+
+       * lib/argp-parse.c (convert_options): Fix improper use of
+       `|' between character values.
+       * tests/test-argp.c (group1_option): New alias option
+       --read (-r).
+       (group1_parser): Special handling for 'r'.
+       (test15): New test case.
+       (test_fun): Add test15.
+       * tests/test-argp-2.sh: Update expected --help and --usage
+       outputs.
+
+2010-02-05  Sergey Poznyakoff  <address@hidden>
+
        * tests/test-argp.c: Fix indentation.
 
 2010-02-04  Eric Blake  <address@hidden>

diff --git a/lib/argp-parse.c b/lib/argp-parse.c
index 9a78778..a1cbf88 100644
--- a/lib/argp-parse.c
+++ b/lib/argp-parse.c
@@ -339,7 +339,7 @@ convert_options (const struct argp *argp,
                        values (the sign of the lower bits is preserved
                        however)...  */
                     cvt->long_end->val =
-                      ((opt->key | real->key) & USER_MASK)
+                      ((opt->key ? opt->key : real->key) & USER_MASK)
                       + (((group - cvt->parser->groups) + 1) << USER_BITS);
 
                     /* Keep the LONG_OPTS list terminated.  */
diff --git a/tests/test-argp-2.sh b/tests/test-argp-2.sh
index 344bf37..5c0c64c 100755
--- a/tests/test-argp-2.sh
+++ b/tests/test-argp-2.sh
@@ -33,10 +33,10 @@ func_compare() {
 ####
 # Test --usage output
 cat > $TMP <<EOT
-Usage: test-argp [-tvCSOlp?V] [-f FILE] [-o[ARG]] [--test] [--file=FILE]
-            [--input=FILE] [--verbose] [--cantiga] [--sonet] [--option]
-            [--optional[=ARG]] [--limerick] [--poem] [--help] [--usage]
-            [--version] ARGS...
+Usage: test-argp [-tvCSOlp?V] [-f FILE] [-r FILE] [-o[ARG]] [--test]
+            [--file=FILE] [--input=FILE] [--read=FILE] [--verbose] [--cantiga]
+            [--sonet] [--option] [--optional[=ARG]] [--limerick] [--poem]
+            [--help] [--usage] [--version] ARGS...
 EOT
 
 ./test-argp$EXEEXT --usage | func_compare || ERR=1
@@ -45,9 +45,10 @@ EOT
 # Test working usage-indent format
 
 cat > $TMP <<EOT
-Usage: test-argp [-tvCSOlp?V] [-f FILE] [-o[ARG]] [--test] [--file=FILE]
-[--input=FILE] [--verbose] [--cantiga] [--sonet] [--option] [--optional[=ARG]]
-[--limerick] [--poem] [--help] [--usage] [--version] ARGS...
+Usage: test-argp [-tvCSOlp?V] [-f FILE] [-r FILE] [-o[ARG]] [--test]
+[--file=FILE] [--input=FILE] [--read=FILE] [--verbose] [--cantiga] [--sonet]
+[--option] [--optional[=ARG]] [--limerick] [--poem] [--help] [--usage]
+[--version] ARGS...
 EOT
 
 ARGP_HELP_FMT='usage-indent=0' ./test-argp$EXEEXT --usage | func_compare || 
ERR=1
@@ -62,7 +63,8 @@ documentation string
   -t, --test
 
  Option Group 1
-  -f, --file=FILE, --input=FILE   Option with a mandatory argument
+  -f, -r, --file=FILE, --input=FILE, --read=FILE
+                             Option with a mandatory argument
   -v, --verbose              Simple option without arguments
 
  Option Group 1.1
diff --git a/tests/test-argp.c b/tests/test-argp.c
index 7f58ae0..675951f 100644
--- a/tests/test-argp.c
+++ b/tests/test-argp.c
@@ -34,6 +34,7 @@ struct test_args
   int test;
   int verbose;
   char *file;
+  int read;
   char *hidden;
   int opt;
   char *optional;
@@ -47,6 +48,7 @@ static struct argp_option group1_option[] = {
   { "verbose", 'v', NULL, 0, "Simple option without arguments", 1 },
   { "file", 'f', "FILE", 0, "Option with a mandatory argument", 1 },
   { "input", 0, NULL, OPTION_ALIAS, NULL, 1 },
+  { "read", 'r', NULL, OPTION_ALIAS, NULL, 1 },
   { "hidden", 'H', "FILE", OPTION_HIDDEN, "Hidden option", 1 },
   { NULL, 0, NULL, 0, NULL, 0 }
 };
@@ -62,6 +64,9 @@ group1_parser (int key, char *arg, struct argp_state *state)
       args->verbose++;
       break;
 
+    case 'r':
+      args->read = 1;
+      /* fall through */
     case 'f':
       args->file = arg;
       break;
@@ -430,6 +435,14 @@ test14 (struct argp *argp)
     fail ("option not processed");
 }
 
+void
+test15 (struct argp *argp)
+{
+  INIT_TEST2 (1, "-r", "FILE");
+  test_file (argp, argc, argv, &test_args);
+  if (!test_args.read)
+    fail ("short alias not recognized properly");
+}
 
 
 typedef void (*test_fp) (struct argp *argp);
@@ -438,7 +451,7 @@ test_fp test_fun[] = {
   test1,  test2,  test3,  test4,
   test5,  test6,  test7,  test8,
   test9,  test10, test11, test12,
-  test13, test14,
+  test13, test14, test15,
   NULL
 };
 
-- 
1.6.0.3


reply via email to

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