OSDN Git Service

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