- Send out the source line where the error occurred from inside PushXMLErrorToken().

- Add the 'parsererror' and 'sourcetext' tags to the HTML tag enum.


git-svn-id: svn://10.0.0.236/trunk@23668 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
nisheeth%netscape.com
1999-03-11 05:36:50 +00:00
parent 462294a411
commit 6d7dd79951
10 changed files with 164 additions and 68 deletions

View File

@@ -30,6 +30,7 @@
// #include "nsParser.h"
#include "nsIParser.h"
#include "prlog.h"
#include <string.h>
/************************************************************************
@@ -154,22 +155,69 @@ nsExpatTokenizer::~nsExpatTokenizer(){
Here begins the real working methods for the tokenizer.
*******************************************************************/
/* Called immediately after an error has occurred in expat. Creates
an error token and pushes it onto the token queue.
*/
void nsExpatTokenizer::PushXMLErrorToken(void)
static void SetErrorContextInfo(nsParserError* aError, PRUint32 aByteIndex,
const char* aSourceBuffer, PRUint32 aLength)
{
/* Figure out the substring inside aSourceBuffer that contains the line on which the error
occurred. Copy the line into error->sourceLine */
PR_ASSERT(aByteIndex > 0 && aByteIndex < aLength);
char* start = (char* ) &aSourceBuffer[aByteIndex]; /* Will try to find the start of the line */
char* end = (char* ) &aSourceBuffer[aByteIndex]; /* Will try to find the end of the line */
PRUint32 startIndex = aByteIndex; /* Track the position of the 'start' pointer into the buffer */
PRUint32 endIndex = aByteIndex; /* Track the position of the 'end' pointer into the buffer */
PRBool reachedStart;
PRBool reachedEnd;
/* Use start to find the first new line before the error position and
end to find the first new line after the error position */
reachedStart = ('\n' == *start || '\r' == *start || startIndex <= 0);
reachedEnd = ('\n' == *end || '\r' == *end || endIndex >= aLength);
while (!reachedStart || !reachedEnd) {
if (!reachedStart) {
start--;
startIndex--;
}
if (!reachedEnd) {
end++;
endIndex++;
}
reachedStart = ('\n' == *start || '\r' == *start || startIndex <= 0);
reachedEnd = ('\n' == *end || '\r' == *end || endIndex >= aLength);
}
if (startIndex == endIndex) {
/* Special case if the error is on a line where the only character is a newline */
aError->sourceLine.Append("");
}
else {
PR_ASSERT(endIndex - startIndex >= 2);
/* At this point, the substring starting at (startIndex + 1) and ending at (endIndex - 1),
is the line on which the error occurred. Copy that substring into the error structure. */
char* tempLine = new char[endIndex - startIndex];
strncpy(tempLine, &aSourceBuffer[startIndex + 1], (endIndex - 1) - startIndex);
tempLine[endIndex - startIndex - 1] = '\0';
aError->sourceLine.Append(tempLine);
delete [] tempLine;
}
}
/*
* Called immediately after an error has occurred in expat. Creates
* an error token and pushes it onto the token queue.
*
*/
void nsExpatTokenizer::PushXMLErrorToken(const char *aBuffer, PRUint32 aLength)
{
CErrorToken* token= (CErrorToken *) gTokenRecycler->CreateTokenOfType(eToken_error, eHTMLTag_unknown);
nsParserError *error = new nsParserError;
error->code = XML_GetErrorCode(mExpatParser);
error->lineNumber = XML_GetCurrentLineNumber(mExpatParser);
error->colNumber = XML_GetCurrentColumnNumber(mExpatParser);
// XXX Does the copy constructor of nsString free the passed in char *?
error->description = XML_ErrorString(error->code);
// XXX Not setting a source buffer and error offset for now
error->offset = 0;
error->sourceBuffer = "";
error->colNumber = XML_GetCurrentColumnNumber(mExpatParser);
error->description = XML_ErrorString(error->code);
SetErrorContextInfo(error, (PRUint32) XML_GetCurrentByteIndex(mExpatParser), aBuffer, aLength);
token->SetError(error);
@@ -182,7 +230,7 @@ nsresult nsExpatTokenizer::ParseXMLBuffer(const char *aBuffer, PRUint32 aLength)
if (mExpatParser) {
PR_ASSERT(aLength == strlen(aBuffer));
if (!XML_Parse(mExpatParser, aBuffer, aLength, PR_FALSE)) {
PushXMLErrorToken();
PushXMLErrorToken(aBuffer, aLength);
}
}
else {

View File

@@ -70,7 +70,7 @@ protected:
*/
void SetupExpatCallbacks(void);
void PushXMLErrorToken(void);
void PushXMLErrorToken(const char *aBuffer, PRUint32 aLength);
/* The callback handlers that get called from the expat parser */
static void HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts);

View File

@@ -31,10 +31,10 @@ static char* tagTable[] = {
"kbd", "keygen", "label", "layer", "legend", "li", "link", "listing",
"map", "menu", "meta", "multicol", "nobr", "noembed", "noframes",
"nolayer", "noscript", "object", "ol", "optgroup", "option", "p", "param",
"plaintext", "pre", "q", "s", "samp", "script", "select", "server",
"small", "sound", "spacer", "span", "strike", "strong", "style", "sub",
"sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "title",
"tr", "tt", "u", "ul", "var", "wbr", "xmp"
"parsererror", "plaintext", "pre", "q", "s", "samp", "script", "select",
"server", "small", "sound", "sourcetext", "spacer", "span", "strike",
"strong", "style", "sub", "sup", "table", "tbody", "td", "textarea",
"tfoot", "th", "thead", "title", "tr", "tt", "u", "ul", "var", "wbr", "xmp"
};
nsHTMLTag NS_TagToEnum(const char* aTagName) {

View File

@@ -46,24 +46,25 @@ enum nsHTMLTag {
eHTMLTag_nobr=66, eHTMLTag_noembed=67, eHTMLTag_noframes=68,
eHTMLTag_nolayer=69, eHTMLTag_noscript=70, eHTMLTag_object=71,
eHTMLTag_ol=72, eHTMLTag_optgroup=73, eHTMLTag_option=74, eHTMLTag_p=75,
eHTMLTag_param=76, eHTMLTag_plaintext=77, eHTMLTag_pre=78, eHTMLTag_q=79,
eHTMLTag_s=80, eHTMLTag_samp=81, eHTMLTag_script=82, eHTMLTag_select=83,
eHTMLTag_server=84, eHTMLTag_small=85, eHTMLTag_sound=86,
eHTMLTag_spacer=87, eHTMLTag_span=88, eHTMLTag_strike=89,
eHTMLTag_strong=90, eHTMLTag_style=91, eHTMLTag_sub=92, eHTMLTag_sup=93,
eHTMLTag_table=94, eHTMLTag_tbody=95, eHTMLTag_td=96, eHTMLTag_textarea=97,
eHTMLTag_tfoot=98, eHTMLTag_th=99, eHTMLTag_thead=100, eHTMLTag_title=101,
eHTMLTag_tr=102, eHTMLTag_tt=103, eHTMLTag_u=104, eHTMLTag_ul=105,
eHTMLTag_var=106, eHTMLTag_wbr=107, eHTMLTag_xmp=108,
eHTMLTag_param=76, eHTMLTag_parsererror=77, eHTMLTag_plaintext=78,
eHTMLTag_pre=79, eHTMLTag_q=80, eHTMLTag_s=81, eHTMLTag_samp=82,
eHTMLTag_script=83, eHTMLTag_select=84, eHTMLTag_server=85,
eHTMLTag_small=86, eHTMLTag_sound=87, eHTMLTag_sourcetext=88,
eHTMLTag_spacer=89, eHTMLTag_span=90, eHTMLTag_strike=91,
eHTMLTag_strong=92, eHTMLTag_style=93, eHTMLTag_sub=94, eHTMLTag_sup=95,
eHTMLTag_table=96, eHTMLTag_tbody=97, eHTMLTag_td=98, eHTMLTag_textarea=99,
eHTMLTag_tfoot=100, eHTMLTag_th=101, eHTMLTag_thead=102,
eHTMLTag_title=103, eHTMLTag_tr=104, eHTMLTag_tt=105, eHTMLTag_u=106,
eHTMLTag_ul=107, eHTMLTag_var=108, eHTMLTag_wbr=109, eHTMLTag_xmp=110,
/* The remaining enums are not for tags */
eHTMLTag_text=109, eHTMLTag_whitespace=110, eHTMLTag_newline=111,
eHTMLTag_comment=112, eHTMLTag_entity=113, eHTMLTag_userdefined=114,
eHTMLTag_secret_h1style=115, eHTMLTag_secret_h2style=116,
eHTMLTag_secret_h3style=117, eHTMLTag_secret_h4style=118,
eHTMLTag_secret_h5style=119, eHTMLTag_secret_h6style=120
eHTMLTag_text=111, eHTMLTag_whitespace=112, eHTMLTag_newline=113,
eHTMLTag_comment=114, eHTMLTag_entity=115, eHTMLTag_userdefined=116,
eHTMLTag_secret_h1style=117, eHTMLTag_secret_h2style=118,
eHTMLTag_secret_h3style=119, eHTMLTag_secret_h4style=120,
eHTMLTag_secret_h5style=121, eHTMLTag_secret_h6style=122
};
#define NS_HTML_TAG_MAX 108
#define NS_HTML_TAG_MAX 110
extern NS_HTMLPARS nsHTMLTag NS_TagToEnum(const char* aTag);
extern NS_HTMLPARS const char* NS_EnumToTag(nsHTMLTag aEnum);

View File

@@ -35,9 +35,8 @@ typedef struct _nsParserError {
PRInt32 code;
PRInt32 lineNumber;
PRInt32 colNumber;
nsString description;
PRInt32 offset;
nsString sourceBuffer;
nsString description;
nsString sourceLine;
} nsParserError;
#endif