From 88033d3779362aad8fd11345636d9578f94c14d7 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 21 May 2017 02:46:18 +0200 Subject: [PATCH] argp: Simplify bit manipulation. * lib/argp-parse.c (parser_parse_opt): Use &, |, ~ instead of shifts on a signed integer type. --- ChangeLog | 6 ++++++ lib/argp-parse.c | 11 ++--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ebdd7b5d0..541952e492 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-05-20 Bruno Haible + + argp: Simplify bit manipulation. + * lib/argp-parse.c (parser_parse_opt): Use &, |, ~ instead of shifts + on a signed integer type. + 2017-05-20 Bruno Haible Avoid wrong configure results with gcc -fsanitize=address. diff --git a/lib/argp-parse.c b/lib/argp-parse.c index 4723a2b29d..fb04a4a2f9 100644 --- a/lib/argp-parse.c +++ b/lib/argp-parse.c @@ -743,15 +743,8 @@ parser_parse_opt (struct parser *parser, int opt, char *val) /* A long option. Preserve the sign in the user key, without invoking undefined behavior. Assume two's complement. */ { - unsigned uopt = opt; - unsigned ushifted_user_key = uopt << GROUP_BITS; - int shifted_user_key = ushifted_user_key; - int user_key; - if (-1 >> 1 == -1) - user_key = shifted_user_key >> GROUP_BITS; - else - user_key = ((ushifted_user_key >> GROUP_BITS) - - (shifted_user_key < 0 ? 1 << USER_BITS : 0)); + int user_key = + ((opt & (1 << (USER_BITS - 1))) ? ~USER_MASK : 0) | (opt & USER_MASK); err = group_parse (&parser->groups[group_key - 1], &parser->state, user_key, parser->opt_data.optarg); -- 2.39.5