X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gamelist.c;h=2be1fe8b6444793f0b4bf3417d306b889454f69d;hb=2380bd9a886c088ba6040d99932c20cdf080fbbb;hp=e8d4132b6fdecf297a274962a1aee0fddbf0bbd8;hpb=3076655d51195e09429c2abde2763e917d3a67a9;p=xboard.git diff --git a/gamelist.c b/gamelist.c index e8d4132..2be1fe8 100644 --- a/gamelist.c +++ b/gamelist.c @@ -70,6 +70,7 @@ static void GameListDeleteGame(listGame) if (listGame->gameInfo.resultDetails) free(listGame->gameInfo.resultDetails); if (listGame->gameInfo.timeControl) free(listGame->gameInfo.timeControl); if (listGame->gameInfo.extraTags) free(listGame->gameInfo.extraTags); + if (listGame->gameInfo.outOfBook) free(listGame->gameInfo.outOfBook); ListNodeFree((ListNode *) listGame); } } @@ -107,6 +108,7 @@ void GameListInitGameInfo(gameInfo) gameInfo->whiteRating = -1; /* unknown */ gameInfo->blackRating = -1; /* unknown */ gameInfo->variant = VariantNormal; + gameInfo->outOfBook = NULL; } @@ -295,12 +297,16 @@ void ClearGameInfo(gameInfo) if (gameInfo->extraTags != NULL) { free(gameInfo->extraTags); } + if (gameInfo->outOfBook != NULL) { + free(gameInfo->outOfBook); + } GameListInitGameInfo(gameInfo); } +/* [AS] Replaced by "dynamic" tag selection below */ char * -GameListLine(number, gameInfo) +GameListLineOld(number, gameInfo) int number; GameInfo *gameInfo; { @@ -317,3 +323,97 @@ GameListLine(number, gameInfo) return ret; } +#define MAX_FIELD_LEN 64 /* To avoid overflowing the buffer */ + +char * GameListLine( int number, GameInfo * gameInfo ) +{ + char buffer[1024]; + char * buf = buffer; + char * glt = appData.gameListTags; + + buf += sprintf( buffer, "%d.", number ); + + while( *glt != '\0' ) { + *buf++ = ' '; + + switch( *glt ) { + case GLT_EVENT: + strncpy( buf, gameInfo->event ? gameInfo->event : "?", MAX_FIELD_LEN ); + break; + case GLT_SITE: + strncpy( buf, gameInfo->site ? gameInfo->site : "?", MAX_FIELD_LEN ); + break; + case GLT_DATE: + strncpy( buf, gameInfo->date ? gameInfo->date : "?", MAX_FIELD_LEN ); + break; + case GLT_ROUND: + strncpy( buf, gameInfo->round ? gameInfo->round : "?", MAX_FIELD_LEN ); + break; + case GLT_PLAYERS: + strncpy( buf, gameInfo->white ? gameInfo->white : "?", MAX_FIELD_LEN ); + buf[ MAX_FIELD_LEN-1 ] = '\0'; + buf += strlen( buf ); + *buf++ = '-'; + strncpy( buf, gameInfo->black ? gameInfo->black : "?", MAX_FIELD_LEN ); + break; + case GLT_RESULT: + strcpy( buf, PGNResult(gameInfo->result) ); + break; + case GLT_WHITE_ELO: + if( gameInfo->whiteRating > 0 ) + sprintf( buf, "%d", gameInfo->whiteRating ); + else + strcpy( buf, "?" ); + break; + case GLT_BLACK_ELO: + if( gameInfo->blackRating > 0 ) + sprintf( buf, "%d", gameInfo->blackRating ); + else + strcpy( buf, "?" ); + break; + case GLT_TIME_CONTROL: + strncpy( buf, gameInfo->timeControl ? gameInfo->timeControl : "?", MAX_FIELD_LEN ); + break; + case GLT_VARIANT: + break; + case GLT_OUT_OF_BOOK: + strncpy( buf, gameInfo->outOfBook ? gameInfo->outOfBook : "?", MAX_FIELD_LEN ); + break; + default: + break; + } + + buf[MAX_FIELD_LEN-1] = '\0'; + + buf += strlen( buf ); + + glt++; + + if( *glt != '\0' ) { + *buf++ = ','; + } + } + + *buf = '\0'; + + return strdup( buffer ); +} + +char * GameListLineFull( int number, GameInfo * gameInfo ) +{ + char * event = gameInfo->event ? gameInfo->event : "?"; + char * site = gameInfo->site ? gameInfo->site : "?"; + char * white = gameInfo->white ? gameInfo->white : "?"; + char * black = gameInfo->black ? gameInfo->black : "?"; + char * round = gameInfo->round ? gameInfo->round : "?"; + char * date = gameInfo->date ? gameInfo->date : "?"; + char * oob = gameInfo->outOfBook ? gameInfo->outOfBook : ""; + + int len = 64 + strlen(event) + strlen(site) + strlen(white) + strlen(black) + strlen(date) + strlen(oob); + + char *ret = (char *) malloc(len); + + sprintf(ret, "%d, \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"", number, event, site, round, white, black, PGNResult(gameInfo->result), date, oob ); + + return ret; +}