version 1.4.45b
[polyglot.git] / main.c
diff --git a/main.c b/main.c
index 8bd6276..8d2724b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -7,6 +7,7 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
+#include <time.h>\r
 \r
 #include "attack.h"\r
 #include "board.h"\r
 #include "xboard2uci.h"\r
 #include "uci2uci.h"\r
 #include "ini.h"\r
+#include "util.h"\r
+\r
 \r
 // constants\r
 \r
 \r
-static const char * const Version = "1.4.44b";\r
+static const char * const Version = "1.4.45b";\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
@@ -52,6 +55,19 @@ static const int SearchDepth = 63;
 static const double SearchTime = 3600.0;\r
 static const int StringSize = 4096;\r
 \r
+static const char * const IniIntro=\r
+              "; This ini file is used internally by PolyGlot\n"\r
+              "; to remember the settings for the UCI engine\n"\r
+              "; whose name is \"%s\".\n"\r
+              "\n"\r
+              "; The values for these settings would be typicallly\n"\r
+              "; obtained from the engine settings dialog\n"\r
+              "; in WinBoard/xboard 4.4.0 and higher.\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
+\r
 // variables\r
 \r
 static bool Init;\r
@@ -80,16 +96,24 @@ static void write_ini(const char *filename,
     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
-        my_fatal("write_ini(): Cannot open %s for writing.\n",filename);\r
-    }\r
-    fprintf(f,"; You may edit this file to set options for the\n"\r
-              "; UCI engine whose PolyGlot name is %s.\n"\r
-              "; You may also safely delete this file\n"\r
-              "; to restore the default options.\n",\r
-            option_get_string(Option,"EngineName"));\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
         if(!my_string_equal(opt->value,opt->default_)&&\r
@@ -120,16 +144,24 @@ static void write_ini_ex(const char *filename,
     ini_entry_t *entry;\r
     char tmp[StringSize];\r
     FILE *f;\r
+    time_t t=time(NULL);\r
     f=fopen(filename,"w");\r
     if(!f){\r
-        my_fatal("write_ini_ex(): Cannot open %s for writing.\n",filename);\r
-    }\r
-    fprintf(f,"; You may edit this file to set options for the\n"\r
-              "; UCI engine whose PolyGlot name is %s.\n"\r
-              "; You may also safely delete this file\n"\r
-              "; to restore the default options.\n",\r
-            option_get_string(Option,"EngineName"));\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
     ini_start_iter(ini);\r
     while((entry=ini_next(ini))){\r
       if(my_string_case_equal(entry->section,"polyglot")){\r
@@ -163,6 +195,7 @@ int main(int argc, char * argv[]) {
     char *arg;\r
     int arg_index;\r
     bool NoIni, Persist;\r
+    char persist_path[StringSize];\r
  \r
     if(!DEBUG){\r
         printf("PolyGlot %s by Fabien Letouzey.\n",Version);\r
@@ -355,7 +388,7 @@ int main(int argc, char * argv[]) {
 \r
     if(my_string_equal(option_get_string(Option,"PersistFile"),"<empty>")){\r
         char tmp[StringSize];\r
-        snprintf(tmp,sizeof(tmp),"PG_%s.ini",\r
+        snprintf(tmp,sizeof(tmp),"%s.ini",\r
                  option_get_string(Option,"EngineName"));\r
         tmp[sizeof(tmp)-1]='\0';\r
         option_set(Option,"PersistFile",tmp);\r
@@ -363,8 +396,12 @@ int main(int argc, char * argv[]) {
 \r
     // Load the persist file\r
 \r
-    my_log("POLYGLOT PersistFile=%s\n",option_get_string(Option,"PersistFile"));   \r
-    if(ini_parse(ini_save,option_get_string(Option,"PersistFile"))){\r
+    my_path_join(persist_path,\r
+                 option_get_string(Option,"PersistDir"),\r
+                 option_get_string(Option,"PersistFile"));\r
+\r
+    my_log("POLYGLOT PersistFile=%s\n",persist_path);   \r
+    if(ini_parse(ini_save,persist_path)){\r
       my_log("POLYGLOT Unable to open PersistFile\n"); \r
     }\r
 \r
@@ -442,13 +479,21 @@ int main(int argc, char * argv[]) {
     my_log("POLYGLOG Options from PersistFile and command line\n");\r
     ini_disp(ini_save);\r
 \r
-        // extract PG options; this time do not set the default\r
+        // Extract PG options; this time do not set the default.\r
         // polyglot_set_option() performs the necessary actions such\r
         // as opening the log file/opening book etcetera.\r
+        // Ignore EngineName, EngineCommand and EngineDir\r
+        // as these are really meant as comments.\r
     \r
     ini_start_iter(ini_save);\r
     while((entry=ini_next(ini_save))){\r
         if(my_string_case_equal(entry->section,"polyglot")){\r
+           if(my_string_case_equal(entry->value,"EngineName")) \r
+              continue;\r
+           if(my_string_case_equal(entry->value,"EngineCommand")) \r
+              continue;\r
+           if(my_string_case_equal(entry->value,"EngineDir")) \r
+              continue;\r
             polyglot_set_option(entry->name,entry->value);\r
         }\r
     }\r
@@ -581,6 +626,8 @@ static void init_book(){
 void quit() {\r
 \r
     ini_t empty[1];\r
+    char persist_path[StringSize];\r
+    int ret;\r
 \r
     ini_init(empty);\r
 \r
@@ -594,19 +641,30 @@ void quit() {
         engine_close(Engine);\r
         \r
     }\r
-    //    printf("def=%s val=%s\n",option_get_default(Option,"Persist"),option_get_string(Option,"Persist"));\r
-    if(option_get_bool(Option,"Persist")){\r
-        write_ini(option_get_string(Option,"PersistFile"),\r
+    ret=my_mkdir(option_get(Option,"PersistDir"));\r
+    if(ret){\r
+      my_log("POLYGLOT quit(): %s: %s\n",option_get(Option,"PersistDir"),strerror(errno));\r
+    }\r
+    // PersistFile can be named "<empty>" in case of a crash before the\r
+    // 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(option_get_string(Option,"PersistFile"),empty);\r
-    }else{\r
-      write_ini_ex(option_get_string(Option,"PersistFile"),empty);\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
+      }\r
+      my_log("POLYGLOT Calling exit\n");\r
     }\r
-    my_log("POLYGLOT Calling exit\n");\r
     exit(EXIT_SUCCESS);\r
 }\r
 \r