int main(int argc, char * argv[]) { genxWriter w = genxNew(NULL, NULL, NULL); genxElement dates, date; genxAttribute yyyy, mm; genxNamespace ns; genxStatus status; int i; char year[100], month[100]; if (!(ns = genxDeclareNamespace(w, "http://example.org/dd", "dd", &status))) oops(w); if (!(dates = genxDeclareElement(w, ns, "dates", &status))) oops(w); if (!(date = genxDeclareElement(w, NULL, "date", &status))) oops(w); if (!(yyyy = genxDeclareAttribute(w, NULL, "yyyy", &status))) oops(w); if (!(mm = genxDeclareAttribute(w, NULL, "mm", &status))) oops(w); if (genxStartDocFile(w, stdout) || genxStartElement(dates) || genxAddText(w, "\n")) oops(w); for (i = 0; i < 1000000; i++) { sprintf(year, "%d", 1900 + (random() % 100)); sprintf(month, "%02d", 1 + (random() % 12)); if (genxStartElement(date) || genxAddAttribute(yyyy, year) || genxAddAttribute(mm, month) || genxEndElement(w) || genxAddText(w, "\n ")) oops(w); } if (genxEndElement(w)) oops(w); if (genxEndDocument(w)) oops(w); }
/* * Construct a new genxWriter */ genxWriter genxNew(void * (* alloc)(void * userData, int bytes), void (* dealloc)(void * userData, void * data), void * userData) { genxWriter w; genxNamespace xml; if (alloc) w = (genxWriter) (*alloc)(userData, sizeof(struct genxWriter_rec)); else w = (genxWriter) malloc(sizeof(struct genxWriter_rec)); if (w == NULL) return NULL; w->status = GENX_SUCCESS; w->alloc = alloc; w->dealloc = dealloc; w->userData = userData; w->sequence = SEQUENCE_NO_DOC; if (initPlist(w, &w->namespaces) != GENX_SUCCESS || initPlist(w, &w->elements) != GENX_SUCCESS || initPlist(w, &w->attributes) != GENX_SUCCESS || initPlist(w, &w->prefixes) != GENX_SUCCESS || initPlist(w, &w->stack) != GENX_SUCCESS) return NULL; if ((w->status = initCollector(w, &w->arec.value)) != GENX_SUCCESS) return NULL; if ((w->empty = copy(w, (utf8) "")) == NULL) { w->status = GENX_ALLOC_FAILED; return NULL; } w->xmlnsEquals = declareAttribute(w, NULL, (utf8) "xmlns", NULL, &w->status); if (w->xmlnsEquals == NULL || w->status != GENX_SUCCESS) return NULL; w->defaultNsDeclared = False; w->nextPrefix = 1; genxSetCharProps(w->xmlChars); w->etext[GENX_SUCCESS] = "Success"; w->etext[GENX_BAD_UTF8] = "Bad UTF8"; w->etext[GENX_NON_XML_CHARACTER] = "Non XML Character"; w->etext[GENX_BAD_NAME] = "Bad NAME"; w->etext[GENX_ALLOC_FAILED] = "Memory allocation failed"; w->etext[GENX_BAD_NAMESPACE_NAME] = "Bad namespace name"; w->etext[GENX_INTERNAL_ERROR] = "Internal error"; w->etext[GENX_DUPLICATE_PREFIX] = "Duplicate prefix"; w->etext[GENX_SEQUENCE_ERROR] = "Call out of sequence"; w->etext[GENX_NO_START_TAG] = "No Start-tag for EndElement call"; w->etext[GENX_IO_ERROR] = "I/O error"; w->etext[GENX_MISSING_VALUE] = "Missing attribute value"; w->etext[GENX_MALFORMED_COMMENT] = "Malformed comment body"; w->etext[GENX_MALFORMED_PI] = "?> in PI"; w->etext[GENX_XML_PI_TARGET] = "Target of PI matches [xX][mM][lL]"; w->etext[GENX_DUPLICATE_ATTRIBUTE] = "Same attribute specified more than once"; w->etext[GENX_ATTRIBUTE_IN_DEFAULT_NAMESPACE] = "Attribute cannot be in default namespace"; w->etext[GENX_DUPLICATE_NAMESPACE] = "Declared namespace twice with different prefixes on one element."; w->etext[GENX_BAD_DEFAULT_DECLARATION] = "Declared a default namespace on an element which is in no namespace"; /* the xml: namespace is pre-wired */ xml = genxDeclareNamespace(w, (utf8) "http://www.w3.org/XML/1998/namespace", (utf8) "xml", &w->status); if (xml == NULL) return NULL; xml->declCount = 1; xml->declaration = xml->defaultDecl; return w; }