/* dasGff.c autoXml generated file */ #include "common.h" #include "xap.h" #include "dasGff.h" void dasGffDasGffFree(struct dasGffDasGff **pObj) /* Free up dasGffDasGff. */ { struct dasGffDasGff *obj = *pObj; if (obj == NULL) return; dasGffGffFree(&obj->dasGffGff); freez(pObj); } void dasGffDasGffFreeList(struct dasGffDasGff **pList) /* Free up list of dasGffDasGff. */ { struct dasGffDasGff *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffDasGffFree(&el); el = next; } } void dasGffDasGffSave(struct dasGffDasGff *obj, int indent, FILE *f) /* Save dasGffDasGff to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "\n"); dasGffGffSave(obj->dasGffGff, indent+2, f); xapIndent(indent, f); fprintf(f, "\n"); } struct dasGffDasGff *dasGffDasGffLoad(char *fileName) /* Load dasGffDasGff from XML file where it is root element. */ { struct dasGffDasGff *obj; xapParseAny(fileName, "DAS_GFF", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffDasGff *dasGffDasGffLoadNext(struct xap *xap) /* Load next dasGffDasGff element. Use xapOpen to get xap. */ { return xapNext(xap, "DAS_GFF"); } void dasGffNumberFree(struct dasGffNumber **pObj) /* Free up dasGffNumber. */ { struct dasGffNumber *obj = *pObj; if (obj == NULL) return; freez(pObj); } void dasGffNumberFreeList(struct dasGffNumber **pList) /* Free up list of dasGffNumber. */ { struct dasGffNumber *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffNumberFree(&el); el = next; } } void dasGffNumberSave(struct dasGffNumber *obj, int indent, FILE *f) /* Save dasGffNumber to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%d", obj->text); fprintf(f, "\n"); } struct dasGffNumber *dasGffNumberLoad(char *fileName) /* Load dasGffNumber from XML file where it is root element. */ { struct dasGffNumber *obj; xapParseAny(fileName, "NUMBER", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffNumber *dasGffNumberLoadNext(struct xap *xap) /* Load next dasGffNumber element. Use xapOpen to get xap. */ { return xapNext(xap, "NUMBER"); } void dasGffGffFree(struct dasGffGff **pObj) /* Free up dasGffGff. */ { struct dasGffGff *obj = *pObj; if (obj == NULL) return; freeMem(obj->version); freeMem(obj->href); dasGffSegmentFreeList(&obj->dasGffSegment); freez(pObj); } void dasGffGffFreeList(struct dasGffGff **pList) /* Free up list of dasGffGff. */ { struct dasGffGff *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffGffFree(&el); el = next; } } void dasGffGffSave(struct dasGffGff *obj, int indent, FILE *f) /* Save dasGffGff to file. */ { struct dasGffSegment *dasGffSegment; if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "version); fprintf(f, " href=\"%s\"", obj->href); fprintf(f, ">"); fprintf(f, "\n"); for (dasGffSegment = obj->dasGffSegment; dasGffSegment != NULL; dasGffSegment = dasGffSegment->next) { dasGffSegmentSave(dasGffSegment, indent+2, f); } xapIndent(indent, f); fprintf(f, "\n"); } struct dasGffGff *dasGffGffLoad(char *fileName) /* Load dasGffGff from XML file where it is root element. */ { struct dasGffGff *obj; xapParseAny(fileName, "GFF", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffGff *dasGffGffLoadNext(struct xap *xap) /* Load next dasGffGff element. Use xapOpen to get xap. */ { return xapNext(xap, "GFF"); } void dasGffSegmentFree(struct dasGffSegment **pObj) /* Free up dasGffSegment. */ { struct dasGffSegment *obj = *pObj; if (obj == NULL) return; freeMem(obj->id); freeMem(obj->label); dasGffFeatureFreeList(&obj->dasGffFeature); freez(pObj); } void dasGffSegmentFreeList(struct dasGffSegment **pList) /* Free up list of dasGffSegment. */ { struct dasGffSegment *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffSegmentFree(&el); el = next; } } void dasGffSegmentSave(struct dasGffSegment *obj, int indent, FILE *f) /* Save dasGffSegment to file. */ { struct dasGffFeature *dasGffFeature; if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "id); fprintf(f, " start=\"%d\"", obj->start); fprintf(f, " stop=\"%d\"", obj->stop); fprintf(f, " version=\"%f\"", obj->version); if (obj->label != NULL) fprintf(f, " label=\"%s\"", obj->label); fprintf(f, ">"); fprintf(f, "\n"); for (dasGffFeature = obj->dasGffFeature; dasGffFeature != NULL; dasGffFeature = dasGffFeature->next) { dasGffFeatureSave(dasGffFeature, indent+2, f); } xapIndent(indent, f); fprintf(f, "\n"); } struct dasGffSegment *dasGffSegmentLoad(char *fileName) /* Load dasGffSegment from XML file where it is root element. */ { struct dasGffSegment *obj; xapParseAny(fileName, "SEGMENT", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffSegment *dasGffSegmentLoadNext(struct xap *xap) /* Load next dasGffSegment element. Use xapOpen to get xap. */ { return xapNext(xap, "SEGMENT"); } void dasGffFeatureFree(struct dasGffFeature **pObj) /* Free up dasGffFeature. */ { struct dasGffFeature *obj = *pObj; if (obj == NULL) return; freeMem(obj->id); freeMem(obj->label); freeMem(obj->version); dasGffTypeFree(&obj->dasGffType); dasGffMethodFree(&obj->dasGffMethod); dasGffStartFree(&obj->dasGffStart); dasGffEndFree(&obj->dasGffEnd); dasGffScoreFree(&obj->dasGffScore); dasGffOrientationFree(&obj->dasGffOrientation); dasGffPhaseFree(&obj->dasGffPhase); dasGffGroupFree(&obj->dasGffGroup); freez(pObj); } void dasGffFeatureFreeList(struct dasGffFeature **pList) /* Free up list of dasGffFeature. */ { struct dasGffFeature *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffFeatureFree(&el); el = next; } } void dasGffFeatureSave(struct dasGffFeature *obj, int indent, FILE *f) /* Save dasGffFeature to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "id); if (obj->label != NULL) fprintf(f, " label=\"%s\"", obj->label); if (obj->version != NULL) fprintf(f, " version=\"%s\"", obj->version); fprintf(f, ">"); fprintf(f, "\n"); dasGffTypeSave(obj->dasGffType, indent+2, f); dasGffMethodSave(obj->dasGffMethod, indent+2, f); dasGffStartSave(obj->dasGffStart, indent+2, f); dasGffEndSave(obj->dasGffEnd, indent+2, f); dasGffScoreSave(obj->dasGffScore, indent+2, f); dasGffOrientationSave(obj->dasGffOrientation, indent+2, f); dasGffPhaseSave(obj->dasGffPhase, indent+2, f); dasGffGroupSave(obj->dasGffGroup, indent+2, f); xapIndent(indent, f); fprintf(f, "\n"); } struct dasGffFeature *dasGffFeatureLoad(char *fileName) /* Load dasGffFeature from XML file where it is root element. */ { struct dasGffFeature *obj; xapParseAny(fileName, "FEATURE", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffFeature *dasGffFeatureLoadNext(struct xap *xap) /* Load next dasGffFeature element. Use xapOpen to get xap. */ { return xapNext(xap, "FEATURE"); } void dasGffTypeFree(struct dasGffType **pObj) /* Free up dasGffType. */ { struct dasGffType *obj = *pObj; if (obj == NULL) return; freeMem(obj->id); freeMem(obj->category); freeMem(obj->reference); freeMem(obj->subparts); freeMem(obj->text); freez(pObj); } void dasGffTypeFreeList(struct dasGffType **pList) /* Free up list of dasGffType. */ { struct dasGffType *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffTypeFree(&el); el = next; } } void dasGffTypeSave(struct dasGffType *obj, int indent, FILE *f) /* Save dasGffType to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "id != NULL) fprintf(f, " id=\"%s\"", obj->id); if (obj->category != NULL) fprintf(f, " category=\"%s\"", obj->category); if (obj->reference != NULL) fprintf(f, " reference=\"%s\"", obj->reference); if (obj->subparts != NULL) fprintf(f, " subparts=\"%s\"", obj->subparts); fprintf(f, ">"); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffType *dasGffTypeLoad(char *fileName) /* Load dasGffType from XML file where it is root element. */ { struct dasGffType *obj; xapParseAny(fileName, "TYPE", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffType *dasGffTypeLoadNext(struct xap *xap) /* Load next dasGffType element. Use xapOpen to get xap. */ { return xapNext(xap, "TYPE"); } void dasGffMethodFree(struct dasGffMethod **pObj) /* Free up dasGffMethod. */ { struct dasGffMethod *obj = *pObj; if (obj == NULL) return; freeMem(obj->id); freeMem(obj->text); freez(pObj); } void dasGffMethodFreeList(struct dasGffMethod **pList) /* Free up list of dasGffMethod. */ { struct dasGffMethod *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffMethodFree(&el); el = next; } } void dasGffMethodSave(struct dasGffMethod *obj, int indent, FILE *f) /* Save dasGffMethod to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "id != NULL) fprintf(f, " id=\"%s\"", obj->id); fprintf(f, ">"); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffMethod *dasGffMethodLoad(char *fileName) /* Load dasGffMethod from XML file where it is root element. */ { struct dasGffMethod *obj; xapParseAny(fileName, "METHOD", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffMethod *dasGffMethodLoadNext(struct xap *xap) /* Load next dasGffMethod element. Use xapOpen to get xap. */ { return xapNext(xap, "METHOD"); } void dasGffStartFree(struct dasGffStart **pObj) /* Free up dasGffStart. */ { struct dasGffStart *obj = *pObj; if (obj == NULL) return; freeMem(obj->text); freez(pObj); } void dasGffStartFreeList(struct dasGffStart **pList) /* Free up list of dasGffStart. */ { struct dasGffStart *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffStartFree(&el); el = next; } } void dasGffStartSave(struct dasGffStart *obj, int indent, FILE *f) /* Save dasGffStart to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffStart *dasGffStartLoad(char *fileName) /* Load dasGffStart from XML file where it is root element. */ { struct dasGffStart *obj; xapParseAny(fileName, "START", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffStart *dasGffStartLoadNext(struct xap *xap) /* Load next dasGffStart element. Use xapOpen to get xap. */ { return xapNext(xap, "START"); } void dasGffEndFree(struct dasGffEnd **pObj) /* Free up dasGffEnd. */ { struct dasGffEnd *obj = *pObj; if (obj == NULL) return; freeMem(obj->text); freez(pObj); } void dasGffEndFreeList(struct dasGffEnd **pList) /* Free up list of dasGffEnd. */ { struct dasGffEnd *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffEndFree(&el); el = next; } } void dasGffEndSave(struct dasGffEnd *obj, int indent, FILE *f) /* Save dasGffEnd to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffEnd *dasGffEndLoad(char *fileName) /* Load dasGffEnd from XML file where it is root element. */ { struct dasGffEnd *obj; xapParseAny(fileName, "END", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffEnd *dasGffEndLoadNext(struct xap *xap) /* Load next dasGffEnd element. Use xapOpen to get xap. */ { return xapNext(xap, "END"); } void dasGffScoreFree(struct dasGffScore **pObj) /* Free up dasGffScore. */ { struct dasGffScore *obj = *pObj; if (obj == NULL) return; freeMem(obj->text); freez(pObj); } void dasGffScoreFreeList(struct dasGffScore **pList) /* Free up list of dasGffScore. */ { struct dasGffScore *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffScoreFree(&el); el = next; } } void dasGffScoreSave(struct dasGffScore *obj, int indent, FILE *f) /* Save dasGffScore to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffScore *dasGffScoreLoad(char *fileName) /* Load dasGffScore from XML file where it is root element. */ { struct dasGffScore *obj; xapParseAny(fileName, "SCORE", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffScore *dasGffScoreLoadNext(struct xap *xap) /* Load next dasGffScore element. Use xapOpen to get xap. */ { return xapNext(xap, "SCORE"); } void dasGffOrientationFree(struct dasGffOrientation **pObj) /* Free up dasGffOrientation. */ { struct dasGffOrientation *obj = *pObj; if (obj == NULL) return; freeMem(obj->text); freez(pObj); } void dasGffOrientationFreeList(struct dasGffOrientation **pList) /* Free up list of dasGffOrientation. */ { struct dasGffOrientation *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffOrientationFree(&el); el = next; } } void dasGffOrientationSave(struct dasGffOrientation *obj, int indent, FILE *f) /* Save dasGffOrientation to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffOrientation *dasGffOrientationLoad(char *fileName) /* Load dasGffOrientation from XML file where it is root element. */ { struct dasGffOrientation *obj; xapParseAny(fileName, "ORIENTATION", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffOrientation *dasGffOrientationLoadNext(struct xap *xap) /* Load next dasGffOrientation element. Use xapOpen to get xap. */ { return xapNext(xap, "ORIENTATION"); } void dasGffPhaseFree(struct dasGffPhase **pObj) /* Free up dasGffPhase. */ { struct dasGffPhase *obj = *pObj; if (obj == NULL) return; freeMem(obj->text); freez(pObj); } void dasGffPhaseFreeList(struct dasGffPhase **pList) /* Free up list of dasGffPhase. */ { struct dasGffPhase *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffPhaseFree(&el); el = next; } } void dasGffPhaseSave(struct dasGffPhase *obj, int indent, FILE *f) /* Save dasGffPhase to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffPhase *dasGffPhaseLoad(char *fileName) /* Load dasGffPhase from XML file where it is root element. */ { struct dasGffPhase *obj; xapParseAny(fileName, "PHASE", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffPhase *dasGffPhaseLoadNext(struct xap *xap) /* Load next dasGffPhase element. Use xapOpen to get xap. */ { return xapNext(xap, "PHASE"); } void dasGffGroupFree(struct dasGffGroup **pObj) /* Free up dasGffGroup. */ { struct dasGffGroup *obj = *pObj; if (obj == NULL) return; freeMem(obj->id); dasGffNoteFree(&obj->dasGffNote); dasGffLinkFree(&obj->dasGffLink); dasGffTargetFree(&obj->dasGffTarget); freez(pObj); } void dasGffGroupFreeList(struct dasGffGroup **pList) /* Free up list of dasGffGroup. */ { struct dasGffGroup *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffGroupFree(&el); el = next; } } void dasGffGroupSave(struct dasGffGroup *obj, int indent, FILE *f) /* Save dasGffGroup to file. */ { boolean isNode = TRUE; if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "id); fprintf(f, ">"); if (obj->dasGffNote != NULL) { if (isNode) { fprintf(f, "\n"); isNode = FALSE; } dasGffNoteSave(obj->dasGffNote, indent+2, f); } if (obj->dasGffLink != NULL) { if (isNode) { fprintf(f, "\n"); isNode = FALSE; } dasGffLinkSave(obj->dasGffLink, indent+2, f); } if (obj->dasGffTarget != NULL) { if (isNode) { fprintf(f, "\n"); isNode = FALSE; } dasGffTargetSave(obj->dasGffTarget, indent+2, f); } if (!isNode) xapIndent(indent, f); fprintf(f, "\n"); } struct dasGffGroup *dasGffGroupLoad(char *fileName) /* Load dasGffGroup from XML file where it is root element. */ { struct dasGffGroup *obj; xapParseAny(fileName, "GROUP", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffGroup *dasGffGroupLoadNext(struct xap *xap) /* Load next dasGffGroup element. Use xapOpen to get xap. */ { return xapNext(xap, "GROUP"); } void dasGffNoteFree(struct dasGffNote **pObj) /* Free up dasGffNote. */ { struct dasGffNote *obj = *pObj; if (obj == NULL) return; freeMem(obj->text); freez(pObj); } void dasGffNoteFreeList(struct dasGffNote **pList) /* Free up list of dasGffNote. */ { struct dasGffNote *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffNoteFree(&el); el = next; } } void dasGffNoteSave(struct dasGffNote *obj, int indent, FILE *f) /* Save dasGffNote to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffNote *dasGffNoteLoad(char *fileName) /* Load dasGffNote from XML file where it is root element. */ { struct dasGffNote *obj; xapParseAny(fileName, "NOTE", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffNote *dasGffNoteLoadNext(struct xap *xap) /* Load next dasGffNote element. Use xapOpen to get xap. */ { return xapNext(xap, "NOTE"); } void dasGffLinkFree(struct dasGffLink **pObj) /* Free up dasGffLink. */ { struct dasGffLink *obj = *pObj; if (obj == NULL) return; freeMem(obj->href); freeMem(obj->text); freez(pObj); } void dasGffLinkFreeList(struct dasGffLink **pList) /* Free up list of dasGffLink. */ { struct dasGffLink *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffLinkFree(&el); el = next; } } void dasGffLinkSave(struct dasGffLink *obj, int indent, FILE *f) /* Save dasGffLink to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "href); fprintf(f, ">"); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffLink *dasGffLinkLoad(char *fileName) /* Load dasGffLink from XML file where it is root element. */ { struct dasGffLink *obj; xapParseAny(fileName, "LINK", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffLink *dasGffLinkLoadNext(struct xap *xap) /* Load next dasGffLink element. Use xapOpen to get xap. */ { return xapNext(xap, "LINK"); } void dasGffTargetFree(struct dasGffTarget **pObj) /* Free up dasGffTarget. */ { struct dasGffTarget *obj = *pObj; if (obj == NULL) return; freeMem(obj->id); freeMem(obj->start); freeMem(obj->stop); freeMem(obj->text); freez(pObj); } void dasGffTargetFreeList(struct dasGffTarget **pList) /* Free up list of dasGffTarget. */ { struct dasGffTarget *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; dasGffTargetFree(&el); el = next; } } void dasGffTargetSave(struct dasGffTarget *obj, int indent, FILE *f) /* Save dasGffTarget to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "id); fprintf(f, " start=\"%s\"", obj->start); fprintf(f, " stop=\"%s\"", obj->stop); fprintf(f, ">"); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct dasGffTarget *dasGffTargetLoad(char *fileName) /* Load dasGffTarget from XML file where it is root element. */ { struct dasGffTarget *obj; xapParseAny(fileName, "TARGET", dasGffStartHandler, dasGffEndHandler, NULL, &obj); return obj; } struct dasGffTarget *dasGffTargetLoadNext(struct xap *xap) /* Load next dasGffTarget element. Use xapOpen to get xap. */ { return xapNext(xap, "TARGET"); } void *dasGffStartHandler(struct xap *xp, char *name, char **atts) /* Called by xap with start tag. Does most of the parsing work. */ { struct xapStack *st = xp->stack+1; int depth = xp->stackDepth; int i; if (sameString(name, "DAS_GFF")) { struct dasGffDasGff *obj; AllocVar(obj); return obj; } else if (sameString(name, "NUMBER")) { struct dasGffNumber *obj; AllocVar(obj); return obj; } else if (sameString(name, "GFF")) { struct dasGffGff *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "version")) obj->version = cloneString(val); else if (sameString(name, "href")) obj->href = cloneString(val); } if (obj->version == NULL) xapError(xp, "missing version"); if (obj->href == NULL) xapError(xp, "missing href"); if (depth > 1) { if (sameString(st->elName, "DAS_GFF")) { struct dasGffDasGff *parent = st->object; slAddHead(&parent->dasGffGff, obj); } } return obj; } else if (sameString(name, "SEGMENT")) { struct dasGffSegment *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "id")) obj->id = cloneString(val); else if (sameString(name, "start")) obj->start = atoi(val); else if (sameString(name, "stop")) obj->stop = atoi(val); else if (sameString(name, "version")) obj->version = atof(val); else if (sameString(name, "label")) obj->label = cloneString(val); } if (obj->id == NULL) xapError(xp, "missing id"); if (depth > 1) { if (sameString(st->elName, "GFF")) { struct dasGffGff *parent = st->object; slAddHead(&parent->dasGffSegment, obj); } } return obj; } else if (sameString(name, "FEATURE")) { struct dasGffFeature *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "id")) obj->id = cloneString(val); else if (sameString(name, "label")) obj->label = cloneString(val); else if (sameString(name, "version")) obj->version = cloneString(val); } if (obj->id == NULL) xapError(xp, "missing id"); if (depth > 1) { if (sameString(st->elName, "SEGMENT")) { struct dasGffSegment *parent = st->object; slAddHead(&parent->dasGffFeature, obj); } } return obj; } else if (sameString(name, "TYPE")) { struct dasGffType *obj; AllocVar(obj); obj->reference = "no"; obj->subparts = "no"; for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "id")) obj->id = cloneString(val); else if (sameString(name, "category")) obj->category = cloneString(val); else if (sameString(name, "reference")) obj->reference = cloneString(val); else if (sameString(name, "subparts")) obj->subparts = cloneString(val); } if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffType, obj); } } return obj; } else if (sameString(name, "METHOD")) { struct dasGffMethod *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "id")) obj->id = cloneString(val); } if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffMethod, obj); } } return obj; } else if (sameString(name, "START")) { struct dasGffStart *obj; AllocVar(obj); if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffStart, obj); } } return obj; } else if (sameString(name, "END")) { struct dasGffEnd *obj; AllocVar(obj); if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffEnd, obj); } } return obj; } else if (sameString(name, "SCORE")) { struct dasGffScore *obj; AllocVar(obj); if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffScore, obj); } } return obj; } else if (sameString(name, "ORIENTATION")) { struct dasGffOrientation *obj; AllocVar(obj); if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffOrientation, obj); } } return obj; } else if (sameString(name, "PHASE")) { struct dasGffPhase *obj; AllocVar(obj); if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffPhase, obj); } } return obj; } else if (sameString(name, "GROUP")) { struct dasGffGroup *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "id")) obj->id = cloneString(val); } if (obj->id == NULL) xapError(xp, "missing id"); if (depth > 1) { if (sameString(st->elName, "FEATURE")) { struct dasGffFeature *parent = st->object; slAddHead(&parent->dasGffGroup, obj); } } return obj; } else if (sameString(name, "NOTE")) { struct dasGffNote *obj; AllocVar(obj); if (depth > 1) { if (sameString(st->elName, "GROUP")) { struct dasGffGroup *parent = st->object; slAddHead(&parent->dasGffNote, obj); } } return obj; } else if (sameString(name, "LINK")) { struct dasGffLink *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "href")) obj->href = cloneString(val); } if (obj->href == NULL) xapError(xp, "missing href"); if (depth > 1) { if (sameString(st->elName, "GROUP")) { struct dasGffGroup *parent = st->object; slAddHead(&parent->dasGffLink, obj); } } return obj; } else if (sameString(name, "TARGET")) { struct dasGffTarget *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "id")) obj->id = cloneString(val); else if (sameString(name, "start")) obj->start = cloneString(val); else if (sameString(name, "stop")) obj->stop = cloneString(val); } if (obj->id == NULL) xapError(xp, "missing id"); if (obj->start == NULL) xapError(xp, "missing start"); if (obj->stop == NULL) xapError(xp, "missing stop"); if (depth > 1) { if (sameString(st->elName, "GROUP")) { struct dasGffGroup *parent = st->object; slAddHead(&parent->dasGffTarget, obj); } } return obj; } else { xapSkip(xp); return NULL; } } void dasGffEndHandler(struct xap *xp, char *name) /* Called by xap with end tag. Checks all required children are loaded. */ { struct xapStack *stack = xp->stack; if (sameString(name, "DAS_GFF")) { struct dasGffDasGff *obj = stack->object; if (obj->dasGffGff == NULL) xapError(xp, "Missing GFF"); if (obj->dasGffGff->next != NULL) xapError(xp, "Multiple GFF"); } else if (sameString(name, "NUMBER")) { struct dasGffNumber *obj = stack->object; obj->text = atoi(stack->text->string); } else if (sameString(name, "GFF")) { struct dasGffGff *obj = stack->object; if (obj->dasGffSegment == NULL) xapError(xp, "Missing SEGMENT"); slReverse(&obj->dasGffSegment); } else if (sameString(name, "SEGMENT")) { struct dasGffSegment *obj = stack->object; if (obj->dasGffFeature == NULL) xapError(xp, "Missing FEATURE"); slReverse(&obj->dasGffFeature); } else if (sameString(name, "FEATURE")) { struct dasGffFeature *obj = stack->object; if (obj->dasGffType == NULL) xapError(xp, "Missing TYPE"); if (obj->dasGffType->next != NULL) xapError(xp, "Multiple TYPE"); if (obj->dasGffMethod == NULL) xapError(xp, "Missing METHOD"); if (obj->dasGffMethod->next != NULL) xapError(xp, "Multiple METHOD"); if (obj->dasGffStart == NULL) xapError(xp, "Missing START"); if (obj->dasGffStart->next != NULL) xapError(xp, "Multiple START"); if (obj->dasGffEnd == NULL) xapError(xp, "Missing END"); if (obj->dasGffEnd->next != NULL) xapError(xp, "Multiple END"); if (obj->dasGffScore == NULL) xapError(xp, "Missing SCORE"); if (obj->dasGffScore->next != NULL) xapError(xp, "Multiple SCORE"); if (obj->dasGffOrientation == NULL) xapError(xp, "Missing ORIENTATION"); if (obj->dasGffOrientation->next != NULL) xapError(xp, "Multiple ORIENTATION"); if (obj->dasGffPhase == NULL) xapError(xp, "Missing PHASE"); if (obj->dasGffPhase->next != NULL) xapError(xp, "Multiple PHASE"); if (obj->dasGffGroup != NULL && obj->dasGffGroup->next != NULL) xapError(xp, "Multiple GROUP"); } else if (sameString(name, "TYPE")) { struct dasGffType *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "METHOD")) { struct dasGffMethod *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "START")) { struct dasGffStart *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "END")) { struct dasGffEnd *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "SCORE")) { struct dasGffScore *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "ORIENTATION")) { struct dasGffOrientation *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "PHASE")) { struct dasGffPhase *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "GROUP")) { struct dasGffGroup *obj = stack->object; if (obj->dasGffNote != NULL && obj->dasGffNote->next != NULL) xapError(xp, "Multiple NOTE"); if (obj->dasGffLink != NULL && obj->dasGffLink->next != NULL) xapError(xp, "Multiple LINK"); if (obj->dasGffTarget != NULL && obj->dasGffTarget->next != NULL) xapError(xp, "Multiple TARGET"); } else if (sameString(name, "NOTE")) { struct dasGffNote *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "LINK")) { struct dasGffLink *obj = stack->object; obj->text = cloneString(stack->text->string); } else if (sameString(name, "TARGET")) { struct dasGffTarget *obj = stack->object; obj->text = cloneString(stack->text->string); } }