15 #define NNB { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }
19 static const bool UseDebug = FALSE;
24 option_list_t Option[1];
26 option_t DefaultOptions[] = {
29 { "SettingsFile", "file","0","0", "polyglot.ini", NULL,0,NNB, PG|XBOARD|XBSEL},
31 { "SettingsDir", "path","0","0", "<empty>" , NULL,0,NNB, PG},
33 { "OnlyWbOptions", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},
35 { "EngineName", "string","0","0", "<empty>" , NULL,0,NNB, PG},
36 { "EngineDir", "path","0","0", "." , NULL,0,NNB, PG},
37 { "EngineCommand", "string","0","0", "<empty>" , NULL,0,NNB, PG},
39 { "Log", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
40 { "LogFile", "file","0","0", "polyglot.log", NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
42 { "UCI", "check","0","0", "false" , NULL,0,NNB, PG},
44 { "UseNice", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|UCI},
45 { "NiceValue", "spin", "0","20", "5" , NULL,0,NNB, PG|XBOARD|UCI},
47 { "Resign", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
48 { "ResignMoves", "spin","0","10000", "3" , NULL,0,NNB, PG|XBOARD|XBSEL},
49 { "QueenNeverResigns","check","0","0", "true" , NULL,0,NNB, PG|XBOARD|XBSEL},
50 { "ResignScore", "spin","0","10000", "600" , NULL,0,NNB, PG|XBOARD|XBSEL},
51 { "HandleDraws", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
52 { "ContemptScore", "spin","0","10000", "30" , NULL,0,NNB, PG|XBOARD|XBSEL},
54 { "MateScore", "spin","0","100000", "10000" , NULL,0,NNB, PG|XBOARD},
56 { "Book", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
57 { "BookFile", "file","0","0", "book.bin" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
59 { "BookRandom", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
60 { "BookDepth", "spin","0","256", "256" , NULL,0,NNB, PG|XBOARD|XBSEL|UCI},
61 { "BookTreshold", "spin","0","1000", "5" , NULL,0,NNB, PG|XBOARD|UCI},
62 { "BookLearn", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
63 { "ShowTbHits", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
65 { "KibitzMove", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
66 { "KibitzPV", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
68 { "KibitzCommand", "string","0","0", "tellall" , NULL,0,NNB, PG|XBOARD},
69 { "KibitzDelay", "spin","0","1000", "5" , NULL,0,NNB, PG|XBOARD},
70 { "KibitzInterval", "spin","0","1000", "0" , NULL,0,NNB, PG|XBOARD},
72 { "ShowPonder", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},
73 { "ScoreWhite", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
75 { "STFudge", "spin","0","1000", "20" , NULL,0,NNB, PG|XBOARD|XBSEL},
79 { "UCIVersion", "spin","1","2", "2" , NULL,0,NNB, PG|XBOARD},
80 { "CanPonder", "check","1","2", "false" , NULL,0,NNB, PG|XBOARD},
81 { "SyncStop", "check","1","2", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
82 { "Affinity", "spin","0","0", "FFFFFFFF" , NULL,0,NNB, PG|XBOARD},
83 { "RepeatPV", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},
84 { "PromoteWorkAround","check","0","0", "false" , NULL,0,NNB, PG|XBOARD},
88 { "Chess960", "check","0","0", "false" , NULL,0,NNB, PG},
90 // These options flag various hacks in the source to work around
91 // WB quirks. They will eventually all be set to false. Probably
94 { "WbWorkArounds", "check","0","0", "true" , NULL,0,NNB, PG},
95 { "WbWorkArounds2", "check","0","0", "false" , NULL,0,NNB, PG},
96 { "WbWorkArounds3", "check","0","0", "true" , NULL,0,NNB, PG},
100 { "Save", "save","0","0", "false" , NULL,0,NNB, PG|XBOARD|XBSEL},
104 { NULL, NULL,"0","0", NULL , NULL,0,NNB, 0},
113 bool option_is_ok(const option_list_t *option) {
114 if(option->option_nb<0 || option->option_nb>=OptionNb){
122 void option_init_pg() {
125 option_t *p=DefaultOptions;
127 char SettingsDir[StringSize];
132 option_insert(Option,p);
138 for(i=0;i<Option->option_nb;i++){
139 Option->options[i].value=my_strdup(Option->options[i].default_);
142 home_dir=getenv("HOME");
146 snprintf(SettingsDir,sizeof(SettingsDir),"%s/.polyglot",home_dir);
147 SettingsDir[sizeof(SettingsDir)-1]='\0';
149 sprintf(SettingsDir,".\\_PG");
151 option_set(Option,"SettingsDir",SettingsDir);
152 option_set_default(Option,"SettingsDir",SettingsDir);
157 void option_init(option_list_t *option){
158 ASSERT(option!=NULL);
161 memset(option->options,0,sizeof(option->options));
166 void option_insert(option_list_t *option, option_t *new_option){
169 ASSERT(option!=NULL);
170 ASSERT(new_option!=NULL);
171 ASSERT(new_option->name!=NULL);
172 opt=option_find(option,new_option->name);
174 opt=&option->options[option->option_nb];
177 if(option->option_nb>=OptionNb){
178 my_fatal("option_insert(): option list overflow\n");
180 if(new_option->name) my_string_set(&opt->name, new_option->name);
181 if(new_option->value) my_string_set(&opt->value, new_option->value);
182 if(new_option->min) my_string_set(&opt->min, new_option->min);
183 if(new_option->max) my_string_set(&opt->max, new_option->max);
184 if(new_option->default_) my_string_set(&opt->default_, new_option->default_);
185 if(new_option->type) my_string_set(&opt->type, new_option->type);
186 opt->var_nb=new_option->var_nb;
187 for(i=0;i<new_option->var_nb;i++){
188 my_string_set(&opt->var[i], new_option->var[i]);
190 opt->mode=new_option->mode;
195 bool option_set(option_list_t *option,
197 const char value[]) {
200 ASSERT(option!=NULL);
204 opt = option_find(option,name);
205 if (opt == NULL) return FALSE;
207 if(my_string_case_equal(opt->type,"check")){
208 value=(my_string_equal(value,"1")||
209 my_string_case_equal(value,"true"))?"true":"false";
212 my_string_set(&opt->value,value);
214 if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);
219 // option_set_default()
221 bool option_set_default(option_list_t *option,
223 const char value[]) {
229 opt = option_find(option,name);
230 if (opt == NULL) return FALSE;
232 if(my_string_case_equal(opt->type,"check")){
233 value=(my_string_equal(value,"1")||
234 my_string_case_equal(value,"true"))?"true":"false";
237 my_string_set(&opt->default_,value);
239 if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);
246 const char * option_get(option_list_t *option, const char name[]) {
252 opt = option_find(option,name);
253 if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);
254 if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);
259 // option_get_default()
261 const char * option_get_default(option_list_t *option, const char name[]) {
267 opt = option_find(option,name);
268 if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);
270 if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);
272 return opt->default_;
277 bool option_get_bool(option_list_t *option, const char name[]) {
281 value = option_get(option,name);
284 } else if (my_string_case_equal(value,"true") || my_string_case_equal(value,"yes") || my_string_equal(value,"1")) {
286 } else if (my_string_case_equal(value,"false") || my_string_case_equal(value,"no") || my_string_equal(value,"0")) {
296 // option_get_double()
298 double option_get_double(option_list_t *option, const char name[]) {
302 value = option_get(option,name);
309 int option_get_int(option_list_t *option, const char name[]) {
313 value = option_get(option,name);
318 // option_get_string()
320 const char * option_get_string(option_list_t *option, const char name[]) {
324 value = option_get(option,name);
331 option_t * option_find(option_list_t *option, const char name[]) {
337 for (i=0; i<option->option_nb; i++){
338 opt=option->options+i;
339 if (my_string_case_equal(opt->name,name)){
347 // option_start_iter()
349 void option_start_iter(option_list_t *option){
355 option_t * option_next(option_list_t *option){
356 ASSERT(option->iter<=option->option_nb);
357 if(option->iter==option->option_nb){
360 return &option->options[option->iter++];
364 void option_free(option_t *option){
366 my_string_clear(&option->name);
367 my_string_clear(&option->type);
368 my_string_clear(&option->min);
369 my_string_clear(&option->max);
370 my_string_clear(&option->default_);
371 my_string_clear(&option->value);
372 for(i=0;i<option->var_nb;i++){
373 my_string_clear(&option->var[i]);
381 void option_clear(option_list_t *option){
383 for (i = 0; i < option->option_nb; i++) {
384 option_free(option->options+i);
391 void option_from_ini(option_list_t *option,
393 const char *section){
396 while((entry=ini_next(ini))){
397 option_set(option,entry->name,entry->value);
398 option_set_default(option,entry->name,entry->value);