X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=61011654c7203bd87736073cdd661d6a089bd134;hb=30d2dde0f9524475deb12e3a32bcee41fad6aeb6;hp=f2c0c98ad960e2a9790ab924a5fba818a8ae63ff;hpb=ecd851c92b21c55ac41a91870deabeff6409fb96;p=xboard.git diff --git a/backend.c b/backend.c index f2c0c98..6101165 100644 --- a/backend.c +++ b/backend.c @@ -506,6 +506,8 @@ ChessMove savedResult[MAX_VARIATIONS]; void PushTail P((int firstMove, int lastMove)); Boolean PopTail P((Boolean annotate)); +void PushInner P((int firstMove, int lastMove)); +void PopInner P((Boolean annotate)); void CleanupTail P((void)); ChessSquare FIDEArray[2][BOARD_FILES] = { @@ -858,12 +860,13 @@ ReplaceEngine(ChessProgramState *cps, int n) LoadEngine(); } -extern char *engineName, *engineDir, *engineChoice, *engineLine, *nickName; +extern char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params; extern Boolean isUCI, hasBook, storeVariant, v1, addToList; -void Load(ChessProgramState *cps, int i) +void +Load(ChessProgramState *cps, int i) { - char *p, *q, buf[MSG_SIZ]; + char *p, *q, buf[MSG_SIZ], command[MSG_SIZ]; if(engineLine[0]) { // an engine was selected from the combo box snprintf(buf, MSG_SIZ, "-fcp %s", engineLine); SwapEngines(i); // kludge to parse -f* / -first* like it is -s* / -second* @@ -875,15 +878,19 @@ void Load(ChessProgramState *cps, int i) } p = engineName; while(q = strchr(p, SLASH)) p = q+1; - if(*p== NULLCHAR) return; - appData.chessProgram[i] = strdup(p); + if(*p== NULLCHAR) { DisplayError(_("You did not specify the engine executable"), 0); return; } if(engineDir[0] != NULLCHAR) appData.directory[i] = engineDir; else if(p != engineName) { // derive directory from engine path, when not given p[-1] = 0; appData.directory[i] = strdup(engineName); - p[-1] = '/'; + p[-1] = SLASH; } else appData.directory[i] = "."; + if(params[0]) { + snprintf(command, MSG_SIZ, "%s %s", p, params); + p = command; + } + appData.chessProgram[i] = strdup(p); appData.isUCI[i] = isUCI; appData.protocolVersion[i] = v1 ? 1 : PROTOVER; appData.hasOwnBookUCI[i] = hasBook; @@ -897,7 +904,6 @@ void Load(ChessProgramState *cps, int i) isUCI ? " -fUCI" : "", storeVariant ? " -variant " : "", storeVariant ? VariantName(gameInfo.variant) : ""); -fprintf(debugFP, "new line: %s", buf); firstChessProgramNames = malloc(len = strlen(q) + strlen(buf) + 1); snprintf(firstChessProgramNames, len, "%s%s", q, buf); if(q) free(q); @@ -1365,6 +1371,16 @@ void MatchEvent(int mode) { // [HGM] moved out of InitBackend3, to make it callable when match starts through menu int dummy; + if(matchMode) { // already in match mode: switch it off + appData.matchGames = matchGame; // kludge to let match terminate after next game. + ModeHighlight(); // kludgey way to remove checkmark... + return; + } + if(gameMode != BeginningOfGame) { + DisplayError(_("You can only start a match from the initial position."), 0); + return; + } + appData.matchGames = appData.defaultMatchGames; /* Set up machine vs. machine match */ nextGame = 0; NextTourneyGame(0, &dummy); // sets appData.matchGames if this is tourney, to make sure ReserveGame knows it @@ -5207,6 +5223,7 @@ ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar) } } +Boolean pushed = FALSE; void ParsePV(char *pv, Boolean storeComments) @@ -5216,6 +5233,10 @@ ParsePV(char *pv, Boolean storeComments) Boolean valid; int nr = 0; + if (gameMode == AnalyzeMode && currentMove < forwardMostMove) { + PushInner(currentMove, forwardMostMove); // [HGM] engine might not be thinking on forwardMost position! + pushed = TRUE; + } endPV = forwardMostMove; do { while(*pv == ' ' || *pv == '\n' || *pv == '\t') pv++; // must still read away whitespace @@ -5312,6 +5333,7 @@ UnLoadPV() if(endPV < 0) return; endPV = -1; currentMove = forwardMostMove; + if(pushed) { PopInner(0); pushed = FALSE; } // restore shelved game contnuation ClearPremoveHighlights(); DrawPosition(TRUE, boards[currentMove]); } @@ -16045,16 +16067,10 @@ int wrap(char *dest, char *src, int count, int width, int *lp) // [HGM] vari: routines for shelving variations void -PushTail(int firstMove, int lastMove) +PushInner(int firstMove, int lastMove) { int i, j, nrMoves = lastMove - firstMove; - if(appData.icsActive) { // only in local mode - forwardMostMove = currentMove; // mimic old ICS behavior - return; - } - if(storedGames >= MAX_VARIATIONS-1) return; - // push current tail of game on stack savedResult[storedGames] = gameInfo.result; savedDetails[storedGames] = gameInfo.resultDetails; @@ -16079,19 +16095,27 @@ PushTail(int firstMove, int lastMove) storedGames++; forwardMostMove = firstMove; // truncate game so we can start variation +} + +void +PushTail(int firstMove, int lastMove) +{ + if(appData.icsActive) { // only in local mode + forwardMostMove = currentMove; // mimic old ICS behavior + return; + } + if(storedGames >= MAX_VARIATIONS-2) return; // leave one for PV-walk + + PushInner(firstMove, lastMove); if(storedGames == 1) GreyRevert(FALSE); } -Boolean -PopTail(Boolean annotate) +void +PopInner(Boolean annotate) { int i, j, nrMoves; char buf[8000], moveBuf[20]; - if(appData.icsActive) return FALSE; // only in local mode - if(!storedGames) return FALSE; // sanity - CommentPopDown(); // make sure no stale variation comments to the destroyed line can remain open - storedGames--; ToNrEvent(savedFirst[storedGames]); // sets currentMove nrMoves = savedLast[storedGames] - currentMove; @@ -16131,6 +16155,17 @@ PopTail(Boolean annotate) } gameInfo.resultDetails = savedDetails[storedGames]; forwardMostMove = currentMove + nrMoves; +} + +Boolean +PopTail(Boolean annotate) +{ + if(appData.icsActive) return FALSE; // only in local mode + if(!storedGames) return FALSE; // sanity + CommentPopDown(); // make sure no stale variation comments to the destroyed line can remain open + + PopInner(annotate); + if(storedGames == 0) GreyRevert(TRUE); return TRUE; }