version 1.4w10UCIb16
[polyglot.git] / option.cpp
1 \r
2 // option.cpp\r
3 \r
4 // includes\r
5 \r
6 #include <cstdlib>\r
7 #include <cstring>\r
8 \r
9 #include "option.h"\r
10 #include "util.h"\r
11 \r
12 // constants\r
13 \r
14 static const bool UseDebug = false;\r
15 \r
16 \r
17 // variables\r
18 \r
19 option_t Option[] = {\r
20 \r
21     { "OptionFile",       "string","0","0",     "polyglot.ini", NULL,0,{},  PG}, \r
22 \r
23    // options\r
24 \r
25     { "EngineName",       "string","0","0",     "<empty>"   , NULL,0,{},  PG}, \r
26     { "EngineDir",        "string","0","0",     "."         , NULL,0,{},  PG}, \r
27     { "EngineCommand",    "string","0","0",     "<empty>"   , NULL,0,{},  PG}, \r
28 \r
29     { "Log",              "check","0","0",     "false"      , NULL,0,{},  PG|XBOARD|UCI}, \r
30     { "LogFile",          "string","0","0",     "polyglot.log", NULL,0,{},  PG|XBOARD|UCI}, \r
31 \r
32     { "UCI",              "string","0","0",     "false"     , NULL,0,{},  PG}, \r
33 \r
34     { "UseNice",          "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD|UCI}, \r
35     { "NiceValue",        "spin", "0","20",     "5"         , NULL,0,{},  PG|XBOARD|UCI}, \r
36 \r
37     { "Chess960",         "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
38 \r
39     { "Resign",           "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
40     { "ResignMoves",      "spin","0","10000",    "3"        , NULL,0,{},  PG|XBOARD}, \r
41     { "ResignScore",      "spin","0","10000",   "600"       , NULL,0,{},  PG|XBOARD}, \r
42 \r
43     { "MateScore",        "spin","0","1000000", "10000"     , NULL,0,{},  PG|XBOARD}, \r
44 \r
45     { "Book",             "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD|UCI}, \r
46     { "BookFile",         "string","0","0",     "book.bin"  , NULL,0,{},  PG|XBOARD|UCI}, \r
47 \r
48     { "BookRandom",       "check","0","0",      "true"      , NULL,0,{},  PG|XBOARD|UCI}, \r
49     { "BookLearn",        "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
50 \r
51     { "KibitzMove",       "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
52     { "KibitzPV",         "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
53 \r
54     { "KibitzCommand",    "string","0","0",     "tellall"   , NULL,0,{},  PG|XBOARD}, \r
55     { "KibitzDelay",      "check","0","10000",  "5"         , NULL,0,{},  PG|XBOARD}, \r
56 \r
57     { "ShowPonder",       "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
58 \r
59    // work-arounds\r
60 \r
61     { "UCIVersion",       "spin","1","2",       "2"         , NULL,0,{},  PG|XBOARD}, \r
62     { "CanPonder",        "check","1","2",      "false"     , NULL,0,{},  PG|XBOARD}, \r
63     { "SyncStop",         "check","1","2",      "false"     , NULL,0,{},  PG|XBOARD}, \r
64     { "Affinity",             "spin","-1","32",     "-1"        , NULL,0,{},  PG}, \r
65     { "RepeatPV",             "check","0","0",      "false"     , NULL,0,{},  PG|XBOARD},\r
66     { "PromoteWorkAround","check","0","0",      "false"     , NULL,0,{},  PG|XBOARD}, \r
67 \r
68     { NULL,               NULL,"0","0",         NULL        , NULL,0,{},  0},\r
69 };\r
70 \r
71 // prototypes\r
72 \r
73 static option_t * option_find (const char var[]);\r
74 \r
75 // functions\r
76 \r
77 // option_init()\r
78 \r
79 void option_init() {\r
80 \r
81     option_t *p=Option;\r
82     const char * name;\r
83 \r
84     while(name=(p++)->name){\r
85         option_set(name,option_get_default(name));\r
86     }\r
87 }\r
88 \r
89 \r
90 // option_set()\r
91 \r
92 bool option_set(const char name[], const char value[]) {\r
93 \r
94    option_t * opt;\r
95    ASSERT(name!=NULL);\r
96    ASSERT(value!=NULL);\r
97 \r
98    opt = option_find(name);\r
99    if (opt == NULL) return false;\r
100 \r
101    my_string_set(&opt->value,value);\r
102 \r
103    if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
104 \r
105    return true;\r
106 }\r
107 // option_set()\r
108 \r
109 bool option_set_default(const char name[], const char value[]) {\r
110 \r
111    option_t * opt;\r
112    ASSERT(name!=NULL);\r
113    ASSERT(value!=NULL);\r
114 \r
115    opt = option_find(name);\r
116    if (opt == NULL) return false;\r
117 \r
118    opt->default_=my_strdup(value);\r
119 \r
120    if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);\r
121 \r
122    return true;\r
123 }\r
124 \r
125 // option_get()\r
126 \r
127 const char * option_get(const char name[]) {\r
128 \r
129    option_t * opt;\r
130 \r
131    ASSERT(name!=NULL);\r
132 \r
133    opt = option_find(name);\r
134    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
135 \r
136    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
137 \r
138    return opt->value;\r
139 }\r
140 \r
141 // option_get_default()\r
142 \r
143 const char * option_get_default(const char name[]) {\r
144 \r
145    option_t * opt;\r
146 \r
147    ASSERT(name!=NULL);\r
148 \r
149    opt = option_find(name);\r
150    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
151 \r
152    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
153 \r
154    return opt->default_;\r
155 }\r
156 \r
157 // option_get_bool()\r
158 \r
159 bool option_get_bool(const char name[]) {\r
160 \r
161    const char * value;\r
162 \r
163    value = option_get(name);\r
164 \r
165    if (false) {\r
166    } else if (my_string_case_equal(value,"true") || my_string_case_equal(value,"yes") || my_string_equal(value,"1")) {\r
167       return true;\r
168    } else if (my_string_case_equal(value,"false") || my_string_case_equal(value,"no") || my_string_equal(value,"0")) {\r
169       return false;\r
170    }\r
171 \r
172    ASSERT(false);\r
173 \r
174    return false;\r
175 }\r
176 \r
177 // option_get_double()\r
178 \r
179 double option_get_double(const char name[]) {\r
180 \r
181    const char * value;\r
182 \r
183    value = option_get(name);\r
184 \r
185    return atof(value);\r
186 }\r
187 \r
188 // option_get_int()\r
189 \r
190 int option_get_int(const char name[]) {\r
191 \r
192    const char * value;\r
193 \r
194    value = option_get(name);\r
195 \r
196    return atoi(value);\r
197 }\r
198 \r
199 // option_get_string()\r
200 \r
201 const char * option_get_string(const char name[]) {\r
202 \r
203    const char * value;\r
204 \r
205    value = option_get(name);\r
206 \r
207    return value;\r
208 }\r
209 \r
210 // option_find()\r
211 \r
212 static option_t * option_find(const char name[]) {\r
213 \r
214    option_t * opt;\r
215 \r
216    ASSERT(name!=NULL);\r
217 \r
218 \r
219    for (opt = &Option[0]; opt->name != NULL; opt++) {\r
220       if (my_string_case_equal(opt->name,name)) return opt;\r
221    }\r
222 \r
223    return NULL;\r
224 }\r
225 \r
226 // end of option.cpp\r
227 \r