summaryrefslogtreecommitdiff
path: root/argp/bug-argp2.c
blob: 133e5cf6e8cb6c9679fa29edb3d16859f8cc5443 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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"