X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gamelist.c;h=c200251c925daf431bc3b41a9e151fc0f00b8eb4;hb=b382d988c6f886f3a49483df9e3e36de0b6b0824;hp=e7a2b4c2520fb49dac6fa4e6c6f37eb98a985183;hpb=2b546bdf3126bdacdeb9d40f34cfbbc1cb163db5;p=xboard.git diff --git a/gamelist.c b/gamelist.c index e7a2b4c..c200251 100644 --- a/gamelist.c +++ b/gamelist.c @@ -1,7 +1,7 @@ /* * gamelist.c -- Functions to manage a gamelist * - * Copyright 1995,2009 Free Software Foundation, Inc. + * Copyright 1995, 2009, 2010, 2011 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * @@ -18,7 +18,7 @@ * General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/. + * along with this program. If not, see http://www.gnu.org/licenses/. * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ @@ -225,7 +225,7 @@ int GameListBuild(f) do { yyboardindex = 0; offset = yyoffset(); - cm = (ChessMove) yylex(); + cm = (ChessMove) Myylex(); switch (cm) { case GNUChessGame: if ((error = GameListNewGame(¤tListGame))) { @@ -280,7 +280,7 @@ int GameListBuild(f) do { yyboardindex = 1; offset = yyoffset(); - cm = (ChessMove) yylex(); + cm = (ChessMove) Myylex(); if (cm == PGNTag) { ParsePGNTag(yy_text, ¤tListGame->gameInfo); } @@ -308,9 +308,9 @@ int GameListBuild(f) free(currentListGame->gameInfo.resultDetails); } if(yy_text[0] == '{') { char *p; - strcpy(lastComment, yy_text+1); - if(p = strchr(lastComment, '}')) *p = 0; - currentListGame->gameInfo.resultDetails = StrSave(lastComment); + safeStrCpy(lastComment, yy_text+1, sizeof(lastComment)/sizeof(lastComment[0])); + if(p = strchr(lastComment, '}')) *p = 0; + currentListGame->gameInfo.resultDetails = StrSave(lastComment); } break; default: @@ -389,7 +389,7 @@ GameListLineOld(number, gameInfo) char *white = gameInfo->white ? gameInfo->white : "?"; char *black = gameInfo->black ? gameInfo->black : "?"; char *date = gameInfo->date ? gameInfo->date : "?"; - int len = 10 + strlen(event) + 2 + strlen(white) + 1 + + int len = 10 + strlen(event) + 2 + strlen(white) + 1 + strlen(black) + 11 + strlen(date) + 1; char *ret = (char *) malloc(len); sprintf(ret, "%d. %s, %s-%s, %s, %s", @@ -401,10 +401,10 @@ GameListLineOld(number, gameInfo) char * GameListLine( int number, GameInfo * gameInfo ) { - char buffer[1024]; + char buffer[2*MSG_SIZ]; char * buf = buffer; char * glt = appData.gameListTags; - + buf += sprintf( buffer, "%d.", number ); while( *glt != '\0' ) { @@ -431,19 +431,19 @@ char * GameListLine( int number, GameInfo * gameInfo ) strncpy( buf, gameInfo->black ? gameInfo->black : "?", MAX_FIELD_LEN ); break; case GLT_RESULT: - strcpy( buf, PGNResult(gameInfo->result) ); + safeStrCpy( buf, PGNResult(gameInfo->result), 2*MSG_SIZ ); break; case GLT_WHITE_ELO: if( gameInfo->whiteRating > 0 ) - sprintf( buf, "%d", gameInfo->whiteRating ); + sprintf( buf, "%d", gameInfo->whiteRating ); else - strcpy( buf, "?" ); + safeStrCpy( buf, "?" , 2*MSG_SIZ); break; case GLT_BLACK_ELO: if( gameInfo->blackRating > 0 ) sprintf( buf, "%d", gameInfo->blackRating ); else - strcpy( buf, "?" ); + safeStrCpy( buf, "?" , 2*MSG_SIZ); break; case GLT_TIME_CONTROL: strncpy( buf, gameInfo->timeControl ? gameInfo->timeControl : "?", MAX_FIELD_LEN ); @@ -486,7 +486,7 @@ char * GameListLineFull( int number, GameInfo * gameInfo ) char * date = gameInfo->date ? gameInfo->date : "?"; char * oob = gameInfo->outOfBook ? gameInfo->outOfBook : ""; char * reason = gameInfo->resultDetails ? gameInfo->resultDetails : ""; - + int len = 64 + strlen(event) + strlen(site) + strlen(white) + strlen(black) + strlen(date) + strlen(oob) + strlen(reason); char *ret = (char *) malloc(len); @@ -496,3 +496,115 @@ char * GameListLineFull( int number, GameInfo * gameInfo ) return ret; } + +// --------------------------------------- Game-List options dialog -------------------------------------- + +// back-end +typedef struct { + char id; + char * name; +} GLT_Item; + +// back-end: translation table tag id-char <-> full tag name +static GLT_Item GLT_ItemInfo[] = { + { GLT_EVENT, "Event" }, + { GLT_SITE, "Site" }, + { GLT_DATE, "Date" }, + { GLT_ROUND, "Round" }, + { GLT_PLAYERS, "Players" }, + { GLT_RESULT, "Result" }, + { GLT_WHITE_ELO, "White Rating" }, + { GLT_BLACK_ELO, "Black Rating" }, + { GLT_TIME_CONTROL,"Time Control" }, + { GLT_VARIANT, "Variant" }, + { GLT_OUT_OF_BOOK,PGN_OUT_OF_BOOK }, + { GLT_RESULT_COMMENT, "Result Comment" }, // [HGM] rescom + { 0, 0 } +}; + +char lpUserGLT[LPUSERGLT_SIZE]; + +// back-end: convert the tag id-char to a full tag name +char * GLT_FindItem( char id ) +{ + char * result = 0; + + GLT_Item * list = GLT_ItemInfo; + + while( list->id != 0 ) { + if( list->id == id ) { + result = list->name; + break; + } + + list++; + } + + return result; +} + +// back-end: build the list of tag names +void +GLT_TagsToList( char * tags ) +{ + char * pc = tags; + + GLT_ClearList(); + + while( *pc ) { + GLT_AddToList( GLT_FindItem(*pc) ); + pc++; + } + + GLT_AddToList( " --- Hidden tags --- " ); + + pc = GLT_ALL_TAGS; + + while( *pc ) { + if( strchr( tags, *pc ) == 0 ) { + GLT_AddToList( GLT_FindItem(*pc) ); + } + pc++; + } + + GLT_DeSelectList(); +} + +// back-end: retrieve item from dialog and translate to id-char +char +GLT_ListItemToTag( int index ) +{ + char result = '\0'; + char name[MSG_SIZ]; + + GLT_Item * list = GLT_ItemInfo; + + if( GLT_GetFromList(index, name) ) { + while( list->id != 0 ) { + if( strcmp( list->name, name ) == 0 ) { + result = list->id; + break; + } + + list++; + } + } + + return result; +} + +// back-end: add items id-chars one-by-one to temp tags string +void +GLT_ParseList() +{ + char * pc = lpUserGLT; + int idx = 0; + char id; + + do { + id = GLT_ListItemToTag( idx ); + *pc++ = id; + idx++; + } while( id != '\0' ); +} +