5e484e0f3f69d240cafa8affaece2d7fa43255fe
tdreszer
  Wed Feb 2 13:14:46 2011 -0800
Added routine to get an slName list of settings from tdb tree which wildMatch an expression
diff --git src/hg/lib/trackDbCustom.c src/hg/lib/trackDbCustom.c
index e96a3f8..797eecb 100644
--- src/hg/lib/trackDbCustom.c
+++ src/hg/lib/trackDbCustom.c
@@ -406,30 +406,82 @@
     }
 freeMem(dupe);
 return hash;
 }
 
 char *trackDbLocalSetting(struct trackDb *tdb, char *name)
 /* Return setting from tdb, but *not* any of it's parents. */
 {
 if (tdb == NULL)
     errAbort("Program error: null tdb passed to trackDbSetting.");
 if (tdb->settingsHash == NULL)
     tdb->settingsHash = trackDbSettingsFromString(tdb->settings);
 return hashFindVal(tdb->settingsHash, name);
 }
 
+struct slName *trackDbLocalSettingsWildMatch(struct trackDb *tdb, char *expression)
+// Return local settings that match expression else NULL.  In alpha order.
+{
+if (tdb == NULL)
+    errAbort("Program error: null tdb passed to trackDbSetting.");
+if (tdb->settingsHash == NULL)
+    tdb->settingsHash = trackDbSettingsFromString(tdb->settings);
+
+struct slName *slFoundVars = NULL;
+struct hashCookie brownie = hashFirst(tdb->settingsHash);
+struct hashEl* el = NULL;
+while ((el = hashNext(&brownie)) != NULL)
+    {
+    if (wildMatch(expression, el->name))
+        slNameAddHead(&slFoundVars, el->name);
+    }
+
+if (slFoundVars != NULL)
+    slNameSort(&slFoundVars);
+
+return slFoundVars;
+}
+
+struct slName *trackDbSettingsWildMatch(struct trackDb *tdb, char *expression)
+// Return settings in tdb tree that match expression else NULL.  In alpha order, no duplicates.
+{
+struct trackDb *generation;
+struct slName *slFoundVars = NULL;
+for (generation = tdb; generation != NULL; generation = generation->parent)
+    {
+    struct slName *slFoundHere = trackDbLocalSettingsWildMatch(generation,expression);
+    if (slFoundHere != NULL)
+        {
+        if (slFoundVars == NULL)
+            slFoundVars = slFoundHere;
+        else
+            {
+            struct slName *one = NULL;
+            while ((one = slPopHead(&slFoundHere)) != NULL)
+                {
+                slNameStore(&slFoundVars, one->name); // Will only store if it is not already found!  This means closest to home will work
+                slNameFree(&one);
+                }
+            }
+        }
+    }
+if (slFoundVars != NULL)
+    slNameSort(&slFoundVars);
+
+return slFoundVars;
+}
+
 boolean trackDbSettingOn(struct trackDb *tdb, char *name)
 /* Return true if a tdb setting is "on" "true" or "enabled". */
 {
 char *setting = trackDbSetting(tdb,name);
 return  (setting && (   sameWord(setting,"on")
                      || sameWord(setting,"true")
                      || sameWord(setting,"enabled")));
 }
 
 char *trackDbRequiredSetting(struct trackDb *tdb, char *name)
 /* Return setting string or squawk and die. */
 {
 char *ret = trackDbSetting(tdb, name);
 if (ret == NULL)
    errAbort("Missing required %s setting in %s track", name, tdb->track);