37977956905d588f73ee5f635fae2f609cb40842
angie
  Wed Aug 9 12:52:00 2017 -0700
Assorted little util functions in support of adding HGVS output to hgVai -- refs #19968

diff --git src/lib/common.c src/lib/common.c
index 8f1921e..a6ad49e 100644
--- src/lib/common.c
+++ src/lib/common.c
@@ -978,37 +978,58 @@
 }
 
 void slPairFreeList(struct slPair **pList)
 /* Free up list.  (Don't free up values.) */
 {
 struct slPair *el, *next;
 
 for (el = *pList; el != NULL; el = next)
     {
     next = el->next;
     slPairFree(&el);
     }
 *pList = NULL;
 }
 
-void slPairFreeVals(struct slPair *list)
-/* Free up all values on list. */
+void slPairFreeValsExt(struct slPair *list, void (*freeFunc)())
+/* Free up all values on list using freeFunc.
+ * freeFunc should take a simple pointer to free an item, and can be NULL. */
 {
 struct slPair *el;
 for (el = list; el != NULL; el = el->next)
+    {
+    if (freeFunc)
+        freeFunc(el->val);
+    else
         freez(&el->val);
     }
+}
+
+void slPairFreeVals(struct slPair *list)
+/* Free up all values on list. */
+{
+slPairFreeValsExt(list, NULL);
+}
+
+void slPairFreeValsAndListExt(struct slPair **pList, void (*freeFunc)())
+/* Free up all values on list using freeFunc and list itself.
+ * freeFunc should take a simple pointer to free an item, and can be NULL. */
+{
+if (pList)
+    slPairFreeValsExt(*pList, freeFunc);
+slPairFreeList(pList);
+}
 
 void slPairFreeValsAndList(struct slPair **pList)
 /* Free up all values on list and list itself */
 {
 slPairFreeVals(*pList);
 slPairFreeList(pList);
 }
 
 struct slPair *slPairFind(struct slPair *list, char *name)
 /* Return list element of given name, or NULL if not found. */
 {
 struct slPair *el;
 for (el = list; el != NULL; el = el->next)
     if (sameString(name, el->name))
         break;