X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=6645db166a7d7b3b69e7ad8991b418d9a1cc0979;hb=84704f266e28a5bbb0e10a7282db30b9983b87ea;hp=2ed15a330019fa2655e6481555cd8020a184dbbe;hpb=00d7f7869e045cbed5037d39e1e56224692eb766;p=xboard.git diff --git a/backend.c b/backend.c index 2ed15a3..6645db1 100644 --- a/backend.c +++ b/backend.c @@ -876,7 +876,7 @@ static char resetOptions[] = void Load(ChessProgramState *cps, int i) { - char *p, *q, buf[MSG_SIZ], command[MSG_SIZ]; + char *p, *q, buf[MSG_SIZ], command[MSG_SIZ], buf2[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* @@ -896,6 +896,7 @@ Load(ChessProgramState *cps, int i) appData.directory[i] = strdup(engineName); p[-1] = SLASH; } else appData.directory[i] = "."; + if(strchr(p, ' ') && !strchr(p, '"')) snprintf(buf2, MSG_SIZ, "\"%s\"", p), p = buf2; // quote if it contains spaces if(params[0]) { snprintf(command, MSG_SIZ, "%s %s", p, params); p = command; @@ -908,9 +909,12 @@ Load(ChessProgramState *cps, int i) if(useNick) ASSIGN(appData.pgnName[i], nickName); if(addToList) { int len; + char quote; q = firstChessProgramNames; if(nickName[0]) snprintf(buf, MSG_SIZ, "\"%s\" -fcp ", nickName); else buf[0] = NULLCHAR; - snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), "\"%s\" -fd \"%s\"%s%s%s%s%s%s%s%s\n", p, appData.directory[i], + quote = strchr(p, '"') ? '\'' : '"'; // use single quotes around engine command if it contains double quotes + snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), "%c%s%c -fd \"%s\"%s%s%s%s%s%s%s%s\n", + quote, p, quote, appData.directory[i], useNick ? " -fn \"" : "", useNick ? nickName : "", useNick ? "\"" : "", @@ -1376,7 +1380,7 @@ ReserveGame(int gameNr, char resChar) safeStrCpy(q, p, strlen(p) + 2); if(gameNr >= 0) q[gameNr] = resChar; // replace '*' with result if(appData.debugMode) fprintf(debugFP, "pick next game from '%s': %d\n", q, nextGame); - if(nextGame <= appData.matchGames && resChar != ' ') { // already reserve next game, if tourney not yet done + if(nextGame <= appData.matchGames && resChar != ' ' && !abortMatch) { // reserve next game if tourney not yet done if(q[nextGame] == NULLCHAR) q[nextGame+1] = NULLCHAR; // append one char q[nextGame] = '*'; } @@ -1388,7 +1392,7 @@ ReserveGame(int gameNr, char resChar) fprintf(tf, "%s\"\n", q); fclose(tf); // update, and flush by closing DisplayMessage(buf, ""); free(p); appData.results = q; - if(nextGame <= appData.matchGames && resChar != ' ' && + if(nextGame <= appData.matchGames && resChar != ' ' && !abortMatch && (gameNr < 0 || nextGame / appData.defaultMatchGames != gameNr / appData.defaultMatchGames)) { UnloadEngine(&first); // next game belongs to other pairing; UnloadEngine(&second); // already unload the engines, so TwoMachinesEvent will load new ones. @@ -1401,8 +1405,7 @@ MatchEvent(int mode) int dummy; if(matchMode) { // already in match mode: switch it off abortMatch = TRUE; - appData.matchGames = appData.tourneyFile[0] ? nextGame: matchGame; // kludge to let match terminate after next game. - ModeHighlight(); // kludgey way to remove checkmark... + if(!appData.tourneyFile[0]) appData.matchGames = matchGame; // kludge to let match terminate after next game. return; } // if(gameMode != BeginningOfGame) { @@ -1410,7 +1413,7 @@ MatchEvent(int mode) // return; // } abortMatch = FALSE; - appData.matchGames = appData.defaultMatchGames; + if(mode == 2) appData.matchGames = appData.defaultMatchGames; /* Set up machine vs. machine match */ nextGame = 0; NextTourneyGame(-1, &dummy); // sets appData.matchGames if this is tourney, to make sure ReserveGame knows it @@ -7139,8 +7142,6 @@ TourneyStandings(int display) int score[MAXPLAYERS], ranking[MAXPLAYERS], points[MAXPLAYERS], games[MAXPLAYERS]; char result, *p, *names[MAXPLAYERS]; - if(appData.tourneyType < 0) return strdup("Swiss tourney finished"); // standings of Swiss yet TODO - names[0] = p = strdup(appData.participants); while(p = strchr(p, '\n')) *p++ = NULLCHAR, names[++nPlayers] = p; // count participants @@ -7163,6 +7164,7 @@ TourneyStandings(int display) games[b]++; nr++; } + if(appData.tourneyType < 0) return strdup("Swiss tourney finished"); // standings of Swiss yet TODO if(appData.tourneyType > 0) nPlayers = appData.tourneyType; // in gauntlet, list only gauntlet engine(s) for(w=0; wtm_year+1900; break; + case 'y': i = tm->tm_year-100; break; + case 'M': i = tm->tm_mon+1; break; + case 'd': i = tm->tm_mday; break; + case 'h': i = tm->tm_hour; break; + case 'm': i = tm->tm_min; break; + case 's': i = tm->tm_sec; break; + default: i = 0; + } + snprintf(p-1, MSG_SIZ-10 - (p - buf), "%02d", i); p += strlen(p); + } + return buf; +} + int CountPlayers(char *p) { @@ -9596,17 +9627,21 @@ CreateTourney(char *name) { FILE *f; if(name[0] == NULLCHAR) { - DisplayError(_("You must supply a tournament file,\nfor storing the tourney progress"), 0); + if(appData.participants[0]) + DisplayError(_("You must supply a tournament file,\nfor storing the tourney progress"), 0); return 0; } - f = fopen(appData.tourneyFile, "r"); + f = fopen(name, "r"); if(f) { // file exists + ASSIGN(appData.tourneyFile, name); ParseArgsFromFile(f); // parse it } else { - if(CountPlayers(appData.participants) < appData.tourneyType + (!appData.tourneyType) + 1) { + if(!appData.participants[0]) return 0; // ignore tourney file if non-existing & no participants + if(CountPlayers(appData.participants) < (appData.tourneyType>0 ? appData.tourneyType+1 : 2)) { DisplayError(_("Not enough participants"), 0); return 0; } + ASSIGN(appData.tourneyFile, name); if((f = WriteTourneyFile("")) == NULL) return 0; } fclose(f); @@ -10174,9 +10209,10 @@ GameEnds(result, resultDetails, whosays) } if(waitingForGame) resChar = ' '; // quit while waiting for round sync: unreserve already reserved game - if(appData.tourneyFile[0] && !abortMatch){ // [HGM] we are in a tourney; update tourney file with game result + if(appData.tourneyFile[0]){ // [HGM] we are in a tourney; update tourney file with game result 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 } else roundNr = nextGame = matchGame + 1; // normal match, just increment; round equals matchGame if (nextGame <= appData.matchGames && !abortMatch) { @@ -12658,6 +12694,12 @@ DisplayTwoMachinesTitle() { char buf[MSG_SIZ]; if (appData.matchGames > 0) { + if(appData.tourneyFile[0]) { + snprintf(buf, MSG_SIZ, "%s vs. %s (%d/%d%s)", + gameInfo.white, gameInfo.black, + nextGame+1, appData.matchGames+1, + appData.tourneyType>0 ? "gt" : appData.tourneyType<0 ? "sw" : "rr"); + } else if (first.twoMachinesColor[0] == 'w') { snprintf(buf, MSG_SIZ, "%s vs. %s (%d-%d-%d)", gameInfo.white, gameInfo.black,