/* FIXME
need current base rather than dtd.base
-check parse state at end of external param entity
+check parse state at end of outer param entity
+implied default att must prevent later non-implied att
+default handler
+eventPtr incorrectly set within internal entities
*/
#include "xmldef.h"
#include "xmlparse.h"
#endif
-
-#ifdef XML_DTD
-#define XML_ERROR_NOT_IMPLEMENTED (XML_ERROR_NOT_STANDALONE + 1)
-#endif
-
#ifdef XML_UNICODE_WCHAR_T
#define XML_T(x) L ## x
#else
getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
static enum XML_Error
-storeEntityValue(XML_Parser parser, const char *start, const char *end);
+storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
static int
reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
static int
XML_T("encoding specified in XML declaration is incorrect"),
XML_T("unclosed CDATA section"),
XML_T("error in processing external entity reference"),
- XML_T("document is not standalone"),
-#ifdef XML_DTD
- XML_T("sorry, DTD not yet fully implemented"),
-#endif
+ XML_T("document is not standalone")
};
if (code > 0 && code < sizeof(message)/sizeof(message[0]))
return message[code];
return prologProcessor(parser, s, end, nextPtr);
}
+static enum XML_Error
+doProlog(XML_Parser parser,
+ const ENCODING *enc,
+ const char *s,
+ const char *end,
+ int tok,
+ const char *next,
+ const char **nextPtr);
+
static enum XML_Error
prologProcessor(XML_Parser parser,
const char *s,
const char *end,
const char **nextPtr)
{
+ const char *next;
+ int tok = XmlPrologTok(encoding, s, end, &next);
+ return doProlog(parser, encoding, s, end, tok, next, nextPtr);
+}
+
+#ifdef XML_DTD
+
+static enum XML_Error
+processInternalParamEntity(XML_Parser parser,
+ ENTITY *entity)
+{
+ const char *s, *end, *next;
+ const ENCODING *enc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding();
+ int tok;
+ enum XML_Error result;
+ OPEN_INTERNAL_ENTITY openEntity;
+ entity->open = 1;
+ openEntity.next = openInternalEntities;
+ openInternalEntities = &openEntity;
+ openEntity.entity = entity;
+ openEntity.internalEventPtr = 0;
+ openEntity.internalEventEndPtr = 0;
+ s = (char *)entity->textPtr;
+ end = (char *)(entity->textPtr + entity->textLen);
+ tok = XmlPrologTok(enc, s, end, &next);
+ result = doProlog(parser, enc, s, end, tok, next, 0);
+ entity->open = 0;
+ openInternalEntities = openEntity.next;
+ return result;
+}
+
+#endif /* XML_DTD */
+
+static enum XML_Error
+doProlog(XML_Parser parser,
+ const ENCODING *enc,
+ const char *s,
+ const char *end,
+ int tok,
+ const char *next,
+ const char **nextPtr)
+{
+ const char **eventPP;
+ const char **eventEndPP;
+ if (enc == encoding) {
+ eventPP = &eventPtr;
+ eventEndPP = &eventEndPtr;
+ }
+ else {
+ eventPP = &(openInternalEntities->internalEventPtr);
+ eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ }
+ /* FIXME use eventPP not eventPtr */
for (;;) {
- const char *next;
- int tok = XmlPrologTok(encoding, s, end, &next);
if (tok <= 0) {
if (nextPtr != 0 && tok != XML_TOK_INVALID) {
*nextPtr = s;
return XML_ERROR_UNCLOSED_TOKEN;
case XML_TOK_PARTIAL_CHAR:
return XML_ERROR_PARTIAL_CHAR;
- case XML_TOK_TRAILING_CR:
- eventPtr = s + encoding->minBytesPerChar;
- /* fall through */
case XML_TOK_NONE:
#ifdef XML_DTD
+ if (enc != encoding)
+ return XML_ERROR_NONE;
if (parentParser) {
hadExternalDoctype = 0;
return XML_ERROR_NONE;
#endif /* XML_DTD */
return XML_ERROR_NO_ELEMENTS;
default:
- abort();
+ tok = -tok;
+ next = end;
+ break;
}
}
- switch (XmlTokenRole(&prologState, tok, s, next, encoding)) {
+ switch (XmlTokenRole(&prologState, tok, s, next, enc)) {
case XML_ROLE_XML_DECL:
{
enum XML_Error result = processXmlDecl(parser, 0, s, next);
return XML_ERROR_NOT_STANDALONE;
#endif /* not XML_DTD */
#ifdef XML_DTD
- dtd.systemId = poolStoreString(&dtd.pool, encoding,
- s + encoding->minBytesPerChar,
- next - encoding->minBytesPerChar);
+ dtd.systemId = poolStoreString(&dtd.pool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
if (!dtd.systemId)
return XML_ERROR_NO_MEMORY;
poolFinish(&dtd.pool);
hadExternalDoctype = 1;
break;
case XML_ROLE_DOCTYPE_PUBLIC_ID:
+ /* FIXME */
case XML_ROLE_ENTITY_PUBLIC_ID:
- if (!XmlIsPublicId(encoding, s, next, &eventPtr))
+ if (!XmlIsPublicId(enc, s, next, &eventPtr))
return XML_ERROR_SYNTAX;
if (declEntity) {
XML_Char *tem = poolStoreString(&dtd.pool,
- encoding,
- s + encoding->minBytesPerChar,
- next - encoding->minBytesPerChar);
+ enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
if (!tem)
return XML_ERROR_NO_MEMORY;
normalizePublicId(tem);
return contentProcessor(parser, s, end, nextPtr);
case XML_ROLE_ATTLIST_ELEMENT_NAME:
{
- const XML_Char *name = poolStoreString(&dtd.pool, encoding, s, next);
+ const XML_Char *name = poolStoreString(&dtd.pool, enc, s, next);
if (!name)
return XML_ERROR_NO_MEMORY;
declElementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE));
break;
}
case XML_ROLE_ATTRIBUTE_NAME:
- declAttributeId = getAttributeId(parser, encoding, s, next);
+ declAttributeId = getAttributeId(parser, enc, s, next);
if (!declAttributeId)
return XML_ERROR_NO_MEMORY;
declAttributeIsCdata = 0;
{
const XML_Char *attVal;
enum XML_Error result
- = storeAttributeValue(parser, encoding, declAttributeIsCdata,
- s + encoding->minBytesPerChar,
- next - encoding->minBytesPerChar,
+ = storeAttributeValue(parser, enc, declAttributeIsCdata,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar,
&dtd.pool);
if (result)
return result;
}
case XML_ROLE_ENTITY_VALUE:
{
- enum XML_Error result = storeEntityValue(parser, s, next);
+ enum XML_Error result = storeEntityValue(parser, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (declEntity) {
+ declEntity->textPtr = poolStart(&dtd.pool);
+ declEntity->textLen = poolLength(&dtd.pool);
+ poolFinish(&dtd.pool);
+ }
+ else
+ poolDiscard(&dtd.pool);
if (result != XML_ERROR_NONE)
return result;
}
break;
case XML_ROLE_ENTITY_SYSTEM_ID:
if (declEntity) {
- declEntity->systemId = poolStoreString(&dtd.pool, encoding,
- s + encoding->minBytesPerChar,
- next - encoding->minBytesPerChar);
+ declEntity->systemId = poolStoreString(&dtd.pool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
if (!declEntity->systemId)
return XML_ERROR_NO_MEMORY;
declEntity->base = dtd.base;
break;
case XML_ROLE_ENTITY_NOTATION_NAME:
if (declEntity) {
- declEntity->notation = poolStoreString(&dtd.pool, encoding, s, next);
+ declEntity->notation = poolStoreString(&dtd.pool, enc, s, next);
if (!declEntity->notation)
return XML_ERROR_NO_MEMORY;
poolFinish(&dtd.pool);
case XML_ROLE_GENERAL_ENTITY_NAME:
{
const XML_Char *name;
- if (XmlPredefinedEntityName(encoding, s, next)) {
+ if (XmlPredefinedEntityName(enc, s, next)) {
declEntity = 0;
break;
}
- name = poolStoreString(&dtd.pool, encoding, s, next);
+ name = poolStoreString(&dtd.pool, enc, s, next);
if (!name)
return XML_ERROR_NO_MEMORY;
if (dtd.complete) {
break;
case XML_ROLE_PARAM_ENTITY_NAME:
#ifdef XML_DTD
- {
- const XML_Char *name = poolStoreString(&dtd.pool, encoding, s, next);
+ if (dtd.complete) {
+ const XML_Char *name = poolStoreString(&dtd.pool, enc, s, next);
if (!name)
return XML_ERROR_NO_MEMORY;
- if (dtd.complete) {
- declEntity = (ENTITY *)lookup(&dtd.paramEntities, name, sizeof(ENTITY));
- if (!declEntity)
- return XML_ERROR_NO_MEMORY;
- if (declEntity->name != name) {
- poolDiscard(&dtd.pool);
- declEntity = 0;
- }
- else
- poolFinish(&dtd.pool);
- }
- else {
+ declEntity = (ENTITY *)lookup(&dtd.paramEntities, name, sizeof(ENTITY));
+ if (!declEntity)
+ return XML_ERROR_NO_MEMORY;
+ if (declEntity->name != name) {
poolDiscard(&dtd.pool);
declEntity = 0;
}
+ else
+ poolFinish(&dtd.pool);
}
#else /* not XML_DTD */
declEntity = 0;
declNotationPublicId = 0;
declNotationName = 0;
if (notationDeclHandler) {
- declNotationName = poolStoreString(&tempPool, encoding, s, next);
+ declNotationName = poolStoreString(&tempPool, enc, s, next);
if (!declNotationName)
return XML_ERROR_NO_MEMORY;
poolFinish(&tempPool);
}
break;
case XML_ROLE_NOTATION_PUBLIC_ID:
- if (!XmlIsPublicId(encoding, s, next, &eventPtr))
+ if (!XmlIsPublicId(enc, s, next, &eventPtr))
return XML_ERROR_SYNTAX;
if (declNotationName) {
XML_Char *tem = poolStoreString(&tempPool,
- encoding,
- s + encoding->minBytesPerChar,
- next - encoding->minBytesPerChar);
+ enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
if (!tem)
return XML_ERROR_NO_MEMORY;
normalizePublicId(tem);
case XML_ROLE_NOTATION_SYSTEM_ID:
if (declNotationName && notationDeclHandler) {
const XML_Char *systemId
- = poolStoreString(&tempPool, encoding,
- s + encoding->minBytesPerChar,
- next - encoding->minBytesPerChar);
+ = poolStoreString(&tempPool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
if (!systemId)
return XML_ERROR_NO_MEMORY;
eventPtr = eventEndPtr = s;
return XML_ERROR_SYNTAX;
}
#ifdef XML_DTD
- case XML_ROLE_INNER_PARAM_ENTITY_REF:
- return XML_ERROR_NOT_IMPLEMENTED;
case XML_ROLE_IGNORE_SECT:
{
enum XML_Error result;
if (defaultHandler)
- reportDefault(parser, encoding, s, next);
- result = doIgnoreSection(parser, encoding, &next, end, nextPtr);
+ reportDefault(parser, enc, s, next);
+ result = doIgnoreSection(parser, enc, &next, end, nextPtr);
if (!next) {
processor = ignoreSectionProcessor;
return result;
}
groupConnector[prologState.level] = '|';
break;
+#ifdef XML_DTD /* FIXME merge code with following case */
+ case XML_ROLE_INNER_PARAM_ENTITY_REF:
+ {
+ /* FIXME what if !dtd.complete */
+ const XML_Char *name;
+ ENTITY *entity;
+ name = poolStoreString(&dtd.pool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ entity = (ENTITY *)lookup(&dtd.paramEntities, name, 0);
+ poolDiscard(&dtd.pool);
+ if (!entity)
+ return XML_ERROR_UNDEFINED_ENTITY;
+ if (entity->open)
+ return XML_ERROR_RECURSIVE_ENTITY_REF;
+ if (entity->textPtr) {
+ enum XML_Error result;
+#if 0 /* do we need this? */
+ if (defaultHandler && !defaultExpandInternalEntities) {
+ reportDefault(parser, enc, s, next);
+ break;
+ }
+#endif
+ result = processInternalParamEntity(parser, entity);
+ if (result != XML_ERROR_NONE)
+ return result;
+ }
+ else
+ return XML_ERROR_PARAM_ENTITY_REF;
+ }
+ break;
+#endif
case XML_ROLE_PARAM_ENTITY_REF:
if (!dtd.complete)
break;
{
const XML_Char *name;
ENTITY *entity;
- name = poolStoreString(&dtd.pool, encoding,
- s + encoding->minBytesPerChar,
- next - encoding->minBytesPerChar);
+ name = poolStoreString(&dtd.pool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
if (!name)
return XML_ERROR_NO_MEMORY;
entity = (ENTITY *)lookup(&dtd.paramEntities, name, 0);
return XML_ERROR_UNDEFINED_ENTITY;
if (entity->open)
return XML_ERROR_RECURSIVE_ENTITY_REF;
- if (entity->systemId && externalEntityRefHandler) {
+ if (entity->textPtr) {
+ enum XML_Error result;
+#if 0 /* do we need this */
+ if (defaultHandler && !defaultExpandInternalEntities) {
+ reportDefault(parser, enc, s, next);
+ break;
+ }
+#endif
+ dtd.complete = 1;
+ result = processInternalParamEntity(parser, entity);
+ if (result != XML_ERROR_NONE)
+ return result;
+ }
+ else if (externalEntityRefHandler) {
entity->open = 1;
if (!externalEntityRefHandler(externalEntityRefHandlerArg,
0,
case XML_TOK_PI:
eventPtr = s;
eventEndPtr = next;
- if (!reportProcessingInstruction(parser, encoding, s, next))
+ if (!reportProcessingInstruction(parser, enc, s, next))
return XML_ERROR_NO_MEMORY;
break;
case XML_TOK_COMMENT:
eventPtr = s;
eventEndPtr = next;
- if (!reportComment(parser, encoding, s, next))
+ if (!reportComment(parser, enc, s, next))
return XML_ERROR_NO_MEMORY;
break;
}
default:
eventPtr = s;
eventEndPtr = next;
- reportDefault(parser, encoding, s, next);
+ reportDefault(parser, enc, s, next);
}
}
s = next;
+ tok = XmlPrologTok(enc, s, end, &next);
}
/* not reached */
}
static
enum XML_Error storeEntityValue(XML_Parser parser,
+ const ENCODING *enc,
const char *entityTextPtr,
const char *entityTextEnd)
{
+ /* FIXME eventPtr */
STRING_POOL *pool = &(dtd.pool);
- entityTextPtr += encoding->minBytesPerChar;
- entityTextEnd -= encoding->minBytesPerChar;
for (;;) {
const char *next;
- int tok = XmlEntityValueTok(encoding, entityTextPtr, entityTextEnd, &next);
+ int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next);
switch (tok) {
case XML_TOK_PARAM_ENTITY_REF:
- eventPtr = entityTextPtr;
#ifdef XML_DTD
- if (parentParser) {
- if (declEntity) {
- declEntity->textPtr = poolStart(&dtd.pool);
- declEntity->textLen = 0;
+ if (parentParser || enc != encoding) {
+ enum XML_Error result;
+ const XML_Char *name;
+ ENTITY *entity;
+ name = poolStoreString(&tempPool, enc,
+ entityTextPtr + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ entity = (ENTITY *)lookup(&dtd.paramEntities, name, 0);
+ poolDiscard(&tempPool);
+ if (!entity) {
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ return XML_ERROR_UNDEFINED_ENTITY;
+ }
+ if (entity->open) {
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ return XML_ERROR_RECURSIVE_ENTITY_REF;
+ }
+ if (entity->systemId) {
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ return XML_ERROR_PARAM_ENTITY_REF;
}
- return XML_ERROR_NOT_IMPLEMENTED;
+ entity->open = 1;
+ result = storeEntityValue(parser,
+ ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(),
+ (char *)entity->textPtr,
+ (char *)(entity->textPtr + entity->textLen));
+ entity->open = 0;
+ if (result)
+ return result;
+ break;
}
#endif /* XML_DTD */
+ eventPtr = entityTextPtr;
return XML_ERROR_SYNTAX;
case XML_TOK_NONE:
- if (declEntity) {
- declEntity->textPtr = pool->start;
- declEntity->textLen = pool->ptr - pool->start;
- poolFinish(pool);
- }
- else
- poolDiscard(pool);
return XML_ERROR_NONE;
case XML_TOK_ENTITY_REF:
case XML_TOK_DATA_CHARS:
- if (!poolAppend(pool, encoding, entityTextPtr, next))
+ if (!poolAppend(pool, enc, entityTextPtr, next))
return XML_ERROR_NO_MEMORY;
break;
case XML_TOK_TRAILING_CR:
- next = entityTextPtr + encoding->minBytesPerChar;
+ next = entityTextPtr + enc->minBytesPerChar;
/* fall through */
case XML_TOK_DATA_NEWLINE:
if (pool->end == pool->ptr && !poolGrow(pool))
{
XML_Char buf[XML_ENCODE_MAX];
int i;
- int n = XmlCharRefNumber(encoding, entityTextPtr);
+ int n = XmlCharRefNumber(enc, entityTextPtr);
if (n < 0) {
eventPtr = entityTextPtr;
return XML_ERROR_BAD_CHAR_REF;
newE->notation = tem;
}
}
+ return 1;
}
static
case XML_TOK_DECL_OPEN:
if (!XmlNameMatchesAscii(enc,
ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
"DOCTYPE"))
break;
state->handler = doctype0;
case XML_TOK_DECL_OPEN:
if (!XmlNameMatchesAscii(enc,
ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
"DOCTYPE"))
break;
state->handler = doctype0;
state->handler = prolog2;
return XML_ROLE_DOCTYPE_CLOSE;
case XML_TOK_NAME:
- if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "SYSTEM")) {
state->handler = doctype3;
return XML_ROLE_NONE;
}
- if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "PUBLIC")) {
state->handler = doctype2;
return XML_ROLE_NONE;
}
case XML_TOK_DECL_OPEN:
if (XmlNameMatchesAscii(enc,
ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
"ENTITY")) {
state->handler = entity0;
return XML_ROLE_NONE;
}
if (XmlNameMatchesAscii(enc,
ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
"ATTLIST")) {
state->handler = attlist0;
return XML_ROLE_NONE;
}
if (XmlNameMatchesAscii(enc,
ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
"ELEMENT")) {
state->handler = element0;
return XML_ROLE_NONE;
}
if (XmlNameMatchesAscii(enc,
ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
"NOTATION")) {
state->handler = notation0;
return XML_ROLE_NONE;
case XML_TOK_PROLOG_S:
return XML_ROLE_NONE;
case XML_TOK_NAME:
- if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "SYSTEM")) {
state->handler = entity4;
return XML_ROLE_NONE;
}
- if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "PUBLIC")) {
state->handler = entity3;
return XML_ROLE_NONE;
}
setTopLevel(state);
return XML_ROLE_NONE;
case XML_TOK_NAME:
- if (XmlNameMatchesAscii(enc, ptr, "NDATA")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "NDATA")) {
state->handler = entity6;
return XML_ROLE_NONE;
}
case XML_TOK_PROLOG_S:
return XML_ROLE_NONE;
case XML_TOK_NAME:
- if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "SYSTEM")) {
state->handler = entity9;
return XML_ROLE_NONE;
}
- if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "PUBLIC")) {
state->handler = entity8;
return XML_ROLE_NONE;
}
case XML_TOK_PROLOG_S:
return XML_ROLE_NONE;
case XML_TOK_NAME:
- if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "SYSTEM")) {
state->handler = notation3;
return XML_ROLE_NONE;
}
- if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "PUBLIC")) {
state->handler = notation2;
return XML_ROLE_NONE;
}
};
int i;
for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
- if (XmlNameMatchesAscii(enc, ptr, types[i])) {
+ if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
state->handler = attlist8;
return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
}
}
- if (XmlNameMatchesAscii(enc, ptr, "NOTATION")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "NOTATION")) {
state->handler = attlist5;
return XML_ROLE_NONE;
}
case XML_TOK_POUND_NAME:
if (XmlNameMatchesAscii(enc,
ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
"IMPLIED")) {
state->handler = attlist1;
return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
}
if (XmlNameMatchesAscii(enc,
ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
"REQUIRED")) {
state->handler = attlist1;
return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
}
if (XmlNameMatchesAscii(enc,
ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
"FIXED")) {
state->handler = attlist9;
return XML_ROLE_NONE;
case XML_TOK_PROLOG_S:
return XML_ROLE_NONE;
case XML_TOK_NAME:
- if (XmlNameMatchesAscii(enc, ptr, "EMPTY")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "EMPTY")) {
state->handler = declClose;
return XML_ROLE_CONTENT_EMPTY;
}
- if (XmlNameMatchesAscii(enc, ptr, "ANY")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "ANY")) {
state->handler = declClose;
return XML_ROLE_CONTENT_ANY;
}
case XML_TOK_POUND_NAME:
if (XmlNameMatchesAscii(enc,
ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
"PCDATA")) {
state->handler = element3;
return XML_ROLE_CONTENT_PCDATA;
case XML_TOK_PROLOG_S:
return XML_ROLE_NONE;
case XML_TOK_NAME:
- if (XmlNameMatchesAscii(enc, ptr, "INCLUDE")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "INCLUDE")) {
state->handler = condSect1;
return XML_ROLE_NONE;
}
- if (XmlNameMatchesAscii(enc, ptr, "IGNORE")) {
+ if (XmlNameMatchesAscii(enc, ptr, end, "IGNORE")) {
state->handler = condSect2;
return XML_ROLE_NONE;
}