mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-13 09:01:53 +03:00
Fixed a few other problems raised by Charlie Bozeman. fixed the output
* DOCBparser.c parser.c valid.c include/libxml/parserInternals.h include/libxml/xmlerror.h include/libxml/xpathInternals.h: Fixed a few other problems raised by Charlie Bozeman. * result/VC/ElementValid[5-7]: fixed the output Daniel
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
Mon Dec 31 17:35:40 CET 2001 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* DOCBparser.c parser.c valid.c include/libxml/parserInternals.h
|
||||||
|
include/libxml/xmlerror.h include/libxml/xpathInternals.h:
|
||||||
|
Fixed a few other problems raised by Charlie Bozeman.
|
||||||
|
* result/VC/ElementValid[5-7]: fixed the output
|
||||||
|
|
||||||
Mon Dec 31 17:13:34 CET 2001 Daniel Veillard <daniel@veillard.com>
|
Mon Dec 31 17:13:34 CET 2001 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* *.c include/libxml/*.h doc/html/*: applied 42 documentation
|
* *.c include/libxml/*.h doc/html/*: applied 42 documentation
|
||||||
|
74
DOCBparser.c
74
DOCBparser.c
@ -1057,72 +1057,6 @@ docbAutoCloseTag(docbDocPtr doc, const xmlChar *name, docbNodePtr elem) {
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
* docbIsAutoClosed:
|
|
||||||
* @doc: the SGML document
|
|
||||||
* @elem: the SGML element
|
|
||||||
*
|
|
||||||
* The list is kept in docbStartClose array. This function checks
|
|
||||||
* if a tag is autoclosed by one of it's child
|
|
||||||
*
|
|
||||||
* Returns 1 if autoclosed, 0 otherwise
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
docbIsAutoClosed(docbDocPtr doc, docbNodePtr elem) {
|
|
||||||
docbNodePtr child;
|
|
||||||
|
|
||||||
if (elem == NULL) return(1);
|
|
||||||
child = elem->children;
|
|
||||||
while (child != NULL) {
|
|
||||||
if (docbAutoCloseTag(doc, elem->name, child)) return(1);
|
|
||||||
child = child->next;
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* docbCheckParagraph
|
|
||||||
* @ctxt: an SGML parser context
|
|
||||||
*
|
|
||||||
* Check whether a p element need to be implied before inserting
|
|
||||||
* characters in the current element.
|
|
||||||
*
|
|
||||||
* Returns 1 if a paragraph has been inserted, 0 if not and -1
|
|
||||||
* in case of error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
docbCheckParagraph(docbParserCtxtPtr ctxt) {
|
|
||||||
const xmlChar *tag;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (ctxt == NULL)
|
|
||||||
return(-1);
|
|
||||||
tag = ctxt->name;
|
|
||||||
if (tag == NULL) {
|
|
||||||
docbAutoClose(ctxt, BAD_CAST"p");
|
|
||||||
docbnamePush(ctxt, xmlStrdup(BAD_CAST"p"));
|
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL))
|
|
||||||
ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
for (i = 0; docbNoContentElements[i] != NULL; i++) {
|
|
||||||
if (xmlStrEqual(tag, BAD_CAST docbNoContentElements[i])) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
xmlGenericError(xmlGenericErrorContext,"Implied element paragraph\n");
|
|
||||||
#endif
|
|
||||||
docbAutoClose(ctxt, BAD_CAST"p");
|
|
||||||
docbnamePush(ctxt, xmlStrdup(BAD_CAST"p"));
|
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL))
|
|
||||||
ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* *
|
* *
|
||||||
* The list of SGML predefined entities *
|
* The list of SGML predefined entities *
|
||||||
@ -3105,7 +3039,6 @@ docbParseCharData(docbParserCtxtPtr ctxt) {
|
|||||||
ctxt->sax->ignorableWhitespace(ctxt->userData,
|
ctxt->sax->ignorableWhitespace(ctxt->userData,
|
||||||
buf, nbchar);
|
buf, nbchar);
|
||||||
} else {
|
} else {
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if (ctxt->sax->characters != NULL)
|
if (ctxt->sax->characters != NULL)
|
||||||
ctxt->sax->characters(ctxt->userData, buf, nbchar);
|
ctxt->sax->characters(ctxt->userData, buf, nbchar);
|
||||||
}
|
}
|
||||||
@ -3124,7 +3057,6 @@ docbParseCharData(docbParserCtxtPtr ctxt) {
|
|||||||
if (ctxt->sax->ignorableWhitespace != NULL)
|
if (ctxt->sax->ignorableWhitespace != NULL)
|
||||||
ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar);
|
ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar);
|
||||||
} else {
|
} else {
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if (ctxt->sax->characters != NULL)
|
if (ctxt->sax->characters != NULL)
|
||||||
ctxt->sax->characters(ctxt->userData, buf, nbchar);
|
ctxt->sax->characters(ctxt->userData, buf, nbchar);
|
||||||
}
|
}
|
||||||
@ -4051,7 +3983,6 @@ docbParseReference(docbParserCtxtPtr ctxt) {
|
|||||||
}
|
}
|
||||||
out[i] = 0;
|
out[i] = 0;
|
||||||
|
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
||||||
ctxt->sax->characters(ctxt->userData, out, i);
|
ctxt->sax->characters(ctxt->userData, out, i);
|
||||||
} else {
|
} else {
|
||||||
@ -4102,7 +4033,6 @@ docbParseReference(docbParserCtxtPtr ctxt) {
|
|||||||
} else if (name != NULL) {
|
} else if (name != NULL) {
|
||||||
ent = docbEntityLookup(name);
|
ent = docbEntityLookup(name);
|
||||||
if ((ent == NULL) || (ent->value <= 0)) {
|
if ((ent == NULL) || (ent->value <= 0)) {
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) {
|
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) {
|
||||||
ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1);
|
ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1);
|
||||||
ctxt->sax->characters(ctxt->userData, name, xmlStrlen(name));
|
ctxt->sax->characters(ctxt->userData, name, xmlStrlen(name));
|
||||||
@ -4127,12 +4057,10 @@ docbParseReference(docbParserCtxtPtr ctxt) {
|
|||||||
}
|
}
|
||||||
out[i] = 0;
|
out[i] = 0;
|
||||||
|
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
||||||
ctxt->sax->characters(ctxt->userData, out, i);
|
ctxt->sax->characters(ctxt->userData, out, i);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
||||||
ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1);
|
ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1);
|
||||||
return;
|
return;
|
||||||
@ -5607,7 +5535,6 @@ docbParseTryOrFinish(docbParserCtxtPtr ctxt, int terminate) {
|
|||||||
xmlChar chr[2] = { 0 , 0 } ;
|
xmlChar chr[2] = { 0 , 0 } ;
|
||||||
|
|
||||||
chr[0] = (xmlChar) ctxt->token;
|
chr[0] = (xmlChar) ctxt->token;
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL))
|
||||||
ctxt->sax->characters(ctxt->userData, chr, 1);
|
ctxt->sax->characters(ctxt->userData, chr, 1);
|
||||||
ctxt->token = 0;
|
ctxt->token = 0;
|
||||||
@ -5622,7 +5549,6 @@ docbParseTryOrFinish(docbParserCtxtPtr ctxt, int terminate) {
|
|||||||
ctxt->sax->ignorableWhitespace(
|
ctxt->sax->ignorableWhitespace(
|
||||||
ctxt->userData, &cur, 1);
|
ctxt->userData, &cur, 1);
|
||||||
} else {
|
} else {
|
||||||
docbCheckParagraph(ctxt);
|
|
||||||
if (ctxt->sax->characters != NULL)
|
if (ctxt->sax->characters != NULL)
|
||||||
ctxt->sax->characters(
|
ctxt->sax->characters(
|
||||||
ctxt->userData, &cur, 1);
|
ctxt->userData, &cur, 1);
|
||||||
|
@ -197,7 +197,6 @@ int xmlIsChar (int c);
|
|||||||
/**
|
/**
|
||||||
* Parser context
|
* Parser context
|
||||||
*/
|
*/
|
||||||
xmlParserCtxtPtr xmlCreateDocParserCtxt (xmlChar *cur);
|
|
||||||
xmlParserCtxtPtr xmlCreateFileParserCtxt (const char *filename);
|
xmlParserCtxtPtr xmlCreateFileParserCtxt (const char *filename);
|
||||||
xmlParserCtxtPtr xmlCreateMemoryParserCtxt(const char *buffer,
|
xmlParserCtxtPtr xmlCreateMemoryParserCtxt(const char *buffer,
|
||||||
int size);
|
int size);
|
||||||
|
@ -110,7 +110,7 @@ typedef enum {
|
|||||||
XML_ERR_EQUAL_REQUIRED,
|
XML_ERR_EQUAL_REQUIRED,
|
||||||
|
|
||||||
XML_ERR_TAG_NAME_MISMATCH, /* 77 */
|
XML_ERR_TAG_NAME_MISMATCH, /* 77 */
|
||||||
XML_ERR_TAG_NOT_FINISED,
|
XML_ERR_TAG_NOT_FINISHED,
|
||||||
|
|
||||||
XML_ERR_STANDALONE_VALUE, /* 79 */
|
XML_ERR_STANDALONE_VALUE, /* 79 */
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ void * xmlXPathPopExternal (xmlXPathParserContextPtr ctxt);
|
|||||||
*
|
*
|
||||||
* Pushes an empty node-set on the context stack
|
* Pushes an empty node-set on the context stack
|
||||||
*/
|
*/
|
||||||
#define xmlXPathReturnEmptyNodeSet(ctxt, ns) \
|
#define xmlXPathReturnEmptyNodeSet(ctxt) \
|
||||||
valuePush((ctxt), xmlXPathNewNodeSet(NULL))
|
valuePush((ctxt), xmlXPathNewNodeSet(NULL))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
2
parser.c
2
parser.c
@ -6848,7 +6848,7 @@ xmlParseElement(xmlParserCtxtPtr ctxt) {
|
|||||||
*/
|
*/
|
||||||
xmlParseContent(ctxt);
|
xmlParseContent(ctxt);
|
||||||
if (!IS_CHAR(RAW)) {
|
if (!IS_CHAR(RAW)) {
|
||||||
ctxt->errNo = XML_ERR_TAG_NOT_FINISED;
|
ctxt->errNo = XML_ERR_TAG_NOT_FINISHED;
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
"Premature end of data in tag %.30s\n", openTag);
|
"Premature end of data in tag %.30s\n", openTag);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
./test/VC/ElementValid5:7: validity error: Element doc content doesn't follow the Dtd
|
./test/VC/ElementValid5:7: validity error: Element doc content doesn't follow the DTD
|
||||||
Expecting (a , b* , c+), got (a b c b)
|
Expecting (a , b* , c+), got (a b c b)
|
||||||
<doc><a/><b> but this</b><c>was not declared</c><b>seems</b></doc>
|
<doc><a/><b> but this</b><c>was not declared</c><b>seems</b></doc>
|
||||||
^
|
^
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
./test/VC/ElementValid6:7: validity error: Element doc content doesn't follow the Dtd
|
./test/VC/ElementValid6:7: validity error: Element doc content doesn't follow the DTD
|
||||||
Expecting (a , b? , c+)?, got (a b)
|
Expecting (a , b? , c+)?, got (a b)
|
||||||
<doc><a/><b>lacks c</b></doc>
|
<doc><a/><b>lacks c</b></doc>
|
||||||
^
|
^
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
./test/VC/ElementValid7:7: validity error: Element doc content doesn't follow the Dtd
|
./test/VC/ElementValid7:7: validity error: Element doc content doesn't follow the DTD
|
||||||
Expecting ((a | b)* , c+ , a , b? , c , a?), got (a b a c c a)
|
Expecting ((a | b)* , c+ , a , b? , c , a?), got (a b a c c a)
|
||||||
<doc><a/><b/><a/><c/><c/><a/></doc>
|
<doc><a/><b/><a/><c/><c/><a/></doc>
|
||||||
^
|
^
|
||||||
|
20
valid.c
20
valid.c
@ -97,11 +97,11 @@ typedef struct _xmlValidState {
|
|||||||
#define OCCURS ctxt->vstate->occurs
|
#define OCCURS ctxt->vstate->occurs
|
||||||
#define STATE ctxt->vstate->state
|
#define STATE ctxt->vstate->state
|
||||||
|
|
||||||
#define OCCURENCE (ctxt->vstate->occurs & (1 << DEPTH))
|
#define OCCURRENCE (ctxt->vstate->occurs & (1 << DEPTH))
|
||||||
#define PARENT_OCCURENCE (ctxt->vstate->occurs & ((1 << DEPTH) - 1))
|
#define PARENT_OCCURRENCE (ctxt->vstate->occurs & ((1 << DEPTH) - 1))
|
||||||
|
|
||||||
#define SET_OCCURENCE ctxt->vstate->occurs |= (1 << DEPTH)
|
#define SET_OCCURRENCE ctxt->vstate->occurs |= (1 << DEPTH)
|
||||||
#define RESET_OCCURENCE ctxt->vstate->occurs &= ((1 << DEPTH) - 1)
|
#define RESET_OCCURRENCE ctxt->vstate->occurs &= ((1 << DEPTH) - 1)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont,
|
vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont,
|
||||||
@ -3445,7 +3445,7 @@ cont:
|
|||||||
(CONT->parent->type != XML_ELEMENT_CONTENT_OR)) &&
|
(CONT->parent->type != XML_ELEMENT_CONTENT_OR)) &&
|
||||||
((CONT->ocur == XML_ELEMENT_CONTENT_MULT) ||
|
((CONT->ocur == XML_ELEMENT_CONTENT_MULT) ||
|
||||||
(CONT->ocur == XML_ELEMENT_CONTENT_OPT) ||
|
(CONT->ocur == XML_ELEMENT_CONTENT_OPT) ||
|
||||||
((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURENCE)))) {
|
((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURRENCE)))) {
|
||||||
DEBUG_VALID_MSG("saving parent branch");
|
DEBUG_VALID_MSG("saving parent branch");
|
||||||
vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT);
|
vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT);
|
||||||
}
|
}
|
||||||
@ -3616,7 +3616,7 @@ analyze:
|
|||||||
determinist = -3;
|
determinist = -3;
|
||||||
goto cont;
|
goto cont;
|
||||||
case XML_ELEMENT_CONTENT_PLUS:
|
case XML_ELEMENT_CONTENT_PLUS:
|
||||||
if (OCCURENCE == 0) {
|
if (OCCURRENCE == 0) {
|
||||||
cur = ctxt->vstate->node;
|
cur = ctxt->vstate->node;
|
||||||
DEBUG_VALID_MSG("Plus branch failed, rollback");
|
DEBUG_VALID_MSG("Plus branch failed, rollback");
|
||||||
if (vstateVPop(ctxt) < 0 ) {
|
if (vstateVPop(ctxt) < 0 ) {
|
||||||
@ -3632,7 +3632,7 @@ analyze:
|
|||||||
break;
|
break;
|
||||||
case XML_ELEMENT_CONTENT_MULT:
|
case XML_ELEMENT_CONTENT_MULT:
|
||||||
#ifdef DEBUG_VALID_ALGO
|
#ifdef DEBUG_VALID_ALGO
|
||||||
if (OCCURENCE == 0) {
|
if (OCCURRENCE == 0) {
|
||||||
DEBUG_VALID_MSG("Mult branch failed");
|
DEBUG_VALID_MSG("Mult branch failed");
|
||||||
} else {
|
} else {
|
||||||
DEBUG_VALID_MSG("Mult branch found");
|
DEBUG_VALID_MSG("Mult branch found");
|
||||||
@ -3667,7 +3667,7 @@ analyze:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DEBUG_VALID_MSG("Plus branch succeeded, continuing");
|
DEBUG_VALID_MSG("Plus branch succeeded, continuing");
|
||||||
SET_OCCURENCE;
|
SET_OCCURRENCE;
|
||||||
goto cont;
|
goto cont;
|
||||||
case XML_ELEMENT_CONTENT_MULT:
|
case XML_ELEMENT_CONTENT_MULT:
|
||||||
if (STATE == ROLLBACK_PARENT) {
|
if (STATE == ROLLBACK_PARENT) {
|
||||||
@ -3681,7 +3681,7 @@ analyze:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DEBUG_VALID_MSG("Mult branch succeeded, continuing");
|
DEBUG_VALID_MSG("Mult branch succeeded, continuing");
|
||||||
/* SET_OCCURENCE; */
|
/* SET_OCCURRENCE; */
|
||||||
goto cont;
|
goto cont;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3690,7 +3690,7 @@ analyze:
|
|||||||
/*
|
/*
|
||||||
* Then act accordingly at the parent level
|
* Then act accordingly at the parent level
|
||||||
*/
|
*/
|
||||||
RESET_OCCURENCE;
|
RESET_OCCURRENCE;
|
||||||
if (CONT->parent == NULL)
|
if (CONT->parent == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user