[Top][All Lists]
[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
- Argp fix,
Sergey Poznyakoff <=