15 #define NNB { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }
\r
19 static const bool UseDebug = FALSE;
\r
20 static const int StringSize = 4096;
\r
25 option_list_t Option[1];
\r
27 option_t DefaultOptions[] = {
\r
30 { "SettingsFile", "file","0","0", "polyglot.ini", NULL,0,NNB, PG|XBOARD|XBSEL},
\r
32 { "SettingsDir", "path","0","0", "<empty>" , NULL,0,NNB, PG},
\r
34 { "OnlyWbOptions", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},
\r
36 { "EngineName", "string","0","0", "<empty>" , NULL,0,NNB, PG},
\r
37 { "EngineDir", "path","0","0", "." , NULL,0,NNB, PG},
\r
38 { "EngineCommand", "string","0","0", "<empty>" , NULL,0,NNB, PG},
\r
40 { "Log", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
\r
41 { "LogFile", "file","0","0", "polyglot.log", NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
\r
43 { "UCI", "check","0","0", "false" , NULL,0,NNB, PG},
\r
45 { "UseNice", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|UCI},
\r
46 { "NiceValue", "spin", "0","20", "5" , NULL,0,NNB, PG|XBOARD|UCI},
\r
48 { "Resign", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
\r
49 { "ResignMoves", "spin","0","10000", "3" , NULL,0,NNB, PG|XBOARD|XBSEL},
\r
50 { "ResignScore", "spin","0","10000", "600" , NULL,0,NNB, PG|XBOARD|XBSEL},
\r
52 { "MateScore", "spin","0","100000", "10000" , NULL,0,NNB, PG|XBOARD},
\r
54 { "Book", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
\r
55 { "BookFile", "file","0","0", "book.bin" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
\r
57 { "BookRandom", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
\r
58 { "BookDepth", "spin","0","256", "256" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
\r
59 { "BookTreshold", "spin","0","1000", "5" , NULL,0,NNB, PG|XBOARD|UCI},
\r
60 { "BookLearn", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
\r
62 { "KibitzMove", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
\r
63 { "KibitzPV", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
\r
65 { "KibitzCommand", "string","0","0", "tellall" , NULL,0,NNB, PG|XBOARD},
\r
66 { "KibitzDelay", "spin","0","1000", "5" , NULL,0,NNB, PG|XBOARD},
\r
67 { "KibitzInterval", "spin","0","1000", "0" , NULL,0,NNB, PG|XBOARD},
\r
69 { "ShowPonder", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},
\r
70 { "ScoreWhite", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
\r
74 { "UCIVersion", "spin","1","2", "2" , NULL,0,NNB, PG|XBOARD},
\r
75 { "CanPonder", "check","1","2", "false" , NULL,0,NNB, PG|XBOARD},
\r
76 { "SyncStop", "check","1","2", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
\r
77 { "Affinity", "spin","-1","32", "-1" , NULL,0,NNB, PG},
\r
78 { "RepeatPV", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},
\r
79 { "PromoteWorkAround","check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
\r
83 { "Chess960", "check","0","0", "false" , NULL,0,NNB, PG},
\r
85 // These options flag various hacks in the source to work around
\r
86 // WB quirks. They will eventually all be set to false. Probably
\r
89 { "WbWorkArounds", "check","0","0", "true" , NULL,0,NNB, PG},
\r
90 { "WbWorkArounds2", "check","0","0", "false" , NULL,0,NNB, PG},
\r
91 { "WbWorkArounds3", "check","0","0", "true" , NULL,0,NNB, PG},
\r
95 { "Save", "save","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
\r
99 { NULL, NULL,"0","0", NULL , NULL,0,NNB, 0},
\r
108 bool option_is_ok(const option_list_t *option) {
\r
109 if(option->option_nb<0 || option->option_nb>=OptionNb){
\r
115 // option_init_pg()
\r
117 void option_init_pg() {
\r
120 option_t *p=DefaultOptions;
\r
122 char SettingsDir[StringSize];
\r
124 option_init(Option);
\r
127 option_insert(Option,p);
\r
133 for(i=0;i<Option->option_nb;i++){
\r
134 Option->options[i].value=my_strdup(Option->options[i].default_);
\r
137 home_dir=getenv("HOME");
\r
141 snprintf(SettingsDir,sizeof(SettingsDir),"%s/.polyglot",home_dir);
\r
142 SettingsDir[sizeof(SettingsDir)-1]='\0';
\r
144 sprintf(SettingsDir,".\\_PG");
\r
146 option_set(Option,"SettingsDir",SettingsDir);
\r
147 option_set_default(Option,"SettingsDir",SettingsDir);
\r
152 void option_init(option_list_t *option){
\r
153 ASSERT(option!=NULL);
\r
154 option->option_nb=0;
\r
156 memset(option->options,0,sizeof(option->options));
\r
161 void option_insert(option_list_t *option, option_t *new_option){
\r
164 ASSERT(option!=NULL);
\r
165 ASSERT(new_option!=NULL);
\r
166 ASSERT(new_option->name!=NULL);
\r
167 opt=option_find(option,new_option->name);
\r
169 opt=&option->options[option->option_nb];
\r
170 option->option_nb++;
\r
172 if(option->option_nb>=OptionNb){
\r
173 my_fatal("option_insert(): option list overflow\n");
\r
175 if(new_option->name) my_string_set(&opt->name, new_option->name);
\r
176 if(new_option->value) my_string_set(&opt->value, new_option->value);
\r
177 if(new_option->min) my_string_set(&opt->min, new_option->min);
\r
178 if(new_option->max) my_string_set(&opt->max, new_option->max);
\r
179 if(new_option->default_) my_string_set(&opt->default_, new_option->default_);
\r
180 if(new_option->type) my_string_set(&opt->type, new_option->type);
\r
181 opt->var_nb=new_option->var_nb;
\r
182 for(i=0;i<new_option->var_nb;i++){
\r
183 my_string_set(&opt->var[i], new_option->var[i]);
\r
185 opt->mode=new_option->mode;
\r
190 bool option_set(option_list_t *option,
\r
191 const char name[],
\r
192 const char value[]) {
\r
195 ASSERT(option!=NULL);
\r
196 ASSERT(name!=NULL);
\r
197 ASSERT(value!=NULL);
\r
199 opt = option_find(option,name);
\r
200 if (opt == NULL) return FALSE;
\r
202 if(my_string_case_equal(opt->type,"check")){
\r
203 value=(my_string_equal(value,"1")||
\r
204 my_string_case_equal(value,"true"))?"true":"false";
\r
207 my_string_set(&opt->value,value);
\r
209 if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);
\r
214 // option_set_default()
\r
216 bool option_set_default(option_list_t *option,
\r
217 const char name[],
\r
218 const char value[]) {
\r
221 ASSERT(name!=NULL);
\r
222 ASSERT(value!=NULL);
\r
224 opt = option_find(option,name);
\r
225 if (opt == NULL) return FALSE;
\r
227 if(my_string_case_equal(opt->type,"check")){
\r
228 value=(my_string_equal(value,"1")||
\r
229 my_string_case_equal(value,"true"))?"true":"false";
\r
232 my_string_set(&opt->default_,value);
\r
234 if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);
\r
241 const char * option_get(option_list_t *option, const char name[]) {
\r
245 ASSERT(name!=NULL);
\r
247 opt = option_find(option,name);
\r
248 if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);
\r
249 if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);
\r
254 // option_get_default()
\r
256 const char * option_get_default(option_list_t *option, const char name[]) {
\r
260 ASSERT(name!=NULL);
\r
262 opt = option_find(option,name);
\r
263 if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);
\r
265 if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);
\r
267 return opt->default_;
\r
270 // option_get_bool()
\r
272 bool option_get_bool(option_list_t *option, const char name[]) {
\r
274 const char * value;
\r
276 value = option_get(option,name);
\r
279 } else if (my_string_case_equal(value,"true") || my_string_case_equal(value,"yes") || my_string_equal(value,"1")) {
\r
281 } else if (my_string_case_equal(value,"false") || my_string_case_equal(value,"no") || my_string_equal(value,"0")) {
\r
291 // option_get_double()
\r
293 double option_get_double(option_list_t *option, const char name[]) {
\r
295 const char * value;
\r
297 value = option_get(option,name);
\r
299 return atof(value);
\r
302 // option_get_int()
\r
304 int option_get_int(option_list_t *option, const char name[]) {
\r
306 const char * value;
\r
308 value = option_get(option,name);
\r
310 return atoi(value);
\r
313 // option_get_string()
\r
315 const char * option_get_string(option_list_t *option, const char name[]) {
\r
317 const char * value;
\r
319 value = option_get(option,name);
\r
326 option_t * option_find(option_list_t *option, const char name[]) {
\r
331 ASSERT(name!=NULL);
\r
332 for (i=0; i<option->option_nb; i++){
\r
333 opt=option->options+i;
\r
334 if (my_string_case_equal(opt->name,name)){
\r
342 // option_start_iter()
\r
344 void option_start_iter(option_list_t *option){
\r
350 option_t * option_next(option_list_t *option){
\r
351 ASSERT(option->iter<=option->option_nb);
\r
352 if(option->iter==option->option_nb){
\r
355 return &option->options[option->iter++];
\r
359 void option_free(option_t *option){
\r
361 my_string_clear(&option->name);
\r
362 my_string_clear(&option->type);
\r
363 my_string_clear(&option->min);
\r
364 my_string_clear(&option->max);
\r
365 my_string_clear(&option->default_);
\r
366 my_string_clear(&option->value);
\r
367 for(i=0;i<option->var_nb;i++){
\r
368 my_string_clear(&option->var[i]);
\r
376 void option_clear(option_list_t *option){
\r
378 for (i = 0; i < option->option_nb; i++) {
\r
379 option_free(option->options+i);
\r
381 option->option_nb=0;
\r
384 // option_from_ini()
\r
386 void option_from_ini(option_list_t *option,
\r
388 const char *section){
\r
389 ini_entry_t *entry;
\r
390 ini_start_iter(ini);
\r
391 while((entry=ini_next(ini))){
\r
392 option_set(option,entry->name,entry->value);
\r
393 option_set_default(option,entry->name,entry->value);
\r
397 // end of option.cpp
\r