Fix loading of opening line
authorH.G.Muller <hgm@hgm-xboard.(none)>
Sun, 2 Jun 2019 20:07:43 +0000 (22:07 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Sun, 2 Jun 2019 20:07:43 +0000 (22:07 +0200)
Appending moves to the game out of sync with otheer commands (i.e. by
the GUI thread) did not work properly: XBoard can send 'new', 'force'
plus a ton of moves all at once, and the appending of moves would then
overtake the 'new'  command (first queued for the engine thread), which
would clear the move number, deleting the moves again. Now the appending
of moves is also deferred to the engine thread, by queuing them.

UCI2WB.c

index 94b23dc..eb3ddc7 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -509,8 +509,8 @@ GUI2Engine()
                EPRINT((f, "# ponderhit%s\n", draw)) fflush(toE); fflush(stdout);\r
            } else {\r
                if(searching) StopSearch(1);     // ponder miss or analysis, as moves won't arrive during thinking\r
-               strcpy(move[moveNr++], command); // possibly overwrites ponder move\r
-               *qEnd++ = '\n'; Sync(WAKEUP);    // queue command to toggle stm\r
+               p = line+7; while(qEnd < queue+10000 && (*qEnd++ = *p++) != '\n') {}\r
+               Sync(WAKEUP);                    // queue move for adding it to game (and toggle stm)\r
            }\r
        } else\r
        if(!strcmp(command, "resume")) {\r
@@ -541,8 +541,7 @@ DoCommand ()
     int i;\r
 \r
     p=line; while(qStart < qEnd && (*p++ = *qStart++) != '\n') {} *p = 0;\r
-    if(line[0] == '\n') { stm = WHITE+BLACK - stm; return; }\r
-    sscanf(line, "%s", command); DPRINT("# command %s\n", command), fflush(stdout);\r
+    sscanf(line, "%s %s", command, type); DPRINT("# command %s\n", command), fflush(stdout);\r
 \r
        if(!strcmp(command, "new")) {\r
            computer = BLACK; moveNr = 0; depth = -1; move[0][0] = 0;\r
@@ -557,6 +556,7 @@ DoCommand ()
            if(sc == 'x') { if(newGame) EPRINT((f, "# setoption newgame\n")) } else // optional in UCCI\r
            EPRINT((f, "# u%cinewgame\n", sc)) fflush(toE);\r
        }\r
+        else if(!strcmp(command, "e")) { strcpy(move[moveNr++], type); stm ^= WHITE|BLACK; return; }\r
        else if(!strcmp(command, "option")) {\r
            char *p;\r
            if(p = strchr(line, '=')) {\r