am-utils: Convert info page to "man 7 am-utils"
[dragonfly.git] / games / hack / hack.options.c
1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 /* hack.options.c - version 1.0.3 */
3 /* $FreeBSD: src/games/hack/hack.options.c,v 1.5 1999/11/16 02:57:08 billf Exp $ */
4
5 #include "hack.h"
6
7 static void parseoptions(char *, bool);
8
9 void
10 initoptions(void)
11 {
12         char *opts;
13
14         flags.time = flags.nonews = flags.notombstone = flags.end_own =
15             flags.standout = flags.nonull = FALSE;
16         flags.no_rest_on_space = TRUE;
17         flags.invlet_constant = TRUE;
18         flags.end_top = 5;
19         flags.end_around = 4;
20         flags.female = FALSE;   /* players are usually male */
21
22         if ((opts = getenv("HACKOPTIONS")))
23                 parseoptions(opts,TRUE);
24 }
25
26 static void
27 parseoptions(char *opts, bool from_env)
28 {
29         char *op, *op2;
30         unsigned num;
31         boolean negated;
32
33         if ((op = strchr(opts, ',')) != NULL) {
34                 *op++ = 0;
35                 parseoptions(op, from_env);
36         }
37         if ((op = strchr(opts, ' ')) != NULL) {
38                 op2 = op;
39                 while (*op++)
40                         if (*op != ' ')
41                                 *op2++ = *op;
42         }
43         if (!*opts)
44                 return;
45         negated = FALSE;
46         while ((*opts == '!') || !strncmp(opts, "no", 2)) {
47                 if (*opts == '!')
48                         opts++;
49                 else
50                         opts += 2;
51                 negated = !negated;
52         }
53
54         if (!strncmp(opts, "standout", 8)) {
55                 flags.standout = !negated;
56                 return;
57         }
58
59         if (!strncmp(opts, "null", 3)) {
60                 flags.nonull = negated;
61                 return;
62         }
63
64         if (!strncmp(opts, "tombstone", 4)) {
65                 flags.notombstone = negated;
66                 return;
67         }
68
69         if (!strncmp(opts, "news", 4)) {
70                 flags.nonews = negated;
71                 return;
72         }
73
74         if (!strncmp(opts, "time", 4)) {
75                 flags.time = !negated;
76                 flags.botl = 1;
77                 return;
78         }
79
80         if (!strncmp(opts, "restonspace", 4)) {
81                 flags.no_rest_on_space = negated;
82                 return;
83         }
84
85         if (!strncmp(opts, "fixinv", 4)) {
86                 if (from_env)
87                         flags.invlet_constant = !negated;
88                 else
89                         pline("The fixinvlet option must be in HACKOPTIONS.");
90                 return;
91         }
92
93         if (!strncmp(opts, "male", 4)) {
94                 flags.female = negated;
95                 return;
96         }
97         if (!strncmp(opts, "female", 6)) {
98                 flags.female = !negated;
99                 return;
100         }
101
102         /* name:string */
103         if (!strncmp(opts, "name", 4)) {
104                 if (!from_env) {
105                         pline("The playername can be set only from HACKOPTIONS.");
106                         return;
107                 }
108                 op = strchr(opts, ':');
109                 if (!op)
110                         goto bad;
111                 strncpy(plname, op + 1, sizeof(plname) - 1);
112                 return;
113         }
114
115         /* endgame:5t[op] 5a[round] o[wn] */
116         if (!strncmp(opts, "endgame", 3)) {
117                 op = strchr(opts, ':');
118                 if (!op)
119                         goto bad;
120                 op++;
121                 while (*op) {
122                         num = 1;
123                         if (digit(*op)) {
124                                 num = atoi(op);
125                                 while (digit(*op))
126                                         op++;
127                         } else if (*op == '!') {
128                                 negated = !negated;
129                                 op++;
130                         }
131                         switch (*op) {
132                         case 't':
133                                 flags.end_top = num;
134                                 break;
135                         case 'a':
136                                 flags.end_around = num;
137                                 break;
138                         case 'o':
139                                 flags.end_own = !negated;
140                                 break;
141                         default:
142                                 goto bad;
143                         }
144                         while (letter(*++op))
145                                 ; /* nothing */
146                         if (*op == '/')
147                                 op++;
148                 }
149                 return;
150         }
151 bad:
152         if (!from_env) {
153                 if (!strncmp(opts, "help", 4)) {
154                         pline("%s%s%s",
155                             "To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ",
156                             "give the command 'o' followed by the line `<options>' while playing. ",
157                             "Here <options> is a list of <option>s separated by commas.");
158                         pline("%s%s%s",
159                             "Simple (boolean) options are rest_on_space, news, time, ",
160                             "null, tombstone, (fe)male. ",
161                             "These can be negated by prefixing them with '!' or \"no\".");
162                         pline("%s",
163                             "A string option is name, as in HACKOPTIONS=\"name:Merlin-W\".");
164                         pline("%s%s%s",
165                             "A compound option is endgame; it is followed by a description of what ",
166                             "parts of the scorelist you want to see. You might for example say: ",
167                             "`endgame:own scores/5 top scores/4 around my score'.");
168                         return;
169                 }
170                 pline("Bad option: %s.", opts);
171                 pline("Type `o help<cr>' for help.");
172                 return;
173         }
174         puts("Bad syntax in HACKOPTIONS.");
175         puts("Use for example:");
176         puts("HACKOPTIONS=\"!restonspace,notombstone,endgame:own/5 topscorers/4 around me\"");
177         getret();
178 }
179
180 int
181 doset(void)
182 {
183         char buf[BUFSZ];
184
185         pline("What options do you want to set? ");
186         getlin(buf);
187         if (!buf[0] || buf[0] == '\033') {
188                 strcpy(buf, "HACKOPTIONS=");
189                 strcat(buf, flags.female ? "female," : "male,");
190                 if (flags.standout)
191                         strcat(buf, "standout,");
192                 if (flags.nonull)
193                         strcat(buf, "nonull,");
194                 if (flags.nonews)
195                         strcat(buf, "nonews,");
196                 if (flags.time)
197                         strcat(buf, "time,");
198                 if (flags.notombstone)
199                         strcat(buf, "notombstone,");
200                 if (flags.no_rest_on_space)
201                         strcat(buf, "!rest_on_space,");
202                 if (flags.end_top != 5 || flags.end_around != 4 || flags.end_own) {
203                         sprintf(eos(buf), "endgame: %u topscores/%u around me",
204                             flags.end_top, flags.end_around);
205                         if (flags.end_own)
206                                 strcat(buf, "/own scores");
207                 } else {
208                         char *eop = eos(buf);
209                         if (*--eop == ',')
210                                 *eop = 0;
211                 }
212                 pline("%s", buf);
213         } else
214                 parseoptions(buf, FALSE);
215
216         return (0);
217 }