a18f9612e9fdc813d6a8ae1653b4af004f5cb8a3 kent Thu Jan 22 14:55:22 2015 -0800 Adding maxDepth parameter to metaWriteAll. diff --git src/lib/meta.c src/lib/meta.c index 26da19a..d081fc0 100644 --- src/lib/meta.c +++ src/lib/meta.c @@ -289,67 +289,72 @@ { pList = &olderSibling->parent->children; meta->parent = olderSibling->parent; } } } slAddHead(pList, meta); lastMeta = meta; } lineFileClose(&lf); forest = rReverseMetaList(forest); return forest; } static void rMetaListWrite(struct meta *metaList, struct meta *parent, - boolean level, int indent, boolean withParent, FILE *f) + int level, int maxLevel, int indent, boolean withParent, FILE *f) /* Write out list of stanzas at same level to file, their children too. */ { int totalIndent = level * indent; struct meta *meta; +int nextLevel = level+1; for (meta = metaList; meta != NULL; meta = meta->next) { struct metaTagVal *mtv; boolean gotParent = FALSE; for (mtv = meta->tagList; mtv != NULL; mtv = mtv->next) { if (sameString(mtv->tag, "parent")) { if (withParent) gotParent = TRUE; else continue; } spaceOut(f, totalIndent); fprintf(f, "%s %s\n", mtv->tag, mtv->val); } if (withParent && !gotParent && parent != NULL) { spaceOut(f, totalIndent); fprintf(f, "%s %s\n", "parent", parent->name); } fprintf(f, "\n"); - if (meta->children) - rMetaListWrite(meta->children, meta, level+1, indent, withParent, f); + if (meta->children && nextLevel < maxLevel) + rMetaListWrite(meta->children, meta, nextLevel, maxLevel, indent, withParent, f); } } -void metaWriteAll(struct meta *metaList, char *fileName, int indent, boolean withParent) -/* Write out metadata, optionally adding meta tag. */ +void metaWriteAll(struct meta *metaList, char *fileName, int indent, boolean withParent, + int maxDepth) +/* Write out metadata, optionally adding meta tag. If maxDepth is non-zero just write + * up to that many levels. Root level is 0. */ { FILE *f = mustOpen(fileName, "w"); -rMetaListWrite(metaList, NULL, 0, indent, withParent, f); +if (maxDepth == 0) + maxDepth = BIGNUM; +rMetaListWrite(metaList, NULL, 0, maxDepth, indent, withParent, f); carefulClose(&f); } char *metaLocalTagVal(struct meta *meta, char *name) /* Return value of tag found in this node, not going up to parents. */ { struct metaTagVal *mtv; for (mtv = meta->tagList; mtv != NULL; mtv = mtv->next) if (sameString(mtv->tag, name)) return mtv->val; return NULL; } char *metaTagVal(struct meta *meta, char *name) /* Return value of tag found in this node or if its not there in parents.