/* polygon.c autoXml generated file */ #include "common.h" #include "xap.h" #include "polygon.h" void polygonPolygonFree(struct polygonPolygon **pObj) /* Free up polygonPolygon. */ { struct polygonPolygon *obj = *pObj; if (obj == NULL) return; freeMem(obj->id); polygonDescriptionFree(&obj->polygonDescription); polygonPointFreeList(&obj->polygonPoint); freez(pObj); } void polygonPolygonFreeList(struct polygonPolygon **pList) /* Free up list of polygonPolygon. */ { struct polygonPolygon *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; polygonPolygonFree(&el); el = next; } } void polygonPolygonSave(struct polygonPolygon *obj, int indent, FILE *f) /* Save polygonPolygon to file. */ { struct polygonPoint *polygonPoint; if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "id); fprintf(f, ">"); fprintf(f, "\n"); polygonDescriptionSave(obj->polygonDescription, indent+2, f); for (polygonPoint = obj->polygonPoint; polygonPoint != NULL; polygonPoint = polygonPoint->next) { polygonPointSave(polygonPoint, indent+2, f); } xapIndent(indent, f); fprintf(f, "\n"); } struct polygonPolygon *polygonPolygonLoad(char *fileName) /* Load polygonPolygon from XML file where it is root element. */ { struct polygonPolygon *obj; xapParseAny(fileName, "POLYGON", polygonStartHandler, polygonEndHandler, NULL, &obj); return obj; } struct polygonPolygon *polygonPolygonLoadNext(struct xap *xap) /* Load next polygonPolygon element. Use xapOpen to get xap. */ { return xapNext(xap, "POLYGON"); } void polygonDescriptionFree(struct polygonDescription **pObj) /* Free up polygonDescription. */ { struct polygonDescription *obj = *pObj; if (obj == NULL) return; freeMem(obj->text); freez(pObj); } void polygonDescriptionFreeList(struct polygonDescription **pList) /* Free up list of polygonDescription. */ { struct polygonDescription *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; polygonDescriptionFree(&el); el = next; } } void polygonDescriptionSave(struct polygonDescription *obj, int indent, FILE *f) /* Save polygonDescription to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, ""); fprintf(f, "%s", obj->text); fprintf(f, "\n"); } struct polygonDescription *polygonDescriptionLoad(char *fileName) /* Load polygonDescription from XML file where it is root element. */ { struct polygonDescription *obj; xapParseAny(fileName, "DESCRIPTION", polygonStartHandler, polygonEndHandler, NULL, &obj); return obj; } struct polygonDescription *polygonDescriptionLoadNext(struct xap *xap) /* Load next polygonDescription element. Use xapOpen to get xap. */ { return xapNext(xap, "DESCRIPTION"); } void polygonPointFree(struct polygonPoint **pObj) /* Free up polygonPoint. */ { struct polygonPoint *obj = *pObj; if (obj == NULL) return; freez(pObj); } void polygonPointFreeList(struct polygonPoint **pList) /* Free up list of polygonPoint. */ { struct polygonPoint *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; polygonPointFree(&el); el = next; } } void polygonPointSave(struct polygonPoint *obj, int indent, FILE *f) /* Save polygonPoint to file. */ { if (obj == NULL) return; xapIndent(indent, f); fprintf(f, "x); fprintf(f, " y=\"%f\"", obj->y); fprintf(f, " z=\"%f\"", obj->z); fprintf(f, "/>\n"); } struct polygonPoint *polygonPointLoad(char *fileName) /* Load polygonPoint from XML file where it is root element. */ { struct polygonPoint *obj; xapParseAny(fileName, "POINT", polygonStartHandler, polygonEndHandler, NULL, &obj); return obj; } struct polygonPoint *polygonPointLoadNext(struct xap *xap) /* Load next polygonPoint element. Use xapOpen to get xap. */ { return xapNext(xap, "POINT"); } void *polygonStartHandler(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, "POLYGON")) { struct polygonPolygon *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"); return obj; } else if (sameString(name, "DESCRIPTION")) { struct polygonDescription *obj; AllocVar(obj); if (depth > 1) { if (sameString(st->elName, "POLYGON")) { struct polygonPolygon *parent = st->object; slAddHead(&parent->polygonDescription, obj); } } return obj; } else if (sameString(name, "POINT")) { struct polygonPoint *obj; AllocVar(obj); obj->z = 0; for (i=0; atts[i] != NULL; i += 2) { char *name = atts[i], *val = atts[i+1]; if (sameString(name, "x")) obj->x = atof(val); else if (sameString(name, "y")) obj->y = atof(val); else if (sameString(name, "z")) obj->z = atof(val); } if (depth > 1) { if (sameString(st->elName, "POLYGON")) { struct polygonPolygon *parent = st->object; slAddHead(&parent->polygonPoint, obj); } } return obj; } else { xapSkip(xp); return NULL; } } void polygonEndHandler(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, "POLYGON")) { struct polygonPolygon *obj = stack->object; if (obj->polygonDescription != NULL && obj->polygonDescription->next != NULL) xapError(xp, "Multiple DESCRIPTION"); if (obj->polygonPoint == NULL) xapError(xp, "Missing POINT"); slReverse(&obj->polygonPoint); } else if (sameString(name, "DESCRIPTION")) { struct polygonDescription *obj = stack->object; obj->text = cloneString(stack->text->string); } }