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);