Mercurial > hg > early-roguelike
comparison srogue/options.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | 34d7a614855e |
comparison
equal
deleted
inserted
replaced
35:05018c63a721 | 36:2128c7dc8a40 |
---|---|
1 /* | |
2 * This file has all the code for the option command. | |
3 * | |
4 * @(#)options.c 9.0 (rdk) 7/17/84 | |
5 * | |
6 * Super-Rogue | |
7 * Copyright (C) 1984 Robert D. Kindelberger | |
8 * All rights reserved. | |
9 * | |
10 * Based on "Rogue: Exploring the Dungeons of Doom" | |
11 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
12 * All rights reserved. | |
13 * | |
14 * See the file LICENSE.TXT for full copyright and licensing information. | |
15 */ | |
16 | |
17 #include <termios.h> | |
18 #include <ctype.h> | |
19 #include "rogue.h" | |
20 #include "rogue.ext" | |
21 | |
22 extern struct termios terminal; | |
23 | |
24 /* | |
25 * description of an option and what to do with it | |
26 */ | |
27 struct optstruct { | |
28 char *o_name; /* option name */ | |
29 char *o_prompt; /* prompt for interactive entry */ | |
30 char *o_opt; /* pointer to thing to set */ | |
31 }; | |
32 | |
33 typedef struct optstruct OPTION; | |
34 | |
35 int put_str(), get_str(); | |
36 | |
37 OPTION optlist[] = { | |
38 { "name", "Name: ", whoami }, | |
39 { "fruit", "Fruit: ", fruit }, | |
40 { "file", "Save file: ", file_name } | |
41 }; | |
42 #define NUM_OPTS (sizeof optlist / sizeof (OPTION)) | |
43 | |
44 /* | |
45 * print and then set options from the terminal | |
46 */ | |
47 option() | |
48 { | |
49 reg OPTION *op; | |
50 reg int wh; | |
51 | |
52 wclear(hw); | |
53 touchwin(hw); | |
54 /* | |
55 * Display current values of options | |
56 */ | |
57 for (op = optlist; op < &optlist[NUM_OPTS]; op++) { | |
58 wh = op - optlist; | |
59 mvwaddstr(hw, wh, 0, op->o_prompt); | |
60 mvwaddstr(hw, wh, 16, op->o_opt); | |
61 } | |
62 /* | |
63 * Set values | |
64 */ | |
65 wmove(hw, 0, 0); | |
66 for (op = optlist; op < &optlist[NUM_OPTS]; op++) { | |
67 wmove(hw, op - optlist, 16); | |
68 if ((wh = get_str(op->o_opt, hw))) { | |
69 if (wh == QUIT) | |
70 break; | |
71 else if (op > optlist) { | |
72 wmove(hw, op - optlist, 0); | |
73 op -= 2; | |
74 } | |
75 else { | |
76 putchar(7); | |
77 wmove(hw, 0, 0); | |
78 op -= 1; | |
79 } | |
80 } | |
81 } | |
82 /* | |
83 * Switch back to original screen | |
84 */ | |
85 dbotline(hw,spacemsg); | |
86 restscr(cw); | |
87 after = FALSE; | |
88 } | |
89 | |
90 | |
91 /* | |
92 * get_str: | |
93 * Set a string option | |
94 */ | |
95 #define CTRLB 2 | |
96 get_str(opt, awin) | |
97 char *opt; | |
98 WINDOW *awin; | |
99 { | |
100 reg char *sp; | |
101 reg int c, oy, ox; | |
102 char buf[LINLEN]; | |
103 | |
104 draw(awin); | |
105 getyx(awin, oy, ox); | |
106 /* | |
107 * loop reading in the string, and put it in a temporary buffer | |
108 */ | |
109 for (sp = buf; (c=wgetch(awin)) != '\n' && c != '\r' && c != ESCAPE; | |
110 wclrtoeol(awin), draw(awin)) { | |
111 if (( (int)sp - (int)buf ) >= 50) { | |
112 *sp = '\0'; /* line was too long */ | |
113 strucpy(opt,buf,strlen(buf)); | |
114 mvwaddstr(awin, 0, 0, "Name was truncated --More--"); | |
115 wclrtoeol(awin); | |
116 draw(awin); | |
117 wait_for(awin, ' '); | |
118 mvwprintw(awin, 0, 0, "Called: %s",opt); | |
119 draw(awin); | |
120 return NORM; | |
121 } | |
122 if (c == -1) | |
123 continue; | |
124 else if(c == terminal.c_cc[VERASE]) { /* process erase char */ | |
125 if (sp > buf) { | |
126 reg int i; | |
127 | |
128 sp--; | |
129 for (i = strlen(unctrl(*sp)); i; i--) | |
130 waddch(awin, '\b'); | |
131 } | |
132 continue; | |
133 } | |
134 else if (c == terminal.c_cc[VKILL]) { /* process kill character */ | |
135 sp = buf; | |
136 wmove(awin, oy, ox); | |
137 continue; | |
138 } | |
139 else if (sp == buf) { | |
140 if (c == CTRLB) /* CTRL - B */ | |
141 break; | |
142 if (c == '~') { | |
143 strcpy(buf, home); | |
144 waddstr(awin, home); | |
145 sp += strlen(home); | |
146 continue; | |
147 } | |
148 } | |
149 *sp++ = c; | |
150 waddstr(awin, unctrl(c)); | |
151 } | |
152 *sp = '\0'; | |
153 if (sp > buf) /* only change option if something was typed */ | |
154 strucpy(opt, buf, strlen(buf)); | |
155 wmove(awin, oy, ox); | |
156 waddstr(awin, opt); | |
157 waddstr(awin, "\n\r"); | |
158 draw(awin); | |
159 if (awin == cw) | |
160 mpos += sp - buf; | |
161 if (c == CTRLB) | |
162 return MINUS; | |
163 if (c == ESCAPE) | |
164 return QUIT; | |
165 return NORM; | |
166 } | |
167 | |
168 /* | |
169 * parse_opts: | |
170 * Parse options from string, usually taken from the environment. | |
171 * the string is a series of comma seperated values, with strings | |
172 * being "name=....", with the string being defined up to a comma | |
173 * or the end of the entire option string. | |
174 */ | |
175 | |
176 parse_opts(str) | |
177 char *str; | |
178 { | |
179 reg char *sp; | |
180 reg OPTION *op; | |
181 reg int len; | |
182 | |
183 while (*str) { | |
184 for (sp = str; isalpha(*sp); sp++) /* get option name */ | |
185 continue; | |
186 len = sp - str; | |
187 for (op = optlist; op < &optlist[NUM_OPTS]; op++) { | |
188 if (EQSTR(str, op->o_name, len)) { | |
189 reg char *start; | |
190 | |
191 for (str = sp + 1; *str == '='; str++) | |
192 continue; | |
193 if (*str == '~') { | |
194 strcpy(op->o_opt, home); | |
195 start = op->o_opt + strlen(home); | |
196 while (*++str == '/') | |
197 continue; | |
198 } | |
199 else | |
200 start = (char *) op->o_opt; | |
201 for (sp = str + 1; *sp && *sp != ','; sp++) | |
202 continue; | |
203 strucpy(start, str, sp - str); | |
204 } | |
205 } | |
206 /* | |
207 * skip to start of next option name | |
208 */ | |
209 while (*sp && !isalpha(*sp)) | |
210 sp++; | |
211 str = sp; | |
212 } | |
213 } | |
214 | |
215 /* | |
216 * copy string using unctrl for things | |
217 */ | |
218 strucpy(s1, s2, len) | |
219 char *s1, *s2; | |
220 int len; | |
221 { | |
222 reg char *sp; | |
223 | |
224 while (len-- > 0) { | |
225 strcpy(s1, (sp = unctrl(*s2))); | |
226 s1 += strlen(sp); | |
227 s2++; | |
228 } | |
229 *s1 = '\0'; | |
230 } |