src/hg/lib/trackDbCustom.c 1.63

1.63 2009/04/22 22:56:22 tdreszer
Add support for parsing out metadata settings.
Index: src/hg/lib/trackDbCustom.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/trackDbCustom.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -b -B -U 4 -r1.62 -r1.63
--- src/hg/lib/trackDbCustom.c	14 Apr 2009 14:22:26 -0000	1.62
+++ src/hg/lib/trackDbCustom.c	22 Apr 2009 22:56:22 -0000	1.63
@@ -813,4 +813,63 @@
     hFreeConn(&conn);
     }
 return tdb;
 }
+
+metadata_t *metadataSettingGet(struct trackDb *tdb)
+/* Looks for a metadata tag and parses the setting into arrays of tags and values */
+{
+char *setting = trackDbSetting(tdb, "metadata");
+if(setting == NULL)
+    return NULL;
+int count = countChars(setting,'='); // <= actual count, since value may contain a =
+if(count <= 0)
+    return NULL;
+
+metadata_t *metadata = needMem(sizeof(metadata_t));
+metadata->setting    = cloneString(setting);
+metadata->tags = needMem(sizeof(char*)*count);
+metadata->values = needMem(sizeof(char*)*count);
+char *cp = metadata->setting;
+for(metadata->count=0;*cp != '\0' && metadata->count<count;metadata->count++)
+    {
+    metadata->tags[metadata->count] = cloneNextWordByDelimiter(&cp,'=');
+    if(*cp != '"')
+        metadata->values[metadata->count] = cloneNextWordByDelimiter(&cp,' ');
+    else
+        {
+        metadata->values[metadata->count] = ++cp;
+        for(;*cp != '\0';cp++)
+            {
+            if(*cp == '"' && *(cp - 1) != '\\') // Not escaped
+                {
+                *cp = '\0';
+                metadata->values[metadata->count] = replaceChars(metadata->values[metadata->count],"\\\"","\"");
+                *cp = '"'; // Put it baaack!
+                break;
+                }
+            }
+        if(*cp == '\0') // Didn't find close quote!
+            metadata->values[metadata->count] = cloneString(metadata->values[metadata->count]);
+        else
+            cp++;
+        }
+    }
+
+return metadata;
+}
+
+void metadataFree(metadata_t **metadata)
+/* frees any previously obtained metadata setting */
+{
+if(metadata && *metadata)
+    {
+    for(;(*metadata)->count > 0;(*metadata)->count--)
+        {
+        freeMem((*metadata)->tags[  (*metadata)->count - 1]);
+        freeMem((*metadata)->values[(*metadata)->count - 1]);
+        }
+    freeMem((*metadata)->setting);
+    freez(metadata);
+    }
+}
+