Accept <Enter> for changing chat partner
[xboard.git] / gamelist.c
index 0a4979e..e7a2b4c 100644 (file)
@@ -56,6 +56,64 @@ static ListGame *GameListCreate P((void));
 static void GameListFree P((List *));
 static int GameListNewGame P((ListGame **));
 
+/* [AS] Wildcard pattern matching */
+Boolean
+HasPattern( const char * text, const char * pattern )
+{
+    while( *pattern != '\0' ) {
+        if( *pattern == '*' ) {
+            while( *pattern == '*' ) {
+                pattern++;
+            }
+
+            if( *pattern == '\0' ) {
+                return TRUE;
+            }
+
+            while( *text != '\0' ) {
+                if( HasPattern( text, pattern ) ) {
+                    return TRUE;
+                }
+                text++;
+            }
+        }
+        else if( (*pattern == *text) || ((*pattern == '?') && (*text != '\0')) ) {
+            pattern++;
+            text++;
+            continue;
+        }
+
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+Boolean
+SearchPattern( const char * text, const char * pattern )
+{
+    Boolean result = TRUE;
+
+    if( pattern != NULL && *pattern != '\0' ) {
+        if( *pattern == '*' ) {
+            result = HasPattern( text, pattern );
+        }
+        else {
+            result = FALSE;
+
+            while( *text != '\0' ) {
+                if( HasPattern( text, pattern ) ) {
+                    result = TRUE;
+                    break;
+                }
+                text++;
+            }
+        }
+    }
+
+    return result;
+}
+
 /* Delete a ListGame; implies removint it from a list.
  */
 static void GameListDeleteGame(listGame)
@@ -317,10 +375,6 @@ void ClearGameInfo(gameInfo)
     if (gameInfo->outOfBook != NULL) {
         free(gameInfo->outOfBook);
     }
-    if (gameInfo->resultDetails != NULL) {
-        free(gameInfo->resultDetails);
-    }
-
     GameListInitGameInfo(gameInfo);
 }
 
@@ -343,7 +397,7 @@ GameListLineOld(number, gameInfo)
     return ret;
 }
 
-#define MAX_FIELD_LEN   64  /* To avoid overflowing the buffer */
+#define MAX_FIELD_LEN   80  /* To avoid overflowing the buffer */
 
 char * GameListLine( int number, GameInfo * gameInfo )
 {
@@ -431,12 +485,14 @@ char * GameListLineFull( int number, GameInfo * gameInfo )
     char * round = gameInfo->round ? gameInfo->round : "?";
     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);
+    int len = 64 + strlen(event) + strlen(site) + strlen(white) + strlen(black) + strlen(date) + strlen(oob) + strlen(reason);
 
     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 );
+    sprintf(ret, "%d, \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"",
+       number, event, site, round, white, black, PGNResult(gameInfo->result), reason, date, oob );
 
     return ret;
 }