From 36d1207becf35a3918d561fb3b4d8b8b0b2d28ea Mon Sep 17 00:00:00 2001 From: H.G.Muller Date: Sun, 27 Mar 2016 12:59:36 +0200 Subject: [PATCH] Allow a list of best moves in EPD All characters upto a semicolon (rather than space) are now read as bestMove string. For checking the correctness of a solution all moves in this string are parsed and compared. --- backend.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-) diff --git a/backend.c b/backend.c index c61649f..325888f 100644 --- a/backend.c +++ b/backend.c @@ -9723,10 +9723,18 @@ FakeBookMove: // [HGM] book: we jump here to simulate machine moves after book h if(*bestMove) { // rememer time best EPD move was first found int ff1, tf1, fr1, tr1, ff2, tf2, fr2, tr2; char pp1, pp2; - ChessMove mt; - int ok = ParseOneMove(bestMove, forwardMostMove, &mt, &ff1, &fr1, &tf1, &tr1, &pp1); - ok &= ParseOneMove(pv, forwardMostMove, &mt, &ff2, &fr2, &tf2, &tr2, &pp2); - solvingTime = (ok && ff1==ff2 && fr1==fr2 && tf1==tf2 && tr1==tr2 && pp1==pp2 ? (solvingTime < 0 ? time : solvingTime) : -1); + ChessMove mt; char *p = bestMove, solved = 0; + int ok = ParseOneMove(pv, forwardMostMove, &mt, &ff2, &fr2, &tf2, &tr2, &pp2); + while(ok && *p && ParseOneMove(p, forwardMostMove, &mt, &ff1, &fr1, &tf1, &tr1, &pp1)) { + if(ff1==ff2 && fr1==fr2 && tf1==tf2 && tr1==tr2 && pp1==pp2) { + solvingTime = (solvingTime < 0 ? time : solvingTime); + solved = 1; + break; + } + while(*p && *p != ' ') p++; + while(*p == ' ') p++; + } + if(!solved) solvingTime = -1; } if(serverMoves && (time > 100 || time == 0 && plylev > 7)) { @@ -13540,7 +13548,7 @@ LoadPosition (FILE *f, int positionNumber, char *title) return FALSE; } if((strchr(line, ';')) && (p = strstr(line, " bm "))) { // EPD with best move - sscanf(p+4, "%s", bestMove); + sscanf(p+4, "%[^;]", bestMove); } else *bestMove = NULLCHAR; } else { (void) fgets(line, MSG_SIZ, f); -- 1.7.0.4