diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2003-10-05 13:51:35 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2003-10-05 13:51:35 +0000 |
commit | f403d298c3dfa831777a4b2d961a66a84666ddc3 (patch) | |
tree | ea03d32e88ef4ff49c9dbc6fb43cacf3985b8338 /HTMLparser.c | |
parent | 24eb97851d77666bc7809a4892679de1a5800970 (diff) | |
download | android_external_libxml2-f403d298c3dfa831777a4b2d961a66a84666ddc3.tar.gz android_external_libxml2-f403d298c3dfa831777a4b2d961a66a84666ddc3.tar.bz2 android_external_libxml2-f403d298c3dfa831777a4b2d961a66a84666ddc3.zip |
more code cleanup, especially around error messages, the HTML parser has
* HTMLparser.c Makefile.am legacy.c parser.c parserInternals.c
include/libxml/xmlerror.h: more code cleanup, especially around
error messages, the HTML parser has now been upgraded to the new
handling.
* result/HTML/*: a few changes in the resulting error messages
Daniel
Diffstat (limited to 'HTMLparser.c')
-rw-r--r-- | HTMLparser.c | 766 |
1 files changed, 295 insertions, 471 deletions
diff --git a/HTMLparser.c b/HTMLparser.c index d9ef259a..3ee37a48 100644 --- a/HTMLparser.c +++ b/HTMLparser.c @@ -59,6 +59,81 @@ static void htmlParseComment(htmlParserCtxtPtr ctxt); /************************************************************************ * * + * Some factorized error routines * + * * + ************************************************************************/ + +/** + * xmlErrMemory: + * @ctxt: an HTML parser context + * @extra: extra informations + * + * Handle a redefinition of attribute error + */ +static void +htmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) +{ + if (ctxt != NULL) { + ctxt->errNo = XML_ERR_NO_MEMORY; + ctxt->instate = XML_PARSER_EOF; + ctxt->disableSAX = 1; + } + if (extra) + __xmlRaiseError(NULL, NULL, ctxt, NULL, XML_FROM_PARSER, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, + NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); + else + __xmlRaiseError(NULL, NULL, ctxt, NULL, XML_FROM_PARSER, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, + NULL, NULL, 0, 0, "Memory allocation failed\n"); +} + +/** + * htmlParseErr: + * @ctxt: an HTML parser context + * @error: the error number + * @msg: the error message + * @str1: string infor + * @str2: string infor + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +htmlParseErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const xmlChar *str1, const xmlChar *str2) +{ + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, + XML_ERR_ERROR, NULL, 0, + (const char *) str1, (const char *) str2, + NULL, 0, 0, + msg, str1, str2); + ctxt->wellFormed = 0; +} + +/** + * htmlParseErrInt: + * @ctxt: an HTML parser context + * @error: the error number + * @msg: the error message + * @val: integer info + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +htmlParseErrInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, int val) +{ + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, + XML_ERR_ERROR, NULL, 0, NULL, NULL, + NULL, val, 0, msg, val); + ctxt->wellFormed = 0; +} + +/************************************************************************ + * * * Parser stacks related functions and macros * * * ************************************************************************/ @@ -82,7 +157,7 @@ htmlnamePush(htmlParserCtxtPtr ctxt, const xmlChar * value) ctxt->nameMax * sizeof(ctxt->nameTab[0])); if (ctxt->nameTab == NULL) { - xmlGenericError(xmlGenericErrorContext, "realloc failed !\n"); + htmlErrMemory(ctxt, NULL); return (0); } } @@ -272,13 +347,8 @@ htmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { val |= cur[1] & 0x3f; } if (!IS_CHAR(val)) { - ctxt->errNo = XML_ERR_INVALID_ENCODING; - if ((ctxt->sax != NULL) && - (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Char 0x%X out of allowed range\n", val); - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) ctxt->disableSAX = 1; + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "Char 0x%X out of allowed range\n", val); } return(val); } else { @@ -311,10 +381,10 @@ encoding_error: * to ISO-Latin-1 (if you don't like this policy, just declare the * encoding !) */ - ctxt->errNo = XML_ERR_INVALID_ENCODING; + htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, + "Input is not proper UTF-8, indicate encoding !\n", + NULL, NULL); if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) { - ctxt->sax->error(ctxt->userData, - "Input is not proper UTF-8, indicate encoding !\n"); ctxt->sax->error(ctxt->userData, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", ctxt->input->cur[0], ctxt->input->cur[1], ctxt->input->cur[2], ctxt->input->cur[3]); @@ -1039,17 +1109,6 @@ htmlAutoCloseOnClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) const htmlElemDesc *info; int i, priority; -#ifdef DEBUG - const xmlChar *oldname; - - xmlGenericError(xmlGenericErrorContext, - "Close of %s stack: %d elements\n", newtag, - ctxt->nameNr); - for (i = 0; i < ctxt->nameNr; i++) - xmlGenericError(xmlGenericErrorContext, "%d : %s\n", i, - ctxt->nameTab[i]); -#endif - priority = htmlGetEndPriority(newtag); for (i = (ctxt->nameNr - 1); i >= 0; i--) { @@ -1070,36 +1129,14 @@ htmlAutoCloseOnClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) while (!xmlStrEqual(newtag, ctxt->name)) { info = htmlTagLookup(ctxt->name); - if ((info == NULL) || (info->endTag == 1)) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "htmlAutoCloseOnClose: %s closes %s\n", newtag, - ctxt->name); -#endif - } else if (info->endTag == 3) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "End of tag %s: expecting %s\n", newtag, - ctxt->name); - -#endif - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Opening and ending tag mismatch: %s and %s\n", - newtag, ctxt->name); - ctxt->wellFormed = 0; + if ((info != NULL) && (info->endTag == 3)) { + htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, + "Opening and ending tag mismatch: %s and %s\n", + NULL, NULL); } if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); -#ifdef DEBUG - oldname = htmlnamePop(ctxt); - if (oldname != NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlAutoCloseOnClose: popped %s\n", oldname); - } -#else htmlnamePop(ctxt); -#endif } } @@ -1113,31 +1150,13 @@ static void htmlAutoCloseOnEnd(htmlParserCtxtPtr ctxt) { int i; -#ifdef DEBUG - const xmlChar *oldname; - - xmlGenericError(xmlGenericErrorContext, - "Close of stack: %d elements\n", ctxt->nameNr); -#endif if (ctxt->nameNr == 0) return; for (i = (ctxt->nameNr - 1); i >= 0; i--) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, "%d : %s\n", i, - ctxt->nameTab[i]); -#endif if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); -#ifdef DEBUG - oldname = htmlnamePop(ctxt); - if (oldname != NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlAutoCloseOnEnd: popped %s\n", oldname); - } -#else htmlnamePop(ctxt); -#endif } } @@ -1156,28 +1175,11 @@ htmlAutoCloseOnEnd(htmlParserCtxtPtr ctxt) static void htmlAutoClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) { -#ifdef DEBUG - const xmlChar *oldname; -#endif - while ((newtag != NULL) && (ctxt->name != NULL) && (htmlCheckAutoClose(newtag, ctxt->name))) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "htmlAutoClose: %s closes %s\n", newtag, - ctxt->name); -#endif if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); -#ifdef DEBUG - oldname = htmlnamePop(ctxt); - if (oldname != NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlAutoClose: popped %s\n", oldname); - } -#else htmlnamePop(ctxt); -#endif } if (newtag == NULL) { htmlAutoCloseOnEnd(ctxt); @@ -1187,23 +1189,10 @@ htmlAutoClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) ((xmlStrEqual(ctxt->name, BAD_CAST "head")) || (xmlStrEqual(ctxt->name, BAD_CAST "body")) || (xmlStrEqual(ctxt->name, BAD_CAST "html")))) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "htmlAutoClose: EOF closes %s\n", ctxt->name); -#endif if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); -#ifdef DEBUG - oldname = htmlnamePop(ctxt); - if (oldname != NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlAutoClose: popped %s\n", oldname); - } -#else htmlnamePop(ctxt); -#endif } - } /** @@ -1274,9 +1263,6 @@ htmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { if (xmlStrEqual(newtag, BAD_CAST"html")) return; if (ctxt->nameNr <= 0) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"Implied element html: pushed html\n"); -#endif htmlnamePush(ctxt, BAD_CAST"html"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"html", NULL); @@ -1294,9 +1280,6 @@ htmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { * dropped OBJECT ... i you put it first BODY will be * assumed ! */ -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"Implied element head: pushed head\n"); -#endif htmlnamePush(ctxt, BAD_CAST"head"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"head", NULL); @@ -1313,9 +1296,6 @@ htmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { } } -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"Implied element body: pushed body\n"); -#endif htmlnamePush(ctxt, BAD_CAST"body"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"body", NULL); @@ -1353,9 +1333,6 @@ htmlCheckParagraph(htmlParserCtxtPtr ctxt) { return(0); for (i = 0; htmlNoContentElements[i] != NULL; i++) { if (xmlStrEqual(tag, BAD_CAST htmlNoContentElements[i])) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"Implied element paragraph\n"); -#endif htmlAutoClose(ctxt, BAD_CAST"p"); htmlCheckImplied(ctxt, BAD_CAST"p"); htmlnamePush(ctxt, BAD_CAST"p"); @@ -1698,7 +1675,7 @@ static const htmlEntityDesc html40EntitiesTable[] = { buffer##_size *= 2; \ buffer = (xmlChar *) xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \ if (buffer == NULL) { \ - xmlGenericError(xmlGenericErrorContext, "realloc failed\n"); \ + htmlErrMemory(ctxt, "growing buffer\n"); \ return(NULL); \ } \ } @@ -1720,9 +1697,6 @@ htmlEntityLookup(const xmlChar *name) { for (i = 0;i < (sizeof(html40EntitiesTable)/ sizeof(html40EntitiesTable[0]));i++) { if (xmlStrEqual(name, BAD_CAST html40EntitiesTable[i].name)) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"Found entity %s\n", name); -#endif return((htmlEntityDescPtr) &html40EntitiesTable[i]); } } @@ -1742,28 +1716,14 @@ htmlEntityLookup(const xmlChar *name) { const htmlEntityDesc * htmlEntityValueLookup(unsigned int value) { unsigned int i; -#ifdef DEBUG - unsigned int lv = 0; -#endif for (i = 0;i < (sizeof(html40EntitiesTable)/ sizeof(html40EntitiesTable[0]));i++) { if (html40EntitiesTable[i].value >= value) { if (html40EntitiesTable[i].value > value) break; -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"Found entity %s\n", html40EntitiesTable[i].name); -#endif return((htmlEntityDescPtr) &html40EntitiesTable[i]); } -#ifdef DEBUG - if (lv > html40EntitiesTable[i].value) { - xmlGenericError(xmlGenericErrorContext, - "html40EntitiesTable[] is not sorted (%d > %d)!\n", - lv, html40EntitiesTable[i].value); - } - lv = html40EntitiesTable[i].value; -#endif } return(NULL); } @@ -1963,33 +1923,6 @@ htmlEncodeEntities(unsigned char* out, int *outlen, return(0); } -/** - * htmlDecodeEntities: - * @ctxt: the parser context - * @len: the len to decode (in bytes !), -1 for no size limit - * @end: an end marker xmlChar, 0 if none - * @end2: an end marker xmlChar, 0 if none - * @end3: an end marker xmlChar, 0 if none - * - * Substitute the HTML entities by their value - * - * DEPRECATED !!!! - * - * Returns A newly allocated string with the substitution done. The caller - * must deallocate it ! - */ -xmlChar * -htmlDecodeEntities(htmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED, - xmlChar end ATTRIBUTE_UNUSED, xmlChar end2 ATTRIBUTE_UNUSED, xmlChar end3 ATTRIBUTE_UNUSED) { - static int deprecated = 0; - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "htmlDecodeEntities() deprecated function reached\n"); - deprecated = 1; - } - return(NULL); -} - /************************************************************************ * * * Commodity functions to handle streams * @@ -2009,10 +1942,7 @@ htmlNewInputStream(htmlParserCtxtPtr ctxt) { input = (xmlParserInputPtr) xmlMalloc(sizeof(htmlParserInput)); if (input == NULL) { - ctxt->errNo = XML_ERR_NO_MEMORY; - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "malloc: couldn't allocate a new input stream\n"); + htmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); return(NULL); } memset(input, 0, sizeof(htmlParserInput)); @@ -2126,8 +2056,7 @@ htmlNewDocNoDtD(const xmlChar *URI, const xmlChar *ExternalID) { */ cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc)); if (cur == NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlNewDocNoDtD : malloc failed\n"); + htmlErrMemory(NULL, "HTML document creation failed\n"); return(NULL); } memset(cur, 0, sizeof(xmlDoc)); @@ -2322,8 +2251,7 @@ htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) { buffer_size = HTML_PARSER_BUFFER_SIZE; buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); if (buffer == NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlParseHTMLAttribute: malloc failed\n"); + htmlErrMemory(ctxt, "buffer allocation failed\n"); return(NULL); } out = buffer; @@ -2458,9 +2386,8 @@ htmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str) { NEXT; name = htmlParseName(ctxt); if (name == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "htmlParseEntityRef: no name\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, + "htmlParseEntityRef: no name\n", NULL, NULL); } else { GROW; if (CUR == ';') { @@ -2473,9 +2400,9 @@ htmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str) { if (ent != NULL) /* OK that's ugly !!! */ NEXT; } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseEntityRef: expecting ';'\n"); + htmlParseErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, + "htmlParseEntityRef: expecting ';'\n", + NULL, NULL); *str = name; } } @@ -2503,18 +2430,16 @@ htmlParseAttValue(htmlParserCtxtPtr ctxt) { NEXT; ret = htmlParseHTMLAttribute(ctxt, '"'); if (CUR != '"') { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "AttValue: ' expected\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, + "AttValue: \" expected\n", NULL, NULL); } else NEXT; } else if (CUR == '\'') { NEXT; ret = htmlParseHTMLAttribute(ctxt, '\''); if (CUR != '\'') { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "AttValue: ' expected\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, + "AttValue: ' expected\n", NULL, NULL); } else NEXT; } else { @@ -2523,9 +2448,8 @@ htmlParseAttValue(htmlParserCtxtPtr ctxt) { */ ret = htmlParseHTMLAttribute(ctxt, 0); if (ret == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "AttValue: no value found\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, + "AttValue: no value found\n", NULL, NULL); } } return(ret); @@ -2553,9 +2477,8 @@ htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { while ((IS_CHAR((unsigned int) CUR)) && (CUR != '"')) NEXT; if (!IS_CHAR((unsigned int) CUR)) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "Unfinished SystemLiteral\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished SystemLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; @@ -2566,18 +2489,15 @@ htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { while ((IS_CHAR((unsigned int) CUR)) && (CUR != '\'')) NEXT; if (!IS_CHAR((unsigned int) CUR)) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "Unfinished SystemLiteral\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished SystemLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "SystemLiteral \" or ' expected\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, + " or ' expected\n", NULL, NULL); } return(ret); @@ -2606,9 +2526,8 @@ htmlParsePubidLiteral(htmlParserCtxtPtr ctxt) { q = CUR_PTR; while (IS_PUBIDCHAR(CUR)) NEXT; if (CUR != '"') { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "Unfinished PubidLiteral\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished PubidLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; @@ -2619,17 +2538,15 @@ htmlParsePubidLiteral(htmlParserCtxtPtr ctxt) { while ((IS_PUBIDCHAR(CUR)) && (CUR != '\'')) NEXT; if (CUR != '\'') { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "Unfinished PubidLiteral\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished PubidLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "SystemLiteral \" or ' expected\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, + "PubidLiteral \" or ' expected\n", NULL, NULL); } return(ret); @@ -2708,10 +2625,8 @@ htmlParseScript(htmlParserCtxtPtr ctxt) { cur = CUR; } if (!(IS_CHAR((unsigned int) cur))) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Invalid char in CDATA 0x%X\n", cur); - ctxt->wellFormed = 0; + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "Invalid char in CDATA 0x%X\n", cur); NEXT; } @@ -2824,36 +2739,29 @@ htmlParseExternalID(htmlParserCtxtPtr ctxt, xmlChar **publicID) { (UPP(4) == 'E') && (UPP(5) == 'M')) { SKIP(6); if (!IS_BLANK(CUR)) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Space required after 'SYSTEM'\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after 'SYSTEM'\n", NULL, NULL); } SKIP_BLANKS; URI = htmlParseSystemLiteral(ctxt); if (URI == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseExternalID: SYSTEM, no URI\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_URI_REQUIRED, + "htmlParseExternalID: SYSTEM, no URI\n", NULL, NULL); } } else if ((UPPER == 'P') && (UPP(1) == 'U') && (UPP(2) == 'B') && (UPP(3) == 'L') && (UPP(4) == 'I') && (UPP(5) == 'C')) { SKIP(6); if (!IS_BLANK(CUR)) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Space required after 'PUBLIC'\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after 'PUBLIC'\n", NULL, NULL); } SKIP_BLANKS; *publicID = htmlParsePubidLiteral(ctxt); if (*publicID == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseExternalID: PUBLIC, no Public Identifier\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_PUBID_REQUIRED, + "htmlParseExternalID: PUBLIC, no Public Identifier\n", + NULL, NULL); } SKIP_BLANKS; if ((CUR == '"') || (CUR == '\'')) { @@ -2893,8 +2801,7 @@ htmlParseComment(htmlParserCtxtPtr ctxt) { SKIP(4); buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { - xmlGenericError(xmlGenericErrorContext, - "malloc of %d byte failed\n", size); + htmlErrMemory(ctxt, "buffer allocation failed\n"); ctxt->instate = state; return; } @@ -2911,8 +2818,7 @@ htmlParseComment(htmlParserCtxtPtr ctxt) { size *= 2; buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); if (buf == NULL) { - xmlGenericError(xmlGenericErrorContext, - "realloc of %d byte failed\n", size); + htmlErrMemory(ctxt, "growing buffer failed\n"); ctxt->instate = state; return; } @@ -2932,11 +2838,8 @@ htmlParseComment(htmlParserCtxtPtr ctxt) { } buf[len] = 0; if (!IS_CHAR(cur)) { - ctxt->errNo = XML_ERR_COMMENT_NOT_FINISHED; - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Comment not terminated \n<!--%.50s\n", buf); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, + "Comment not terminated \n<!--%.50s\n", buf, NULL); xmlFree(buf); } else { NEXT; @@ -2974,10 +2877,9 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) { else if ((CUR >= 'A') && (CUR <= 'F')) val = val * 16 + (CUR - 'A') + 10; else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseCharRef: invalid hexadecimal value\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, + "htmlParseCharRef: invalid hexadecimal value\n", + NULL, NULL); return(0); } NEXT; @@ -2990,10 +2892,9 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) { if ((CUR >= '0') && (CUR <= '9')) val = val * 10 + (CUR - '0'); else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseCharRef: invalid decimal value\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, + "htmlParseCharRef: invalid decimal value\n", + NULL, NULL); return(0); } NEXT; @@ -3001,9 +2902,8 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) { if (CUR == ';') NEXT; } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "htmlParseCharRef: invalid value\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_INVALID_CHARREF, + "htmlParseCharRef: invalid value\n", NULL, NULL); } /* * Check the value IS_CHAR ... @@ -3011,10 +2911,9 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) { if (IS_CHAR(val)) { return(val); } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "htmlParseCharRef: invalid xmlChar value %d\n", - val); - ctxt->wellFormed = 0; + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "htmlParseCharRef: invalid xmlChar value %d\n", + val); } return(0); } @@ -3048,9 +2947,9 @@ htmlParseDocTypeDecl(htmlParserCtxtPtr ctxt) { */ name = htmlParseName(ctxt); if (name == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "htmlParseDocTypeDecl : no DOCTYPE name !\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, + "htmlParseDocTypeDecl : no DOCTYPE name !\n", + NULL, NULL); } /* * Check that upper(name) == "HTML" !!!!!!!!!!!!! @@ -3068,9 +2967,8 @@ htmlParseDocTypeDecl(htmlParserCtxtPtr ctxt) { * We should be at the end of the DOCTYPE declaration. */ if (CUR != '>') { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "DOCTYPE improperly terminated\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, + "DOCTYPE improperly terminated\n", NULL, NULL); /* We shouldn't try to resynchronize ... */ } NEXT; @@ -3118,9 +3016,8 @@ htmlParseAttribute(htmlParserCtxtPtr ctxt, xmlChar **value) { *value = NULL; name = htmlParseHTMLName(ctxt); if (name == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "error parsing attribute name\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, + "error parsing attribute name\n", NULL, NULL); return(NULL); } @@ -3219,10 +3116,9 @@ htmlCheckEncoding(htmlParserCtxtPtr ctxt, const xmlChar *attvalue) { ctxt->input->buf->buffer, ctxt->input->buf->raw); if (nbchars < 0) { - ctxt->errNo = XML_ERR_INVALID_ENCODING; - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlCheckEncoding: encoder error\n"); + htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, + "htmlCheckEncoding: encoder error\n", + NULL, NULL); } ctxt->input->base = ctxt->input->cur = ctxt->input->buf->buffer->content; @@ -3287,9 +3183,9 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { const xmlChar *name; const xmlChar *attname; xmlChar *attvalue; - const xmlChar **atts = NULL; + const xmlChar **atts = ctxt->atts; int nbatts = 0; - int maxatts = 0; + int maxatts = ctxt->maxatts; int meta = 0; int i; @@ -3299,10 +3195,9 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { GROW; name = htmlParseHTMLName(ctxt); if (name == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseStartTag: invalid element name\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, + "htmlParseStartTag: invalid element name\n", + NULL, NULL); /* Dump the bogus tag like browsers do */ while ((IS_CHAR((unsigned int) CUR)) && (CUR != '>')) NEXT; @@ -3326,28 +3221,25 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { * or any attempt to recurse body */ if ((ctxt->nameNr > 0) && (xmlStrEqual(name, BAD_CAST"html"))) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseStartTag: misplaced <html> tag\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, + "htmlParseStartTag: misplaced <html> tag\n", + name, NULL); return; } if ((ctxt->nameNr != 1) && (xmlStrEqual(name, BAD_CAST"head"))) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseStartTag: misplaced <head> tag\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, + "htmlParseStartTag: misplaced <head> tag\n", + name, NULL); return; } if (xmlStrEqual(name, BAD_CAST"body")) { int indx; for (indx = 0;indx < ctxt->nameNr;indx++) { if (xmlStrEqual(ctxt->nameTab[indx], BAD_CAST"body")) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseStartTag: misplaced <body> tag\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, + "htmlParseStartTag: misplaced <body> tag\n", + name, NULL); return; } } @@ -3373,11 +3265,8 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { */ for (i = 0; i < nbatts;i += 2) { if (xmlStrEqual(atts[i], attname)) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Attribute %s redefined\n", - attname); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_REDEFINED, + "Attribute %s redefined\n", attname, NULL); if (attvalue != NULL) xmlFree(attvalue); goto failed; @@ -3388,24 +3277,32 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { * Add the pair to atts */ if (atts == NULL) { - maxatts = 10; - atts = (const xmlChar **) xmlMalloc(maxatts * sizeof(xmlChar *)); + maxatts = 22; /* allow for 10 attrs by default */ + atts = (const xmlChar **) + xmlMalloc(maxatts * sizeof(xmlChar *)); if (atts == NULL) { - xmlGenericError(xmlGenericErrorContext, - "malloc of %ld byte failed\n", - maxatts * (long)sizeof(xmlChar *)); - return; + htmlErrMemory(ctxt, NULL); + if (attvalue != NULL) + xmlFree(attvalue); + goto failed; } + ctxt->atts = atts; + ctxt->maxatts = maxatts; } else if (nbatts + 4 > maxatts) { + const xmlChar **n; + maxatts *= 2; - atts = (const xmlChar **) xmlRealloc((void *) atts, - maxatts * sizeof(xmlChar *)); - if (atts == NULL) { - xmlGenericError(xmlGenericErrorContext, - "realloc of %ld byte failed\n", - maxatts * (long)sizeof(xmlChar *)); - return; + n = (const xmlChar **) xmlRealloc((void *) atts, + maxatts * sizeof(const xmlChar *)); + if (n == NULL) { + htmlErrMemory(ctxt, NULL); + if (attvalue != NULL) + xmlFree(attvalue); + goto failed; } + atts = n; + ctxt->atts = atts; + ctxt->maxatts = maxatts; } atts[nbatts++] = attname; atts[nbatts++] = attvalue; @@ -3413,6 +3310,8 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { atts[nbatts + 1] = NULL; } else { + if (attvalue != NULL) + xmlFree(attvalue); /* Dump the bogus attribute string up to the next blank or * the end of the tag. */ while ((IS_CHAR((unsigned int) CUR)) && @@ -3424,10 +3323,9 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { failed: SKIP_BLANKS; if (cons == ctxt->nbChars) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseStartTag: problem parsing attributes\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "htmlParseStartTag: problem parsing attributes\n", + NULL, NULL); break; } } @@ -3442,18 +3340,18 @@ failed: * SAX: Start of Element ! */ htmlnamePush(ctxt, name); -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"Start of element %s: pushed %s\n", name, ctxt->name); -#endif - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) - ctxt->sax->startElement(ctxt->userData, name, atts); + if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) { + if (nbatts != 0) + ctxt->sax->startElement(ctxt->userData, name, atts); + else + ctxt->sax->startElement(ctxt->userData, name, NULL); + } if (atts != NULL) { for (i = 1;i < nbatts;i += 2) { if (atts[i] != NULL) xmlFree((xmlChar *) atts[i]); } - xmlFree((void *) atts); } } @@ -3480,10 +3378,8 @@ htmlParseEndTag(htmlParserCtxtPtr ctxt) int i, ret; if ((CUR != '<') || (NXT(1) != '/')) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "htmlParseEndTag: '</' not found\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_LTSLASH_REQUIRED, + "htmlParseEndTag: '</' not found\n", NULL, NULL); return (0); } SKIP(2); @@ -3497,9 +3393,8 @@ htmlParseEndTag(htmlParserCtxtPtr ctxt) */ SKIP_BLANKS; if ((!IS_CHAR((unsigned int) CUR)) || (CUR != '>')) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "End tag : expected '>'\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, + "End tag : expected '>'\n", NULL, NULL); } else NEXT; @@ -3512,10 +3407,8 @@ htmlParseEndTag(htmlParserCtxtPtr ctxt) break; } if (i < 0) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Unexpected end tag : %s\n", name); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, + "Unexpected end tag : %s\n", name, NULL); return (0); } @@ -3532,16 +3425,10 @@ htmlParseEndTag(htmlParserCtxtPtr ctxt) * of the stack. */ if (!xmlStrEqual(name, ctxt->name)) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "End of tag %s: expecting %s\n", name, ctxt->name); -#endif if ((ctxt->name != NULL) && (!xmlStrEqual(ctxt->name, name))) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Opening and ending tag mismatch: %s and %s\n", - name, ctxt->name); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, + "Opening and ending tag mismatch: %s and %s\n", + name, ctxt->name); } } @@ -3552,17 +3439,7 @@ htmlParseEndTag(htmlParserCtxtPtr ctxt) if ((oldname != NULL) && (xmlStrEqual(oldname, name))) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, name); - oldname = htmlnamePop(ctxt); -#ifdef DEBUG - if (oldname != NULL) { - xmlGenericError(xmlGenericErrorContext, - "End of tag %s: popping out %s\n", name, - oldname); - } else { - xmlGenericError(xmlGenericErrorContext, - "End of tag %s: stack empty !!!\n", name); - } -#endif + htmlnamePop(ctxt); ret = 1; } else { ret = 0; @@ -3708,10 +3585,9 @@ htmlParseContent(htmlParserCtxtPtr ctxt) { (UPP(4) == 'C') && (UPP(5) == 'T') && (UPP(6) == 'Y') && (UPP(7) == 'P') && (UPP(8) == 'E')) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Misplaced DOCTYPE declaration\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, + "Misplaced DOCTYPE declaration\n", + BAD_CAST "DOCTYPE" , NULL); htmlParseDocTypeDecl(ctxt); } @@ -3755,10 +3631,9 @@ htmlParseContent(htmlParserCtxtPtr ctxt) { if (cons == ctxt->nbChars) { if (ctxt->node != NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "detected an error in element content\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "detected an error in element content\n", + NULL, NULL); } break; } @@ -3799,17 +3674,6 @@ htmlParseElement(htmlParserCtxtPtr ctxt) { oldname = ctxt->name; htmlParseStartTag(ctxt); name = ctxt->name; -#ifdef DEBUG - if (oldname == NULL) - xmlGenericError(xmlGenericErrorContext, - "Start of element %s\n", name); - else if (name == NULL) - xmlGenericError(xmlGenericErrorContext, - "Start of element failed, was %s\n", oldname); - else - xmlGenericError(xmlGenericErrorContext, - "Start of element %s, was %s\n", name, oldname); -#endif if (((depth == ctxt->nameNr) && (xmlStrEqual(oldname, ctxt->name))) || (name == NULL)) { if (CUR == '>') @@ -3822,10 +3686,8 @@ htmlParseElement(htmlParserCtxtPtr ctxt) { */ info = htmlTagLookup(name); if (info == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "Tag %s invalid\n", - name); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, + "Tag %s invalid\n", name, NULL); } /* @@ -3835,31 +3697,22 @@ htmlParseElement(htmlParserCtxtPtr ctxt) { SKIP(2); if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, name); - oldname = htmlnamePop(ctxt); -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"End of tag the XML way: popping out %s\n", oldname); -#endif + htmlnamePop(ctxt); return; } if (CUR == '>') { NEXT; } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Couldn't find end of Start Tag %s\n", - name); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, + "Couldn't find end of Start Tag %s\n", name, NULL); /* * end of parsing of this node. */ if (xmlStrEqual(name, ctxt->name)) { nodePop(ctxt); - oldname = htmlnamePop(ctxt); -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"End of start tag problem: popping out %s\n", oldname); -#endif + htmlnamePop(ctxt); } /* @@ -3881,10 +3734,7 @@ htmlParseElement(htmlParserCtxtPtr ctxt) { if ((info != NULL) && (info->empty)) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, name); - oldname = htmlnamePop(ctxt); -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"End of empty tag %s : popping out %s\n", name, oldname); -#endif + htmlnamePop(ctxt); return; } @@ -3950,9 +3800,8 @@ htmlParseDocument(htmlParserCtxtPtr ctxt) { */ SKIP_BLANKS; if (CUR == 0) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "Document is empty\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_DOCUMENT_EMPTY, + "Document is empty\n", NULL, NULL); } if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) @@ -4033,26 +3882,27 @@ htmlParseDocument(htmlParserCtxtPtr ctxt) { * @ctxt: an HTML parser context * * Initialize a parser context + * + * Returns 0 in case of success and -1 in case of error */ -static void +static int htmlInitParserCtxt(htmlParserCtxtPtr ctxt) { htmlSAXHandler *sax; - if (ctxt == NULL) return; + if (ctxt == NULL) return(-1); memset(ctxt, 0, sizeof(htmlParserCtxt)); ctxt->dict = xmlDictCreate(); if (ctxt->dict == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlInitParserCtxt: out of memory\n"); - return; + htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); + return(-1); } sax = (htmlSAXHandler *) xmlMalloc(sizeof(htmlSAXHandler)); if (sax == NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlInitParserCtxt: out of memory\n"); + htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); + return(-1); } else memset(sax, 0, sizeof(htmlSAXHandler)); @@ -4061,12 +3911,11 @@ htmlInitParserCtxt(htmlParserCtxtPtr ctxt) ctxt->inputTab = (htmlParserInputPtr *) xmlMalloc(5 * sizeof(htmlParserInputPtr)); if (ctxt->inputTab == NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlInitParserCtxt: out of memory\n"); + htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); ctxt->inputNr = 0; ctxt->inputMax = 0; ctxt->input = NULL; - return; + return(-1); } ctxt->inputNr = 0; ctxt->inputMax = 5; @@ -4079,15 +3928,14 @@ htmlInitParserCtxt(htmlParserCtxtPtr ctxt) /* Allocate the Node stack */ ctxt->nodeTab = (htmlNodePtr *) xmlMalloc(10 * sizeof(htmlNodePtr)); if (ctxt->nodeTab == NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlInitParserCtxt: out of memory\n"); + htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); ctxt->nodeNr = 0; ctxt->nodeMax = 0; ctxt->node = NULL; ctxt->inputNr = 0; ctxt->inputMax = 0; ctxt->input = NULL; - return; + return(-1); } ctxt->nodeNr = 0; ctxt->nodeMax = 10; @@ -4096,8 +3944,7 @@ htmlInitParserCtxt(htmlParserCtxtPtr ctxt) /* Allocate the Name stack */ ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *)); if (ctxt->nameTab == NULL) { - xmlGenericError(xmlGenericErrorContext, - "htmlInitParserCtxt: out of memory\n"); + htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); ctxt->nameNr = 0; ctxt->nameMax = 10; ctxt->name = NULL; @@ -4107,7 +3954,7 @@ htmlInitParserCtxt(htmlParserCtxtPtr ctxt) ctxt->inputNr = 0; ctxt->inputMax = 0; ctxt->input = NULL; - return; + return(-1); } ctxt->nameNr = 0; ctxt->nameMax = 10; @@ -4130,6 +3977,7 @@ htmlInitParserCtxt(htmlParserCtxtPtr ctxt) ctxt->checkIndex = 0; ctxt->catalogs = NULL; xmlInitNodeInfoSeq(&ctxt->node_seq); + return(0); } /** @@ -4161,12 +4009,14 @@ htmlNewParserCtxt(void) ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt)); if (ctxt == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlNewParserCtxt : cannot allocate context\n"); + htmlErrMemory(NULL, "NewParserCtxt: out of memory\n"); return(NULL); } memset(ctxt, 0, sizeof(xmlParserCtxt)); - htmlInitParserCtxt(ctxt); + if (htmlInitParserCtxt(ctxt) < 0) { + htmlFreeParserCtxt(ctxt); + return(NULL); + } return(ctxt); } @@ -4249,9 +4099,9 @@ htmlCreateDocParserCtxt(xmlChar *cur, const char *encoding ATTRIBUTE_UNUSED) { if (enc != XML_CHAR_ENCODING_ERROR) { xmlSwitchEncoding(ctxt, enc); if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Unsupported encoding %s\n", encoding); + htmlParseErr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, + "Unsupported encoding %s\n", + (const xmlChar *) encoding, NULL); } } else { /* @@ -4261,10 +4111,9 @@ htmlCreateDocParserCtxt(xmlChar *cur, const char *encoding ATTRIBUTE_UNUSED) { if (handler != NULL) { xmlSwitchToEncoding(ctxt, handler); } else { - ctxt->errNo = XML_ERR_UNSUPPORTED_ENCODING; - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Unsupported encoding %s\n", encoding); + htmlParseErr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, + "Unsupported encoding %s\n", + (const xmlChar *) encoding, NULL); } } } @@ -4684,19 +4533,6 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { oldname = ctxt->name; htmlParseStartTag(ctxt); name = ctxt->name; -#ifdef DEBUG - if (oldname == NULL) - xmlGenericError(xmlGenericErrorContext, - "Start of element %s\n", name); - else if (name == NULL) - xmlGenericError(xmlGenericErrorContext, - "Start of element failed, was %s\n", - oldname); - else - xmlGenericError(xmlGenericErrorContext, - "Start of element %s, was %s\n", - name, oldname); -#endif if (((depth == ctxt->nameNr) && (xmlStrEqual(oldname, ctxt->name))) || (name == NULL)) { @@ -4710,10 +4546,8 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { */ info = htmlTagLookup(name); if (info == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "Tag %s invalid\n", - name); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, + "Tag %s invalid\n", name, NULL); } /* @@ -4724,10 +4558,6 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, name); oldname = htmlnamePop(ctxt); -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"End of tag the XML way: popping out %s\n", - oldname); -#endif ctxt->instate = XML_PARSER_CONTENT; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, @@ -4739,11 +4569,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { if (CUR == '>') { NEXT; } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Couldn't find end of Start Tag %s\n", - name); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, + "Couldn't find end of Start Tag %s\n", + name, NULL); /* * end of parsing of this node. @@ -4751,10 +4579,6 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { if (xmlStrEqual(name, ctxt->name)) { nodePop(ctxt); oldname = htmlnamePop(ctxt); -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "End of start tag problem: popping out %s\n", oldname); -#endif } ctxt->instate = XML_PARSER_CONTENT; @@ -4772,9 +4596,6 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, name); oldname = htmlnamePop(ctxt); -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext,"End of empty tag %s : popping out %s\n", name, oldname); -#endif } ctxt->instate = XML_PARSER_CONTENT; #ifdef DEBUG_PUSH @@ -4854,10 +4675,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) goto done; - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "Misplaced DOCTYPE declaration\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, + "Misplaced DOCTYPE declaration\n", + BAD_CAST "DOCTYPE" , NULL); htmlParseDocTypeDecl(ctxt); } else if ((cur == '<') && (next == '!') && (in->cur[2] == '-') && (in->cur[3] == '-')) { @@ -4919,10 +4739,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { } if (cons == ctxt->nbChars) { if (ctxt->node != NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "detected an error in element content\n"); - ctxt->wellFormed = 0; + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "detected an error in element content\n", + NULL, NULL); } NEXT; break; @@ -4949,8 +4768,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_CDATA_SECTION: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == CDATA\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == CDATA\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -4959,8 +4779,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_DTD: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == DTD\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == DTD\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -4969,8 +4790,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_COMMENT: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == COMMENT\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == COMMENT\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -4979,8 +4801,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_PI: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == PI\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == PI\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -4989,8 +4812,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_ENTITY_DECL: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == ENTITY_DECL\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == ENTITY_DECL\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -4999,8 +4823,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_ENTITY_VALUE: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == ENTITY_VALUE\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == ENTITY_VALUE\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -5009,8 +4834,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_ATTRIBUTE_VALUE: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == ATTRIBUTE_VALUE\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == ATTRIBUTE_VALUE\n", + NULL, NULL); ctxt->instate = XML_PARSER_START_TAG; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -5019,8 +4845,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_SYSTEM_LITERAL: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == XML_PARSER_SYSTEM_LITERAL\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == XML_PARSER_SYSTEM_LITERAL\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -5029,8 +4856,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_IGNORE: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == XML_PARSER_IGNORE\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == XML_PARSER_IGNORE\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -5039,8 +4867,9 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { #endif break; case XML_PARSER_PUBLIC_LITERAL: - xmlGenericError(xmlGenericErrorContext, - "HPP: internal error, state == XML_PARSER_LITERAL\n"); + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == XML_PARSER_LITERAL\n", + NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH @@ -5082,7 +4911,7 @@ done: /** * htmlParseChunk: - * @ctxt: an XML parser context + * @ctxt: an HTML parser context * @chunk: an char array * @size: the size in byte of the chunk * @terminate: last chunk indicator @@ -5119,8 +4948,8 @@ htmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size, nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); if (nbchars < 0) { - xmlGenericError(xmlGenericErrorContext, - "htmlParseChunk: encoder error\n"); + htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, + "encoder error\n", NULL, NULL); return(XML_ERR_INVALID_ENCODING); } } @@ -5178,13 +5007,11 @@ htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, void *user_data, buf = xmlAllocParserInputBuffer(enc); if (buf == NULL) return(NULL); - ctxt = (htmlParserCtxtPtr) xmlMalloc(sizeof(htmlParserCtxt)); + ctxt = htmlNewParserCtxt(); if (ctxt == NULL) { - xmlFree(buf); + xmlFreeParserInputBuffer(buf); return(NULL); } - memset(ctxt, 0, sizeof(htmlParserCtxt)); - htmlInitParserCtxt(ctxt); if(enc==XML_CHAR_ENCODING_UTF8 || buf->encoder) ctxt->charset=XML_CHAR_ENCODING_UTF8; if (sax != NULL) { @@ -5325,13 +5152,10 @@ htmlCreateFileParserCtxt(const char *filename, const char *encoding) /* htmlCharEncoding enc; */ xmlChar *content, *content_line = (xmlChar *) "charset="; - ctxt = (htmlParserCtxtPtr) xmlMalloc(sizeof(htmlParserCtxt)); + ctxt = htmlNewParserCtxt(); if (ctxt == NULL) { - xmlGenericError(xmlGenericErrorContext, "malloc failed\n"); return(NULL); } - memset(ctxt, 0, sizeof(htmlParserCtxt)); - htmlInitParserCtxt(ctxt); canonicFilename = (char *) xmlCanonicPath((const xmlChar *) filename); if (canonicFilename == NULL) { if (xmlDefaultSAXHandler.error != NULL) { @@ -5573,7 +5397,7 @@ htmlNodeStatus(const htmlNodePtr node, int legacy) { /** * htmlCtxtReset: - * @ctxt: an XML parser context + * @ctxt: an HTML parser context * * Reset a parser context */ |