version 1.4.35b
[polyglot.git] / option.c
1 \r
2 // option.c\r
3 \r
4 // includes\r
5 \r
6 #include <stdlib.h>\r
7 #include <string.h>\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 \r
17 // variables\r
18 \r
19 #define NNB { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }\r
20 \r
21 option_list_t Option[1];\r
22 \r
23 option_t DefaultOptions[] = {    \r
24     { "OptionFile",       "string","0","0",     "polyglot.ini", NULL,0,NNB,  PG}, \r
25 \r
26    // options\r
27 \r
28     { "EngineName",       "string","0","0",     "<empty>"   , NULL,0,NNB,  PG}, \r
29     { "EngineDir",        "string","0","0",     "."         , NULL,0,NNB,  PG}, \r
30     { "EngineCommand",    "string","0","0",     "<empty>"   , NULL,0,NNB,  PG}, \r
31 \r
32     { "Log",              "check","0","0",     "false"      , NULL,0,NNB,  PG|XBOARD|UCI}, \r
33     { "LogFile",          "string","0","0",     "polyglot.log", NULL,0,NNB,  PG|XBOARD|UCI}, \r
34 \r
35     { "UCI",              "check","0","0",      "false"     , NULL,0,NNB,  PG}, \r
36 \r
37     { "UseNice",          "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD|UCI}, \r
38     { "NiceValue",        "spin", "0","20",     "5"         , NULL,0,NNB,  PG|XBOARD|UCI}, \r
39 \r
40     { "Chess960",         "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
41 \r
42     { "Resign",           "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
43     { "ResignMoves",      "spin","0","10000",    "3"        , NULL,0,NNB,  PG|XBOARD}, \r
44     { "ResignScore",      "spin","0","10000",   "600"       , NULL,0,NNB,  PG|XBOARD}, \r
45 \r
46     { "MateScore",        "spin","0","1000000", "10000"     , NULL,0,NNB,  PG|XBOARD}, \r
47 \r
48     { "Book",             "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD|UCI}, \r
49     { "BookFile",         "string","0","0",     "book.bin"  , NULL,0,NNB,  PG|XBOARD|UCI}, \r
50 \r
51     { "BookRandom",       "check","0","0",      "true"      , NULL,0,NNB,  PG|XBOARD|UCI}, \r
52     { "BookLearn",        "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
53 \r
54     { "KibitzMove",       "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
55     { "KibitzPV",         "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
56 \r
57     { "KibitzCommand",    "string","0","0",     "tellall"   , NULL,0,NNB,  PG|XBOARD}, \r
58     { "KibitzDelay",      "spin","0","10000",  "5"         , NULL,0,NNB,  PG|XBOARD}, \r
59     { "KibitzInterval",   "spin","0","10000",  "0"         , NULL,0,NNB,  PG|XBOARD}, \r
60 \r
61     { "ShowPonder",       "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
62     { "ScoreWhite",       "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
63 \r
64    // work-arounds\r
65 \r
66     { "UCIVersion",       "spin","1","2",       "2"         , NULL,0,NNB,  PG|XBOARD}, \r
67     { "CanPonder",        "check","1","2",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
68     { "SyncStop",         "check","1","2",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
69     { "Affinity",         "spin","-1","32",     "-1"        , NULL,0,NNB,  PG}, \r
70     { "RepeatPV",         "check","0","0",      "true"     , NULL,0,NNB,  PG|XBOARD},\r
71     { "PromoteWorkAround","check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
72 \r
73     { "WbWorkArounds",    "check","0","0",      "true"     , NULL,0,NNB,  PG|XBOARD}, \r
74     { NULL,               NULL,"0","0",         NULL        , NULL,0,NNB,  0},\r
75 \r
76 };\r
77 \r
78 \r
79 // functions\r
80 \r
81 // option_is_ok()\r
82 \r
83 bool option_is_ok(const option_list_t *option) {\r
84     if(option->option_nb<0 || option->option_nb>=OptionNb){\r
85         return FALSE;\r
86     }\r
87     return TRUE;\r
88 }\r
89 \r
90 // option_init_pg()\r
91 \r
92 void option_init_pg() {\r
93 \r
94     int i;\r
95     option_t *p=DefaultOptions;\r
96     \r
97     option_init(Option);\r
98     while(p){\r
99         if(p->name){\r
100             option_insert(Option,p);\r
101             p++;\r
102         }else{\r
103             break;\r
104         }\r
105     }\r
106     for(i=0;i<Option->option_nb;i++){\r
107         Option->options[i].value=my_strdup(Option->options[i].default_);\r
108     }\r
109 }\r
110 \r
111 // option_init()\r
112 \r
113 void option_init(option_list_t *option){\r
114     ASSERT(option!=NULL);\r
115     option->option_nb=0;\r
116     option->iter=0;\r
117     memset(option->options,0,sizeof(option->options));\r
118 }\r
119 \r
120 // option_insert()\r
121 \r
122 void option_insert(option_list_t *option, option_t *new_option){\r
123     ASSERT(option!=NULL);\r
124     ASSERT(new_option!=NULL);\r
125     ASSERT(new_option->name!=NULL);\r
126     option_t *opt;\r
127     opt=option_find(option,new_option->name);\r
128     if(!opt){\r
129         opt=&option->options[option->option_nb];\r
130         option->option_nb++;\r
131     }\r
132     int i;\r
133     if(option->option_nb>=OptionNb){\r
134         my_fatal("option_insert(): option list overflow\n");\r
135     }\r
136     if(new_option->name)     my_string_set(&opt->name,     new_option->name);\r
137     if(new_option->value)    my_string_set(&opt->value,    new_option->value);\r
138     if(new_option->min)      my_string_set(&opt->min,      new_option->min);\r
139     if(new_option->max)      my_string_set(&opt->max,      new_option->max);\r
140     if(new_option->default_) my_string_set(&opt->default_, new_option->default_);\r
141     if(new_option->type)     my_string_set(&opt->type,     new_option->type);\r
142     opt->var_nb=new_option->var_nb;\r
143     for(i=0;i<new_option->var_nb;i++){\r
144         my_string_set(&opt->var[i], new_option->var[i]);\r
145     }\r
146     opt->mode=new_option->mode;\r
147 }\r
148 \r
149 // option_set()\r
150 \r
151 bool option_set(option_list_t *option, \r
152                 const char name[], \r
153                 const char value[]) {\r
154 \r
155    option_t * opt;\r
156    ASSERT(option!=NULL);\r
157    ASSERT(name!=NULL);\r
158    ASSERT(value!=NULL);\r
159 \r
160    opt = option_find(option,name);\r
161    if (opt == NULL) return FALSE;\r
162 \r
163    my_string_set(&opt->value,value);\r
164 \r
165    if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
166 \r
167    return TRUE;\r
168 }\r
169 \r
170 // option_set_default()\r
171 \r
172 bool option_set_default(option_list_t *option,\r
173                            const char name[], \r
174                            const char value[]) {\r
175 \r
176    option_t * opt;\r
177    ASSERT(name!=NULL);\r
178    ASSERT(value!=NULL);\r
179 \r
180    opt = option_find(option,name);\r
181    if (opt == NULL) return FALSE;\r
182 \r
183    opt->default_=my_strdup(value);\r
184 \r
185    if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);\r
186 \r
187    return TRUE;\r
188 }\r
189 \r
190 // option_get()\r
191 \r
192 const char * option_get(option_list_t *option, const char name[]) {\r
193 \r
194    option_t * opt;\r
195 \r
196    ASSERT(name!=NULL);\r
197 \r
198    opt = option_find(option,name);\r
199    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
200    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
201 \r
202    return opt->value;\r
203 }\r
204 \r
205 // option_get_default()\r
206 \r
207 const char * option_get_default(option_list_t *option, const char name[]) {\r
208 \r
209    option_t * opt;\r
210 \r
211    ASSERT(name!=NULL);\r
212 \r
213    opt = option_find(option,name);\r
214    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
215 \r
216    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
217 \r
218    return opt->default_;\r
219 }\r
220 \r
221 // option_get_bool()\r
222 \r
223 bool option_get_bool(option_list_t *option, const char name[]) {\r
224 \r
225    const char * value;\r
226 \r
227    value = option_get(option,name);\r
228 \r
229    if (FALSE) {\r
230    } else if (my_string_case_equal(value,"true") || my_string_case_equal(value,"yes") || my_string_equal(value,"1")) {\r
231       return TRUE;\r
232    } else if (my_string_case_equal(value,"false") || my_string_case_equal(value,"no") || my_string_equal(value,"0")) {\r
233       return FALSE;\r
234    }\r
235 \r
236    ASSERT(FALSE);\r
237 \r
238    return FALSE;\r
239 }\r
240 \r
241 \r
242 // option_get_double()\r
243 \r
244 double option_get_double(option_list_t *option, const char name[]) {\r
245 \r
246    const char * value;\r
247 \r
248    value = option_get(option,name);\r
249 \r
250    return atof(value);\r
251 }\r
252 \r
253 // option_get_int()\r
254 \r
255 int option_get_int(option_list_t *option, const char name[]) {\r
256 \r
257    const char * value;\r
258 \r
259    value = option_get(option,name);\r
260 \r
261    return atoi(value);\r
262 }\r
263 \r
264 // option_get_string()\r
265 \r
266 const char * option_get_string(option_list_t *option, const char name[]) {\r
267 \r
268    const char * value;\r
269 \r
270    value = option_get(option,name);\r
271 \r
272    return value;\r
273 }\r
274 \r
275 // option_find()\r
276 \r
277 option_t * option_find(option_list_t *option, const char name[]) {\r
278 \r
279    option_t * opt;\r
280    int i;\r
281 \r
282    ASSERT(name!=NULL);\r
283    for (i=0; i<option->option_nb; i++){\r
284        opt=option->options+i;\r
285        if (my_string_case_equal(opt->name,name)){\r
286            return opt;\r
287        }\r
288    }\r
289    \r
290    return NULL;\r
291 }\r
292 \r
293 void option_start_iter(option_list_t *option){\r
294     option->iter=0;\r
295 }\r
296 \r
297 option_t * option_next(option_list_t *option){\r
298     ASSERT(option->iter<=option->option_nb);\r
299     if(option->iter==option->option_nb){\r
300         return NULL;\r
301     }\r
302     return &option->options[option->iter++];\r
303         \r
304 }\r
305 \r
306 void option_free(option_t *option){\r
307       int i;\r
308       my_string_clear(&option->name);\r
309       my_string_clear(&option->type);\r
310       my_string_clear(&option->min);\r
311       my_string_clear(&option->max);\r
312       my_string_clear(&option->default_);\r
313       my_string_clear(&option->value);\r
314       for(i=0;i<option->var_nb;i++){\r
315          my_string_clear(&option->var[i]);\r
316       }\r
317       option->var_nb=0;\r
318       option->mode=0;\r
319 }\r
320 \r
321 void option_clear(option_list_t *option){\r
322     int i;\r
323     for (i = 0; i < option->option_nb; i++) {\r
324         option_free(option->options+i);\r
325    }\r
326    option->option_nb=0;\r
327 }\r
328 \r
329 // end of option.cpp\r
330 \r