]> git.cworth.org Git - rrsolve/blob - src/args.c
Permit rr_client_next_notice to return null notice
[rrsolve] / src / args.c
1 /* args.c - Parse command-line arguments for grrobot using argp
2  *
3  * Copyright © 2003 Carl Worth
4  *
5  * Permission to use, copy, modify, distribute, and sell this software
6  * and its documentation for any purpose is hereby granted without
7  * fee, provided that the above copyright notice appear in all copies
8  * and that both that copyright notice and this permission notice
9  * appear in supporting documentation, and that the name of Carl Worth
10  * not be used in advertising or publicity pertaining to distribution
11  * of the software without specific, written prior permission.
12  * Carl Worth makes no representations about the suitability of this
13  * software for any purpose.  It is provided "as is" without express
14  * or implied warranty.
15  * 
16  * CARL WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
18  * NO EVENT SHALL CARL WORTH BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
20  * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
21  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23  *
24  * Author: Carl Worth <carl@theworths.org>
25  */
26
27 #include <stdlib.h>
28 #include <argp.h>
29
30 #include "args.h"
31
32 const char *argp_program_version = "grrobot " VERSION;
33
34 const char *argp_program_bug_address = "<carl@theworths.org>";
35
36 static char doc[] = "rrsolve - Ricochet Robot solver";
37
38 static char args_doc[] = "";
39
40 static struct argp_option options[] = {
41     /* name,            key, arg,       flags, doc */
42     {"host",            'h', "HOST", 0, "Host running RR server"},
43     {"port",            'p', "PORT", 0, "Port of server"},
44     {"user",            'u', "USERNAME", 0, "Username for conection"},
45     {"game",            'g', "GAME", 0, "Game to join"},
46     { 0 }
47 };
48
49 static error_t
50 parse_opt (int key, char *arg, struct argp_state *state)
51 {
52     struct args *args = state->input;
53
54     switch (key) {
55     case 'h':
56         args->host = arg;
57         break;
58     case 'p':
59         args->port = arg;
60         break;
61     case 'u':
62         args->user = arg;
63         break;
64     case 'g':
65         args->game = arg;
66         break;
67
68     case ARGP_KEY_ARG:
69         argp_usage (state);
70         break;
71
72 /*
73     case ARGP_KEY_END:
74         if (state->arg_num < 1)
75             argp_usage (state);
76         break;
77 */
78
79     default:
80         return ARGP_ERR_UNKNOWN;
81     }
82
83     return 0;
84 }
85             
86 static struct argp argp = { options, parse_opt, args_doc, doc };
87
88 error_t
89 args_parse(args_t *args, int argc, char *argv[])
90 {
91     args->host = getenv ("RR_HOST");
92     if (args->host == NULL)
93         args->host = ARGS_HOST_DEFAULT;
94     args->port = getenv ("RR_PORT");
95     if (args->port == NULL)
96         args->port = ARGS_PORT_DEFAULT;
97     args->user = ARGS_USER_DEFAULT;
98     args->game = getenv ("RR_GAME");
99     if (args->game == NULL)
100         args->game = ARGS_GAME_DEFAULT;
101
102     return argp_parse (&argp, argc, argv, 0, 0, args);
103 }