Check in polyglot-1.4w10UCIb15
[polyglot.git] / option.cpp
1 \r
2 // option.cpp\r
3 \r
4 // includes\r
5 \r
6 #include <cstdlib>\r
7 #include <cstring>\r
8 \r
9 #include "option.h"\r
10 #include "util.h"\r
11 \r
12 // constants\r
13 \r
14 static const bool UseDebug = false;\r
15 \r
16 // types\r
17 \r
18 struct option_t {\r
19    const char * var;\r
20    const char * val;\r
21 };\r
22 \r
23 // variables\r
24 \r
25 static option_t Option[] = {\r
26 \r
27    { "OptionFile",    NULL, }, // string\r
28 \r
29    // options\r
30 \r
31    { "EngineName",    NULL, }, // string\r
32    { "EngineDir",     NULL, }, // string\r
33    { "EngineCommand", NULL, }, // string\r
34 \r
35    { "Log",           NULL, }, // true/false\r
36    { "LogFile",       NULL, }, // string\r
37 \r
38    { "UCI",           NULL, }, // true/false\r
39 \r
40    { "UseNice",       NULL, }, // true/false\r
41 \r
42    { "NiceValue",     NULL, }, // true/false\r
43 \r
44    { "Chess960",      NULL, }, // true/false\r
45 \r
46    { "Resign",        NULL, }, // true/false\r
47    { "ResignMoves",   NULL, }, // move number\r
48    { "ResignScore",   NULL, }, // centipawns\r
49 \r
50    { "MateScore",     NULL, }, // centipawns\r
51 \r
52    { "Book",          NULL, }, // true/false\r
53    { "BookFile",      NULL, }, // string\r
54 \r
55    { "BookRandom",    NULL, }, // true/false\r
56    { "BookLearn",     NULL, }, // true/false\r
57 \r
58    { "KibitzMove",    NULL, }, // true/false\r
59    { "KibitzPV",      NULL, }, // true/false\r
60 \r
61    { "KibitzCommand", NULL, }, // string\r
62    { "KibitzDelay",   NULL, }, // seconds\r
63 \r
64    { "ShowPonder",    NULL, }, // true/false\r
65 \r
66    // work-arounds\r
67 \r
68    { "UCIVersion",    NULL, }, // 1-\r
69    { "CanPonder",     NULL, }, // true/false\r
70    { "SyncStop",      NULL, }, // true/false\r
71    { "Affinity",          NULL, }, // -1 else 0-32 //won't do much on *nix systems\r
72    { "RepeatPV",          NULL, },\r
73    { "PromoteWorkAround", NULL, }, // true/false\r
74 \r
75    // { "",              NULL, },\r
76 \r
77    { NULL,            NULL, },\r
78 };\r
79 \r
80 // prototypes\r
81 \r
82 static option_t * option_find (const char var[]);\r
83 \r
84 // functions\r
85 \r
86 // option_init()\r
87 \r
88 void option_init() {\r
89 \r
90    option_set("OptionFile","polyglot.ini");\r
91 \r
92    // options\r
93 \r
94    option_set("EngineName","<empty>");\r
95    option_set("EngineDir",".");\r
96    option_set("EngineCommand","<empty>");\r
97 \r
98    option_set("Log","false");\r
99    option_set("LogFile","polyglot.log");\r
100 \r
101    option_set("UCI","false");\r
102 \r
103    option_set("UseNice","false");\r
104    option_set("NiceValue","5");\r
105    \r
106    option_set("Chess960","false");\r
107 \r
108    option_set("Resign","false");\r
109    option_set("ResignMoves","3");\r
110    option_set("ResignScore","600");\r
111 \r
112    option_set("MateScore","10000");\r
113 \r
114    option_set("Book","false");\r
115    option_set("BookFile","book.bin");\r
116 \r
117    option_set("BookRandom","true");\r
118    option_set("BookLearn","false");\r
119 \r
120    option_set("KibitzMove","false");\r
121    option_set("KibitzPV","false");\r
122 \r
123    option_set("KibitzCommand","tellall");\r
124    option_set("KibitzDelay","5");\r
125 \r
126    option_set("ShowPonder","true");\r
127 \r
128    // work-arounds\r
129 \r
130    option_set("UCIVersion","2");\r
131    option_set("CanPonder","false");\r
132    option_set("SyncStop","false");\r
133    option_set("Affinity","-1");\r
134    option_set("PromoteWorkAround","false");\r
135    option_set("RepeatPV","true");\r
136    // option_set("","");\r
137 }\r
138 \r
139 // option_set()\r
140 \r
141 bool option_set(const char var[], const char val[]) {\r
142 \r
143    option_t * opt;\r
144 \r
145    ASSERT(var!=NULL);\r
146    ASSERT(val!=NULL);\r
147 \r
148    opt = option_find(var);\r
149    if (opt == NULL) return false;\r
150 \r
151    my_string_set(&opt->val,val);\r
152 \r
153    if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->var,opt->val);\r
154 \r
155    return true;\r
156 }\r
157 \r
158 // option_get()\r
159 \r
160 const char * option_get(const char var[]) {\r
161 \r
162    option_t * opt;\r
163 \r
164    ASSERT(var!=NULL);\r
165 \r
166    opt = option_find(var);\r
167    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",var);\r
168 \r
169    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->var,opt->val);\r
170 \r
171    return opt->val;\r
172 }\r
173 \r
174 // option_get_bool()\r
175 \r
176 bool option_get_bool(const char var[]) {\r
177 \r
178    const char * val;\r
179 \r
180    val = option_get(var);\r
181 \r
182    if (false) {\r
183    } else if (my_string_case_equal(val,"true") || my_string_case_equal(val,"yes") || my_string_equal(val,"1")) {\r
184       return true;\r
185    } else if (my_string_case_equal(val,"false") || my_string_case_equal(val,"no") || my_string_equal(val,"0")) {\r
186       return false;\r
187    }\r
188 \r
189    ASSERT(false);\r
190 \r
191    return false;\r
192 }\r
193 \r
194 // option_get_double()\r
195 \r
196 double option_get_double(const char var[]) {\r
197 \r
198    const char * val;\r
199 \r
200    val = option_get(var);\r
201 \r
202    return atof(val);\r
203 }\r
204 \r
205 // option_get_int()\r
206 \r
207 int option_get_int(const char var[]) {\r
208 \r
209    const char * val;\r
210 \r
211    val = option_get(var);\r
212 \r
213    return atoi(val);\r
214 }\r
215 \r
216 // option_get_string()\r
217 \r
218 const char * option_get_string(const char var[]) {\r
219 \r
220    const char * val;\r
221 \r
222    val = option_get(var);\r
223 \r
224    return val;\r
225 }\r
226 \r
227 // option_find()\r
228 \r
229 static option_t * option_find(const char var[]) {\r
230 \r
231    option_t * opt;\r
232 \r
233    ASSERT(var!=NULL);\r
234 \r
235    for (opt = &Option[0]; opt->var != NULL; opt++) {\r
236       if (my_string_case_equal(opt->var,var)) return opt;\r
237    }\r
238 \r
239    return NULL;\r
240 }\r
241 \r
242 // end of option.cpp\r
243 \r