OSDN Git Service

Merge pull request #1510 from habu1010/feature/refactor-smith-info-class
[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(player_type *player_ptr, char **sp, char *fp)
28 {
29     char *s;
30     s = (*sp);
31     while (iswspace(*s))
32         s++;
33
34     char *b;
35     b = s;
36
37     concptr v = "?o?o?";
38
39     char b1 = '[';
40     char b2 = ']';
41     char f = ' ';
42     static char tmp[16];
43     if (*s == b1) {
44         concptr p;
45         concptr t;
46
47         /* Skip b1 */
48         s++;
49
50         /* First */
51         t = process_pref_file_expr(player_ptr, &s, &f);
52
53         if (!*t) {
54         } else if (streq(t, "IOR")) {
55             v = "0";
56             while (*s && (f != b2)) {
57                 t = process_pref_file_expr(player_ptr, &s, &f);
58                 if (*t && !streq(t, "0"))
59                     v = "1";
60             }
61         } else if (streq(t, "AND")) {
62             v = "1";
63             while (*s && (f != b2)) {
64                 t = process_pref_file_expr(player_ptr, &s, &f);
65                 if (*t && streq(t, "0"))
66                     v = "0";
67             }
68         } else if (streq(t, "NOT")) {
69             v = "1";
70             while (*s && (f != b2)) {
71                 t = process_pref_file_expr(player_ptr, &s, &f);
72                 if (*t && streq(t, "1"))
73                     v = "0";
74             }
75         } else if (streq(t, "EQU")) {
76             v = "0";
77             if (*s && (f != b2)) {
78                 t = process_pref_file_expr(player_ptr, &s, &f);
79             }
80             while (*s && (f != b2)) {
81                 p = process_pref_file_expr(player_ptr, &s, &f);
82                 if (streq(t, p))
83                     v = "1";
84             }
85         } else if (streq(t, "LEQ")) {
86             v = "1";
87             if (*s && (f != b2)) {
88                 t = process_pref_file_expr(player_ptr, &s, &f);
89             }
90             while (*s && (f != b2)) {
91                 p = t;
92                 t = process_pref_file_expr(player_ptr, &s, &f);
93                 if (*t && atoi(p) > atoi(t))
94                     v = "0";
95             }
96         } else if (streq(t, "GEQ")) {
97             v = "1";
98             if (*s && (f != b2)) {
99                 t = process_pref_file_expr(player_ptr, &s, &f);
100             }
101             while (*s && (f != b2)) {
102                 p = t;
103                 t = process_pref_file_expr(player_ptr, &s, &f);
104                 if (*t && atoi(p) < atoi(t))
105                     v = "0";
106             }
107         } else {
108             while (*s && (f != b2)) {
109                 t = process_pref_file_expr(player_ptr, &s, &f);
110             }
111         }
112
113         if (f != b2)
114             v = "?x?x?";
115
116         if ((f = *s) != '\0')
117             *s++ = '\0';
118
119         *fp = f;
120         *sp = s;
121         return v;
122     }
123
124     /* Accept all printables except spaces and brackets */
125 #ifdef JP
126     while (iskanji(*s) || (isprint(*s) && !angband_strchr(" []", *s))) {
127         if (iskanji(*s))
128             s++;
129         s++;
130     }
131 #else
132     while (isprint(*s) && !angband_strchr(" []", *s))
133         ++s;
134 #endif
135
136     if ((f = *s) != '\0')
137         *s++ = '\0';
138
139     if (*b != '$') {
140         v = b;
141         *fp = f;
142         *sp = s;
143         return v;
144     }
145
146     if (streq(b + 1, "SYS")) {
147         v = ANGBAND_SYS;
148     } else if (streq(b + 1, "KEYBOARD")) {
149         v = ANGBAND_KEYBOARD;
150     } else if (streq(b + 1, "GRAF")) {
151         v = ANGBAND_GRAF;
152     } else if (streq(b + 1, "MONOCHROME")) {
153         if (arg_monochrome)
154             v = "ON";
155         else
156             v = "OFF";
157     } else if (streq(b + 1, "RACE")) {
158 #ifdef JP
159         v = rp_ptr->E_title;
160 #else
161         v = rp_ptr->title;
162 #endif
163     } else if (streq(b + 1, "CLASS")) {
164 #ifdef JP
165         v = cp_ptr->E_title;
166 #else
167         v = cp_ptr->title;
168 #endif
169     } else if (streq(b + 1, "PLAYER")) {
170         static char tmp_player_name[32];
171         char *pn, *tpn;
172         for (pn = player_ptr->name, tpn = tmp_player_name; *pn; pn++, tpn++) {
173 #ifdef JP
174             if (iskanji(*pn)) {
175                 *(tpn++) = *(pn++);
176                 *tpn = *pn;
177                 continue;
178             }
179 #endif
180             *tpn = angband_strchr(" []", *pn) ? '_' : *pn;
181         }
182
183         *tpn = '\0';
184         v = tmp_player_name;
185     } else if (streq(b + 1, "REALM1")) {
186 #ifdef JP
187         v = E_realm_names[player_ptr->realm1];
188 #else
189         v = realm_names[player_ptr->realm1];
190 #endif
191     } else if (streq(b + 1, "REALM2")) {
192 #ifdef JP
193         v = E_realm_names[player_ptr->realm2];
194 #else
195         v = realm_names[player_ptr->realm2];
196 #endif
197     } else if (streq(b + 1, "LEVEL")) {
198         sprintf(tmp, "%02d", player_ptr->lev);
199         v = tmp;
200     } else if (streq(b + 1, "AUTOREGISTER")) {
201         if (player_ptr->autopick_autoregister)
202             v = "1";
203         else
204             v = "0";
205     } else if (streq(b + 1, "MONEY")) {
206         sprintf(tmp, "%09ld", (long int)player_ptr->au);
207         v = tmp;
208     }
209
210     *fp = f;
211     *sp = s;
212     return v;
213 }