05563be2e445f57aaadc21dd3a843db0ff8faee6 kent Tue Mar 26 21:52:43 2013 -0700 Adding several new functions to meta library. diff --git src/hg/inc/meta.h src/hg/inc/meta.h index 91ff185..2861bd7 100644 --- src/hg/inc/meta.h +++ src/hg/inc/meta.h @@ -1,58 +1,76 @@ /* metaRa - stuff to parse and interpret a genome-hub meta.txt file, which is in * a hierarchical ra format. That is something like: * meta topLevel * cellLine HELA * * meta midLevel * target H3K4Me3 * antibody abCamAntiH3k4me3 * * meta lowLevel * fileName hg19/chipSeq/helaH3k4me3.narrowPeak.bigBed * The file is interpreted so that lower level stanzas inherit tags from higher level ones. */ +#ifndef META_H +#define META_H + struct metaTagVal /* A tag/value pair. */ { struct metaTagVal *next; /* Next in list. */ char *tag; /* Tag name. */ char *val; /* Tag value. */ }; +struct metaTagVal *metaTagValNew(char *tag, char *val); +/* Create new meta tag/val */ + +int metaTagValCmp(const void *va, const void *vb); +/* Compare to sort based on tag name . */ + struct meta /* A node in the metadata tree */ { struct meta *next; /* Pointer to next younger sibling. */ struct meta *children; /* Pointer to eldest child. */ struct meta *parent; /* Pointer to parent. */ char *name; /* Same as val of meta tag. Not allocated here. */ struct metaTagVal *tagList; /* All tags, including the "meta" one. */ int indent; /* Indentation level. */ }; struct meta *metaLoadAll(char *fileName, char *keyTag, char *parentTag, boolean ignoreOtherStanzas, boolean ignoreIndent); /* Loads in all ra stanzas from file and turns them into a list of meta, some of which * may have children. The keyTag parameter is optional. If non-null it should be set to * the tag name that starts a stanza. If null, the first tag of the first stanza will be used. * The parentTag if non-NULL will be a tag name used to define the parent of a stanza. * The ignoreOtherStanzas flag if set will ignore stanzas that start with other tags. * If not set the routine will abort on such stanzas. The ignoreIndent if set will * use the parentTag (which must be set) to define the hierarchy. Otherwise the program * will look at the indentation, and if there is a parentTag complain about any * disagreements between indentation and parentTag. */ void metaWriteAll(struct meta *metaList, char *fileName, int indent, boolean withParent); /* Write out metadata, including children, optionally adding meta tag. By convention * for out meta.txt/meta.ra files, indent is 3, withParent is FALSE. */ -char *metaLocalTagVal(struct meta *meta, char *name); +char *metaLocalTagVal(struct meta *meta, char *tag); /* Return value of tag found in this node, not going up to parents. */ -char *metaTagVal(struct meta *meta, char *name); +char *metaTagVal(struct meta *meta, char *tag); /* Return value of tag found in this node or if its not there in parents. * Returns NULL if tag not found. */ +void metaAddTag(struct meta *meta, char *tag, char *val); +/* Return value of tag found in this node, not going up to parents. */ + +void metaSortTags(struct meta *meta); +/* Do canonical sort so that the first tag stays first but the + * rest are alphabetical. */ + struct hash *metaHash(struct meta *forest); /* Return hash of meta at all levels of heirarchy keyed by forest. */ + +#endif /* META_H */