version 1.4w10UCIb16
[polyglot.git] / option.cpp
index 716802c..0462000 100644 (file)
 \r
 static const bool UseDebug = false;\r
 \r
-// types\r
-\r
-struct option_t {\r
-   const char * var;\r
-   const char * val;\r
-};\r
 \r
 // variables\r
 \r
-static option_t Option[] = {\r
+option_t Option[] = {\r
 \r
-   { "OptionFile",    NULL, }, // string\r
+    { "OptionFile",       "string","0","0",     "polyglot.ini", NULL,0,{},  PG}, \r
 \r
    // options\r
 \r
-   { "EngineName",    NULL, }, // string\r
-   { "EngineDir",     NULL, }, // string\r
-   { "EngineCommand", NULL, }, // string\r
-\r
-   { "Log",           NULL, }, // true/false\r
-   { "LogFile",       NULL, }, // string\r
+    { "EngineName",       "string","0","0",     "<empty>"   , NULL,0,{},  PG}, \r
+    { "EngineDir",        "string","0","0",     "."         , NULL,0,{},  PG}, \r
+    { "EngineCommand",    "string","0","0",     "<empty>"   , NULL,0,{},  PG}, \r
 \r
-   { "UCI",           NULL, }, // true/false\r
+    { "Log",              "check","0","0",     "false"      , NULL,0,{},  PG|XBOARD|UCI}, \r
+    { "LogFile",          "string","0","0",     "polyglot.log", NULL,0,{},  PG|XBOARD|UCI}, \r
 \r
-   { "UseNice",       NULL, }, // true/false\r
+    { "UCI",              "string","0","0",     "false"     , NULL,0,{},  PG}, \r
 \r
-   { "NiceValue",     NULL, }, // true/false\r
+    { "UseNice",          "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD|UCI}, \r
+    { "NiceValue",        "spin", "0","20",     "5"         , NULL,0,{},  PG|XBOARD|UCI}, \r
 \r
-   { "Chess960",      NULL, }, // true/false\r
+    { "Chess960",         "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
 \r
-   { "Resign",        NULL, }, // true/false\r
-   { "ResignMoves",   NULL, }, // move number\r
-   { "ResignScore",   NULL, }, // centipawns\r
+    { "Resign",           "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
+    { "ResignMoves",      "spin","0","10000",    "3"        , NULL,0,{},  PG|XBOARD}, \r
+    { "ResignScore",      "spin","0","10000",   "600"       , NULL,0,{},  PG|XBOARD}, \r
 \r
-   { "MateScore",     NULL, }, // centipawns\r
+    { "MateScore",        "spin","0","1000000", "10000"     , NULL,0,{},  PG|XBOARD}, \r
 \r
-   { "Book",          NULL, }, // true/false\r
-   { "BookFile",      NULL, }, // string\r
+    { "Book",             "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD|UCI}, \r
+    { "BookFile",         "string","0","0",     "book.bin"  , NULL,0,{},  PG|XBOARD|UCI}, \r
 \r
-   { "BookRandom",    NULL, }, // true/false\r
-   { "BookLearn",     NULL, }, // true/false\r
+    { "BookRandom",       "check","0","0",      "true"      , NULL,0,{},  PG|XBOARD|UCI}, \r
+    { "BookLearn",        "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
 \r
-   { "KibitzMove",    NULL, }, // true/false\r
-   { "KibitzPV",      NULL, }, // true/false\r
+    { "KibitzMove",       "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
+    { "KibitzPV",         "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
 \r
-   { "KibitzCommand", NULL, }, // string\r
-   { "KibitzDelay",   NULL, }, // seconds\r
+    { "KibitzCommand",    "string","0","0",     "tellall"   , NULL,0,{},  PG|XBOARD}, \r
+    { "KibitzDelay",      "check","0","10000",  "5"         , NULL,0,{},  PG|XBOARD}, \r
 \r
-   { "ShowPonder",    NULL, }, // true/false\r
+    { "ShowPonder",       "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
 \r
    // work-arounds\r
 \r
-   { "UCIVersion",    NULL, }, // 1-\r
-   { "CanPonder",     NULL, }, // true/false\r
-   { "SyncStop",      NULL, }, // true/false\r
-   { "Affinity",         NULL, }, // -1 else 0-32 //won't do much on *nix systems\r
-   { "RepeatPV",         NULL, },\r
-   { "PromoteWorkAround", NULL, }, // true/false\r
+    { "UCIVersion",       "spin","1","2",       "2"         , NULL,0,{},  PG|XBOARD}, \r
+    { "CanPonder",        "check","1","2",      "false"     , NULL,0,{},  PG|XBOARD}, \r
+    { "SyncStop",         "check","1","2",      "false"     , NULL,0,{},  PG|XBOARD}, \r
+    { "Affinity",            "spin","-1","32",     "-1"        , NULL,0,{},  PG}, \r
+    { "RepeatPV",            "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD},\r
+    { "PromoteWorkAround","check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
 \r
-   // { "",              NULL, },\r
-\r
-   { NULL,            NULL, },\r
+    { NULL,               NULL,"0","0",         NULL        , NULL,0,{},  0},\r
 };\r
 \r
 // prototypes\r
@@ -87,102 +78,94 @@ static option_t * option_find (const char var[]);
 \r
 void option_init() {\r
 \r
-   option_set("OptionFile","polyglot.ini");\r
+    option_t *p=Option;\r
+    const char * name;\r
 \r
-   // options\r
+    while(name=(p++)->name){\r
+        option_set(name,option_get_default(name));\r
+    }\r
+}\r
 \r
-   option_set("EngineName","<empty>");\r
-   option_set("EngineDir",".");\r
-   option_set("EngineCommand","<empty>");\r
 \r
-   option_set("Log","false");\r
-   option_set("LogFile","polyglot.log");\r
+// option_set()\r
+\r
+bool option_set(const char name[], const char value[]) {\r
 \r
-   option_set("UCI","false");\r
+   option_t * opt;\r
+   ASSERT(name!=NULL);\r
+   ASSERT(value!=NULL);\r
 \r
-   option_set("UseNice","false");\r
-   option_set("NiceValue","5");\r
-   \r
-   option_set("Chess960","false");\r
+   opt = option_find(name);\r
+   if (opt == NULL) return false;\r
 \r
-   option_set("Resign","false");\r
-   option_set("ResignMoves","3");\r
-   option_set("ResignScore","600");\r
+   my_string_set(&opt->value,value);\r
 \r
-   option_set("MateScore","10000");\r
+   if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
 \r
-   option_set("Book","false");\r
-   option_set("BookFile","book.bin");\r
+   return true;\r
+}\r
+// option_set()\r
 \r
-   option_set("BookRandom","true");\r
-   option_set("BookLearn","false");\r
+bool option_set_default(const char name[], const char value[]) {\r
 \r
-   option_set("KibitzMove","false");\r
-   option_set("KibitzPV","false");\r
+   option_t * opt;\r
+   ASSERT(name!=NULL);\r
+   ASSERT(value!=NULL);\r
 \r
-   option_set("KibitzCommand","tellall");\r
-   option_set("KibitzDelay","5");\r
+   opt = option_find(name);\r
+   if (opt == NULL) return false;\r
 \r
-   option_set("ShowPonder","true");\r
+   opt->default_=my_strdup(value);\r
 \r
-   // work-arounds\r
+   if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);\r
 \r
-   option_set("UCIVersion","2");\r
-   option_set("CanPonder","false");\r
-   option_set("SyncStop","false");\r
-   option_set("Affinity","-1");\r
-   option_set("PromoteWorkAround","false");\r
-   option_set("RepeatPV","true");\r
-   // option_set("","");\r
+   return true;\r
 }\r
 \r
-// option_set()\r
+// option_get()\r
 \r
-bool option_set(const char var[], const char val[]) {\r
+const char * option_get(const char name[]) {\r
 \r
    option_t * opt;\r
 \r
-   ASSERT(var!=NULL);\r
-   ASSERT(val!=NULL);\r
-\r
-   opt = option_find(var);\r
-   if (opt == NULL) return false;\r
+   ASSERT(name!=NULL);\r
 \r
-   my_string_set(&opt->val,val);\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 SET \"%s\" -> \"%s\"\n",opt->var,opt->val);\r
+   if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
 \r
-   return true;\r
+   return opt->value;\r
 }\r
 \r
-// option_get()\r
+// option_get_default()\r
 \r
-const char * option_get(const char var[]) {\r
+const char * option_get_default(const char name[]) {\r
 \r
    option_t * opt;\r
 \r
-   ASSERT(var!=NULL);\r
+   ASSERT(name!=NULL);\r
 \r
-   opt = option_find(var);\r
-   if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",var);\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->var,opt->val);\r
+   if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
 \r
-   return opt->val;\r
+   return opt->default_;\r
 }\r
 \r
 // option_get_bool()\r
 \r
-bool option_get_bool(const char var[]) {\r
+bool option_get_bool(const char name[]) {\r
 \r
-   const char * val;\r
+   const char * value;\r
 \r
-   val = option_get(var);\r
+   value = option_get(name);\r
 \r
    if (false) {\r
-   } else if (my_string_case_equal(val,"true") || my_string_case_equal(val,"yes") || my_string_equal(val,"1")) {\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(val,"false") || my_string_case_equal(val,"no") || my_string_equal(val,"0")) {\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
@@ -193,47 +176,48 @@ bool option_get_bool(const char var[]) {
 \r
 // option_get_double()\r
 \r
-double option_get_double(const char var[]) {\r
+double option_get_double(const char name[]) {\r
 \r
-   const char * val;\r
+   const char * value;\r
 \r
-   val = option_get(var);\r
+   value = option_get(name);\r
 \r
-   return atof(val);\r
+   return atof(value);\r
 }\r
 \r
 // option_get_int()\r
 \r
-int option_get_int(const char var[]) {\r
+int option_get_int(const char name[]) {\r
 \r
-   const char * val;\r
+   const char * value;\r
 \r
-   val = option_get(var);\r
+   value = option_get(name);\r
 \r
-   return atoi(val);\r
+   return atoi(value);\r
 }\r
 \r
 // option_get_string()\r
 \r
-const char * option_get_string(const char var[]) {\r
+const char * option_get_string(const char name[]) {\r
 \r
-   const char * val;\r
+   const char * value;\r
 \r
-   val = option_get(var);\r
+   value = option_get(name);\r
 \r
-   return val;\r
+   return value;\r
 }\r
 \r
 // option_find()\r
 \r
-static option_t * option_find(const char var[]) {\r
+static option_t * option_find(const char name[]) {\r
 \r
    option_t * opt;\r
 \r
-   ASSERT(var!=NULL);\r
+   ASSERT(name!=NULL);\r
+\r
 \r
-   for (opt = &Option[0]; opt->var != NULL; opt++) {\r
-      if (my_string_case_equal(opt->var,var)) return opt;\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