// variables\r
\r
#define NNB { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }\r
-option_t Option[] = {\r
\r
+option_list_t Option[1];\r
+\r
+option_t DefaultOptions[] = { \r
{ "OptionFile", "string","0","0", "polyglot.ini", NULL,0,NNB, PG}, \r
\r
// options\r
\r
+ { "SaveSettingsOnExit","check","0","0", "true" , NULL,0,NNB, PG|XBOARD},\r
+\r
+ { "SaveFile", "string","0","0", "<empty>" , NULL,0,NNB, PG},\r
+ \r
{ "EngineName", "string","0","0", "<empty>" , NULL,0,NNB, PG}, \r
{ "EngineDir", "string","0","0", "." , NULL,0,NNB, PG}, \r
{ "EngineCommand", "string","0","0", "<empty>" , NULL,0,NNB, PG}, \r
\r
- { "Log", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|UCI}, \r
+ { "Log", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|UCI}, \r
{ "LogFile", "string","0","0", "polyglot.log", NULL,0,NNB, PG|XBOARD|UCI}, \r
\r
{ "UCI", "check","0","0", "false" , NULL,0,NNB, PG}, \r
{ "UseNice", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|UCI}, \r
{ "NiceValue", "spin", "0","20", "5" , NULL,0,NNB, PG|XBOARD|UCI}, \r
\r
- { "Chess960", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
+ { "Chess960", "check","0","0", "false" , NULL,0,NNB, PG}, \r
\r
{ "Resign", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
{ "ResignMoves", "spin","0","10000", "3" , NULL,0,NNB, PG|XBOARD}, \r
{ "ResignScore", "spin","0","10000", "600" , NULL,0,NNB, PG|XBOARD}, \r
\r
- { "MateScore", "spin","0","1000000", "10000" , NULL,0,NNB, PG|XBOARD}, \r
+ { "MateScore", "spin","0","100000", "10000" , NULL,0,NNB, PG|XBOARD}, \r
\r
{ "Book", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD|UCI}, \r
{ "BookFile", "string","0","0", "book.bin" , NULL,0,NNB, PG|XBOARD|UCI}, \r
\r
{ "BookRandom", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD|UCI}, \r
+ { "BookDepth", "spin","0","256", "256" , NULL,0,NNB, PG|XBOARD}, \r
+ { "BookTreshold", "spin","0","1000", "5" , NULL,0,NNB, PG|XBOARD|UCI}, \r
{ "BookLearn", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
\r
{ "KibitzMove", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
{ "KibitzPV", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
\r
{ "KibitzCommand", "string","0","0", "tellall" , NULL,0,NNB, PG|XBOARD}, \r
- { "KibitzDelay", "spin","0","10000", "5" , NULL,0,NNB, PG|XBOARD}, \r
- { "KibitzInterval", "spin","0","10000", "0" , NULL,0,NNB, PG|XBOARD}, \r
+ { "KibitzDelay", "spin","0","1000", "5" , NULL,0,NNB, PG|XBOARD}, \r
+ { "KibitzInterval", "spin","0","1000", "0" , NULL,0,NNB, PG|XBOARD}, \r
\r
{ "ShowPonder", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
{ "ScoreWhite", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
{ "UCIVersion", "spin","1","2", "2" , NULL,0,NNB, PG|XBOARD}, \r
{ "CanPonder", "check","1","2", "false" , NULL,0,NNB, PG|XBOARD}, \r
{ "SyncStop", "check","1","2", "false" , NULL,0,NNB, PG|XBOARD}, \r
- { "Affinity", "spin","-1","32", "-1" , NULL,0,NNB, PG}, \r
- { "RepeatPV", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},\r
+ { "Affinity", "spin","-1","32", "-1" , NULL,0,NNB, PG}, \r
+ { "RepeatPV", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD},\r
{ "PromoteWorkAround","check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
\r
- { "WbWorkArounds", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
+ { "WbWorkArounds", "check","0","0", "true" , NULL,0,NNB, PG|XBOARD}, \r
+ { "WbWorkArounds2", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
{ NULL, NULL,"0","0", NULL , NULL,0,NNB, 0},\r
-};\r
\r
-// prototypes\r
+};\r
\r
-static option_t * option_find (const char var[]);\r
\r
// functions\r
\r
-// option_init()\r
-\r
-void option_init() {\r
+// option_is_ok()\r
\r
- option_t *p=Option;\r
- const char * name;\r
+bool option_is_ok(const option_list_t *option) {\r
+ if(option->option_nb<0 || option->option_nb>=OptionNb){\r
+ return FALSE;\r
+ }\r
+ return TRUE;\r
+}\r
\r
- while((name=(p++)->name)){\r
- option_set(name,option_get_default(name));\r
+// option_init_pg()\r
+\r
+void option_init_pg() {\r
+\r
+ int i;\r
+ option_t *p=DefaultOptions;\r
+ \r
+ option_init(Option);\r
+ while(p){\r
+ if(p->name){\r
+ option_insert(Option,p);\r
+ p++;\r
+ }else{\r
+ break;\r
+ }\r
+ }\r
+ for(i=0;i<Option->option_nb;i++){\r
+ Option->options[i].value=my_strdup(Option->options[i].default_);\r
}\r
}\r
\r
+// option_init()\r
+\r
+void option_init(option_list_t *option){\r
+ ASSERT(option!=NULL);\r
+ option->option_nb=0;\r
+ option->iter=0;\r
+ memset(option->options,0,sizeof(option->options));\r
+}\r
+\r
+// option_insert()\r
+\r
+void option_insert(option_list_t *option, option_t *new_option){\r
+ int i;\r
+ option_t *opt;\r
+ ASSERT(option!=NULL);\r
+ ASSERT(new_option!=NULL);\r
+ ASSERT(new_option->name!=NULL);\r
+ opt=option_find(option,new_option->name);\r
+ if(!opt){\r
+ opt=&option->options[option->option_nb];\r
+ option->option_nb++;\r
+ }\r
+ if(option->option_nb>=OptionNb){\r
+ my_fatal("option_insert(): option list overflow\n");\r
+ }\r
+ if(new_option->name) my_string_set(&opt->name, new_option->name);\r
+ if(new_option->value) my_string_set(&opt->value, new_option->value);\r
+ if(new_option->min) my_string_set(&opt->min, new_option->min);\r
+ if(new_option->max) my_string_set(&opt->max, new_option->max);\r
+ if(new_option->default_) my_string_set(&opt->default_, new_option->default_);\r
+ if(new_option->type) my_string_set(&opt->type, new_option->type);\r
+ opt->var_nb=new_option->var_nb;\r
+ for(i=0;i<new_option->var_nb;i++){\r
+ my_string_set(&opt->var[i], new_option->var[i]);\r
+ }\r
+ opt->mode=new_option->mode;\r
+}\r
\r
// option_set()\r
\r
-bool option_set(const char name[], const char value[]) {\r
+bool option_set(option_list_t *option, \r
+ const char name[], \r
+ const char value[]) {\r
\r
option_t * opt;\r
+ ASSERT(option!=NULL);\r
ASSERT(name!=NULL);\r
ASSERT(value!=NULL);\r
\r
- opt = option_find(name);\r
+ opt = option_find(option,name);\r
if (opt == NULL) return FALSE;\r
\r
my_string_set(&opt->value,value);\r
\r
return TRUE;\r
}\r
-// option_set()\r
\r
-bool option_set_default(const char name[], const char value[]) {\r
+// option_set_default()\r
+\r
+bool option_set_default(option_list_t *option,\r
+ const char name[], \r
+ const char value[]) {\r
\r
option_t * opt;\r
ASSERT(name!=NULL);\r
ASSERT(value!=NULL);\r
\r
- opt = option_find(name);\r
+ opt = option_find(option,name);\r
if (opt == NULL) return FALSE;\r
\r
- opt->default_=my_strdup(value);\r
+ my_string_set(&opt->default_,value);\r
\r
if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);\r
\r
\r
// option_get()\r
\r
-const char * option_get(const char name[]) {\r
+const char * option_get(option_list_t *option, const char name[]) {\r
\r
option_t * opt;\r
\r
ASSERT(name!=NULL);\r
\r
- opt = option_find(name);\r
+ opt = option_find(option,name);\r
if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
-\r
if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
\r
return opt->value;\r
\r
// option_get_default()\r
\r
-const char * option_get_default(const char name[]) {\r
+const char * option_get_default(option_list_t *option, const char name[]) {\r
\r
option_t * opt;\r
\r
ASSERT(name!=NULL);\r
\r
- opt = option_find(name);\r
+ opt = option_find(option,name);\r
if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
\r
if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
\r
// option_get_bool()\r
\r
-bool option_get_bool(const char name[]) {\r
+bool option_get_bool(option_list_t *option, const char name[]) {\r
\r
const char * value;\r
\r
- value = option_get(name);\r
+ value = option_get(option,name);\r
\r
if (FALSE) {\r
} else if (my_string_case_equal(value,"true") || my_string_case_equal(value,"yes") || my_string_equal(value,"1")) {\r
return FALSE;\r
}\r
\r
+\r
// option_get_double()\r
\r
-double option_get_double(const char name[]) {\r
+double option_get_double(option_list_t *option, const char name[]) {\r
\r
const char * value;\r
\r
- value = option_get(name);\r
+ value = option_get(option,name);\r
\r
return atof(value);\r
}\r
\r
// option_get_int()\r
\r
-int option_get_int(const char name[]) {\r
+int option_get_int(option_list_t *option, const char name[]) {\r
\r
const char * value;\r
\r
- value = option_get(name);\r
+ value = option_get(option,name);\r
\r
return atoi(value);\r
}\r
\r
// option_get_string()\r
\r
-const char * option_get_string(const char name[]) {\r
+const char * option_get_string(option_list_t *option, const char name[]) {\r
\r
const char * value;\r
\r
- value = option_get(name);\r
+ value = option_get(option,name);\r
\r
return value;\r
}\r
\r
// option_find()\r
\r
-static option_t * option_find(const char name[]) {\r
+option_t * option_find(option_list_t *option, const char name[]) {\r
\r
option_t * opt;\r
+ int i;\r
\r
ASSERT(name!=NULL);\r
+ for (i=0; i<option->option_nb; i++){\r
+ opt=option->options+i;\r
+ if (my_string_case_equal(opt->name,name)){\r
+ return opt;\r
+ }\r
+ }\r
+ \r
+ return NULL;\r
+}\r
+\r
+// option_start_iter()\r
+\r
+void option_start_iter(option_list_t *option){\r
+ option->iter=0;\r
+}\r
+\r
+// option_next()\r
\r
+option_t * option_next(option_list_t *option){\r
+ ASSERT(option->iter<=option->option_nb);\r
+ if(option->iter==option->option_nb){\r
+ return NULL;\r
+ }\r
+ return &option->options[option->iter++];\r
+ \r
+}\r
+\r
+void option_free(option_t *option){\r
+ int i;\r
+ my_string_clear(&option->name);\r
+ my_string_clear(&option->type);\r
+ my_string_clear(&option->min);\r
+ my_string_clear(&option->max);\r
+ my_string_clear(&option->default_);\r
+ my_string_clear(&option->value);\r
+ for(i=0;i<option->var_nb;i++){\r
+ my_string_clear(&option->var[i]);\r
+ }\r
+ option->var_nb=0;\r
+ option->mode=0;\r
+}\r
+\r
+// option_clear()\r
\r
- for (opt = &Option[0]; opt->name != NULL; opt++) {\r
- if (my_string_case_equal(opt->name,name)) return opt;\r
+void option_clear(option_list_t *option){\r
+ int i;\r
+ for (i = 0; i < option->option_nb; i++) {\r
+ option_free(option->options+i);\r
}\r
+ option->option_nb=0;\r
+}\r
\r
- return NULL;\r
+// option_from_ini()\r
+\r
+void option_from_ini(option_list_t *option,\r
+ ini_t *ini,\r
+ const char *section){\r
+ ini_entry_t *entry;\r
+ ini_start_iter(ini);\r
+ while((entry=ini_next(ini))){\r
+ option_set(option,entry->name,entry->value);\r
+ option_set_default(option,entry->name,entry->value);\r
+ }\r
}\r
\r
// end of option.cpp\r