Implement -installEngine option
authorH.G. Muller <h.g.muller@hccnet.nl>
Fri, 25 Oct 2013 20:24:43 +0000 (22:24 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 22 Dec 2013 22:32:09 +0000 (23:32 +0100)
This volatile string option conditionally adds its argument as a line
to the engine list (-firstChessProgramNames). The condition is that the
line is not yet already there, and either that the -versionNumber option
read from settings files or command line has a value different from the
version of the binary, or that -autoClose is set. It can be used for two
purposes: to install engines from the master settings file (so that it
only works first time after upgrades, when the stored versionNumber is
obsolete), or from engine install scripts (calling XBoard with -autoClose).

args.h
xaw/xboard.c

diff --git a/args.h b/args.h
index 827952e..2d2fc1d 100644 (file)
--- a/args.h
+++ b/args.h
@@ -60,7 +60,7 @@
 typedef enum {
   ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone,
   ArgColor, ArgAttribs, ArgFilename, ArgBoardSize, ArgFont, ArgCommSettings,
-  ArgSettingsFilename, ArgBackupSettingsFile, ArgTwo,
+  ArgSettingsFilename, ArgBackupSettingsFile, ArgTwo, ArgInstall,
   ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window
 } ArgType;
 
@@ -507,6 +507,7 @@ ArgDescriptor argDescriptors[] = {
   { "secondChessProgramNames", ArgString, (void *) &secondChessProgramNames,
     !XBOARD, (ArgIniType) SCP_NAMES },
   { "themeNames", ArgString, (void *) &appData.themeNames, !XBOARD, (ArgIniType) "native -upf false -ub false -ubt false -pid \"\"\n" },
+  { "installEngine", ArgInstall, (void *) &firstChessProgramNames, FALSE, (ArgIniType) "" },
   { "initialMode", ArgString, (void *) &appData.initialMode, FALSE, (ArgIniType) "" },
   { "mode", ArgString, (void *) &appData.initialMode, FALSE, INVALID },
   { "variant", ArgString, (void *) &appData.variant, FALSE, (ArgIniType) "normal" },
@@ -1176,6 +1177,16 @@ ParseArgs(GetFunc get, void *cl)
       ParseCommPortSettings(argValue);
       break;
 
+    case ArgInstall:
+      q = *(char **) ad->argLoc;
+      if((strcmp(version, VERSION) || autoClose) && !strstr(q, argValue) ) {
+        int l = strlen(q) + strlen(argValue);
+        *(char **) ad->argLoc = malloc(l+2);
+        snprintf(*(char **) ad->argLoc, l+2, "%s%s\n", q, argValue);
+        free(q);
+      }
+      break;
+
     case ArgNone:
       ExitArgError(_("Unrecognized argument %s"), argValue, TRUE);
       break;
@@ -1560,6 +1571,7 @@ SaveSettings(char* name)
     case ArgNone:
     case ArgBackupSettingsFile:
     case ArgSettingsFilename: ;
+    case ArgInstall: ;
     }
   }
   fclose(f);
index 5b6501d..b88c445 100644 (file)
@@ -819,6 +819,7 @@ PrintArg (ArgType t)
     case ArgTwo:
     case ArgNone:
     case ArgCommSettings:
+    case ArgInstall:
       break;
   }
   return p;