XMLCH XMLAPI *XMLStringbuf_InitUsePool(LPXMLSTRINGBUF sbuf, int blockSize, int initSize, LPXMLPOOL pool) { if (initSize > pool->itemSize) return XMLStringbuf_Init(sbuf, blockSize, initSize); sbuf->pool = pool; sbuf->usePool = 1; sbuf->len = sbuf->capacity = 0; sbuf->blocksize = blockSize; return (sbuf->str = (XMLCH*)XMLPool_Alloc(pool)); }
struct XMLReader_t *XMLReader_Create(struct XMLReader_t *r, int validating) { int i; if (!r) { r=malloc(sizeof(*r)); ASSERT_MEM_SETERR(r); r->dynamicalloc = 1; } memset(r, 0, sizeof *r); ASSERT_MEM_SETERR(XMLParser_Create(&r->parser)); XMLVector_Create(&r->atts, 0, sizeof(struct XMLReaderAttribute_t)); ASSERT_MEM_SETERR(r->atts); XMLVector_Create(&r->eventbuffer, 0, sizeof(union XMLReaderNode_t)); ASSERT_MEM_SETERR(r->eventbuffer); for (i=0; i<sizeof(r->buf)/sizeof(r->buf[0]); i++) { ASSERT_MEM_SETERR(XMLStringbuf_Init(&r->buf[i], 256, 256)); } _XMLParser_SetFlag(r->parser, XMLFLAG_USE_SIMPLEPULL, 1); if (validating) { ASSERT_MEM_SETERR(r->dtdv = XMLParser_CreateDTDValidator()); r->dtdv->UserData = r; r->parser->errorHandler = ErrorHandlerV; r->parser->startElementHandler = StartElementV; r->parser->endElementHandler = EndElementV; r->parser->charactersHandler = CharsV; r->parser->commentHandler = CommentV; r->parser->processingInstructionHandler = PiV; r->parser->endDocumentHandler = EndDocumentV; } else { r->parser->UserData = r; r->parser->errorHandler = ErrorHandlerN; r->parser->startElementHandler = StartElementN; r->parser->endElementHandler = EndElementN; r->parser->charactersHandler = CharsN; r->parser->commentHandler = CommentN; r->parser->processingInstructionHandler = PiN; } return r; }
CURLREADER *Curlreader_Create(void) { CURLREADER *r = malloc(sizeof(CURLREADER)); if (r==NULL) return NULL; r->curlh = NULL; r->curlmh = NULL; r->flags = 0; XMLStringbuf_Init(&r->sbuf, 1024, 0); r->curlh = curl_easy_init(); if (!r->curlh) { Curlreader_Free(r); return NULL; } curl_easy_setopt(r->curlh, CURLOPT_WRITEDATA, r); curl_easy_setopt(r->curlh, CURLOPT_WRITEFUNCTION, getdata); r->curlmh = curl_multi_init(); if (!r->curlmh) { Curlreader_Free(r); return NULL; } return r; }
int main(int argc, char* argv[]) { BOOKPARSER bparser; BOOK *b; LPXMLPARSER parser; LPXMLDTDVALIDATOR vp; int i, success; if (!XMLParser_Create(&parser)) { puts("Error creating parser!"); return 1; } vp = XMLParser_CreateDTDValidator(); if (!vp) { puts("Error creating DTDValidator in main()"); return 1; } if (!XMLVector_Create(&bparser.books, 6, sizeof(BOOK))) { puts("Error creating books vector in main()"); return 1; } /* init Stringbuf: blockSize 256, no pre-allocation: */ XMLStringbuf_Init(&bparser.textBuf, 256, 0); vp->UserData = &bparser; parser->errorHandler = ErrorHandler; parser->startElementHandler = StartElement; parser->endElementHandler = EndElement; parser->charactersHandler = Characters; success = XMLParser_ParseValidateDTD(vp, parser, cstream, stdin, 0); for (i=0; i<bparser.books->length; i++) { b = XMLVector_Get(bparser.books, i); if (success) printf("id: %d\n" "author: %s\n" "title: %s\n" "genre: %s\n" "price: %f\n" "publish_date: %s\n" "description: %s\n\n", b->id, b->author, b->title, b->genre, b->price, b->publish_date, b->description ); SAFE_FREE(b->author); SAFE_FREE(b->title); SAFE_FREE(b->genre); SAFE_FREE(b->publish_date); SAFE_FREE(b->description); } XMLParser_FreeDTDValidator(vp); XMLParser_Free(parser); XMLStringbuf_Free(&bparser.textBuf); XMLVector_Free(bparser.books); return 0; }