version 1.4.34b
[polyglot.git] / option.c
index 07b36cf..8d067b8 100644 (file)
--- a/option.c
+++ b/option.c
@@ -17,8 +17,10 @@ static const bool UseDebug = FALSE;
 // 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
+option_list_t Option[1];\r
+\r
+option_t DefaultOptions[] = {    \r
     { "OptionFile",       "string","0","0",     "polyglot.ini", NULL,0,NNB,  PG}, \r
 \r
    // options\r
@@ -68,38 +70,94 @@ option_t Option[] = {
     { "RepeatPV",        "check","0","0",      "true"     , NULL,0,NNB,  PG|XBOARD},\r
     { "PromoteWorkAround","check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
 \r
-    { "WbWorkArounds",    "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD}, \r
+    { "WbWorkArounds",    "check","0","0",      "true"     , NULL,0,NNB,  PG|XBOARD}, \r
     { NULL,               NULL,"0","0",         NULL        , NULL,0,NNB,  0},\r
-};\r
 \r
-// prototypes\r
+};\r
 \r
-static option_t * option_find (const char var[]);\r
 \r
 // functions\r
 \r
-// option_init()\r
-\r
-void option_init() {\r
+// option_is_ok()\r
 \r
-    option_t *p=Option;\r
-    const char * name;\r
+bool option_is_ok(const option_list_t *option) {\r
+    if(option->option_nb<0 || option->option_nb>=OptionNb){\r
+        return FALSE;\r
+    }\r
+    return TRUE;\r
+}\r
 \r
-    while((name=(p++)->name)){\r
-        option_set(name,option_get_default(name));\r
+// option_init_pg()\r
+\r
+void option_init_pg() {\r
+\r
+    int i;\r
+    option_t *p=DefaultOptions;\r
+    \r
+    option_init(Option);\r
+    while(p){\r
+        if(p->name){\r
+            option_insert(Option,p);\r
+            p++;\r
+        }else{\r
+            break;\r
+        }\r
+    }\r
+    for(i=0;i<Option->option_nb;i++){\r
+        Option->options[i].value=my_strdup(Option->options[i].default_);\r
     }\r
 }\r
 \r
+// option_init()\r
+\r
+void option_init(option_list_t *option){\r
+    ASSERT(option!=NULL);\r
+    option->option_nb=0;\r
+    option->iter=0;\r
+    memset(option->options,0,sizeof(option->options));\r
+}\r
+\r
+// option_insert()\r
+\r
+void option_insert(option_list_t *option, option_t *new_option){\r
+    ASSERT(option!=NULL);\r
+    ASSERT(new_option!=NULL);\r
+    ASSERT(new_option->name!=NULL);\r
+    option_t *opt;\r
+    opt=option_find(option,new_option->name);\r
+    if(!opt){\r
+        opt=&option->options[option->option_nb];\r
+        option->option_nb++;\r
+    }\r
+    int i;\r
+    if(option->option_nb>=OptionNb){\r
+        my_fatal("option_insert(): option list overflow\n");\r
+    }\r
+    if(new_option->name)     my_string_set(&opt->name,     new_option->name);\r
+    if(new_option->value)    my_string_set(&opt->value,    new_option->value);\r
+    if(new_option->min)      my_string_set(&opt->min,      new_option->min);\r
+    if(new_option->max)      my_string_set(&opt->max,      new_option->max);\r
+    if(new_option->default_) my_string_set(&opt->default_, new_option->default_);\r
+    if(new_option->type)     my_string_set(&opt->type,     new_option->type);\r
+    opt->var_nb=new_option->var_nb;\r
+    for(i=0;i<new_option->var_nb;i++){\r
+        my_string_set(&opt->var[i], new_option->var[i]);\r
+    }\r
+    opt->mode=new_option->mode;\r
+}\r
 \r
 // option_set()\r
 \r
-bool option_set(const char name[], const char value[]) {\r
+bool option_set(option_list_t *option, \r
+                const char name[], \r
+                const char value[]) {\r
 \r
    option_t * opt;\r
+   ASSERT(option!=NULL);\r
    ASSERT(name!=NULL);\r
    ASSERT(value!=NULL);\r
 \r
-   opt = option_find(name);\r
+   opt = option_find(option,name);\r
    if (opt == NULL) return FALSE;\r
 \r
    my_string_set(&opt->value,value);\r
@@ -108,15 +166,18 @@ bool option_set(const char name[], const char value[]) {
 \r
    return TRUE;\r
 }\r
-// option_set()\r
 \r
-bool option_set_default(const char name[], const char value[]) {\r
+// option_set_default()\r
+\r
+bool option_set_default(option_list_t *option,\r
+                           const char name[], \r
+                           const char value[]) {\r
 \r
    option_t * opt;\r
    ASSERT(name!=NULL);\r
    ASSERT(value!=NULL);\r
 \r
-   opt = option_find(name);\r
+   opt = option_find(option,name);\r
    if (opt == NULL) return FALSE;\r
 \r
    opt->default_=my_strdup(value);\r
@@ -128,15 +189,14 @@ bool option_set_default(const char name[], const char value[]) {
 \r
 // option_get()\r
 \r
-const char * option_get(const char name[]) {\r
+const char * option_get(option_list_t *option, const char name[]) {\r
 \r
    option_t * opt;\r
 \r
    ASSERT(name!=NULL);\r
 \r
-   opt = option_find(name);\r
+   opt = option_find(option,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
@@ -144,13 +204,13 @@ const char * option_get(const char name[]) {
 \r
 // option_get_default()\r
 \r
-const char * option_get_default(const char name[]) {\r
+const char * option_get_default(option_list_t *option, const char name[]) {\r
 \r
    option_t * opt;\r
 \r
    ASSERT(name!=NULL);\r
 \r
-   opt = option_find(name);\r
+   opt = option_find(option,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
@@ -160,11 +220,11 @@ const char * option_get_default(const char name[]) {
 \r
 // option_get_bool()\r
 \r
-bool option_get_bool(const char name[]) {\r
+bool option_get_bool(option_list_t *option, const char name[]) {\r
 \r
    const char * value;\r
 \r
-   value = option_get(name);\r
+   value = option_get(option,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
@@ -178,53 +238,92 @@ bool option_get_bool(const char name[]) {
    return FALSE;\r
 }\r
 \r
+\r
 // option_get_double()\r
 \r
-double option_get_double(const char name[]) {\r
+double option_get_double(option_list_t *option, const char name[]) {\r
 \r
    const char * value;\r
 \r
-   value = option_get(name);\r
+   value = option_get(option,name);\r
 \r
    return atof(value);\r
 }\r
 \r
 // option_get_int()\r
 \r
-int option_get_int(const char name[]) {\r
+int option_get_int(option_list_t *option, const char name[]) {\r
 \r
    const char * value;\r
 \r
-   value = option_get(name);\r
+   value = option_get(option,name);\r
 \r
    return atoi(value);\r
 }\r
 \r
 // option_get_string()\r
 \r
-const char * option_get_string(const char name[]) {\r
+const char * option_get_string(option_list_t *option, const char name[]) {\r
 \r
    const char * value;\r
 \r
-   value = option_get(name);\r
+   value = option_get(option,name);\r
 \r
    return value;\r
 }\r
 \r
 // option_find()\r
 \r
-static option_t * option_find(const char name[]) {\r
+option_t * option_find(option_list_t *option, const char name[]) {\r
 \r
    option_t * opt;\r
+   int i;\r
 \r
    ASSERT(name!=NULL);\r
+   for (i=0; i<option->option_nb; i++){\r
+       opt=option->options+i;\r
+       if (my_string_case_equal(opt->name,name)){\r
+           return opt;\r
+       }\r
+   }\r
+   \r
+   return NULL;\r
+}\r
 \r
+void option_start_iter(option_list_t *option){\r
+    option->iter=0;\r
+}\r
 \r
-   for (opt = &Option[0]; opt->name != NULL; opt++) {\r
-      if (my_string_case_equal(opt->name,name)) return opt;\r
-   }\r
+option_t * option_next(option_list_t *option){\r
+    ASSERT(option->iter<=option->option_nb);\r
+    if(option->iter==option->option_nb){\r
+        return NULL;\r
+    }\r
+    return &option->options[option->iter++];\r
+        \r
+}\r
 \r
-   return NULL;\r
+void option_free(option_t *option){\r
+      int i;\r
+      my_string_clear(&option->name);\r
+      my_string_clear(&option->type);\r
+      my_string_clear(&option->min);\r
+      my_string_clear(&option->max);\r
+      my_string_clear(&option->default_);\r
+      my_string_clear(&option->value);\r
+      for(i=0;i<option->var_nb;i++){\r
+         my_string_clear(&option->var[i]);\r
+      }\r
+      option->var_nb=0;\r
+      option->mode=0;\r
+}\r
+\r
+void option_clear(option_list_t *option){\r
+    int i;\r
+    for (i = 0; i < option->option_nb; i++) {\r
+        option_free(option->options+i);\r
+   }\r
+   option->option_nb=0;\r
 }\r
 \r
 // end of option.cpp\r