27aa980683134b5ff14cbaf5bdcbe563eb4af207
tdreszer
  Wed Apr 6 08:19:34 2011 -0700
Moved common name and description matching code into search lib and removed it from hgFileSearch and hgTracks/searchTracks.c
diff --git src/hg/hgFileSearch/hgFileSearch.c src/hg/hgFileSearch/hgFileSearch.c
index 1f6ef5e..121e48a 100644
--- src/hg/hgFileSearch/hgFileSearch.c
+++ src/hg/hgFileSearch/hgFileSearch.c
@@ -24,107 +24,56 @@
 
 #define FILE_SEARCH              "hgfs_Search"
 #define FILE_SEARCH_FORM         "fileSearch"
 #define FILE_SEARCH_CURRENT_TAB  "fsCurTab"
 #define FILE_SEARCH_ON_FILETYPE  "fsFileType"
 
 // These are common with trackSearch.  Should they be?
 #define TRACK_SEARCH_SIMPLE      "tsSimple"
 #define TRACK_SEARCH_ON_NAME     "tsName"
 #define TRACK_SEARCH_ON_GROUP    "tsGroup"
 #define TRACK_SEARCH_ON_DESCR    "tsDescr"
 #define TRACK_SEARCH_SORT        "tsSort"
 
 //#define USE_TABS
 
-static boolean matchToken(char *string, char *token)
-{
-// do this with regex ? Would require all sorts of careful parsing for ()., etc.
-if (string == NULL)
-    return (token == NULL);
-if (token == NULL)
-    return TRUE;
-
-if (!strchr(token,'*') && !strchr(token,'?'))
-    return (strcasestr(string,token) != NULL);
-
-char wordWild[1024];
-safef(wordWild,sizeof wordWild,"*%s*",token);
-return wildMatch(wordWild, string);
-
-}
-
-static boolean doesNameMatch(struct trackDb *tdb, struct slName *wordList)
-// We parse str and look for every word at the start of any word in track description (i.e. google style).
-{
-if (tdb->shortLabel == NULL || tdb->longLabel == NULL)
-    return (wordList != NULL);
-
-struct slName *word = wordList;
-for(; word != NULL; word = word->next)
-    {
-    if (!matchToken(tdb->shortLabel,word->name)
-    &&  !matchToken(tdb->longLabel, word->name))
-        return FALSE;
-    }
-return TRUE;
-}
-
-static boolean doesDescriptionMatch(struct trackDb *tdb, struct slName *wordList)
-// We parse str and look for every word at the start of any word in track description (i.e. google style).
-{
-if (tdb->html == NULL)
-    return (wordList != NULL);
-
-if (strchr(tdb->html,'\n'))
-    strSwapChar(tdb->html,'\n',' ');   // DANGER: don't own memory.  However, this CGI will use html for no other purpose
-
-struct slName *word = wordList;
-for(; word != NULL; word = word->next)
-    {
-    if (!matchToken(tdb->html,word->name))
-        return FALSE;
-    }
-return TRUE;
-}
-
 static struct trackDb *tdbFilterBy(struct trackDb **pTdbList, char *name, char *description, char *group)
 // returns tdbs that match supplied criterion, leaving unmatched in list passed in
 {
 // Set the word lists up once
 struct slName *nameList = NULL;
 if (name)
     nameList = slNameListOfUniqueWords(cloneString(name),TRUE); // TRUE means respect quotes
 struct slName *descList = NULL;
 if (description)
     descList = slNameListOfUniqueWords(cloneString(description),TRUE);
 
 struct trackDb *tdbList = *pTdbList;
 struct trackDb *tdbRejects = NULL;
 struct trackDb *tdbMatched = NULL;
 
 while (tdbList != NULL)
     {
     struct trackDb *tdb = slPopHead(&tdbList);
 
     if (!tdbIsComposite(tdb))
         slAddHead(&tdbRejects,tdb);
     else if (group && differentString(tdb->grp,group))
         slAddHead(&tdbRejects,tdb);
-    else if (name && !doesNameMatch(tdb, nameList))
+    else if (name && !searchNameMatches(tdb, nameList))
         slAddHead(&tdbRejects,tdb);
-    else if (description && !doesDescriptionMatch(tdb, descList))
+    else if (description && !searchDescriptionMatches(tdb, descList))
         slAddHead(&tdbRejects,tdb);
     else
         slAddHead(&tdbMatched,tdb);
     }
 *pTdbList = tdbRejects;
 
 //warn("matched %d tracks",slCount(tdbMatched));
 return tdbMatched;
 }
 
 static boolean mdbSelectsAddFoundComposites(struct slPair **pMdbSelects,struct trackDb *tdbsFound)
 // Adds a composite mdbSelect (if found in tdbsFound) to the head of the pairs list.
 // If tdbsFound is NULL, then add dummy composite search criteria
 {
 // create comma separated list of composites