version 1.4.44b
[polyglot.git] / main.c
diff --git a/main.c b/main.c
index fad2ed8..8bd6276 100644 (file)
--- a/main.c
+++ b/main.c
@@ -36,7 +36,7 @@
 // constants\r
 \r
 \r
-static const char * const Version = "1.4.42b";\r
+static const char * const Version = "1.4.44b";\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
@@ -82,7 +82,7 @@ static void write_ini(const char *filename,
     FILE *f;\r
     f=fopen(filename,"w");\r
     if(!f){\r
-        my_fatal("ini_create_pg(): Cannot open %s for writing.\n",filename);\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
@@ -93,7 +93,7 @@ static void write_ini(const char *filename,
     option_start_iter(pg_options);\r
     while((opt=option_next(pg_options))){\r
         if(!my_string_equal(opt->value,opt->default_)&&\r
-           !my_string_case_equal(opt->type,"button") &&\r
+           !IS_BUTTON(opt) &&\r
            (opt->mode & XBOARD)){\r
             snprintf(tmp,sizeof(tmp),"%s=%s\n",opt->name,opt->value);\r
             tmp[sizeof(tmp)-1]='\0';\r
@@ -104,7 +104,7 @@ static void write_ini(const char *filename,
     option_start_iter(uci_options);\r
     while((opt=option_next(uci_options))){\r
         if(!my_string_equal(opt->value,opt->default_)&&\r
-           !my_string_case_equal(opt->type,"button")){\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
@@ -113,6 +113,47 @@ static void write_ini(const char *filename,
     fclose(f);\r
 }\r
 \r
+// write_ini_ex()\r
+\r
+static void write_ini_ex(const char *filename,\r
+                        ini_t *ini){\r
+    ini_entry_t *entry;\r
+    char tmp[StringSize];\r
+    FILE *f;\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
+    fprintf(f,"[PolyGlot]\n");\r
+    ini_start_iter(ini);\r
+    while((entry=ini_next(ini))){\r
+      if(my_string_case_equal(entry->section,"polyglot")){\r
+       snprintf(tmp,sizeof(tmp),"%s=%s\n",\r
+                entry->name,\r
+                entry->value);\r
+       tmp[sizeof(tmp)-1]='\0';\r
+       fprintf(f,"%s",tmp);\r
+      }\r
+    }\r
+    fprintf(f,"[Engine]\n");\r
+    ini_start_iter(ini);\r
+    while((entry=ini_next(ini))){\r
+      if(my_string_case_equal(entry->section,"engine")){\r
+       snprintf(tmp,sizeof(tmp),"%s=%s\n",\r
+                entry->name,\r
+                entry->value);\r
+       tmp[sizeof(tmp)-1]='\0';\r
+       fprintf(f,"%s",tmp);\r
+      }\r
+    }\r
+    fclose(f);\r
+}\r
+\r
 \r
 // main()\r
 \r
@@ -121,7 +162,7 @@ int main(int argc, char * argv[]) {
     ini_entry_t *entry;\r
     char *arg;\r
     int arg_index;\r
-    bool NoIni;\r
+    bool NoIni, Persist;\r
  \r
     if(!DEBUG){\r
         printf("PolyGlot %s by Fabien Letouzey.\n",Version);\r
@@ -299,8 +340,8 @@ int main(int argc, char * argv[]) {
         my_log("POLYGLOT *** Switching to UCI mode ***\n");\r
     }\r
 \r
-        // initialize uci parsing and send uci command. Parse options and wait\r
-        // for uciok\r
+        // initialize uci parsing and send uci command. \r
+        // Parse options and wait for uciok\r
     \r
     uci_open(Uci,Engine);\r
 \r
@@ -320,16 +361,34 @@ int main(int argc, char * argv[]) {
         option_set(Option,"PersistFile",tmp);\r
     }\r
 \r
-        // if "Persist" is true, load the persist file!\r
-    \r
-    if(option_get_bool(Option,"Persist")){\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_log("POLYGLOT Unable to open PersistFile\n"); \r
-        }\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_log("POLYGLOT Unable to open PersistFile\n"); \r
+    }\r
+\r
+    // Do we want to use the persist file?\r
+\r
+    entry=ini_find(ini_save,"polyglot","Persist");\r
+    if(!entry){\r
+      Persist=option_get_bool(Option,"Persist");\r
+    }else{\r
+      Persist=(my_string_case_equal(entry->value,"false") || \r
+              my_string_equal(entry->value,"0"))?FALSE:TRUE;\r
     }\r
-    \r
-        // parse the command line and merge remaining options\r
+\r
+    // if "Persist" now happens to be false, forget about the\r
+    // persist file    \r
+\r
+    if(!Persist){\r
+      my_log("POLYGLOT Ignoring PersistFile");\r
+      ini_clear(ini_save);\r
+    }\r
+\r
+    option_set(Option,"Persist",Persist?"true":"false");\r
+\r
+    // parse the command line and merge remaining options\r
 \r
     arg_index=1;\r
     while((arg=argv[arg_index])){\r
@@ -380,7 +439,7 @@ int main(int argc, char * argv[]) {
 \r
         // remind the reader once again about options\r
 \r
-    my_log("POLYGLOG Options from save file and command line\n");\r
+    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
@@ -452,7 +511,24 @@ int main(int argc, char * argv[]) {
 // polyglot_set_option()\r
 \r
 void polyglot_set_option(const char *name, const char *value){ // this must be cleaned up!\r
+    option_t *opt;\r
     my_log("POLYGLOT Setting PolyGlot option %s=\"%s\"\n",name,value);\r
+    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
+       // 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
+         polyglot_set_option(opt->name,opt->default_);\r
+       }\r
+      }\r
+      xboard2uci_send_options();\r
+    }\r
     option_set(Option,name,value);\r
     if(option_get_bool(Option,"Book")&&(my_string_case_equal(name,"BookFile")||my_string_case_equal(name,"Book"))){\r
         my_log("POLYGLOT *** SETTING BOOK ***\n");\r
@@ -464,7 +540,7 @@ void polyglot_set_option(const char *name, const char *value){ // this must be c
             my_log("POLYGLOT Unable to open book \"%s\"\n",option_get_string(Option,"BookFile"));\r
         }\r
     }else if(option_get_bool(Option,"Log")&&(my_string_case_equal(name,"LogFile") ||my_string_case_equal(name,"Log"))){\r
-        my_log("POLYGLOT *** SETTING LOGFILE ***\n");\r
+        my_log("POLYGLOT *** SWITCHING LOGFILE ***\n");\r
         my_log("POLYGLOT LOGFILE \"%s\"\n",option_get_string(Option,"LogFile"));\r
         my_log_close();\r
         my_log_open(option_get_string(Option,"LogFile"));\r
@@ -504,6 +580,10 @@ static void init_book(){
 \r
 void quit() {\r
 \r
+    ini_t empty[1];\r
+\r
+    ini_init(empty);\r
+\r
     my_log("POLYGLOT *** QUIT ***\n");\r
     \r
     if (Init) {\r
@@ -514,9 +594,17 @@ 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
                   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
     }\r
     my_log("POLYGLOT Calling exit\n");\r
     exit(EXIT_SUCCESS);\r