Add -afterGame option
authorH.G. Muller <h.g.muller@hccnet.nl>
Sat, 10 Sep 2011 12:01:58 +0000 (14:01 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 13 Sep 2011 21:05:08 +0000 (23:05 +0200)
This option specifies a command line to be executed after each game of
a tournament. To execute the line, the function RunCommand() was added
in the front-end. For XBoard this was a simple call to system(); for
WinBoard part of the StartChildProcess code was cloned (without the pipe
stuff).

args.h
backend.c
common.h
frontend.h
winboard/winboard.c
xboard.c

diff --git a/args.h b/args.h
index bbdaeeb..e22ebfc 100644 (file)
--- a/args.h
+++ b/args.h
@@ -578,6 +578,7 @@ ArgDescriptor argDescriptors[] = {
   { "syncAfterRound", ArgBoolean, (void *) &appData.roundSync, FALSE, (ArgIniType) FALSE },
   { "syncAfterCycle", ArgBoolean, (void *) &appData.cycleSync, FALSE, (ArgIniType) TRUE },
   { "seedBase", ArgInt, (void *) &appData.seedBase, FALSE, (ArgIniType) 1 },
+  { "afterGame", ArgString, (void *) &appData.afterGame, FALSE, INVALID },
 
   /* [HGM] board-size, adjudication and misc. options */
   { "oneClickMove", ArgBoolean, (void *) &appData.oneClick, TRUE, (ArgIniType) FALSE },
index e3b32e6..9f58b18 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -10437,6 +10437,7 @@ GameEnds(result, resultDetails, whosays)
 
        if(waitingForGame) resChar = ' '; // quit while waiting for round sync: unreserve already reserved game
        if(appData.tourneyFile[0]){ // [HGM] we are in a tourney; update tourney file with game result
+           if(appData.afterGame && appData.afterGame[0]) RunCommand(appData.afterGame);
            ReserveGame(nextGame, resChar); // sets nextGame
            if(nextGame > appData.matchGames) appData.tourneyFile[0] = 0, ranking = TourneyStandings(3); // tourney is done
            else ranking = strdup("busy"); //suppress popup when aborted but not finished
index b45fcf1..98a6149 100644 (file)
--- a/common.h
+++ b/common.h
@@ -667,6 +667,7 @@ typedef struct {
     char *processes;
     char *results;
     char *participants;
+    char *afterGame;
     int tourneyType;
     int tourneyCycles;
     int seedBase;
index 483356a..ec0a4ea 100644 (file)
@@ -143,6 +143,7 @@ int  RightClick P((ClickType c, int x, int y, int *col, int *row));
 int StartChildProcess P((char *cmdLine, char *dir, ProcRef *pr));
 void DestroyChildProcess P((ProcRef pr, int/*boolean*/ signal));
 void InterruptChildProcess P((ProcRef pr));
+void RunCommand P((char *buf));
 
 int OpenTelnet P((char *host, char *port, ProcRef *pr));
 int OpenTCP P((char *host, char *port, ProcRef *pr));
index 223a6f8..83fd4bd 100644 (file)
@@ -8853,6 +8853,37 @@ IDLE_PRIORITY_CLASS         0x00000040
         return 0x00000040;\r
 }\r
 \r
+void RunCommand(char *cmdLine)\r
+{\r
+  /* Now create the child process. */\r
+  STARTUPINFO siStartInfo;\r
+  PROCESS_INFORMATION piProcInfo;\r
+\r
+  siStartInfo.cb = sizeof(STARTUPINFO);\r
+  siStartInfo.lpReserved = NULL;\r
+  siStartInfo.lpDesktop = NULL;\r
+  siStartInfo.lpTitle = NULL;\r
+  siStartInfo.dwFlags = STARTF_USESTDHANDLES;\r
+  siStartInfo.cbReserved2 = 0;\r
+  siStartInfo.lpReserved2 = NULL;\r
+  siStartInfo.hStdInput = NULL;\r
+  siStartInfo.hStdOutput = NULL;\r
+  siStartInfo.hStdError = NULL;\r
+\r
+  CreateProcess(NULL,\r
+               cmdLine,           /* command line */\r
+               NULL,      /* process security attributes */\r
+               NULL,      /* primary thread security attrs */\r
+               TRUE,      /* handles are inherited */\r
+               DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP,\r
+               NULL,      /* use parent's environment */\r
+               NULL,\r
+               &siStartInfo, /* STARTUPINFO pointer */\r
+               &piProcInfo); /* receives PROCESS_INFORMATION */\r
+\r
+  CloseHandle(piProcInfo.hThread);\r
+}\r
+\r
 /* Start a child process running the given program.\r
    The process's standard output can be read from "from", and its\r
    standard input can be written to "to".\r
index 4a88774..4a6d7f0 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -7262,6 +7262,12 @@ EchoOff()
     noEcho = True;
 }
 
+void
+RunCommand(char *buf)
+{
+    system(buf);
+}
+
 void
 Colorize(cc, continuation)
      ColorClass cc;