OSDN Git Service

Merge pull request #3845 from dis-/feature/refactor-save-floors
[hengbandforosx/hengbandosx.git] / src / io / pref-file-expressor.cpp
1 #include "io/pref-file-expressor.h"
2 #include "game-option/runtime-arguments.h"
3 #include "player-info/class-info.h"
4 #include "player-info/race-info.h"
5 #include "realm/realm-names-table.h"
6 #include "system/player-type-definition.h"
7 #include "system/system-variables.h"
8 #include "term/z-form.h"
9 #include "util/string-processor.h"
10
11 /*!
12  * @brief process_pref_fileのサブルーチンとして条件分岐処理の解釈と結果を返す
13  * Helper function for "process_pref_file()"
14  * @param player_ptr プレイヤーへの参照ポインタ
15  * @param sp テキスト文字列の参照ポインタ
16  * @param fp 再帰中のポインタ参照
17  * @return
18  * @details
19  * かなり長いが、エンバグすると非常に危険な関数なので一旦放置する
20  * <pre>
21  * Input:
22  *   v: output buffer array
23  *   f: final character
24  * Output:
25  *   result
26  * </pre>
27  */
28 concptr process_pref_file_expr(PlayerType *player_ptr, char **sp, char *fp)
29 {
30     char *s;
31     s = (*sp);
32     while (iswspace(*s)) {
33         s++;
34     }
35
36     char *b;
37     b = s;
38
39     concptr v = "?o?o?";
40
41     char b1 = '[';
42     char b2 = ']';
43     char f = ' ';
44     static char tmp[16];
45     if (*s == b1) {
46         concptr p;
47         concptr t;
48
49         /* Skip b1 */
50         s++;
51
52         /* First */
53         t = process_pref_file_expr(player_ptr, &s, &f);
54
55         if (!*t) {
56         } else if (streq(t, "IOR")) {
57             v = "0";
58             while (*s && (f != b2)) {
59                 t = process_pref_file_expr(player_ptr, &s, &f);
60                 if (*t && !streq(t, "0")) {
61                     v = "1";
62                 }
63             }
64         } else if (streq(t, "AND")) {
65             v = "1";
66             while (*s && (f != b2)) {
67                 t = process_pref_file_expr(player_ptr, &s, &f);
68                 if (*t && streq(t, "0")) {
69                     v = "0";
70                 }
71             }
72         } else if (streq(t, "NOT")) {
73             v = "1";
74             while (*s && (f != b2)) {
75                 t = process_pref_file_expr(player_ptr, &s, &f);
76                 if (*t && streq(t, "1")) {
77                     v = "0";
78                 }
79             }
80         } else if (streq(t, "EQU")) {
81             v = "0";
82             if (*s && (f != b2)) {
83                 t = process_pref_file_expr(player_ptr, &s, &f);
84             }
85             while (*s && (f != b2)) {
86                 p = process_pref_file_expr(player_ptr, &s, &f);
87                 if (streq(t, p)) {
88                     v = "1";
89                 }
90             }
91         } else if (streq(t, "LEQ")) {
92             v = "1";
93             if (*s && (f != b2)) {
94                 t = process_pref_file_expr(player_ptr, &s, &f);
95             }
96             while (*s && (f != b2)) {
97                 p = t;
98                 t = process_pref_file_expr(player_ptr, &s, &f);
99                 if (*t && atoi(p) > atoi(t)) {
100                     v = "0";
101                 }
102             }
103         } else if (streq(t, "GEQ")) {
104             v = "1";
105             if (*s && (f != b2)) {
106                 t = process_pref_file_expr(player_ptr, &s, &f);
107             }
108             while (*s && (f != b2)) {
109                 p = t;
110                 t = process_pref_file_expr(player_ptr, &s, &f);
111                 if (*t && atoi(p) < atoi(t)) {
112                     v = "0";
113                 }
114             }
115         } else {
116             while (*s && (f != b2)) {
117                 t = process_pref_file_expr(player_ptr, &s, &f);
118             }
119         }
120
121         if (f != b2) {
122             v = "?x?x?";
123         }
124
125         if ((f = *s) != '\0') {
126             *s++ = '\0';
127         }
128
129         *fp = f;
130         *sp = s;
131         return v;
132     }
133
134     /* Accept all printables except spaces and brackets */
135 #ifdef JP
136     while (iskanji(*s) || (isprint(*s) && !angband_strchr(" []", *s))) {
137         if (iskanji(*s)) {
138             s++;
139         }
140         s++;
141     }
142 #else
143     while (isprint(*s) && !angband_strchr(" []", *s)) {
144         ++s;
145     }
146 #endif
147
148     if ((f = *s) != '\0') {
149         *s++ = '\0';
150     }
151
152     if (*b != '$') {
153         v = b;
154         *fp = f;
155         *sp = s;
156         return v;
157     }
158
159     if (streq(b + 1, "SYS")) {
160         v = ANGBAND_SYS;
161     } else if (streq(b + 1, "KEYBOARD")) {
162         v = ANGBAND_KEYBOARD;
163     } else if (streq(b + 1, "GRAF")) {
164         v = ANGBAND_GRAF;
165     } else if (streq(b + 1, "MONOCHROME")) {
166         if (arg_monochrome) {
167             v = "ON";
168         } else {
169             v = "OFF";
170         }
171     } else if (streq(b + 1, "RACE")) {
172 #ifdef JP
173         v = rp_ptr->E_title;
174 #else
175         v = rp_ptr->title;
176 #endif
177     } else if (streq(b + 1, "CLASS")) {
178 #ifdef JP
179         v = cp_ptr->E_title;
180 #else
181         v = cp_ptr->title;
182 #endif
183     } else if (streq(b + 1, "PLAYER")) {
184         static char tmp_player_name[32];
185         char *pn, *tpn;
186         for (pn = player_ptr->name, tpn = tmp_player_name; *pn; pn++, tpn++) {
187 #ifdef JP
188             if (iskanji(*pn)) {
189                 *(tpn++) = *(pn++);
190                 *tpn = *pn;
191                 continue;
192             }
193 #endif
194             *tpn = angband_strchr(" []", *pn) ? '_' : *pn;
195         }
196
197         *tpn = '\0';
198         v = tmp_player_name;
199     } else if (streq(b + 1, "REALM1")) {
200 #ifdef JP
201         v = E_realm_names[player_ptr->realm1];
202 #else
203         v = realm_names[player_ptr->realm1];
204 #endif
205     } else if (streq(b + 1, "REALM2")) {
206 #ifdef JP
207         v = E_realm_names[player_ptr->realm2];
208 #else
209         v = realm_names[player_ptr->realm2];
210 #endif
211     } else if (streq(b + 1, "LEVEL")) {
212         strnfmt(tmp, sizeof(tmp), "%02d", player_ptr->lev);
213         v = tmp;
214     } else if (streq(b + 1, "AUTOREGISTER")) {
215         if (player_ptr->autopick_autoregister) {
216             v = "1";
217         } else {
218             v = "0";
219         }
220     } else if (streq(b + 1, "MONEY")) {
221         strnfmt(tmp, sizeof(tmp), "%09ld", (long int)player_ptr->au);
222         v = tmp;
223     }
224
225     *fp = f;
226     *sp = s;
227     return v;
228 }