version 1.4.33b
[polyglot.git] / option.c
1 \r
2 // option.c\r
3 \r
4 // includes\r
5 \r
6 #include <stdlib.h>\r
7 #include <string.h>\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",              "check","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",      "spin","0","10000",  "5"         , NULL,0,NNB,  PG|XBOARD}, \r
57     { "KibitzInterval",   "spin","0","10000",  "0"         , NULL,0,NNB,  PG|XBOARD}, \r
58 \r
59     { "ShowPonder",       "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
60     { "ScoreWhite",       "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
61 \r
62    // work-arounds\r
63 \r
64     { "UCIVersion",       "spin","1","2",       "2"         , NULL,0,NNB,  PG|XBOARD}, \r
65     { "CanPonder",        "check","1","2",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
66     { "SyncStop",         "check","1","2",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
67     { "Affinity",         "spin","-1","32",     "-1"        , NULL,0,NNB,  PG}, \r
68     { "RepeatPV",         "check","0","0",      "true"     , NULL,0,NNB,  PG|XBOARD},\r
69     { "PromoteWorkAround","check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
70 \r
71     { "WbWorkArounds",    "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
72     { NULL,               NULL,"0","0",         NULL        , NULL,0,NNB,  0},\r
73 };\r
74 \r
75 // prototypes\r
76 \r
77 static option_t * option_find (const char var[]);\r
78 \r
79 // functions\r
80 \r
81 // option_init()\r
82 \r
83 void option_init() {\r
84 \r
85     option_t *p=Option;\r
86     const char * name;\r
87 \r
88     while((name=(p++)->name)){\r
89         option_set(name,option_get_default(name));\r
90     }\r
91 }\r
92 \r
93 \r
94 // option_set()\r
95 \r
96 bool option_set(const char name[], const char value[]) {\r
97 \r
98    option_t * opt;\r
99    ASSERT(name!=NULL);\r
100    ASSERT(value!=NULL);\r
101 \r
102    opt = option_find(name);\r
103    if (opt == NULL) return FALSE;\r
104 \r
105    my_string_set(&opt->value,value);\r
106 \r
107    if (UseDebug) my_log("POLYGLOT OPTION SET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
108 \r
109    return TRUE;\r
110 }\r
111 // option_set()\r
112 \r
113 bool option_set_default(const char name[], const char value[]) {\r
114 \r
115    option_t * opt;\r
116    ASSERT(name!=NULL);\r
117    ASSERT(value!=NULL);\r
118 \r
119    opt = option_find(name);\r
120    if (opt == NULL) return FALSE;\r
121 \r
122    opt->default_=my_strdup(value);\r
123 \r
124    if (UseDebug) my_log("POLYGLOT OPTION DEFAULT SET \"%s\" -> \"%s\"\n",opt->name,opt->default_);\r
125 \r
126    return TRUE;\r
127 }\r
128 \r
129 // option_get()\r
130 \r
131 const char * option_get(const char name[]) {\r
132 \r
133    option_t * opt;\r
134 \r
135    ASSERT(name!=NULL);\r
136 \r
137    opt = option_find(name);\r
138    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
139 \r
140    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
141 \r
142    return opt->value;\r
143 }\r
144 \r
145 // option_get_default()\r
146 \r
147 const char * option_get_default(const char name[]) {\r
148 \r
149    option_t * opt;\r
150 \r
151    ASSERT(name!=NULL);\r
152 \r
153    opt = option_find(name);\r
154    if (opt == NULL) my_fatal("option_get(): unknown option \"%s\"\n",name);\r
155 \r
156    if (UseDebug) my_log("POLYGLOT OPTION GET \"%s\" -> \"%s\"\n",opt->name,opt->value);\r
157 \r
158    return opt->default_;\r
159 }\r
160 \r
161 // option_get_bool()\r
162 \r
163 bool option_get_bool(const char name[]) {\r
164 \r
165    const char * value;\r
166 \r
167    value = option_get(name);\r
168 \r
169    if (FALSE) {\r
170    } else if (my_string_case_equal(value,"true") || my_string_case_equal(value,"yes") || my_string_equal(value,"1")) {\r
171       return TRUE;\r
172    } else if (my_string_case_equal(value,"false") || my_string_case_equal(value,"no") || my_string_equal(value,"0")) {\r
173       return FALSE;\r
174    }\r
175 \r
176    ASSERT(FALSE);\r
177 \r
178    return FALSE;\r
179 }\r
180 \r
181 // option_get_double()\r
182 \r
183 double option_get_double(const char name[]) {\r
184 \r
185    const char * value;\r
186 \r
187    value = option_get(name);\r
188 \r
189    return atof(value);\r
190 }\r
191 \r
192 // option_get_int()\r
193 \r
194 int option_get_int(const char name[]) {\r
195 \r
196    const char * value;\r
197 \r
198    value = option_get(name);\r
199 \r
200    return atoi(value);\r
201 }\r
202 \r
203 // option_get_string()\r
204 \r
205 const char * option_get_string(const char name[]) {\r
206 \r
207    const char * value;\r
208 \r
209    value = option_get(name);\r
210 \r
211    return value;\r
212 }\r
213 \r
214 // option_find()\r
215 \r
216 static option_t * option_find(const char name[]) {\r
217 \r
218    option_t * opt;\r
219 \r
220    ASSERT(name!=NULL);\r
221 \r
222 \r
223    for (opt = &Option[0]; opt->name != NULL; opt++) {\r
224       if (my_string_case_equal(opt->name,name)) return opt;\r
225    }\r
226 \r
227    return NULL;\r
228 }\r
229 \r
230 // end of option.cpp\r
231 \r