| 26 | |
---|
| 27 | const char *argp_program_version = PACKAGE_STRING; |
---|
| 28 | const char *argp_program_bug_address = PACKAGE_BUGREPORT; |
---|
| 29 | |
---|
| 30 | // Program documentation. |
---|
| 31 | static char doc[] = "FreeBob -- a driver for BeBob devices"; |
---|
| 32 | |
---|
| 33 | // A description of the arguments we accept. |
---|
| 34 | static char args_doc[] = "LISTEN_TIME"; |
---|
| 35 | |
---|
| 36 | // The options we understand. |
---|
| 37 | static struct argp_option options[] = { |
---|
| 38 | {"verbose", 'v', 0, 0, "Produce verbose output" }, |
---|
| 39 | {"quiet", 'q', 0, 0, "Don't produce any output" }, |
---|
| 40 | {"silent", 's', 0, OPTION_ALIAS }, |
---|
| 41 | { 0 } |
---|
| 42 | }; |
---|
| 43 | |
---|
| 44 | // Parse a single option. |
---|
| 45 | static error_t |
---|
| 46 | parse_opt( int key, char* arg, struct argp_state* state ) |
---|
| 47 | { |
---|
| 48 | // Get the input argument from `argp_parse', which we |
---|
| 49 | // know is a pointer to our arguments structure. |
---|
| 50 | struct arguments* arguments = ( struct arguments* ) state->input; |
---|
| 51 | |
---|
| 52 | switch (key) { |
---|
| 53 | case 'q': case 's': |
---|
| 54 | arguments->silent = 1; |
---|
| 55 | break; |
---|
| 56 | case 'v': |
---|
| 57 | arguments->verbose = 1; |
---|
| 58 | break; |
---|
| 59 | case ARGP_KEY_ARG: |
---|
| 60 | if ( state->arg_num >= 1 ) { |
---|
| 61 | // Too many arguments. |
---|
| 62 | argp_usage( state ); |
---|
| 63 | } |
---|
| 64 | arguments->args[state->arg_num] = arg; |
---|
| 65 | break; |
---|
| 66 | case ARGP_KEY_END: |
---|
| 67 | if ( state->arg_num < 1 ) { |
---|
| 68 | // Not enough arguments. |
---|
| 69 | argp_usage( state ); |
---|
| 70 | } |
---|
| 71 | break; |
---|
| 72 | default: |
---|
| 73 | return ARGP_ERR_UNKNOWN; |
---|
| 74 | } |
---|
| 75 | return 0; |
---|
| 76 | } |
---|
| 77 | |
---|
| 78 | // Our argp parser. |
---|
| 79 | static struct argp argp = { options, parse_opt, args_doc, doc }; |
---|
| 80 | |
---|
| 81 | struct arguments* pMainArguments; |
---|
| 86 | struct arguments arguments; |
---|
| 87 | pMainArguments = &arguments; |
---|
| 88 | |
---|
| 89 | // Default values. |
---|
| 90 | arguments.silent = 0; |
---|
| 91 | arguments.verbose = 0; |
---|
| 92 | |
---|
| 93 | // Parse our arguments; every option seen by `parse_opt' will |
---|
| 94 | // be reflected in `arguments'. |
---|
| 95 | argp_parse (&argp, argc, argv, 0, 0, &arguments); |
---|
| 96 | |
---|
| 97 | char* tail; |
---|
| 98 | int timeToListen = strtol( arguments.args[0], &tail, 0 ); |
---|
| 99 | if ( errno ) { |
---|
| 100 | fprintf( stderr, "LISTEN_TIME could not be parsed\n" ); |
---|
| 101 | return -1; |
---|
| 102 | } |
---|
| 103 | |
---|