--- /dev/null
+\r
+// option.c\r
+\r
+// includes\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#include "option.h"\r
+#include "util.h"\r
+\r
+// constants\r
+\r
+static const bool UseDebug = FALSE;\r
+\r
+\r
+// 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
+ { "OptionFile", "string","0","0", "polyglot.ini", NULL,0,NNB, PG}, \r
+\r
+ // options\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
+ { "LogFile", "string","0","0", "polyglot.log", NULL,0,NNB, PG|XBOARD|UCI}, \r
+\r
+ { "UCI", "check","0","0", "false" , NULL,0,NNB, PG}, \r
+\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
+\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
+\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
+ { "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
+\r
+ { "ShowPonder", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
+ { "ScoreWhite", "check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
+\r
+ // work-arounds\r
+\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", "false" , NULL,0,NNB, PG|XBOARD},\r
+ { "PromoteWorkAround","check","0","0", "false" , NULL,0,NNB, PG|XBOARD}, \r
+\r
+ { NULL, NULL,"0","0", NULL , NULL,0,NNB, 0},\r
+};\r
+\r
+// prototypes\r
+\r
+static option_t * option_find (const char var[]);\r
+\r
+// functions\r
+\r
+// option_init()\r
+\r
+void option_init() {\r
+\r
+ option_t *p=Option;\r
+ const char * name;\r
+\r
+ while((name=(p++)->name)){\r
+ option_set(name,option_get_default(name));\r
+ }\r
+}\r
+\r
+\r
+// option_set()\r
+\r
+bool option_set(const char name[], const char value[]) {\r
+\r
+ option_t * opt;\r
+ ASSERT(name!=NULL);\r
+ ASSERT(value!=NULL);\r
+\r
+ opt = option_find(name);\r
+ if (opt == NULL) return FALSE;\r
+\r
+ my_string_set(&opt->value,value);\r
+\r
+ if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
+\r
+ return TRUE;\r
+}\r
+// option_set()\r
+\r
+bool option_set_default(const char name[], const char value[]) {\r
+\r
+ option_t * opt;\r
+ ASSERT(name!=NULL);\r
+ ASSERT(value!=NULL);\r
+\r
+ opt = option_find(name);\r
+ if (opt == NULL) return FALSE;\r
+\r
+ opt->default_=my_strdup(value);\r
+\r
+ if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);\r
+\r
+ return TRUE;\r
+}\r
+\r
+// option_get()\r
+\r
+const char * option_get(const char name[]) {\r
+\r
+ option_t * opt;\r
+\r
+ ASSERT(name!=NULL);\r
+\r
+ opt = option_find(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
+\r
+// option_get_default()\r
+\r
+const char * option_get_default(const char name[]) {\r
+\r
+ option_t * opt;\r
+\r
+ ASSERT(name!=NULL);\r
+\r
+ opt = option_find(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->default_;\r
+}\r
+\r
+// option_get_bool()\r
+\r
+bool option_get_bool(const char name[]) {\r
+\r
+ const char * value;\r
+\r
+ value = option_get(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 TRUE;\r
+ } else if (my_string_case_equal(value,"false") || my_string_case_equal(value,"no") || my_string_equal(value,"0")) {\r
+ return FALSE;\r
+ }\r
+\r
+ ASSERT(FALSE);\r
+\r
+ return FALSE;\r
+}\r
+\r
+// option_get_double()\r
+\r
+double option_get_double(const char name[]) {\r
+\r
+ const char * value;\r
+\r
+ value = option_get(name);\r
+\r
+ return atof(value);\r
+}\r
+\r
+// option_get_int()\r
+\r
+int option_get_int(const char name[]) {\r
+\r
+ const char * value;\r
+\r
+ value = option_get(name);\r
+\r
+ return atoi(value);\r
+}\r
+\r
+// option_get_string()\r
+\r
+const char * option_get_string(const char name[]) {\r
+\r
+ const char * value;\r
+\r
+ value = option_get(name);\r
+\r
+ return value;\r
+}\r
+\r
+// option_find()\r
+\r
+static option_t * option_find(const char name[]) {\r
+\r
+ option_t * opt;\r
+\r
+ ASSERT(name!=NULL);\r
+\r
+\r
+ for (opt = &Option[0]; opt->name != NULL; opt++) {\r
+ if (my_string_case_equal(opt->name,name)) return opt;\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+// end of option.cpp\r
+\r