void netLineFilter(struct lineFile *lf, FILE *f) /* Do filter one line at a time. */ { struct hash *nameHash = newHash(0); char *line, *l; int d; while (lineFileNext(lf, &line, NULL)) { d = countLeadingChars(line, ' '); l = line + d; if (startsWith("fill", l) || startsWith("gap", l)) { struct cnFill *fill = cnFillFromLine(nameHash, lf, l); if (filterOne(fill)) cnFillWrite(fill, f, d); cnFillFree(&fill); } else { fprintf(f, "%s\n", line); } } hashFree(&nameHash); }
void cnFillFreeList(struct cnFill **pList) /* Free up a list of fills. */ { struct cnFill *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; cnFillFree(&el); } *pList = NULL; }
struct cnFill *cnPrune(struct cnFill *fillList) /* Get rid of parts of fillList that don't pass filter. * Return what's left. */ { struct cnFill *newList = NULL, *fill, *next; for (fill = fillList; fill != NULL; fill = next) { next = fill->next; if (filterOne(fill)) { slAddHead(&newList, fill); if (fill->children) fill->children = cnPrune(fill->children); } else { cnFillFree(&fill); } } slReverse(&newList); return newList; }