version 1.4.36b
[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     { "WbWorkArounds2",   "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
75     { NULL,               NULL,"0","0",         NULL        , NULL,0,NNB,  0},\r
76 \r
77 };\r
78 \r
79 \r
80 // functions\r
81 \r
82 // option_is_ok()\r
83 \r
84 bool option_is_ok(const option_list_t *option) {\r
85     if(option->option_nb<0 || option->option_nb>=OptionNb){\r
86         return FALSE;\r
87     }\r
88     return TRUE;\r
89 }\r
90 \r
91 // option_init_pg()\r
92 \r
93 void option_init_pg() {\r
94 \r
95     int i;\r
96     option_t *p=DefaultOptions;\r
97     \r
98     option_init(Option);\r
99     while(p){\r
100         if(p->name){\r
101             option_insert(Option,p);\r
102             p++;\r
103         }else{\r
104             break;\r
105         }\r
106     }\r
107     for(i=0;i<Option->option_nb;i++){\r
108         Option->options[i].value=my_strdup(Option->options[i].default_);\r
109     }\r
110 }\r
111 \r
112 // option_init()\r
113 \r
114 void option_init(option_list_t *option){\r
115     ASSERT(option!=NULL);\r
116     option->option_nb=0;\r
117     option->iter=0;\r
118     memset(option->options,0,sizeof(option->options));\r
119 }\r
120 \r
121 // option_insert()\r
122 \r
123 void option_insert(option_list_t *option, option_t *new_option){\r
124     ASSERT(option!=NULL);\r
125     ASSERT(new_option!=NULL);\r
126     ASSERT(new_option->name!=NULL);\r
127     option_t *opt;\r
128     opt=option_find(option,new_option->name);\r
129     if(!opt){\r
130         opt=&option->options[option->option_nb];\r
131         option->option_nb++;\r
132     }\r
133     int i;\r
134     if(option->option_nb>=OptionNb){\r
135         my_fatal("option_insert(): option list overflow\n");\r
136     }\r
137     if(new_option->name)     my_string_set(&opt->name,     new_option->name);\r
138     if(new_option->value)    my_string_set(&opt->value,    new_option->value);\r
139     if(new_option->min)      my_string_set(&opt->min,      new_option->min);\r
140     if(new_option->max)      my_string_set(&opt->max,      new_option->max);\r
141     if(new_option->default_) my_string_set(&opt->default_, new_option->default_);\r
142     if(new_option->type)     my_string_set(&opt->type,     new_option->type);\r
143     opt->var_nb=new_option->var_nb;\r
144     for(i=0;i<new_option->var_nb;i++){\r
145         my_string_set(&opt->var[i], new_option->var[i]);\r
146     }\r
147     opt->mode=new_option->mode;\r
148 }\r
149 \r
150 // option_set()\r
151 \r
152 bool option_set(option_list_t *option, \r
153                 const char name[], \r
154                 const char value[]) {\r
155 \r
156    option_t * opt;\r
157    ASSERT(option!=NULL);\r
158    ASSERT(name!=NULL);\r
159    ASSERT(value!=NULL);\r
160 \r
161    opt = option_find(option,name);\r
162    if (opt == NULL) return FALSE;\r
163 \r
164    my_string_set(&opt->value,value);\r
165 \r
166    if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
167 \r
168    return TRUE;\r
169 }\r
170 \r
171 // option_set_default()\r
172 \r
173 bool option_set_default(option_list_t *option,\r
174                            const char name[], \r
175                            const char value[]) {\r
176 \r
177    option_t * opt;\r
178    ASSERT(name!=NULL);\r
179    ASSERT(value!=NULL);\r
180 \r
181    opt = option_find(option,name);\r
182    if (opt == NULL) return FALSE;\r
183 \r
184    opt->default_=my_strdup(value);\r
185 \r
186    if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);\r
187 \r
188    return TRUE;\r
189 }\r
190 \r
191 // option_get()\r
192 \r
193 const char * option_get(option_list_t *option, const char name[]) {\r
194 \r
195    option_t * opt;\r
196 \r
197    ASSERT(name!=NULL);\r
198 \r
199    opt = option_find(option,name);\r
200    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
201    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
202 \r
203    return opt->value;\r
204 }\r
205 \r
206 // option_get_default()\r
207 \r
208 const char * option_get_default(option_list_t *option, const char name[]) {\r
209 \r
210    option_t * opt;\r
211 \r
212    ASSERT(name!=NULL);\r
213 \r
214    opt = option_find(option,name);\r
215    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
216 \r
217    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
218 \r
219    return opt->default_;\r
220 }\r
221 \r
222 // option_get_bool()\r
223 \r
224 bool option_get_bool(option_list_t *option, const char name[]) {\r
225 \r
226    const char * value;\r
227 \r
228    value = option_get(option,name);\r
229 \r
230    if (FALSE) {\r
231    } else if (my_string_case_equal(value,"true") || my_string_case_equal(value,"yes") || my_string_equal(value,"1")) {\r
232       return TRUE;\r
233    } else if (my_string_case_equal(value,"false") || my_string_case_equal(value,"no") || my_string_equal(value,"0")) {\r
234       return FALSE;\r
235    }\r
236 \r
237    ASSERT(FALSE);\r
238 \r
239    return FALSE;\r
240 }\r
241 \r
242 \r
243 // option_get_double()\r
244 \r
245 double option_get_double(option_list_t *option, const char name[]) {\r
246 \r
247    const char * value;\r
248 \r
249    value = option_get(option,name);\r
250 \r
251    return atof(value);\r
252 }\r
253 \r
254 // option_get_int()\r
255 \r
256 int option_get_int(option_list_t *option, const char name[]) {\r
257 \r
258    const char * value;\r
259 \r
260    value = option_get(option,name);\r
261 \r
262    return atoi(value);\r
263 }\r
264 \r
265 // option_get_string()\r
266 \r
267 const char * option_get_string(option_list_t *option, const char name[]) {\r
268 \r
269    const char * value;\r
270 \r
271    value = option_get(option,name);\r
272 \r
273    return value;\r
274 }\r
275 \r
276 // option_find()\r
277 \r
278 option_t * option_find(option_list_t *option, const char name[]) {\r
279 \r
280    option_t * opt;\r
281    int i;\r
282 \r
283    ASSERT(name!=NULL);\r
284    for (i=0; i<option->option_nb; i++){\r
285        opt=option->options+i;\r
286        if (my_string_case_equal(opt->name,name)){\r
287            return opt;\r
288        }\r
289    }\r
290    \r
291    return NULL;\r
292 }\r
293 \r
294 void option_start_iter(option_list_t *option){\r
295     option->iter=0;\r
296 }\r
297 \r
298 option_t * option_next(option_list_t *option){\r
299     ASSERT(option->iter<=option->option_nb);\r
300     if(option->iter==option->option_nb){\r
301         return NULL;\r
302     }\r
303     return &option->options[option->iter++];\r
304         \r
305 }\r
306 \r
307 void option_free(option_t *option){\r
308       int i;\r
309       my_string_clear(&option->name);\r
310       my_string_clear(&option->type);\r
311       my_string_clear(&option->min);\r
312       my_string_clear(&option->max);\r
313       my_string_clear(&option->default_);\r
314       my_string_clear(&option->value);\r
315       for(i=0;i<option->var_nb;i++){\r
316          my_string_clear(&option->var[i]);\r
317       }\r
318       option->var_nb=0;\r
319       option->mode=0;\r
320 }\r
321 \r
322 void option_clear(option_list_t *option){\r
323     int i;\r
324     for (i = 0; i < option->option_nb; i++) {\r
325         option_free(option->options+i);\r
326    }\r
327    option->option_nb=0;\r
328 }\r
329 \r
330 // end of option.cpp\r
331 \r