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