version 1.4.46b
[polyglot.git] / main.c
diff --git a/main.c b/main.c
index 8d2724b..aaadc82 100644 (file)
--- a/main.c
+++ b/main.c
@@ -39,7 +39,7 @@
 // constants\r
 \r
 \r
-static const char * const Version = "1.4.45b";\r
+static const char * const Version = "1.4.46b";\r
 static const char * const HelpMessage = "\\r
 SYNTAX\n\\r
 * polyglot [configfile] [-noini] [-ec engine] [-ed enginedirectory] [-en enginename] [-log] [-lf logfile] [-hash value] [-bk book] [-pg <name>=<value>]* [-uci <name>=<value>]*\n\\r
@@ -64,6 +64,9 @@ static const char * const IniIntro=
               "; obtained from the engine settings dialog\n"\r
               "; in WinBoard/xboard 4.4.0 and higher.\n"\r
               "\n" \r
+              "; If the value of the option \"Persist\" is false\n"\r
+              "; then the content of this file is ignored.\n"\r
+              "\n"\r
               "; It is allowed to manually edit this file\n"\r
               "; and you may safely delete it as well.\n"\r
               "\n";\r
@@ -88,58 +91,42 @@ static void arg_shift_left(char **argv, int index){
     }\r
 }\r
 \r
-// write_ini()\r
 \r
-static void write_ini(const char *filename,\r
-                      option_list_t *pg_options,\r
-                      option_list_t *uci_options){\r
+// make_ini()\r
+\r
+static void make_ini(ini_t *ini){\r
     option_t *opt;\r
     char tmp[StringSize];\r
-    FILE *f;\r
-    time_t t=time(NULL);\r
-    f=fopen(filename,"w");\r
-    if(!f){\r
-      // alas this does nothing....\r
-      gui_send(GUI,"tellusererror write_ini(): %s: %s.",filename,strerror(errno));\r
-      // but at least we log the error\r
-      my_log("POLYGLOT write_ini(): %s: %s.\n",filename,strerror(errno));\r
-      return;\r
-    }\r
-    fprintf(f,"; %s\n",ctime(&t));\r
-    fprintf(f,IniIntro,option_get_string(Option,"EngineName"));\r
-    fprintf(f,"[PolyGlot]\n");\r
-    fprintf(f,"EngineName=%s\n",\r
-           option_get_string(Option,"EngineName"));\r
-    fprintf(f,"EngineCommand=%s\n",\r
-           option_get_string(Option,"EngineCommand"));\r
-    fprintf(f,"EngineDir=%s\n",\r
-           option_get_string(Option,"EngineDir"));\r
-    option_start_iter(pg_options);\r
-    while((opt=option_next(pg_options))){\r
+    ini_insert_ex(ini,"polyglot",\r
+                 "EngineName",\r
+                 option_get_string(Option,"EngineName"));\r
+    ini_insert_ex(ini,"polyglot",\r
+                 "EngineCommand",\r
+                 option_get_string(Option,"EngineCommand"));\r
+    ini_insert_ex(ini,"polyglot",\r
+                 "EngineDir",\r
+                 option_get_string(Option,"EngineDir"));\r
+    option_start_iter(Option);\r
+    while((opt=option_next(Option))){\r
         if(!my_string_equal(opt->value,opt->default_)&&\r
-           !IS_BUTTON(opt) &&\r
+           !IS_BUTTON(opt->type) &&\r
            (opt->mode & XBOARD)){\r
-            snprintf(tmp,sizeof(tmp),"%s=%s\n",opt->name,opt->value);\r
-            tmp[sizeof(tmp)-1]='\0';\r
-            fprintf(f,"%s",tmp);\r
+         ini_insert_ex(ini,"polyglot",opt->name,opt->value);\r
         }\r
     }\r
-    fprintf(f,"[Engine]\n");\r
-    option_start_iter(uci_options);\r
-    while((opt=option_next(uci_options))){\r
+    option_start_iter(Uci->option);\r
+    while((opt=option_next(Uci->option))){\r
         if(!my_string_equal(opt->value,opt->default_)&&\r
-           !IS_BUTTON(opt)){\r
-            snprintf(tmp,sizeof(tmp),"%s=%s\n",opt->name,opt->value);\r
-            tmp[sizeof(tmp)-1]='\0';\r
-            fprintf(f,"%s",tmp);\r
+           !IS_BUTTON(opt->type)){\r
+         ini_insert_ex(ini,"engine",opt->name,opt->value);\r
         }\r
     }\r
-    fclose(f);\r
 }\r
 \r
-// write_ini_ex()\r
 \r
-static void write_ini_ex(const char *filename,\r
+// write_ini()\r
+\r
+static void write_ini(const char *filename,\r
                         ini_t *ini){\r
     ini_entry_t *entry;\r
     char tmp[StringSize];\r
@@ -156,12 +143,6 @@ static void write_ini_ex(const char *filename,
     fprintf(f,"; %s\n",ctime(&t));\r
     fprintf(f,IniIntro,option_get_string(Option,"EngineName"));\r
     fprintf(f,"[PolyGlot]\n");\r
-    fprintf(f,"EngineName=%s\n",\r
-           option_get_string(Option,"EngineName"));\r
-    fprintf(f,"EngineCommand=%s\n",\r
-           option_get_string(Option,"EngineCommand"));\r
-    fprintf(f,"EngineDir=%s\n",\r
-           option_get_string(Option,"EngineDir"));\r
     ini_start_iter(ini);\r
     while((entry=ini_next(ini))){\r
       if(my_string_case_equal(entry->section,"polyglot")){\r
@@ -388,9 +369,15 @@ int main(int argc, char * argv[]) {
 \r
     if(my_string_equal(option_get_string(Option,"PersistFile"),"<empty>")){\r
         char tmp[StringSize];\r
+       int i;\r
         snprintf(tmp,sizeof(tmp),"%s.ini",\r
                  option_get_string(Option,"EngineName"));\r
         tmp[sizeof(tmp)-1]='\0';\r
+       for(i=0;i<strlen(tmp);i++){\r
+         if(tmp[i]==' '){\r
+           tmp[i]='_';\r
+         }\r
+       }\r
         option_set(Option,"PersistFile",tmp);\r
     }\r
 \r
@@ -561,14 +548,14 @@ void polyglot_set_option(const char *name, const char *value){ // this must be c
     if(my_string_case_equal(name,"Defaults")){\r
       option_start_iter(Uci->option);\r
       while((opt=option_next(Uci->option))){\r
-       if(!IS_BUTTON(opt)){\r
+       if(!IS_BUTTON(opt->type)){\r
        // also sets opt->value\r
          uci_send_option(Uci,opt->name,opt->default_);\r
        }\r
       }\r
       option_start_iter(Option);\r
       while((opt=option_next(Option))){\r
-       if(!IS_BUTTON(opt)){\r
+       if(!IS_BUTTON(opt->type)){\r
          polyglot_set_option(opt->name,opt->default_);\r
        }\r
       }\r
@@ -625,11 +612,11 @@ static void init_book(){
 \r
 void quit() {\r
 \r
-    ini_t empty[1];\r
+    ini_t ini[1];\r
     char persist_path[StringSize];\r
     int ret;\r
 \r
-    ini_init(empty);\r
+    ini_init(ini);\r
 \r
     my_log("POLYGLOT *** QUIT ***\n");\r
     \r
@@ -649,21 +636,25 @@ void quit() {
     // engine is started. \r
     if(!my_string_case_equal(option_get(Option,"PersistFile"),\r
                             "<empty>")){\r
-      my_path_join(persist_path,\r
-                 option_get(Option,"PersistDir"),\r
-                 option_get(Option,"PersistFile"));\r
-      if(option_get_bool(Option,"Persist")){\r
-        write_ini(persist_path,\r
-                  Option,Uci->option);\r
-      }else if(!my_string_case_equal(option_get_default(Option,"Persist"),\r
-                                    option_get_string(Option,"Persist"))){\r
-       // Hack\r
-       ini_insert_ex(empty,"PolyGlot","Persist","false");\r
-       write_ini_ex(persist_path,empty);\r
-      }else{\r
-       write_ini_ex(persist_path,empty);\r
+      // Persistence should only work in XBOARD mode.\r
+      // In UCI mode the GUI is responsible for remembering options.\r
+      if(!option_get_bool(Option,"UCI")){\r
+       my_path_join(persist_path,\r
+                    option_get(Option,"PersistDir"),\r
+                    option_get(Option,"PersistFile"));\r
+       make_ini(ini);\r
+       if(option_get_bool(Option,"Persist")){\r
+         write_ini(persist_path,ini);\r
+       }else if(!my_string_case_equal(option_get_default(Option,"Persist"),\r
+                                      option_get_string(Option,"Persist"))){\r
+         // Hack\r
+         ini_insert_ex(ini,"polyglot","Persist","false");\r
+         write_ini(persist_path,ini);\r
+       }else{\r
+         write_ini(persist_path,ini);\r
+       }\r
+       my_log("POLYGLOT Calling exit\n");\r
       }\r
-      my_log("POLYGLOT Calling exit\n");\r
     }\r
     exit(EXIT_SUCCESS);\r
 }\r