diff options
Diffstat (limited to 'argp')
-rw-r--r-- | argp/Makefile | 5 | ||||
-rw-r--r-- | argp/bug-argp2.c | 55 |
2 files changed, 58 insertions, 2 deletions
diff --git a/argp/Makefile b/argp/Makefile index b8c9fca..caa95db 100644 --- a/argp/Makefile +++ b/argp/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1997, 2002, 2003, 2006, 2007 Free Software Foundation, Inc. +# Copyright (C) 1997,2002,2003,2006,2007,2010 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -26,12 +26,13 @@ distribute = argp-fmtstream.h argp-namefrob.h routines = $(addprefix argp-, ba fmtstream fs-xinl help parse pv \ pvh xinl eexst) -tests = argp-test tst-argp1 bug-argp1 tst-argp2 +tests = argp-test tst-argp1 bug-argp1 tst-argp2 bug-argp2 CFLAGS-argp-help.c = $(uses-callbacks) -fexceptions CFLAGS-argp-parse.c = $(uses-callbacks) CFLAGS-argp-fmtstream.c = -fexceptions bug-argp1-ARGS = -- --help +bug-argp2-ARGS = -- -d 111 --dstaddr 222 -p 333 --peer 444 include ../Rules diff --git a/argp/bug-argp2.c b/argp/bug-argp2.c new file mode 100644 index 0000000..133e5cf --- /dev/null +++ b/argp/bug-argp2.c @@ -0,0 +1,55 @@ +#include <argp.h> +#include <stdio.h> +#include <stdlib.h> + +static struct argp_option argp_options[] = { + { "dstaddr", 'd', "ADDR", 0, + "set destination (peer) address to ADDR" }, + { "peer", 'p', "ADDR", OPTION_ALIAS }, + { NULL } +}; + +static error_t parse_opt (int key, char *arg, struct argp_state *state); + +static struct argp argp = +{ + argp_options, parse_opt +}; + +static int cnt; + +static int +do_test (int argc, char *argv[]) +{ + int remaining; + argp_parse (&argp, argc, argv, 0, &remaining, NULL); + return cnt != 4; +} + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case 'd': + case 'p': + printf ("got '%c' with argument '%s'\n", key, arg); + ++cnt; + break; + case 0: + case ARGP_KEY_END: + case ARGP_KEY_NO_ARGS: + case ARGP_KEY_INIT: + case ARGP_KEY_SUCCESS: + case ARGP_KEY_FINI: + // Ignore. + return ARGP_ERR_UNKNOWN; + default: + printf ("invalid key '%x'\n", key); + exit (1); + } + return 0; +} + +#define TEST_FUNCTION do_test (argc, argv) +#include "../test-skeleton.c" |