version 1.4.30b
[polyglot.git] / option.c
diff --git a/option.c b/option.c
new file mode 100644 (file)
index 0000000..fbf71ef
--- /dev/null
+++ b/option.c
@@ -0,0 +1,230 @@
+\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