]> git.cworth.org Git - rrsolve/blob - src/args.c
Added support for solving boards in files provided on the command line.
[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[] = "[file ...]";
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         /* Consume all remaining non-option arguments */
70         args->files =  &state->argv[state->next - 1];
71         state->next = state->argc;
72         break;
73
74     default:
75         return ARGP_ERR_UNKNOWN;
76     }
77
78     return 0;
79 }
80             
81 static struct argp argp = { options, parse_opt, args_doc, doc };
82
83 error_t
84 args_parse(args_t *args, int argc, char *argv[])
85 {
86     args->host = getenv ("RR_HOST");
87     if (args->host == NULL)
88         args->host = ARGS_HOST_DEFAULT;
89     args->port = getenv ("RR_PORT");
90     if (args->port == NULL)
91         args->port = ARGS_PORT_DEFAULT;
92     args->user = ARGS_USER_DEFAULT;
93     args->game = getenv ("RR_GAME");
94     if (args->game == NULL)
95         args->game = ARGS_GAME_DEFAULT;
96     args->files = NULL;
97
98     return argp_parse (&argp, argc, argv,
99                        ARGP_LONG_ONLY,
100                        NULL, args);
101 }