/* esm.c autoXml generated file */ #include "common.h" #include "xap.h" #include "esMotif.h" void *esmStartHandler(struct xap *xp, char *name, char **atts); /* Called by expat with start tag. Does most of the parsing work. */ void esmEndHandler(struct xap *xp, char *name); /* Called by expat with end tag. Checks all required children are loaded. */ void esmMotifsSave(struct esmMotifs *obj, int indent, FILE *f) /* Save esmMotifs to file. */ { struct esmMotif *esmMotif; boolean isNode = TRUE; if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "SeqFile); fprintf(f, ">"); for (esmMotif = obj->esmMotif; esmMotif != NULL; esmMotif = esmMotif->next) { if (isNode) { fprintf(f, "\n"); isNode = FALSE; } esmMotifSave(esmMotif, indent+2, f); } if (!isNode) xapIndent(indent, f); fprintf(f, "\n"); } struct esmMotifs *esmMotifsLoad(char *fileName) /* Load esmMotifs from file. */ { struct esmMotifs *obj; xapParseAny(fileName, "Motifs", esmStartHandler, esmEndHandler, NULL, &obj); return obj; } void esmMotifSave(struct esmMotif *obj, int indent, FILE *f) /* Save esmMotif to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "Consensus); fprintf(f, " Source=\"%s\"", obj->Source); fprintf(f, " Name=\"%s\"", obj->Name); if (obj->Description != NULL) fprintf(f, " Description=\"%s\"", obj->Description); fprintf(f, ">"); fprintf(f, "\n"); esmWeightsSave(obj->esmWeights, indent+2, f); xapIndent(indent, f); fprintf(f, "\n"); } struct esmMotif *esmMotifLoad(char *fileName) /* Load esmMotif from file. */ { struct esmMotif *obj; xapParseAny(fileName, "Motif", esmStartHandler, esmEndHandler, NULL, &obj); return obj; } void esmWeightsSave(struct esmWeights *obj, int indent, FILE *f) /* Save esmWeights to file. */ { struct esmPosition *esmPosition; if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "ZeroWeight); fprintf(f, ">"); fprintf(f, "\n"); for (esmPosition = obj->esmPosition; esmPosition != NULL; esmPosition = esmPosition->next) { esmPositionSave(esmPosition, indent+2, f); } xapIndent(indent, f); fprintf(f, "\n"); } struct esmWeights *esmWeightsLoad(char *fileName) /* Load esmWeights from file. */ { struct esmWeights *obj; xapParseAny(fileName, "Weights", esmStartHandler, esmEndHandler, NULL, &obj); return obj; } void esmPositionSave(struct esmPosition *obj, int indent, FILE *f) /* Save esmPosition to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "Num); fprintf(f, " Weights=\"%s\"", obj->Weights); fprintf(f, "->\n"); } struct esmPosition *esmPositionLoad(char *fileName) /* Load esmPosition from file. */ { struct esmPosition *obj; xapParseAny(fileName, "Position", esmStartHandler, esmEndHandler, NULL, &obj); return obj; } void *esmStartHandler(struct xap *xp, char *name, char **atts) /* Called by expat with start tag. Does most of the parsing work. */ { struct xapStack *st = xp->stack+1; int depth = xp->stackDepth; int i; if (sameString(name, "Motifs")) { struct esmMotifs *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "SeqFile")) obj->SeqFile = cloneString(val); } if (obj->SeqFile == NULL) xapError(xp, "missing SeqFile"); return obj; } else if (sameString(name, "Motif")) { struct esmMotif *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "Consensus")) obj->Consensus = cloneString(val); else if (sameString(name, "Source")) obj->Source = cloneString(val); else if (sameString(name, "Name")) obj->Name = cloneString(val); else if (sameString(name, "Description")) obj->Description = cloneString(val); } if (obj->Consensus == NULL) xapError(xp, "missing Consensus"); if (obj->Source == NULL) xapError(xp, "missing Source"); if (obj->Name == NULL) xapError(xp, "missing Name"); if (depth > 1) { if (sameString(st->elName, "Motifs")) { struct esmMotifs *parent = st->object; slAddHead(&parent->esmMotif, obj); } } return obj; } else if (sameString(name, "Weights")) { struct esmWeights *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "ZeroWeight")) obj->ZeroWeight = atof(val); } if (depth > 1) { if (sameString(st->elName, "Motif")) { struct esmMotif *parent = st->object; slAddHead(&parent->esmWeights, obj); } } return obj; } else if (sameString(name, "Position")) { struct esmPosition *obj; AllocVar(obj); for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "Num")) obj->Num = atoi(val); else if (sameString(name, "Weights")) obj->Weights = cloneString(val); } if (obj->Weights == NULL) xapError(xp, "missing Weights"); if (depth > 1) { if (sameString(st->elName, "Weights")) { struct esmWeights *parent = st->object; slAddHead(&parent->esmPosition, obj); } } return obj; } else { xapSkip(xp); return NULL; } } void esmEndHandler(struct xap *xp, char *name) /* Called by expat with end tag. Checks all required children are loaded. */ { struct xapStack *stack = xp->stack; if (sameString(name, "Motifs")) { struct esmMotifs *obj = stack->object; slReverse(&obj->esmMotif); } else if (sameString(name, "Motif")) { struct esmMotif *obj = stack->object; if (obj->esmWeights == NULL) xapError(xp, "Missing Weights"); if (obj->esmWeights->next != NULL) xapError(xp, "Multiple Weights"); } else if (sameString(name, "Weights")) { struct esmWeights *obj = stack->object; if (obj->esmPosition == NULL) xapError(xp, "Missing Position"); slReverse(&obj->esmPosition); } }