2023-10-22 14:56:55 +03:00
/*
* testparser . c : Additional parser tests
*
* See Copyright for the status of this software .
*/
# include <libxml/parser.h>
# ifdef LIBXML_PUSH_ENABLED
static int
testHugePush ( void ) {
xmlParserCtxtPtr ctxt ;
int err , i ;
ctxt = xmlCreatePushParserCtxt ( NULL , NULL , NULL , 0 , NULL ) ;
/*
* Push parse a document larger than XML_MAX_LOOKUP_LIMIT
* ( 10 , 000 , 000 bytes ) . This mainly tests whether shrinking the
* buffer works when push parsing .
*/
xmlParseChunk ( ctxt , " <doc> " , 5 , 0 ) ;
for ( i = 0 ; i < 1000000 ; i + + )
xmlParseChunk ( ctxt , " <elem>text</elem> " , 17 , 0 ) ;
xmlParseChunk ( ctxt , " </doc> " , 6 , 1 ) ;
err = ctxt - > wellFormed ? 0 : 1 ;
xmlFreeDoc ( ctxt - > myDoc ) ;
xmlFreeParserCtxt ( ctxt ) ;
return err ;
}
2023-10-28 04:04:59 +03:00
static int
testHugeEncodedChunk ( void ) {
xmlBufferPtr buf ;
xmlChar * chunk ;
xmlParserCtxtPtr ctxt ;
int err , i ;
/*
* Test the push parser with a built - in encoding handler like ISO - 8859 - 1
* and a chunk larger than the initial decoded buffer ( currently 4 KB ) .
*/
buf = xmlBufferCreate ( ) ;
xmlBufferCat ( buf ,
BAD_CAST " <?xml version='1.0' encoding='ISO-8859-1'?> \n " ) ;
xmlBufferCat ( buf , BAD_CAST " <doc><!-- " ) ;
for ( i = 0 ; i < 2000 ; i + + )
xmlBufferCat ( buf , BAD_CAST " 0123456789 " ) ;
xmlBufferCat ( buf , BAD_CAST " --></doc> " ) ;
chunk = xmlBufferDetach ( buf ) ;
xmlBufferFree ( buf ) ;
ctxt = xmlCreatePushParserCtxt ( NULL , NULL , NULL , 0 , NULL ) ;
xmlParseChunk ( ctxt , ( char * ) chunk , xmlStrlen ( chunk ) , 0 ) ;
xmlParseChunk ( ctxt , NULL , 0 , 1 ) ;
err = ctxt - > wellFormed ? 0 : 1 ;
xmlFreeDoc ( ctxt - > myDoc ) ;
xmlFreeParserCtxt ( ctxt ) ;
xmlFree ( chunk ) ;
return err ;
}
2023-10-22 14:56:55 +03:00
# endif
int
main ( void ) {
int err = 0 ;
# ifdef LIBXML_PUSH_ENABLED
err | = testHugePush ( ) ;
2023-10-28 04:04:59 +03:00
err | = testHugeEncodedChunk ( ) ;
2023-10-22 14:56:55 +03:00
# endif
return err ;
}