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