OSDN Git Service

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