parser.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:295k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1.     buf = (xmlChar *) xmlMalloc(size * sizeof(xmlChar));
  2.     if (buf == NULL) {
  3. fprintf(stderr, "malloc of %d byte failedn", size);
  4. return(NULL);
  5.     }
  6.     /*
  7.      * The content of the entity definition is copied in a buffer.
  8.      */
  9.     ctxt->instate = XML_PARSER_ENTITY_VALUE;
  10.     input = ctxt->input;
  11.     GROW;
  12.     NEXT;
  13.     c = CUR_CHAR(l);
  14.     /*
  15.      * NOTE: 4.4.5 Included in Literal
  16.      * When a parameter entity reference appears in a literal entity
  17.      * value, ... a single or double quote character in the replacement
  18.      * text is always treated as a normal data character and will not
  19.      * terminate the literal. 
  20.      * In practice it means we stop the loop only when back at parsing
  21.      * the initial entity and the quote is found
  22.      */
  23.     while (IS_CHAR(c) && ((c != stop) || (ctxt->input != input))) {
  24. if (len + 5 >= size) {
  25.     size *= 2;
  26.     buf = xmlRealloc(buf, size * sizeof(xmlChar));
  27.     if (buf == NULL) {
  28. fprintf(stderr, "realloc of %d byte failedn", size);
  29. return(NULL);
  30.     }
  31. }
  32. COPY_BUF(l,buf,len,c);
  33. NEXTL(l);
  34. /*
  35.  * Pop-up of finished entities.
  36.  */
  37. while ((RAW == 0) && (ctxt->inputNr > 1))
  38.     xmlPopInput(ctxt);
  39. c = CUR_CHAR(l);
  40. if (c == 0) {
  41.     GROW;
  42.     c = CUR_CHAR(l);
  43. }
  44.     }
  45.     buf[len] = 0;
  46.     /*
  47.      * Raise problem w.r.t. '&' and '%' being used in non-entities
  48.      * reference constructs. Note Charref will be handled in
  49.      * xmlStringDecodeEntities()
  50.      */
  51.     cur = buf;
  52.     while (*cur != 0) {
  53. if ((*cur == '%') || ((*cur == '&') && (cur[1] != '#'))) {
  54.     xmlChar *name;
  55.     xmlChar tmp = *cur;
  56.     cur++;
  57.     name = xmlParseStringName(ctxt, &cur);
  58.             if ((name == NULL) || (*cur != ';')) {
  59. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  60.     ctxt->sax->error(ctxt->userData,
  61.     "EntityValue: '%c' forbidden except for entities referencesn",
  62.                              tmp);
  63. ctxt->wellFormed = 0;
  64. ctxt->disableSAX = 1;
  65. ctxt->errNo = XML_ERR_ENTITY_CHAR_ERROR;
  66.     }
  67.     if ((ctxt->inSubset == 1) && (tmp == '%')) {
  68. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  69.     ctxt->sax->error(ctxt->userData,
  70.     "EntityValue: PEReferences forbidden in internal subsetn",
  71.                              tmp);
  72. ctxt->wellFormed = 0;
  73. ctxt->disableSAX = 1;
  74. ctxt->errNo = XML_ERR_ENTITY_PE_INTERNAL;
  75.     }
  76.     if (name != NULL)
  77. xmlFree(name);
  78. }
  79. cur++;
  80.     }
  81.     /*
  82.      * Then PEReference entities are substituted.
  83.      */
  84.     if (c != stop) {
  85. ctxt->errNo = XML_ERR_ENTITY_NOT_FINISHED;
  86. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  87.     ctxt->sax->error(ctxt->userData, "EntityValue: " expectedn");
  88. ctxt->wellFormed = 0;
  89. ctxt->disableSAX = 1;
  90. xmlFree(buf);
  91.     } else {
  92. NEXT;
  93. /*
  94.  * NOTE: 4.4.7 Bypassed
  95.  * When a general entity reference appears in the EntityValue in
  96.  * an entity declaration, it is bypassed and left as is.
  97.  * so XML_SUBSTITUTE_REF is not set here.
  98.  */
  99. ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF,
  100.       0, 0, 0);
  101. if (orig != NULL) 
  102.     *orig = buf;
  103. else
  104.     xmlFree(buf);
  105.     }
  106.     
  107.     return(ret);
  108. }
  109. /**
  110.  * xmlParseAttValue:
  111.  * @ctxt:  an XML parser context
  112.  *
  113.  * parse a value for an attribute
  114.  * Note: the parser won't do substitution of entities here, this
  115.  * will be handled later in xmlStringGetNodeList
  116.  *
  117.  * [10] AttValue ::= '"' ([^<&"] | Reference)* '"' |
  118.  *                   "'" ([^<&'] | Reference)* "'"
  119.  *
  120.  * 3.3.3 Attribute-Value Normalization:
  121.  * Before the value of an attribute is passed to the application or
  122.  * checked for validity, the XML processor must normalize it as follows: 
  123.  * - a character reference is processed by appending the referenced
  124.  *   character to the attribute value
  125.  * - an entity reference is processed by recursively processing the
  126.  *   replacement text of the entity 
  127.  * - a whitespace character (#x20, #xD, #xA, #x9) is processed by
  128.  *   appending #x20 to the normalized value, except that only a single
  129.  *   #x20 is appended for a "#xD#xA" sequence that is part of an external
  130.  *   parsed entity or the literal entity value of an internal parsed entity 
  131.  * - other characters are processed by appending them to the normalized value 
  132.  * If the declared value is not CDATA, then the XML processor must further
  133.  * process the normalized attribute value by discarding any leading and
  134.  * trailing space (#x20) characters, and by replacing sequences of space
  135.  * (#x20) characters by a single space (#x20) character.  
  136.  * All attributes for which no declaration has been read should be treated
  137.  * by a non-validating parser as if declared CDATA.
  138.  *
  139.  * Returns the AttValue parsed or NULL. The value has to be freed by the caller.
  140.  */
  141. xmlChar *
  142. xmlParseAttValue(xmlParserCtxtPtr ctxt) {
  143.     xmlChar limit = 0;
  144.     xmlChar *buffer = NULL;
  145.     int buffer_size = 0;
  146.     xmlChar *out = NULL;
  147.     xmlChar *current = NULL;
  148.     xmlEntityPtr ent;
  149.     xmlChar cur;
  150.     SHRINK;
  151.     if (NXT(0) == '"') {
  152. ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE;
  153. limit = '"';
  154.         NEXT;
  155.     } else if (NXT(0) == ''') {
  156. limit = ''';
  157. ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE;
  158.         NEXT;
  159.     } else {
  160. ctxt->errNo = XML_ERR_ATTRIBUTE_NOT_STARTED;
  161. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  162.     ctxt->sax->error(ctxt->userData, "AttValue: " or ' expectedn");
  163. ctxt->wellFormed = 0;
  164. ctxt->disableSAX = 1;
  165. return(NULL);
  166.     }
  167.     
  168.     /*
  169.      * allocate a translation buffer.
  170.      */
  171.     buffer_size = XML_PARSER_BUFFER_SIZE;
  172.     buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
  173.     if (buffer == NULL) {
  174. perror("xmlParseAttValue: malloc failed");
  175. return(NULL);
  176.     }
  177.     out = buffer;
  178.     /*
  179.      * Ok loop until we reach one of the ending char or a size limit.
  180.      */
  181.     cur = CUR;
  182.     while (((NXT(0) != limit) && (cur != '<')) || (ctxt->token != 0)) {
  183. if (cur == 0) break;
  184.         if ((cur == '&') && (NXT(1) == '#')) {
  185.     int val = xmlParseCharRef(ctxt);
  186.     *out++ = val;
  187. } else if (cur == '&') {
  188.     ent = xmlParseEntityRef(ctxt);
  189.     if ((ent != NULL) && 
  190. (ctxt->replaceEntities != 0)) {
  191. xmlChar *rep;
  192. if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) {
  193.     rep = xmlStringDecodeEntities(ctxt, ent->content,
  194.       XML_SUBSTITUTE_REF, 0, 0, 0);
  195.     if (rep != NULL) {
  196. current = rep;
  197. while (*current != 0) {
  198.     *out++ = *current++;
  199.     if (out - buffer > buffer_size - 10) {
  200. int index = out - buffer;
  201. growBuffer(buffer);
  202. out = &buffer[index];
  203.     }
  204. }
  205. xmlFree(rep);
  206.     }
  207. } else {
  208.     if (ent->content != NULL)
  209. *out++ = ent->content[0];
  210. }
  211.     } else if (ent != NULL) {
  212. int i = xmlStrlen(ent->name);
  213. const xmlChar *cur = ent->name;
  214. /*
  215.  * This may look absurd but is needed to detect
  216.  * entities problems
  217.  */
  218. if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) {
  219.     xmlChar *rep;
  220.     rep = xmlStringDecodeEntities(ctxt, ent->content,
  221.       XML_SUBSTITUTE_REF, 0, 0, 0);
  222.     if (rep != NULL)
  223. xmlFree(rep);
  224. }
  225. /*
  226.  * Just output the reference
  227.  */
  228. *out++ = '&';
  229. if (out - buffer > buffer_size - i - 10) {
  230.     int index = out - buffer;
  231.     growBuffer(buffer);
  232.     out = &buffer[index];
  233. }
  234. for (;i > 0;i--)
  235.     *out++ = *cur++;
  236. *out++ = ';';
  237.     }
  238. } else {
  239.     /*  invalid for UTF-8 , use COPY(out); !!! */
  240.     if ((cur == 0x20) || (cur == 0xD) || (cur == 0xA) || (cur == 0x9)) {
  241. *out++ = 0x20;
  242. if (out - buffer > buffer_size - 10) {
  243.   int index = out - buffer;
  244.   
  245.   growBuffer(buffer);
  246.   out = &buffer[index];
  247. }
  248.     } else {
  249. *out++ = cur;
  250. if (out - buffer > buffer_size - 10) {
  251.   int index = out - buffer;
  252.   
  253.   growBuffer(buffer);
  254.   out = &buffer[index];
  255. }
  256.     }
  257.     NEXT;
  258. }
  259. cur = CUR;
  260.     }
  261.     *out++ = 0;
  262.     if (RAW == '<') {
  263. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  264.     ctxt->sax->error(ctxt->userData,
  265.        "Unescaped '<' not allowed in attributes valuesn");
  266. ctxt->errNo = XML_ERR_LT_IN_ATTRIBUTE;
  267. ctxt->wellFormed = 0;
  268. ctxt->disableSAX = 1;
  269.     } else if (RAW != limit) {
  270. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  271.     ctxt->sax->error(ctxt->userData, "AttValue: ' expectedn");
  272. ctxt->errNo = XML_ERR_ATTRIBUTE_NOT_FINISHED;
  273. ctxt->wellFormed = 0;
  274. ctxt->disableSAX = 1;
  275.     } else
  276. NEXT;
  277.     return(buffer);
  278. }
  279. /**
  280.  * xmlParseSystemLiteral:
  281.  * @ctxt:  an XML parser context
  282.  * 
  283.  * parse an XML Literal
  284.  *
  285.  * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")
  286.  *
  287.  * Returns the SystemLiteral parsed or NULL
  288.  */
  289. xmlChar *
  290. xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) {
  291.     xmlChar *buf = NULL;
  292.     int len = 0;
  293.     int size = XML_PARSER_BUFFER_SIZE;
  294.     int cur, l;
  295.     xmlChar stop;
  296.     int state = ctxt->instate;
  297.     SHRINK;
  298.     if (RAW == '"') {
  299.         NEXT;
  300. stop = '"';
  301.     } else if (RAW == ''') {
  302.         NEXT;
  303. stop = ''';
  304.     } else {
  305. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  306.     ctxt->sax->error(ctxt->userData,
  307.                      "SystemLiteral " or ' expectedn");
  308. ctxt->errNo = XML_ERR_LITERAL_NOT_STARTED;
  309. ctxt->wellFormed = 0;
  310. ctxt->disableSAX = 1;
  311. return(NULL);
  312.     }
  313.     
  314.     buf = (xmlChar *) xmlMalloc(size * sizeof(xmlChar));
  315.     if (buf == NULL) {
  316. fprintf(stderr, "malloc of %d byte failedn", size);
  317. return(NULL);
  318.     }
  319.     ctxt->instate = XML_PARSER_SYSTEM_LITERAL;
  320.     cur = CUR_CHAR(l);
  321.     while ((IS_CHAR(cur)) && (cur != stop)) {
  322. if (len + 5 >= size) {
  323.     size *= 2;
  324.     buf = xmlRealloc(buf, size * sizeof(xmlChar));
  325.     if (buf == NULL) {
  326. fprintf(stderr, "realloc of %d byte failedn", size);
  327. ctxt->instate = state;
  328. return(NULL);
  329.     }
  330. }
  331. COPY_BUF(l,buf,len,cur);
  332. NEXTL(l);
  333. cur = CUR_CHAR(l);
  334. if (cur == 0) {
  335.     GROW;
  336.     SHRINK;
  337.     cur = CUR_CHAR(l);
  338. }
  339.     }
  340.     buf[len] = 0;
  341.     ctxt->instate = state;
  342.     if (!IS_CHAR(cur)) {
  343. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  344.     ctxt->sax->error(ctxt->userData, "Unfinished SystemLiteraln");
  345. ctxt->errNo = XML_ERR_LITERAL_NOT_FINISHED;
  346. ctxt->wellFormed = 0;
  347. ctxt->disableSAX = 1;
  348.     } else {
  349. NEXT;
  350.     }
  351.     return(buf);
  352. }
  353. /**
  354.  * xmlParsePubidLiteral:
  355.  * @ctxt:  an XML parser context
  356.  *
  357.  * parse an XML public literal
  358.  *
  359.  * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"
  360.  *
  361.  * Returns the PubidLiteral parsed or NULL.
  362.  */
  363. xmlChar *
  364. xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) {
  365.     xmlChar *buf = NULL;
  366.     int len = 0;
  367.     int size = XML_PARSER_BUFFER_SIZE;
  368.     xmlChar cur;
  369.     xmlChar stop;
  370.     SHRINK;
  371.     if (RAW == '"') {
  372.         NEXT;
  373. stop = '"';
  374.     } else if (RAW == ''') {
  375.         NEXT;
  376. stop = ''';
  377.     } else {
  378. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  379.     ctxt->sax->error(ctxt->userData,
  380.                      "SystemLiteral " or ' expectedn");
  381. ctxt->errNo = XML_ERR_LITERAL_NOT_STARTED;
  382. ctxt->wellFormed = 0;
  383. ctxt->disableSAX = 1;
  384. return(NULL);
  385.     }
  386.     buf = (xmlChar *) xmlMalloc(size * sizeof(xmlChar));
  387.     if (buf == NULL) {
  388. fprintf(stderr, "malloc of %d byte failedn", size);
  389. return(NULL);
  390.     }
  391.     cur = CUR;
  392.     while ((IS_PUBIDCHAR(cur)) && (cur != stop)) {
  393. if (len + 1 >= size) {
  394.     size *= 2;
  395.     buf = xmlRealloc(buf, size * sizeof(xmlChar));
  396.     if (buf == NULL) {
  397. fprintf(stderr, "realloc of %d byte failedn", size);
  398. return(NULL);
  399.     }
  400. }
  401. buf[len++] = cur;
  402. NEXT;
  403. cur = CUR;
  404. if (cur == 0) {
  405.     GROW;
  406.     SHRINK;
  407.     cur = CUR;
  408. }
  409.     }
  410.     buf[len] = 0;
  411.     if (cur != stop) {
  412. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  413.     ctxt->sax->error(ctxt->userData, "Unfinished PubidLiteraln");
  414. ctxt->errNo = XML_ERR_LITERAL_NOT_FINISHED;
  415. ctxt->wellFormed = 0;
  416. ctxt->disableSAX = 1;
  417.     } else {
  418. NEXT;
  419.     }
  420.     return(buf);
  421. }
  422. /**
  423.  * xmlParseCharData:
  424.  * @ctxt:  an XML parser context
  425.  * @cdata:  int indicating whether we are within a CDATA section
  426.  *
  427.  * parse a CharData section.
  428.  * if we are within a CDATA section ']]>' marks an end of section.
  429.  *
  430.  * The right angle bracket (>) may be represented using the string "&gt;",
  431.  * and must, for compatibility, be escaped using "&gt;" or a character
  432.  * reference when it appears in the string "]]>" in content, when that
  433.  * string is not marking the end of a CDATA section. 
  434.  *
  435.  * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)
  436.  */
  437. void
  438. xmlParseCharData(xmlParserCtxtPtr ctxt, int cdata) {
  439.     xmlChar buf[XML_PARSER_BIG_BUFFER_SIZE + 5];
  440.     int nbchar = 0;
  441.     int cur, l;
  442.     SHRINK;
  443.     cur = CUR_CHAR(l);
  444.     while (((cur != '<') || (ctxt->token == '<')) &&
  445.            ((cur != '&') || (ctxt->token == '&')) && 
  446.    (IS_CHAR(cur))) {
  447. if ((cur == ']') && (NXT(1) == ']') &&
  448.     (NXT(2) == '>')) {
  449.     if (cdata) break;
  450.     else {
  451. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  452.     ctxt->sax->error(ctxt->userData,
  453.        "Sequence ']]>' not allowed in contentn");
  454. ctxt->errNo = XML_ERR_MISPLACED_CDATA_END;
  455. /* Should this be relaxed ??? I see a "must here */
  456. ctxt->wellFormed = 0;
  457. ctxt->disableSAX = 1;
  458.     }
  459. }
  460. COPY_BUF(l,buf,nbchar,cur);
  461. if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) {
  462.     /*
  463.      * Ok the segment is to be consumed as chars.
  464.      */
  465.     if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) {
  466. if (areBlanks(ctxt, buf, nbchar)) {
  467.     if (ctxt->sax->ignorableWhitespace != NULL)
  468. ctxt->sax->ignorableWhitespace(ctxt->userData,
  469.                                buf, nbchar);
  470. } else {
  471.     if (ctxt->sax->characters != NULL)
  472. ctxt->sax->characters(ctxt->userData, buf, nbchar);
  473. }
  474.     }
  475.     nbchar = 0;
  476. }
  477. NEXTL(l);
  478. cur = CUR_CHAR(l);
  479.     }
  480.     if (nbchar != 0) {
  481. /*
  482.  * Ok the segment is to be consumed as chars.
  483.  */
  484. if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) {
  485.     if (areBlanks(ctxt, buf, nbchar)) {
  486. if (ctxt->sax->ignorableWhitespace != NULL)
  487.     ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar);
  488.     } else {
  489. if (ctxt->sax->characters != NULL)
  490.     ctxt->sax->characters(ctxt->userData, buf, nbchar);
  491.     }
  492. }
  493.     }
  494. }
  495. /**
  496.  * xmlParseExternalID:
  497.  * @ctxt:  an XML parser context
  498.  * @publicID:  a xmlChar** receiving PubidLiteral
  499.  * @strict: indicate whether we should restrict parsing to only
  500.  *          production [75], see NOTE below
  501.  *
  502.  * Parse an External ID or a Public ID
  503.  *
  504.  * NOTE: Productions [75] and [83] interract badly since [75] can generate
  505.  *       'PUBLIC' S PubidLiteral S SystemLiteral
  506.  *
  507.  * [75] ExternalID ::= 'SYSTEM' S SystemLiteral
  508.  *                   | 'PUBLIC' S PubidLiteral S SystemLiteral
  509.  *
  510.  * [83] PublicID ::= 'PUBLIC' S PubidLiteral
  511.  *
  512.  * Returns the function returns SystemLiteral and in the second
  513.  *                case publicID receives PubidLiteral, is strict is off
  514.  *                it is possible to return NULL and have publicID set.
  515.  */
  516. xmlChar *
  517. xmlParseExternalID(xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict) {
  518.     xmlChar *URI = NULL;
  519.     SHRINK;
  520.     if ((RAW == 'S') && (NXT(1) == 'Y') &&
  521.          (NXT(2) == 'S') && (NXT(3) == 'T') &&
  522.  (NXT(4) == 'E') && (NXT(5) == 'M')) {
  523.         SKIP(6);
  524. if (!IS_BLANK(CUR)) {
  525.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  526. ctxt->sax->error(ctxt->userData,
  527.     "Space required after 'SYSTEM'n");
  528.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  529.     ctxt->wellFormed = 0;
  530.     ctxt->disableSAX = 1;
  531. }
  532.         SKIP_BLANKS;
  533. URI = xmlParseSystemLiteral(ctxt);
  534. if (URI == NULL) {
  535.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  536.         ctxt->sax->error(ctxt->userData,
  537.           "xmlParseExternalID: SYSTEM, no URIn");
  538.     ctxt->errNo = XML_ERR_URI_REQUIRED;
  539.     ctxt->wellFormed = 0;
  540.     ctxt->disableSAX = 1;
  541.         }
  542.     } else if ((RAW == 'P') && (NXT(1) == 'U') &&
  543.        (NXT(2) == 'B') && (NXT(3) == 'L') &&
  544.        (NXT(4) == 'I') && (NXT(5) == 'C')) {
  545.         SKIP(6);
  546. if (!IS_BLANK(CUR)) {
  547.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  548. ctxt->sax->error(ctxt->userData,
  549.     "Space required after 'PUBLIC'n");
  550.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  551.     ctxt->wellFormed = 0;
  552.     ctxt->disableSAX = 1;
  553. }
  554.         SKIP_BLANKS;
  555. *publicID = xmlParsePubidLiteral(ctxt);
  556. if (*publicID == NULL) {
  557.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  558.         ctxt->sax->error(ctxt->userData, 
  559.           "xmlParseExternalID: PUBLIC, no Public Identifiern");
  560.     ctxt->errNo = XML_ERR_PUBID_REQUIRED;
  561.     ctxt->wellFormed = 0;
  562.     ctxt->disableSAX = 1;
  563. }
  564. if (strict) {
  565.     /*
  566.      * We don't handle [83] so "S SystemLiteral" is required.
  567.      */
  568.     if (!IS_BLANK(CUR)) {
  569. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  570.     ctxt->sax->error(ctxt->userData,
  571. "Space required after the Public Identifiern");
  572. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  573. ctxt->wellFormed = 0;
  574. ctxt->disableSAX = 1;
  575.     }
  576. } else {
  577.     /*
  578.      * We handle [83] so we return immediately, if 
  579.      * "S SystemLiteral" is not detected. From a purely parsing
  580.      * point of view that's a nice mess.
  581.      */
  582.     const xmlChar *ptr;
  583.     GROW;
  584.     ptr = CUR_PTR;
  585.     if (!IS_BLANK(*ptr)) return(NULL);
  586.     
  587.     while (IS_BLANK(*ptr)) ptr++;
  588.     if ((*ptr != ''') && (*ptr != '"')) return(NULL);
  589. }
  590.         SKIP_BLANKS;
  591. URI = xmlParseSystemLiteral(ctxt);
  592. if (URI == NULL) {
  593.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  594.         ctxt->sax->error(ctxt->userData, 
  595.            "xmlParseExternalID: PUBLIC, no URIn");
  596.     ctxt->errNo = XML_ERR_URI_REQUIRED;
  597.     ctxt->wellFormed = 0;
  598.     ctxt->disableSAX = 1;
  599.         }
  600.     }
  601.     return(URI);
  602. }
  603. /**
  604.  * xmlParseComment:
  605.  * @ctxt:  an XML parser context
  606.  *
  607.  * Skip an XML (SGML) comment <!-- .... -->
  608.  *  The spec says that "For compatibility, the string "--" (double-hyphen)
  609.  *  must not occur within comments. "
  610.  *
  611.  * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'
  612.  */
  613. void
  614. xmlParseComment(xmlParserCtxtPtr ctxt) {
  615.     xmlChar *buf = NULL;
  616.     int len = 0;
  617.     int size = XML_PARSER_BUFFER_SIZE;
  618.     int q, ql;
  619.     int r, rl;
  620.     int cur, l;
  621.     xmlParserInputState state;
  622.     xmlParserInputPtr input = ctxt->input;
  623.     /*
  624.      * Check that there is a comment right here.
  625.      */
  626.     if ((RAW != '<') || (NXT(1) != '!') ||
  627.         (NXT(2) != '-') || (NXT(3) != '-')) return;
  628.     state = ctxt->instate;
  629.     ctxt->instate = XML_PARSER_COMMENT;
  630.     SHRINK;
  631.     SKIP(4);
  632.     buf = (xmlChar *) xmlMalloc(size * sizeof(xmlChar));
  633.     if (buf == NULL) {
  634. fprintf(stderr, "malloc of %d byte failedn", size);
  635. ctxt->instate = state;
  636. return;
  637.     }
  638.     q = CUR_CHAR(ql);
  639.     NEXTL(ql);
  640.     r = CUR_CHAR(rl);
  641.     NEXTL(rl);
  642.     cur = CUR_CHAR(l);
  643.     while (IS_CHAR(cur) &&
  644.            ((cur != '>') ||
  645.     (r != '-') || (q != '-'))) {
  646. if ((r == '-') && (q == '-')) {
  647.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  648.         ctxt->sax->error(ctxt->userData,
  649.        "Comment must not contain '--' (double-hyphen)`n");
  650.     ctxt->errNo = XML_ERR_HYPHEN_IN_COMMENT;
  651.     ctxt->wellFormed = 0;
  652.     ctxt->disableSAX = 1;
  653. }
  654. if (len + 5 >= size) {
  655.     size *= 2;
  656.     buf = xmlRealloc(buf, size * sizeof(xmlChar));
  657.     if (buf == NULL) {
  658. fprintf(stderr, "realloc of %d byte failedn", size);
  659. ctxt->instate = state;
  660. return;
  661.     }
  662. }
  663. COPY_BUF(ql,buf,len,q);
  664. q = r;
  665. ql = rl;
  666. r = cur;
  667. rl = l;
  668. NEXTL(l);
  669. cur = CUR_CHAR(l);
  670. if (cur == 0) {
  671.     SHRINK;
  672.     GROW;
  673.     cur = CUR_CHAR(l);
  674. }
  675.     }
  676.     buf[len] = 0;
  677.     if (!IS_CHAR(cur)) {
  678. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  679.     ctxt->sax->error(ctxt->userData,
  680.                      "Comment not terminated n<!--%.50sn", buf);
  681. ctxt->errNo = XML_ERR_COMMENT_NOT_FINISHED;
  682. ctxt->wellFormed = 0;
  683. ctxt->disableSAX = 1;
  684. xmlFree(buf);
  685.     } else {
  686. if (input != ctxt->input) {
  687.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  688. ctxt->sax->error(ctxt->userData, 
  689. "Comment doesn't start and stop in the same entityn");
  690.     ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  691.     ctxt->wellFormed = 0;
  692.     ctxt->disableSAX = 1;
  693. }
  694.         NEXT;
  695. if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) &&
  696.     (!ctxt->disableSAX))
  697.     ctxt->sax->comment(ctxt->userData, buf);
  698. xmlFree(buf);
  699.     }
  700.     ctxt->instate = state;
  701. }
  702. /**
  703.  * xmlParsePITarget:
  704.  * @ctxt:  an XML parser context
  705.  * 
  706.  * parse the name of a PI
  707.  *
  708.  * [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
  709.  *
  710.  * Returns the PITarget name or NULL
  711.  */
  712. xmlChar *
  713. xmlParsePITarget(xmlParserCtxtPtr ctxt) {
  714.     xmlChar *name;
  715.     name = xmlParseName(ctxt);
  716.     if ((name != NULL) &&
  717.         ((name[0] == 'x') || (name[0] == 'X')) &&
  718.         ((name[1] == 'm') || (name[1] == 'M')) &&
  719.         ((name[2] == 'l') || (name[2] == 'L'))) {
  720. int i;
  721. if ((name[0] == 'x') && (name[1] == 'm') &&
  722.     (name[2] == 'l') && (name[3] == 0)) {
  723.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  724. ctxt->sax->error(ctxt->userData,
  725.  "XML declaration allowed only at the start of the documentn");
  726.     ctxt->errNo = XML_ERR_RESERVED_XML_NAME;
  727.     ctxt->wellFormed = 0;
  728.     ctxt->disableSAX = 1;
  729.     return(name);
  730. } else if (name[3] == 0) {
  731.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  732. ctxt->sax->error(ctxt->userData, "Invalid PI namen");
  733.     ctxt->errNo = XML_ERR_RESERVED_XML_NAME;
  734.     ctxt->wellFormed = 0;
  735.     ctxt->disableSAX = 1;
  736.     return(name);
  737. }
  738. for (i = 0;;i++) {
  739.     if (xmlW3CPIs[i] == NULL) break;
  740.     if (!xmlStrcmp(name, (const xmlChar *)xmlW3CPIs[i]))
  741.         return(name);
  742. }
  743. if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) {
  744.     ctxt->sax->warning(ctxt->userData,
  745.          "xmlParsePItarget: invalid name prefix 'xml'n");
  746.     ctxt->errNo = XML_ERR_RESERVED_XML_NAME;
  747. }
  748.     }
  749.     return(name);
  750. }
  751. /**
  752.  * xmlParsePI:
  753.  * @ctxt:  an XML parser context
  754.  * 
  755.  * parse an XML Processing Instruction.
  756.  *
  757.  * [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
  758.  *
  759.  * The processing is transfered to SAX once parsed.
  760.  */
  761. void
  762. xmlParsePI(xmlParserCtxtPtr ctxt) {
  763.     xmlChar *buf = NULL;
  764.     int len = 0;
  765.     int size = XML_PARSER_BUFFER_SIZE;
  766.     int cur, l;
  767.     xmlChar *target;
  768.     xmlParserInputState state;
  769.     if ((RAW == '<') && (NXT(1) == '?')) {
  770. xmlParserInputPtr input = ctxt->input;
  771. state = ctxt->instate;
  772.         ctxt->instate = XML_PARSER_PI;
  773. /*
  774.  * this is a Processing Instruction.
  775.  */
  776. SKIP(2);
  777. SHRINK;
  778. /*
  779.  * Parse the target name and check for special support like
  780.  * namespace.
  781.  */
  782.         target = xmlParsePITarget(ctxt);
  783. if (target != NULL) {
  784.     if ((RAW == '?') && (NXT(1) == '>')) {
  785. if (input != ctxt->input) {
  786.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  787. ctxt->sax->error(ctxt->userData, 
  788.     "PI declaration doesn't start and stop in the same entityn");
  789.     ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  790.     ctxt->wellFormed = 0;
  791.     ctxt->disableSAX = 1;
  792. }
  793. SKIP(2);
  794. /*
  795.  * SAX: PI detected.
  796.  */
  797. if ((ctxt->sax) && (!ctxt->disableSAX) &&
  798.     (ctxt->sax->processingInstruction != NULL))
  799.     ctxt->sax->processingInstruction(ctxt->userData,
  800.                                      target, NULL);
  801. ctxt->instate = state;
  802. xmlFree(target);
  803. return;
  804.     }
  805.     buf = (xmlChar *) xmlMalloc(size * sizeof(xmlChar));
  806.     if (buf == NULL) {
  807. fprintf(stderr, "malloc of %d byte failedn", size);
  808. ctxt->instate = state;
  809. return;
  810.     }
  811.     cur = CUR;
  812.     if (!IS_BLANK(cur)) {
  813. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  814.     ctxt->sax->error(ctxt->userData,
  815.       "xmlParsePI: PI %s space expectedn", target);
  816. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  817. ctxt->wellFormed = 0;
  818. ctxt->disableSAX = 1;
  819.     }
  820.             SKIP_BLANKS;
  821.     cur = CUR_CHAR(l);
  822.     while (IS_CHAR(cur) &&
  823.    ((cur != '?') || (NXT(1) != '>'))) {
  824. if (len + 5 >= size) {
  825.     size *= 2;
  826.     buf = xmlRealloc(buf, size * sizeof(xmlChar));
  827.     if (buf == NULL) {
  828. fprintf(stderr, "realloc of %d byte failedn", size);
  829. ctxt->instate = state;
  830. return;
  831.     }
  832. }
  833. COPY_BUF(l,buf,len,cur);
  834. NEXTL(l);
  835. cur = CUR_CHAR(l);
  836. if (cur == 0) {
  837.     SHRINK;
  838.     GROW;
  839.     cur = CUR_CHAR(l);
  840. }
  841.     }
  842.     buf[len] = 0;
  843.     if (cur != '?') {
  844. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  845.     ctxt->sax->error(ctxt->userData,
  846.       "xmlParsePI: PI %s never end ...n", target);
  847. ctxt->errNo = XML_ERR_PI_NOT_FINISHED;
  848. ctxt->wellFormed = 0;
  849. ctxt->disableSAX = 1;
  850.     } else {
  851. if (input != ctxt->input) {
  852.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  853. ctxt->sax->error(ctxt->userData, 
  854.     "PI declaration doesn't start and stop in the same entityn");
  855.     ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  856.     ctxt->wellFormed = 0;
  857.     ctxt->disableSAX = 1;
  858. }
  859. SKIP(2);
  860. /*
  861.  * SAX: PI detected.
  862.  */
  863. if ((ctxt->sax) && (!ctxt->disableSAX) &&
  864.     (ctxt->sax->processingInstruction != NULL))
  865.     ctxt->sax->processingInstruction(ctxt->userData,
  866.                                      target, buf);
  867.     }
  868.     xmlFree(buf);
  869.     xmlFree(target);
  870. } else {
  871.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  872.         ctxt->sax->error(ctxt->userData,
  873.        "xmlParsePI : no target namen");
  874.     ctxt->errNo = XML_ERR_PI_NOT_STARTED;
  875.     ctxt->wellFormed = 0;
  876.     ctxt->disableSAX = 1;
  877. }
  878. ctxt->instate = state;
  879.     }
  880. }
  881. /**
  882.  * xmlParseNotationDecl:
  883.  * @ctxt:  an XML parser context
  884.  *
  885.  * parse a notation declaration
  886.  *
  887.  * [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID |  PublicID) S? '>'
  888.  *
  889.  * Hence there is actually 3 choices:
  890.  *     'PUBLIC' S PubidLiteral
  891.  *     'PUBLIC' S PubidLiteral S SystemLiteral
  892.  * and 'SYSTEM' S SystemLiteral
  893.  *
  894.  * See the NOTE on xmlParseExternalID().
  895.  */
  896. void
  897. xmlParseNotationDecl(xmlParserCtxtPtr ctxt) {
  898.     xmlChar *name;
  899.     xmlChar *Pubid;
  900.     xmlChar *Systemid;
  901.     
  902.     if ((RAW == '<') && (NXT(1) == '!') &&
  903.         (NXT(2) == 'N') && (NXT(3) == 'O') &&
  904.         (NXT(4) == 'T') && (NXT(5) == 'A') &&
  905.         (NXT(6) == 'T') && (NXT(7) == 'I') &&
  906.         (NXT(8) == 'O') && (NXT(9) == 'N')) {
  907. xmlParserInputPtr input = ctxt->input;
  908. SHRINK;
  909. SKIP(10);
  910. if (!IS_BLANK(CUR)) {
  911.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  912. ctxt->sax->error(ctxt->userData,
  913.                  "Space required after '<!NOTATION'n");
  914.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  915.     ctxt->wellFormed = 0;
  916.     ctxt->disableSAX = 1;
  917.     return;
  918. }
  919. SKIP_BLANKS;
  920.         name = xmlParseName(ctxt);
  921. if (name == NULL) {
  922.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  923.         ctxt->sax->error(ctxt->userData,
  924.                  "NOTATION: Name expected heren");
  925.     ctxt->errNo = XML_ERR_NOTATION_NOT_STARTED;
  926.     ctxt->wellFormed = 0;
  927.     ctxt->disableSAX = 1;
  928.     return;
  929. }
  930. if (!IS_BLANK(CUR)) {
  931.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  932. ctxt->sax->error(ctxt->userData, 
  933.      "Space required after the NOTATION name'n");
  934.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  935.     ctxt->wellFormed = 0;
  936.     ctxt->disableSAX = 1;
  937.     return;
  938. }
  939. SKIP_BLANKS;
  940. /*
  941.  * Parse the IDs.
  942.  */
  943. Systemid = xmlParseExternalID(ctxt, &Pubid, 0);
  944. SKIP_BLANKS;
  945. if (RAW == '>') {
  946.     if (input != ctxt->input) {
  947. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  948.     ctxt->sax->error(ctxt->userData, 
  949. "Notation declaration doesn't start and stop in the same entityn");
  950. ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  951. ctxt->wellFormed = 0;
  952. ctxt->disableSAX = 1;
  953.     }
  954.     NEXT;
  955.     if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
  956. (ctxt->sax->notationDecl != NULL))
  957. ctxt->sax->notationDecl(ctxt->userData, name, Pubid, Systemid);
  958. } else {
  959.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  960. ctxt->sax->error(ctxt->userData,
  961.        "'>' required to close NOTATION declarationn");
  962.     ctxt->errNo = XML_ERR_NOTATION_NOT_FINISHED;
  963.     ctxt->wellFormed = 0;
  964.     ctxt->disableSAX = 1;
  965. }
  966. xmlFree(name);
  967. if (Systemid != NULL) xmlFree(Systemid);
  968. if (Pubid != NULL) xmlFree(Pubid);
  969.     }
  970. }
  971. /**
  972.  * xmlParseEntityDecl:
  973.  * @ctxt:  an XML parser context
  974.  *
  975.  * parse <!ENTITY declarations
  976.  *
  977.  * [70] EntityDecl ::= GEDecl | PEDecl
  978.  *
  979.  * [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
  980.  *
  981.  * [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
  982.  *
  983.  * [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
  984.  *
  985.  * [74] PEDef ::= EntityValue | ExternalID
  986.  *
  987.  * [76] NDataDecl ::= S 'NDATA' S Name
  988.  *
  989.  * [ VC: Notation Declared ]
  990.  * The Name must match the declared name of a notation.
  991.  */
  992. void
  993. xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
  994.     xmlChar *name = NULL;
  995.     xmlChar *value = NULL;
  996.     xmlChar *URI = NULL, *literal = NULL;
  997.     xmlChar *ndata = NULL;
  998.     int isParameter = 0;
  999.     xmlChar *orig = NULL;
  1000.     
  1001.     GROW;
  1002.     if ((RAW == '<') && (NXT(1) == '!') &&
  1003.         (NXT(2) == 'E') && (NXT(3) == 'N') &&
  1004.         (NXT(4) == 'T') && (NXT(5) == 'I') &&
  1005.         (NXT(6) == 'T') && (NXT(7) == 'Y')) {
  1006. xmlParserInputPtr input = ctxt->input;
  1007. ctxt->instate = XML_PARSER_ENTITY_DECL;
  1008. SHRINK;
  1009. SKIP(8);
  1010. if (!IS_BLANK(CUR)) {
  1011.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1012. ctxt->sax->error(ctxt->userData,
  1013.                  "Space required after '<!ENTITY'n");
  1014.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1015.     ctxt->wellFormed = 0;
  1016.     ctxt->disableSAX = 1;
  1017. }
  1018. SKIP_BLANKS;
  1019. if (RAW == '%') {
  1020.     NEXT;
  1021.     if (!IS_BLANK(CUR)) {
  1022. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1023.     ctxt->sax->error(ctxt->userData,
  1024.                      "Space required after '%'n");
  1025. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1026. ctxt->wellFormed = 0;
  1027. ctxt->disableSAX = 1;
  1028.     }
  1029.     SKIP_BLANKS;
  1030.     isParameter = 1;
  1031. }
  1032.         name = xmlParseName(ctxt);
  1033. if (name == NULL) {
  1034.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1035.         ctxt->sax->error(ctxt->userData, "xmlParseEntityDecl: no namen");
  1036.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  1037.     ctxt->wellFormed = 0;
  1038.     ctxt->disableSAX = 1;
  1039.             return;
  1040. }
  1041. if (!IS_BLANK(CUR)) {
  1042.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1043. ctxt->sax->error(ctxt->userData,
  1044.      "Space required after the entity namen");
  1045.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1046.     ctxt->wellFormed = 0;
  1047.     ctxt->disableSAX = 1;
  1048. }
  1049.         SKIP_BLANKS;
  1050. /*
  1051.  * handle the various case of definitions...
  1052.  */
  1053. if (isParameter) {
  1054.     if ((RAW == '"') || (RAW == '''))
  1055.         value = xmlParseEntityValue(ctxt, &orig);
  1056. if (value) {
  1057.     if ((ctxt->sax != NULL) &&
  1058. (!ctxt->disableSAX) && (ctxt->sax->entityDecl != NULL))
  1059. ctxt->sax->entityDecl(ctxt->userData, name,
  1060.                     XML_INTERNAL_PARAMETER_ENTITY,
  1061.     NULL, NULL, value);
  1062. }
  1063.     else {
  1064.         URI = xmlParseExternalID(ctxt, &literal, 1);
  1065. if ((URI == NULL) && (literal == NULL)) {
  1066.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1067. ctxt->sax->error(ctxt->userData,
  1068.     "Entity value requiredn");
  1069.     ctxt->errNo = XML_ERR_VALUE_REQUIRED;
  1070.     ctxt->wellFormed = 0;
  1071.     ctxt->disableSAX = 1;
  1072. }
  1073. if (URI) {
  1074.     if ((ctxt->sax != NULL) &&
  1075. (!ctxt->disableSAX) && (ctxt->sax->entityDecl != NULL))
  1076. ctxt->sax->entityDecl(ctxt->userData, name,
  1077.                     XML_EXTERNAL_PARAMETER_ENTITY,
  1078.     literal, URI, NULL);
  1079. }
  1080.     }
  1081. } else {
  1082.     if ((RAW == '"') || (RAW == ''')) {
  1083.         value = xmlParseEntityValue(ctxt, &orig);
  1084. if ((ctxt->sax != NULL) &&
  1085.     (!ctxt->disableSAX) && (ctxt->sax->entityDecl != NULL))
  1086.     ctxt->sax->entityDecl(ctxt->userData, name,
  1087. XML_INTERNAL_GENERAL_ENTITY,
  1088. NULL, NULL, value);
  1089.     } else {
  1090.         URI = xmlParseExternalID(ctxt, &literal, 1);
  1091. if ((URI == NULL) && (literal == NULL)) {
  1092.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1093. ctxt->sax->error(ctxt->userData,
  1094.     "Entity value requiredn");
  1095.     ctxt->errNo = XML_ERR_VALUE_REQUIRED;
  1096.     ctxt->wellFormed = 0;
  1097.     ctxt->disableSAX = 1;
  1098. }
  1099. if ((RAW != '>') && (!IS_BLANK(CUR))) {
  1100.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1101. ctxt->sax->error(ctxt->userData,
  1102.     "Space required before 'NDATA'n");
  1103.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1104.     ctxt->wellFormed = 0;
  1105.     ctxt->disableSAX = 1;
  1106. }
  1107. SKIP_BLANKS;
  1108. if ((RAW == 'N') && (NXT(1) == 'D') &&
  1109.     (NXT(2) == 'A') && (NXT(3) == 'T') &&
  1110.     (NXT(4) == 'A')) {
  1111.     SKIP(5);
  1112.     if (!IS_BLANK(CUR)) {
  1113. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1114.     ctxt->sax->error(ctxt->userData,
  1115.         "Space required after 'NDATA'n");
  1116. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1117. ctxt->wellFormed = 0;
  1118. ctxt->disableSAX = 1;
  1119.     }
  1120.     SKIP_BLANKS;
  1121.     ndata = xmlParseName(ctxt);
  1122.     if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
  1123.         (ctxt->sax->unparsedEntityDecl != NULL))
  1124. ctxt->sax->unparsedEntityDecl(ctxt->userData, name,
  1125.     literal, URI, ndata);
  1126. } else {
  1127.     if ((ctxt->sax != NULL) &&
  1128.         (!ctxt->disableSAX) && (ctxt->sax->entityDecl != NULL))
  1129. ctxt->sax->entityDecl(ctxt->userData, name,
  1130.     XML_EXTERNAL_GENERAL_PARSED_ENTITY,
  1131.     literal, URI, NULL);
  1132. }
  1133.     }
  1134. }
  1135. SKIP_BLANKS;
  1136. if (RAW != '>') {
  1137.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1138.         ctxt->sax->error(ctxt->userData, 
  1139.             "xmlParseEntityDecl: entity %s not terminatedn", name);
  1140.     ctxt->errNo = XML_ERR_ENTITY_NOT_FINISHED;
  1141.     ctxt->wellFormed = 0;
  1142.     ctxt->disableSAX = 1;
  1143. } else {
  1144.     if (input != ctxt->input) {
  1145. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1146.     ctxt->sax->error(ctxt->userData, 
  1147. "Entity declaration doesn't start and stop in the same entityn");
  1148. ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  1149. ctxt->wellFormed = 0;
  1150. ctxt->disableSAX = 1;
  1151.     }
  1152.     NEXT;
  1153. }
  1154. if (orig != NULL) {
  1155.     /*
  1156.      * Ugly mechanism to save the raw entity value.
  1157.      */
  1158.     xmlEntityPtr cur = NULL;
  1159.     if (isParameter) {
  1160.         if ((ctxt->sax != NULL) &&
  1161.     (ctxt->sax->getParameterEntity != NULL))
  1162.     cur = ctxt->sax->getParameterEntity(ctxt->userData, name);
  1163.     } else {
  1164.         if ((ctxt->sax != NULL) &&
  1165.     (ctxt->sax->getEntity != NULL))
  1166.     cur = ctxt->sax->getEntity(ctxt->userData, name);
  1167.     }
  1168.             if (cur != NULL) {
  1169.         if (cur->orig != NULL)
  1170.     xmlFree(orig);
  1171. else
  1172.     cur->orig = orig;
  1173.     } else
  1174. xmlFree(orig);
  1175. }
  1176. if (name != NULL) xmlFree(name);
  1177. if (value != NULL) xmlFree(value);
  1178. if (URI != NULL) xmlFree(URI);
  1179. if (literal != NULL) xmlFree(literal);
  1180. if (ndata != NULL) xmlFree(ndata);
  1181.     }
  1182. }
  1183. /**
  1184.  * xmlParseDefaultDecl:
  1185.  * @ctxt:  an XML parser context
  1186.  * @value:  Receive a possible fixed default value for the attribute
  1187.  *
  1188.  * Parse an attribute default declaration
  1189.  *
  1190.  * [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)
  1191.  *
  1192.  * [ VC: Required Attribute ]
  1193.  * if the default declaration is the keyword #REQUIRED, then the
  1194.  * attribute must be specified for all elements of the type in the
  1195.  * attribute-list declaration.
  1196.  *
  1197.  * [ VC: Attribute Default Legal ]
  1198.  * The declared default value must meet the lexical constraints of
  1199.  * the declared attribute type c.f. xmlValidateAttributeDecl()
  1200.  *
  1201.  * [ VC: Fixed Attribute Default ]
  1202.  * if an attribute has a default value declared with the #FIXED
  1203.  * keyword, instances of that attribute must match the default value. 
  1204.  *
  1205.  * [ WFC: No < in Attribute Values ]
  1206.  * handled in xmlParseAttValue()
  1207.  *
  1208.  * returns: XML_ATTRIBUTE_NONE, XML_ATTRIBUTE_REQUIRED, XML_ATTRIBUTE_IMPLIED
  1209.  *          or XML_ATTRIBUTE_FIXED. 
  1210.  */
  1211. int
  1212. xmlParseDefaultDecl(xmlParserCtxtPtr ctxt, xmlChar **value) {
  1213.     int val;
  1214.     xmlChar *ret;
  1215.     *value = NULL;
  1216.     if ((RAW == '#') && (NXT(1) == 'R') &&
  1217.         (NXT(2) == 'E') && (NXT(3) == 'Q') &&
  1218.         (NXT(4) == 'U') && (NXT(5) == 'I') &&
  1219.         (NXT(6) == 'R') && (NXT(7) == 'E') &&
  1220.         (NXT(8) == 'D')) {
  1221. SKIP(9);
  1222. return(XML_ATTRIBUTE_REQUIRED);
  1223.     }
  1224.     if ((RAW == '#') && (NXT(1) == 'I') &&
  1225.         (NXT(2) == 'M') && (NXT(3) == 'P') &&
  1226.         (NXT(4) == 'L') && (NXT(5) == 'I') &&
  1227.         (NXT(6) == 'E') && (NXT(7) == 'D')) {
  1228. SKIP(8);
  1229. return(XML_ATTRIBUTE_IMPLIED);
  1230.     }
  1231.     val = XML_ATTRIBUTE_NONE;
  1232.     if ((RAW == '#') && (NXT(1) == 'F') &&
  1233.         (NXT(2) == 'I') && (NXT(3) == 'X') &&
  1234.         (NXT(4) == 'E') && (NXT(5) == 'D')) {
  1235. SKIP(6);
  1236. val = XML_ATTRIBUTE_FIXED;
  1237. if (!IS_BLANK(CUR)) {
  1238.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1239.         ctxt->sax->error(ctxt->userData,
  1240.                  "Space required after '#FIXED'n");
  1241.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1242.     ctxt->wellFormed = 0;
  1243.     ctxt->disableSAX = 1;
  1244. }
  1245. SKIP_BLANKS;
  1246.     }
  1247.     ret = xmlParseAttValue(ctxt);
  1248.     ctxt->instate = XML_PARSER_DTD;
  1249.     if (ret == NULL) {
  1250. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1251.     ctxt->sax->error(ctxt->userData,
  1252.        "Attribute default value declaration errorn");
  1253. ctxt->wellFormed = 0;
  1254. ctxt->disableSAX = 1;
  1255.     } else
  1256.         *value = ret;
  1257.     return(val);
  1258. }
  1259. /**
  1260.  * xmlParseNotationType:
  1261.  * @ctxt:  an XML parser context
  1262.  *
  1263.  * parse an Notation attribute type.
  1264.  *
  1265.  * Note: the leading 'NOTATION' S part has already being parsed...
  1266.  *
  1267.  * [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'
  1268.  *
  1269.  * [ VC: Notation Attributes ]
  1270.  * Values of this type must match one of the notation names included
  1271.  * in the declaration; all notation names in the declaration must be declared. 
  1272.  *
  1273.  * Returns: the notation attribute tree built while parsing
  1274.  */
  1275. xmlEnumerationPtr
  1276. xmlParseNotationType(xmlParserCtxtPtr ctxt) {
  1277.     xmlChar *name;
  1278.     xmlEnumerationPtr ret = NULL, last = NULL, cur;
  1279.     if (RAW != '(') {
  1280. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1281.     ctxt->sax->error(ctxt->userData,
  1282.                      "'(' required to start 'NOTATION'n");
  1283. ctxt->errNo = XML_ERR_NOTATION_NOT_STARTED;
  1284. ctxt->wellFormed = 0;
  1285. ctxt->disableSAX = 1;
  1286. return(NULL);
  1287.     }
  1288.     SHRINK;
  1289.     do {
  1290.         NEXT;
  1291. SKIP_BLANKS;
  1292.         name = xmlParseName(ctxt);
  1293. if (name == NULL) {
  1294.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1295. ctxt->sax->error(ctxt->userData, 
  1296.                  "Name expected in NOTATION declarationn");
  1297.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  1298.     ctxt->wellFormed = 0;
  1299.     ctxt->disableSAX = 1;
  1300.     return(ret);
  1301. }
  1302. cur = xmlCreateEnumeration(name);
  1303. xmlFree(name);
  1304. if (cur == NULL) return(ret);
  1305. if (last == NULL) ret = last = cur;
  1306. else {
  1307.     last->next = cur;
  1308.     last = cur;
  1309. }
  1310. SKIP_BLANKS;
  1311.     } while (RAW == '|');
  1312.     if (RAW != ')') {
  1313. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1314.     ctxt->sax->error(ctxt->userData,
  1315.                      "')' required to finish NOTATION declarationn");
  1316. ctxt->errNo = XML_ERR_NOTATION_NOT_FINISHED;
  1317. ctxt->wellFormed = 0;
  1318. ctxt->disableSAX = 1;
  1319. if ((last != NULL) && (last != ret))
  1320.     xmlFreeEnumeration(last);
  1321. return(ret);
  1322.     }
  1323.     NEXT;
  1324.     return(ret);
  1325. }
  1326. /**
  1327.  * xmlParseEnumerationType:
  1328.  * @ctxt:  an XML parser context
  1329.  *
  1330.  * parse an Enumeration attribute type.
  1331.  *
  1332.  * [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'
  1333.  *
  1334.  * [ VC: Enumeration ]
  1335.  * Values of this type must match one of the Nmtoken tokens in
  1336.  * the declaration
  1337.  *
  1338.  * Returns: the enumeration attribute tree built while parsing
  1339.  */
  1340. xmlEnumerationPtr
  1341. xmlParseEnumerationType(xmlParserCtxtPtr ctxt) {
  1342.     xmlChar *name;
  1343.     xmlEnumerationPtr ret = NULL, last = NULL, cur;
  1344.     if (RAW != '(') {
  1345. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1346.     ctxt->sax->error(ctxt->userData,
  1347.                      "'(' required to start ATTLIST enumerationn");
  1348. ctxt->errNo = XML_ERR_ATTLIST_NOT_STARTED;
  1349. ctxt->wellFormed = 0;
  1350. ctxt->disableSAX = 1;
  1351. return(NULL);
  1352.     }
  1353.     SHRINK;
  1354.     do {
  1355.         NEXT;
  1356. SKIP_BLANKS;
  1357.         name = xmlParseNmtoken(ctxt);
  1358. if (name == NULL) {
  1359.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1360. ctxt->sax->error(ctxt->userData, 
  1361.                  "NmToken expected in ATTLIST enumerationn");
  1362.     ctxt->errNo = XML_ERR_NMTOKEN_REQUIRED;
  1363.     ctxt->wellFormed = 0;
  1364.     ctxt->disableSAX = 1;
  1365.     return(ret);
  1366. }
  1367. cur = xmlCreateEnumeration(name);
  1368. xmlFree(name);
  1369. if (cur == NULL) return(ret);
  1370. if (last == NULL) ret = last = cur;
  1371. else {
  1372.     last->next = cur;
  1373.     last = cur;
  1374. }
  1375. SKIP_BLANKS;
  1376.     } while (RAW == '|');
  1377.     if (RAW != ')') {
  1378. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1379.     ctxt->sax->error(ctxt->userData,
  1380.                      "')' required to finish ATTLIST enumerationn");
  1381. ctxt->errNo = XML_ERR_ATTLIST_NOT_FINISHED;
  1382. ctxt->wellFormed = 0;
  1383. ctxt->disableSAX = 1;
  1384. return(ret);
  1385.     }
  1386.     NEXT;
  1387.     return(ret);
  1388. }
  1389. /**
  1390.  * xmlParseEnumeratedType:
  1391.  * @ctxt:  an XML parser context
  1392.  * @tree:  the enumeration tree built while parsing
  1393.  *
  1394.  * parse an Enumerated attribute type.
  1395.  *
  1396.  * [57] EnumeratedType ::= NotationType | Enumeration
  1397.  *
  1398.  * [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'
  1399.  *
  1400.  *
  1401.  * Returns: XML_ATTRIBUTE_ENUMERATION or XML_ATTRIBUTE_NOTATION
  1402.  */
  1403. int
  1404. xmlParseEnumeratedType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) {
  1405.     if ((RAW == 'N') && (NXT(1) == 'O') &&
  1406.         (NXT(2) == 'T') && (NXT(3) == 'A') &&
  1407.         (NXT(4) == 'T') && (NXT(5) == 'I') &&
  1408. (NXT(6) == 'O') && (NXT(7) == 'N')) {
  1409. SKIP(8);
  1410. if (!IS_BLANK(CUR)) {
  1411.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1412.         ctxt->sax->error(ctxt->userData,
  1413.                  "Space required after 'NOTATION'n");
  1414.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1415.     ctxt->wellFormed = 0;
  1416.     ctxt->disableSAX = 1;
  1417.     return(0);
  1418. }
  1419.         SKIP_BLANKS;
  1420. *tree = xmlParseNotationType(ctxt);
  1421. if (*tree == NULL) return(0);
  1422. return(XML_ATTRIBUTE_NOTATION);
  1423.     }
  1424.     *tree = xmlParseEnumerationType(ctxt);
  1425.     if (*tree == NULL) return(0);
  1426.     return(XML_ATTRIBUTE_ENUMERATION);
  1427. }
  1428. /**
  1429.  * xmlParseAttributeType:
  1430.  * @ctxt:  an XML parser context
  1431.  * @tree:  the enumeration tree built while parsing
  1432.  *
  1433.  * parse the Attribute list def for an element
  1434.  *
  1435.  * [54] AttType ::= StringType | TokenizedType | EnumeratedType
  1436.  *
  1437.  * [55] StringType ::= 'CDATA'
  1438.  *
  1439.  * [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' |
  1440.  *                        'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'
  1441.  *
  1442.  * Validity constraints for attribute values syntax are checked in
  1443.  * xmlValidateAttributeValue()
  1444.  *
  1445.  * [ VC: ID ]
  1446.  * Values of type ID must match the Name production. A name must not
  1447.  * appear more than once in an XML document as a value of this type;
  1448.  * i.e., ID values must uniquely identify the elements which bear them.
  1449.  *
  1450.  * [ VC: One ID per Element Type ]
  1451.  * No element type may have more than one ID attribute specified.
  1452.  *
  1453.  * [ VC: ID Attribute Default ]
  1454.  * An ID attribute must have a declared default of #IMPLIED or #REQUIRED.
  1455.  *
  1456.  * [ VC: IDREF ]
  1457.  * Values of type IDREF must match the Name production, and values
  1458.  * of type IDREFS must match Names; each IDREF Name must match the value
  1459.  * of an ID attribute on some element in the XML document; i.e. IDREF
  1460.  * values must match the value of some ID attribute.
  1461.  *
  1462.  * [ VC: Entity Name ]
  1463.  * Values of type ENTITY must match the Name production, values
  1464.  * of type ENTITIES must match Names; each Entity Name must match the
  1465.  * name of an unparsed entity declared in the DTD.  
  1466.  *
  1467.  * [ VC: Name Token ]
  1468.  * Values of type NMTOKEN must match the Nmtoken production; values
  1469.  * of type NMTOKENS must match Nmtokens. 
  1470.  *
  1471.  * Returns the attribute type
  1472.  */
  1473. int 
  1474. xmlParseAttributeType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) {
  1475.     SHRINK;
  1476.     if ((RAW == 'C') && (NXT(1) == 'D') &&
  1477.         (NXT(2) == 'A') && (NXT(3) == 'T') &&
  1478.         (NXT(4) == 'A')) {
  1479. SKIP(5);
  1480. return(XML_ATTRIBUTE_CDATA);
  1481.      } else if ((RAW == 'I') && (NXT(1) == 'D') &&
  1482.         (NXT(2) == 'R') && (NXT(3) == 'E') &&
  1483.         (NXT(4) == 'F') && (NXT(5) == 'S')) {
  1484. SKIP(6);
  1485. return(XML_ATTRIBUTE_IDREFS);
  1486.      } else if ((RAW == 'I') && (NXT(1) == 'D') &&
  1487.         (NXT(2) == 'R') && (NXT(3) == 'E') &&
  1488.         (NXT(4) == 'F')) {
  1489. SKIP(5);
  1490. return(XML_ATTRIBUTE_IDREF);
  1491.      } else if ((RAW == 'I') && (NXT(1) == 'D')) {
  1492.         SKIP(2);
  1493. return(XML_ATTRIBUTE_ID);
  1494.      } else if ((RAW == 'E') && (NXT(1) == 'N') &&
  1495.         (NXT(2) == 'T') && (NXT(3) == 'I') &&
  1496.         (NXT(4) == 'T') && (NXT(5) == 'Y')) {
  1497. SKIP(6);
  1498. return(XML_ATTRIBUTE_ENTITY);
  1499.      } else if ((RAW == 'E') && (NXT(1) == 'N') &&
  1500.         (NXT(2) == 'T') && (NXT(3) == 'I') &&
  1501.         (NXT(4) == 'T') && (NXT(5) == 'I') &&
  1502.         (NXT(6) == 'E') && (NXT(7) == 'S')) {
  1503. SKIP(8);
  1504. return(XML_ATTRIBUTE_ENTITIES);
  1505.      } else if ((RAW == 'N') && (NXT(1) == 'M') &&
  1506.         (NXT(2) == 'T') && (NXT(3) == 'O') &&
  1507.         (NXT(4) == 'K') && (NXT(5) == 'E') &&
  1508.         (NXT(6) == 'N') && (NXT(7) == 'S')) {
  1509. SKIP(8);
  1510. return(XML_ATTRIBUTE_NMTOKENS);
  1511.      } else if ((RAW == 'N') && (NXT(1) == 'M') &&
  1512.         (NXT(2) == 'T') && (NXT(3) == 'O') &&
  1513.         (NXT(4) == 'K') && (NXT(5) == 'E') &&
  1514.         (NXT(6) == 'N')) {
  1515. SKIP(7);
  1516. return(XML_ATTRIBUTE_NMTOKEN);
  1517.      }
  1518.      return(xmlParseEnumeratedType(ctxt, tree));
  1519. }
  1520. /**
  1521.  * xmlParseAttributeListDecl:
  1522.  * @ctxt:  an XML parser context
  1523.  *
  1524.  * : parse the Attribute list def for an element
  1525.  *
  1526.  * [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
  1527.  *
  1528.  * [53] AttDef ::= S Name S AttType S DefaultDecl
  1529.  *
  1530.  */
  1531. void
  1532. xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt) {
  1533.     xmlChar *elemName;
  1534.     xmlChar *attrName;
  1535.     xmlEnumerationPtr tree;
  1536.     if ((RAW == '<') && (NXT(1) == '!') &&
  1537.         (NXT(2) == 'A') && (NXT(3) == 'T') &&
  1538.         (NXT(4) == 'T') && (NXT(5) == 'L') &&
  1539.         (NXT(6) == 'I') && (NXT(7) == 'S') &&
  1540.         (NXT(8) == 'T')) {
  1541. xmlParserInputPtr input = ctxt->input;
  1542. SKIP(9);
  1543. if (!IS_BLANK(CUR)) {
  1544.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1545.         ctxt->sax->error(ctxt->userData,
  1546.                  "Space required after '<!ATTLIST'n");
  1547.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1548.     ctxt->wellFormed = 0;
  1549.     ctxt->disableSAX = 1;
  1550. }
  1551.         SKIP_BLANKS;
  1552.         elemName = xmlParseName(ctxt);
  1553. if (elemName == NULL) {
  1554.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1555.         ctxt->sax->error(ctxt->userData,
  1556.                  "ATTLIST: no name for Elementn");
  1557.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  1558.     ctxt->wellFormed = 0;
  1559.     ctxt->disableSAX = 1;
  1560.     return;
  1561. }
  1562. SKIP_BLANKS;
  1563. while (RAW != '>') {
  1564.     const xmlChar *check = CUR_PTR;
  1565.     int type;
  1566.     int def;
  1567.     xmlChar *defaultValue = NULL;
  1568.             tree = NULL;
  1569.     attrName = xmlParseName(ctxt);
  1570.     if (attrName == NULL) {
  1571. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1572.     ctxt->sax->error(ctxt->userData,
  1573.                      "ATTLIST: no name for Attributen");
  1574. ctxt->errNo = XML_ERR_NAME_REQUIRED;
  1575. ctxt->wellFormed = 0;
  1576. ctxt->disableSAX = 1;
  1577. break;
  1578.     }
  1579.     GROW;
  1580.     if (!IS_BLANK(CUR)) {
  1581. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1582.     ctxt->sax->error(ctxt->userData, 
  1583.         "Space required after the attribute namen");
  1584. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1585. ctxt->wellFormed = 0;
  1586. ctxt->disableSAX = 1;
  1587.                 if (attrName != NULL)
  1588.     xmlFree(attrName);
  1589.                 if (defaultValue != NULL)
  1590.     xmlFree(defaultValue);
  1591. break;
  1592.     }
  1593.     SKIP_BLANKS;
  1594.     type = xmlParseAttributeType(ctxt, &tree);
  1595.     if (type <= 0) {
  1596.                 if (attrName != NULL)
  1597.     xmlFree(attrName);
  1598.                 if (defaultValue != NULL)
  1599.     xmlFree(defaultValue);
  1600.         break;
  1601.     }
  1602.     GROW;
  1603.     if (!IS_BLANK(CUR)) {
  1604. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1605.     ctxt->sax->error(ctxt->userData, 
  1606.         "Space required after the attribute typen");
  1607. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1608. ctxt->wellFormed = 0;
  1609. ctxt->disableSAX = 1;
  1610.                 if (attrName != NULL)
  1611.     xmlFree(attrName);
  1612.                 if (defaultValue != NULL)
  1613.     xmlFree(defaultValue);
  1614.         if (tree != NULL)
  1615.     xmlFreeEnumeration(tree);
  1616. break;
  1617.     }
  1618.     SKIP_BLANKS;
  1619.     def = xmlParseDefaultDecl(ctxt, &defaultValue);
  1620.     if (def <= 0) {
  1621.                 if (attrName != NULL)
  1622.     xmlFree(attrName);
  1623.                 if (defaultValue != NULL)
  1624.     xmlFree(defaultValue);
  1625.         if (tree != NULL)
  1626.     xmlFreeEnumeration(tree);
  1627.         break;
  1628.     }
  1629.     GROW;
  1630.             if (RAW != '>') {
  1631. if (!IS_BLANK(CUR)) {
  1632.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1633. ctxt->sax->error(ctxt->userData, 
  1634. "Space required after the attribute default valuen");
  1635.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  1636.     ctxt->wellFormed = 0;
  1637.     ctxt->disableSAX = 1;
  1638.     if (attrName != NULL)
  1639. xmlFree(attrName);
  1640.     if (defaultValue != NULL)
  1641. xmlFree(defaultValue);
  1642.     if (tree != NULL)
  1643. xmlFreeEnumeration(tree);
  1644.     break;
  1645. }
  1646. SKIP_BLANKS;
  1647.     }
  1648.     if (check == CUR_PTR) {
  1649.         if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1650.     ctxt->sax->error(ctxt->userData, 
  1651.     "xmlParseAttributeListDecl: detected internal errorn");
  1652. ctxt->errNo = XML_ERR_INTERNAL_ERROR;
  1653. if (attrName != NULL)
  1654.     xmlFree(attrName);
  1655. if (defaultValue != NULL)
  1656.     xmlFree(defaultValue);
  1657.         if (tree != NULL)
  1658.     xmlFreeEnumeration(tree);
  1659. break;
  1660.     }
  1661.     if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
  1662. (ctxt->sax->attributeDecl != NULL))
  1663. ctxt->sax->attributeDecl(ctxt->userData, elemName, attrName,
  1664.                         type, def, defaultValue, tree);
  1665.     if (attrName != NULL)
  1666. xmlFree(attrName);
  1667.     if (defaultValue != NULL)
  1668.         xmlFree(defaultValue);
  1669.     GROW;
  1670. }
  1671. if (RAW == '>') {
  1672.     if (input != ctxt->input) {
  1673. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1674.     ctxt->sax->error(ctxt->userData, 
  1675. "Attribute list declaration doesn't start and stop in the same entityn");
  1676. ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  1677. ctxt->wellFormed = 0;
  1678. ctxt->disableSAX = 1;
  1679.     }
  1680.     NEXT;
  1681. }
  1682. xmlFree(elemName);
  1683.     }
  1684. }
  1685. /**
  1686.  * xmlParseElementMixedContentDecl:
  1687.  * @ctxt:  an XML parser context
  1688.  *
  1689.  * parse the declaration for a Mixed Element content
  1690.  * The leading '(' and spaces have been skipped in xmlParseElementContentDecl
  1691.  * 
  1692.  * [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' |
  1693.  *                '(' S? '#PCDATA' S? ')'
  1694.  *
  1695.  * [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49])
  1696.  *
  1697.  * [ VC: No Duplicate Types ]
  1698.  * The same name must not appear more than once in a single
  1699.  * mixed-content declaration. 
  1700.  *
  1701.  * returns: the list of the xmlElementContentPtr describing the element choices
  1702.  */
  1703. xmlElementContentPtr
  1704. xmlParseElementMixedContentDecl(xmlParserCtxtPtr ctxt) {
  1705.     xmlElementContentPtr ret = NULL, cur = NULL, n;
  1706.     xmlChar *elem = NULL;
  1707.     GROW;
  1708.     if ((RAW == '#') && (NXT(1) == 'P') &&
  1709.         (NXT(2) == 'C') && (NXT(3) == 'D') &&
  1710.         (NXT(4) == 'A') && (NXT(5) == 'T') &&
  1711.         (NXT(6) == 'A')) {
  1712. SKIP(7);
  1713. SKIP_BLANKS;
  1714. SHRINK;
  1715. if (RAW == ')') {
  1716.     ctxt->entity = ctxt->input;
  1717.     NEXT;
  1718.     ret = xmlNewElementContent(NULL, XML_ELEMENT_CONTENT_PCDATA);
  1719.     if (RAW == '*') {
  1720. ret->ocur = XML_ELEMENT_CONTENT_MULT;
  1721. NEXT;
  1722.     }
  1723.     return(ret);
  1724. }
  1725. if ((RAW == '(') || (RAW == '|')) {
  1726.     ret = cur = xmlNewElementContent(NULL, XML_ELEMENT_CONTENT_PCDATA);
  1727.     if (ret == NULL) return(NULL);
  1728. }
  1729. while (RAW == '|') {
  1730.     NEXT;
  1731.     if (elem == NULL) {
  1732.         ret = xmlNewElementContent(NULL, XML_ELEMENT_CONTENT_OR);
  1733. if (ret == NULL) return(NULL);
  1734. ret->c1 = cur;
  1735. cur = ret;
  1736.     } else {
  1737.         n = xmlNewElementContent(NULL, XML_ELEMENT_CONTENT_OR);
  1738. if (n == NULL) return(NULL);
  1739. n->c1 = xmlNewElementContent(elem, XML_ELEMENT_CONTENT_ELEMENT);
  1740.         cur->c2 = n;
  1741. cur = n;
  1742. xmlFree(elem);
  1743.     }
  1744.     SKIP_BLANKS;
  1745.     elem = xmlParseName(ctxt);
  1746.     if (elem == NULL) {
  1747. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1748.     ctxt->sax->error(ctxt->userData, 
  1749. "xmlParseElementMixedContentDecl : Name expectedn");
  1750. ctxt->errNo = XML_ERR_NAME_REQUIRED;
  1751. ctxt->wellFormed = 0;
  1752. ctxt->disableSAX = 1;
  1753. xmlFreeElementContent(cur);
  1754. return(NULL);
  1755.     }
  1756.     SKIP_BLANKS;
  1757.     GROW;
  1758. }
  1759. if ((RAW == ')') && (NXT(1) == '*')) {
  1760.     if (elem != NULL) {
  1761. cur->c2 = xmlNewElementContent(elem,
  1762.                                XML_ELEMENT_CONTENT_ELEMENT);
  1763.         xmlFree(elem);
  1764.             }
  1765.     ret->ocur = XML_ELEMENT_CONTENT_MULT;
  1766.     ctxt->entity = ctxt->input;
  1767.     SKIP(2);
  1768. } else {
  1769.     if (elem != NULL) xmlFree(elem);
  1770.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1771. ctxt->sax->error(ctxt->userData, 
  1772.     "xmlParseElementMixedContentDecl : '|' or ')*' expectedn");
  1773.     ctxt->errNo = XML_ERR_MIXED_NOT_STARTED;
  1774.     ctxt->wellFormed = 0;
  1775.     ctxt->disableSAX = 1;
  1776.     xmlFreeElementContent(ret);
  1777.     return(NULL);
  1778. }
  1779.     } else {
  1780. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1781.     ctxt->sax->error(ctxt->userData, 
  1782. "xmlParseElementMixedContentDecl : '#PCDATA' expectedn");
  1783. ctxt->errNo = XML_ERR_PCDATA_REQUIRED;
  1784. ctxt->wellFormed = 0;
  1785. ctxt->disableSAX = 1;
  1786.     }
  1787.     return(ret);
  1788. }
  1789. /**
  1790.  * xmlParseElementChildrenContentDecl:
  1791.  * @ctxt:  an XML parser context
  1792.  *
  1793.  * parse the declaration for a Mixed Element content
  1794.  * The leading '(' and spaces have been skipped in xmlParseElementContentDecl
  1795.  * 
  1796.  *
  1797.  * [47] children ::= (choice | seq) ('?' | '*' | '+')?
  1798.  *
  1799.  * [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
  1800.  *
  1801.  * [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')'
  1802.  *
  1803.  * [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'
  1804.  *
  1805.  * [ VC: Proper Group/PE Nesting ] applies to [49] and [50]
  1806.  * TODO Parameter-entity replacement text must be properly nested
  1807.  * with parenthetized groups. That is to say, if either of the
  1808.  * opening or closing parentheses in a choice, seq, or Mixed
  1809.  * construct is contained in the replacement text for a parameter
  1810.  * entity, both must be contained in the same replacement text. For
  1811.  * interoperability, if a parameter-entity reference appears in a
  1812.  * choice, seq, or Mixed construct, its replacement text should not
  1813.  * be empty, and neither the first nor last non-blank character of
  1814.  * the replacement text should be a connector (| or ,).
  1815.  *
  1816.  * returns: the tree of xmlElementContentPtr describing the element 
  1817.  *          hierarchy.
  1818.  */
  1819. xmlElementContentPtr
  1820. xmlParseElementChildrenContentDecl(xmlParserCtxtPtr ctxt) {
  1821.     xmlElementContentPtr ret = NULL, cur = NULL, last = NULL, op = NULL;
  1822.     xmlChar *elem;
  1823.     xmlChar type = 0;
  1824.     SKIP_BLANKS;
  1825.     GROW;
  1826.     if (RAW == '(') {
  1827.         /* Recurse on first child */
  1828. NEXT;
  1829. SKIP_BLANKS;
  1830.         cur = ret = xmlParseElementChildrenContentDecl(ctxt);
  1831. SKIP_BLANKS;
  1832. GROW;
  1833.     } else {
  1834. elem = xmlParseName(ctxt);
  1835. if (elem == NULL) {
  1836.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1837. ctxt->sax->error(ctxt->userData, 
  1838. "xmlParseElementChildrenContentDecl : Name or '(' expectedn");
  1839.     ctxt->errNo = XML_ERR_ELEMCONTENT_NOT_STARTED;
  1840.     ctxt->wellFormed = 0;
  1841.     ctxt->disableSAX = 1;
  1842.     return(NULL);
  1843. }
  1844.         cur = ret = xmlNewElementContent(elem, XML_ELEMENT_CONTENT_ELEMENT);
  1845. GROW;
  1846. if (RAW == '?') {
  1847.     cur->ocur = XML_ELEMENT_CONTENT_OPT;
  1848.     NEXT;
  1849. } else if (RAW == '*') {
  1850.     cur->ocur = XML_ELEMENT_CONTENT_MULT;
  1851.     NEXT;
  1852. } else if (RAW == '+') {
  1853.     cur->ocur = XML_ELEMENT_CONTENT_PLUS;
  1854.     NEXT;
  1855. } else {
  1856.     cur->ocur = XML_ELEMENT_CONTENT_ONCE;
  1857. }
  1858. xmlFree(elem);
  1859. GROW;
  1860.     }
  1861.     SKIP_BLANKS;
  1862.     SHRINK;
  1863.     while (RAW != ')') {
  1864.         /*
  1865.  * Each loop we parse one separator and one element.
  1866.  */
  1867.         if (RAW == ',') {
  1868.     if (type == 0) type = CUR;
  1869.     /*
  1870.      * Detect "Name | Name , Name" error
  1871.      */
  1872.     else if (type != CUR) {
  1873. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1874.     ctxt->sax->error(ctxt->userData, 
  1875.     "xmlParseElementChildrenContentDecl : '%c' expectedn",
  1876.     type);
  1877. ctxt->errNo = XML_ERR_SEPARATOR_REQUIRED;
  1878. ctxt->wellFormed = 0;
  1879. ctxt->disableSAX = 1;
  1880. if ((op != NULL) && (op != ret))
  1881.     xmlFreeElementContent(op);
  1882. if ((last != NULL) && (last != ret))
  1883.     xmlFreeElementContent(last);
  1884. if (ret != NULL)
  1885.     xmlFreeElementContent(ret);
  1886. return(NULL);
  1887.     }
  1888.     NEXT;
  1889.     op = xmlNewElementContent(NULL, XML_ELEMENT_CONTENT_SEQ);
  1890.     if (op == NULL) {
  1891.         xmlFreeElementContent(ret);
  1892. return(NULL);
  1893.     }
  1894.     if (last == NULL) {
  1895. op->c1 = ret;
  1896. ret = cur = op;
  1897.     } else {
  1898.         cur->c2 = op;
  1899. op->c1 = last;
  1900. cur =op;
  1901. last = NULL;
  1902.     }
  1903. } else if (RAW == '|') {
  1904.     if (type == 0) type = CUR;
  1905.     /*
  1906.      * Detect "Name , Name | Name" error
  1907.      */
  1908.     else if (type != CUR) {
  1909. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1910.     ctxt->sax->error(ctxt->userData, 
  1911.     "xmlParseElementChildrenContentDecl : '%c' expectedn",
  1912.     type);
  1913. ctxt->errNo = XML_ERR_SEPARATOR_REQUIRED;
  1914. ctxt->wellFormed = 0;
  1915. ctxt->disableSAX = 1;
  1916. if ((op != NULL) && (op != ret))
  1917.     xmlFreeElementContent(op);
  1918. if ((last != NULL) && (last != ret))
  1919.     xmlFreeElementContent(last);
  1920. if (ret != NULL)
  1921.     xmlFreeElementContent(ret);
  1922. return(NULL);
  1923.     }
  1924.     NEXT;
  1925.     op = xmlNewElementContent(NULL, XML_ELEMENT_CONTENT_OR);
  1926.     if (op == NULL) {
  1927. if ((op != NULL) && (op != ret))
  1928.     xmlFreeElementContent(op);
  1929. if ((last != NULL) && (last != ret))
  1930.     xmlFreeElementContent(last);
  1931. if (ret != NULL)
  1932.     xmlFreeElementContent(ret);
  1933. return(NULL);
  1934.     }
  1935.     if (last == NULL) {
  1936. op->c1 = ret;
  1937. ret = cur = op;
  1938.     } else {
  1939.         cur->c2 = op;
  1940. op->c1 = last;
  1941. cur =op;
  1942. last = NULL;
  1943.     }
  1944. } else {
  1945.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1946. ctxt->sax->error(ctxt->userData, 
  1947.     "xmlParseElementChildrenContentDecl : ',' '|' or ')' expectedn");
  1948.     ctxt->wellFormed = 0;
  1949.     ctxt->disableSAX = 1;
  1950.     ctxt->errNo = XML_ERR_ELEMCONTENT_NOT_FINISHED;
  1951.     if ((op != NULL) && (op != ret))
  1952. xmlFreeElementContent(op);
  1953.     if ((last != NULL) && (last != ret))
  1954. xmlFreeElementContent(last);
  1955.     if (ret != NULL)
  1956. xmlFreeElementContent(ret);
  1957.     return(NULL);
  1958. }
  1959. GROW;
  1960. SKIP_BLANKS;
  1961. GROW;
  1962. if (RAW == '(') {
  1963.     /* Recurse on second child */
  1964.     NEXT;
  1965.     SKIP_BLANKS;
  1966.     last = xmlParseElementChildrenContentDecl(ctxt);
  1967.     SKIP_BLANKS;
  1968. } else {
  1969.     elem = xmlParseName(ctxt);
  1970.     if (elem == NULL) {
  1971. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  1972.     ctxt->sax->error(ctxt->userData, 
  1973. "xmlParseElementChildrenContentDecl : Name or '(' expectedn");
  1974. ctxt->errNo = XML_ERR_ELEMCONTENT_NOT_STARTED;
  1975. ctxt->wellFormed = 0;
  1976. ctxt->disableSAX = 1;
  1977. if ((op != NULL) && (op != ret))
  1978.     xmlFreeElementContent(op);
  1979. if ((last != NULL) && (last != ret))
  1980.     xmlFreeElementContent(last);
  1981. if (ret != NULL)
  1982.     xmlFreeElementContent(ret);
  1983. return(NULL);
  1984.     }
  1985.     last = xmlNewElementContent(elem, XML_ELEMENT_CONTENT_ELEMENT);
  1986.     xmlFree(elem);
  1987.     if (RAW == '?') {
  1988. last->ocur = XML_ELEMENT_CONTENT_OPT;
  1989. NEXT;
  1990.     } else if (RAW == '*') {
  1991. last->ocur = XML_ELEMENT_CONTENT_MULT;
  1992. NEXT;
  1993.     } else if (RAW == '+') {
  1994. last->ocur = XML_ELEMENT_CONTENT_PLUS;
  1995. NEXT;
  1996.     } else {
  1997. last->ocur = XML_ELEMENT_CONTENT_ONCE;
  1998.     }
  1999. }
  2000. SKIP_BLANKS;
  2001. GROW;
  2002.     }
  2003.     if ((cur != NULL) && (last != NULL)) {
  2004.         cur->c2 = last;
  2005.     }
  2006.     ctxt->entity = ctxt->input;
  2007.     NEXT;
  2008.     if (RAW == '?') {
  2009.         ret->ocur = XML_ELEMENT_CONTENT_OPT;
  2010. NEXT;
  2011.     } else if (RAW == '*') {
  2012.         ret->ocur = XML_ELEMENT_CONTENT_MULT;
  2013. NEXT;
  2014.     } else if (RAW == '+') {
  2015.         ret->ocur = XML_ELEMENT_CONTENT_PLUS;
  2016. NEXT;
  2017.     }
  2018.     return(ret);
  2019. }
  2020. /**
  2021.  * xmlParseElementContentDecl:
  2022.  * @ctxt:  an XML parser context
  2023.  * @name:  the name of the element being defined.
  2024.  * @result:  the Element Content pointer will be stored here if any
  2025.  *
  2026.  * parse the declaration for an Element content either Mixed or Children,
  2027.  * the cases EMPTY and ANY are handled directly in xmlParseElementDecl
  2028.  * 
  2029.  * [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children
  2030.  *
  2031.  * returns: the type of element content XML_ELEMENT_TYPE_xxx
  2032.  */
  2033. int
  2034. xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, xmlChar *name,
  2035.                            xmlElementContentPtr *result) {
  2036.     xmlElementContentPtr tree = NULL;
  2037.     xmlParserInputPtr input = ctxt->input;
  2038.     int res;
  2039.     *result = NULL;
  2040.     if (RAW != '(') {
  2041. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2042.     ctxt->sax->error(ctxt->userData, 
  2043. "xmlParseElementContentDecl : '(' expectedn");
  2044. ctxt->errNo = XML_ERR_ELEMCONTENT_NOT_STARTED;
  2045. ctxt->wellFormed = 0;
  2046. ctxt->disableSAX = 1;
  2047. return(-1);
  2048.     }
  2049.     NEXT;
  2050.     GROW;
  2051.     SKIP_BLANKS;
  2052.     if ((RAW == '#') && (NXT(1) == 'P') &&
  2053.         (NXT(2) == 'C') && (NXT(3) == 'D') &&
  2054.         (NXT(4) == 'A') && (NXT(5) == 'T') &&
  2055.         (NXT(6) == 'A')) {
  2056.         tree = xmlParseElementMixedContentDecl(ctxt);
  2057. res = XML_ELEMENT_TYPE_MIXED;
  2058.     } else {
  2059.         tree = xmlParseElementChildrenContentDecl(ctxt);
  2060. res = XML_ELEMENT_TYPE_ELEMENT;
  2061.     }
  2062.     if ((ctxt->entity != NULL) && (input != ctxt->entity)) {
  2063. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2064.     ctxt->sax->error(ctxt->userData, 
  2065. "Element content declaration doesn't start and stop in the same entityn");
  2066. ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  2067. ctxt->wellFormed = 0;
  2068. ctxt->disableSAX = 1;
  2069.     }
  2070.     SKIP_BLANKS;
  2071.     /****************************
  2072.     if (RAW != ')') {
  2073. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2074.     ctxt->sax->error(ctxt->userData, 
  2075. "xmlParseElementContentDecl : ')' expectedn");
  2076. ctxt->wellFormed = 0;
  2077. ctxt->disableSAX = 1;
  2078. return(-1);
  2079.     }
  2080.      ****************************/
  2081.     *result = tree;
  2082.     return(res);
  2083. }
  2084. /**
  2085.  * xmlParseElementDecl:
  2086.  * @ctxt:  an XML parser context
  2087.  *
  2088.  * parse an Element declaration.
  2089.  *
  2090.  * [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
  2091.  *
  2092.  * [ VC: Unique Element Type Declaration ]
  2093.  * No element type may be declared more than once
  2094.  *
  2095.  * Returns the type of the element, or -1 in case of error
  2096.  */
  2097. int
  2098. xmlParseElementDecl(xmlParserCtxtPtr ctxt) {
  2099.     xmlChar *name;
  2100.     int ret = -1;
  2101.     xmlElementContentPtr content  = NULL;
  2102.     GROW;
  2103.     if ((RAW == '<') && (NXT(1) == '!') &&
  2104.         (NXT(2) == 'E') && (NXT(3) == 'L') &&
  2105.         (NXT(4) == 'E') && (NXT(5) == 'M') &&
  2106.         (NXT(6) == 'E') && (NXT(7) == 'N') &&
  2107.         (NXT(8) == 'T')) {
  2108. xmlParserInputPtr input = ctxt->input;
  2109. SKIP(9);
  2110. if (!IS_BLANK(CUR)) {
  2111.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2112. ctxt->sax->error(ctxt->userData, 
  2113.     "Space required after 'ELEMENT'n");
  2114.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  2115.     ctxt->wellFormed = 0;
  2116.     ctxt->disableSAX = 1;
  2117. }
  2118.         SKIP_BLANKS;
  2119.         name = xmlParseName(ctxt);
  2120. if (name == NULL) {
  2121.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2122.         ctxt->sax->error(ctxt->userData,
  2123.    "xmlParseElementDecl: no name for Elementn");
  2124.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  2125.     ctxt->wellFormed = 0;
  2126.     ctxt->disableSAX = 1;
  2127.     return(-1);
  2128. }
  2129. if (!IS_BLANK(CUR)) {
  2130.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2131. ctxt->sax->error(ctxt->userData, 
  2132.     "Space required after the element namen");
  2133.     ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  2134.     ctxt->wellFormed = 0;
  2135.     ctxt->disableSAX = 1;
  2136. }
  2137.         SKIP_BLANKS;
  2138. if ((RAW == 'E') && (NXT(1) == 'M') &&
  2139.     (NXT(2) == 'P') && (NXT(3) == 'T') &&
  2140.     (NXT(4) == 'Y')) {
  2141.     SKIP(5);
  2142.     /*
  2143.      * Element must always be empty.
  2144.      */
  2145.     ret = XML_ELEMENT_TYPE_EMPTY;
  2146. } else if ((RAW == 'A') && (NXT(1) == 'N') &&
  2147.            (NXT(2) == 'Y')) {
  2148.     SKIP(3);
  2149.     /*
  2150.      * Element is a generic container.
  2151.      */
  2152.     ret = XML_ELEMENT_TYPE_ANY;
  2153. } else if (RAW == '(') {
  2154.     ret = xmlParseElementContentDecl(ctxt, name, &content);
  2155. } else {
  2156.     /*
  2157.      * [ WFC: PEs in Internal Subset ] error handling.
  2158.      */
  2159.     if ((RAW == '%') && (ctxt->external == 0) &&
  2160.         (ctxt->inputNr == 1)) {
  2161. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2162.     ctxt->sax->error(ctxt->userData, 
  2163.   "PEReference: forbidden within markup decl in internal subsetn");
  2164. ctxt->errNo = XML_ERR_PEREF_IN_INT_SUBSET;
  2165.     } else {
  2166. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2167.     ctxt->sax->error(ctxt->userData, 
  2168.       "xmlParseElementDecl: 'EMPTY', 'ANY' or '(' expectedn");
  2169. ctxt->errNo = XML_ERR_ELEMCONTENT_NOT_STARTED;
  2170.             }
  2171.     ctxt->wellFormed = 0;
  2172.     ctxt->disableSAX = 1;
  2173.     if (name != NULL) xmlFree(name);
  2174.     return(-1);
  2175. }
  2176. SKIP_BLANKS;
  2177. /*
  2178.  * Pop-up of finished entities.
  2179.  */
  2180. while ((RAW == 0) && (ctxt->inputNr > 1))
  2181.     xmlPopInput(ctxt);
  2182. SKIP_BLANKS;
  2183. if (RAW != '>') {
  2184.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2185.         ctxt->sax->error(ctxt->userData, 
  2186.           "xmlParseElementDecl: expected '>' at the endn");
  2187.     ctxt->errNo = XML_ERR_GT_REQUIRED;
  2188.     ctxt->wellFormed = 0;
  2189.     ctxt->disableSAX = 1;
  2190. } else {
  2191.     if (input != ctxt->input) {
  2192. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2193.     ctxt->sax->error(ctxt->userData, 
  2194. "Element declaration doesn't start and stop in the same entityn");
  2195. ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
  2196. ctxt->wellFormed = 0;
  2197. ctxt->disableSAX = 1;
  2198.     }
  2199.     NEXT;
  2200.     if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
  2201. (ctxt->sax->elementDecl != NULL))
  2202.         ctxt->sax->elementDecl(ctxt->userData, name, ret,
  2203.                        content);
  2204. }
  2205. if (content != NULL) {
  2206.     xmlFreeElementContent(content);
  2207. }
  2208. if (name != NULL) {
  2209.     xmlFree(name);
  2210. }
  2211.     }
  2212.     return(ret);
  2213. }
  2214. /**
  2215.  * xmlParseMarkupDecl:
  2216.  * @ctxt:  an XML parser context
  2217.  * 
  2218.  * parse Markup declarations
  2219.  *
  2220.  * [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl |
  2221.  *                     NotationDecl | PI | Comment
  2222.  *
  2223.  * [ VC: Proper Declaration/PE Nesting ]
  2224.  * TODO Parameter-entity replacement text must be properly nested with
  2225.  * markup declarations. That is to say, if either the first character
  2226.  * or the last character of a markup declaration (markupdecl above) is
  2227.  * contained in the replacement text for a parameter-entity reference,
  2228.  * both must be contained in the same replacement text.
  2229.  *
  2230.  * [ WFC: PEs in Internal Subset ]
  2231.  * In the internal DTD subset, parameter-entity references can occur
  2232.  * only where markup declarations can occur, not within markup declarations.
  2233.  * (This does not apply to references that occur in external parameter
  2234.  * entities or to the external subset.) 
  2235.  */
  2236. void
  2237. xmlParseMarkupDecl(xmlParserCtxtPtr ctxt) {
  2238.     GROW;
  2239.     xmlParseElementDecl(ctxt);
  2240.     xmlParseAttributeListDecl(ctxt);
  2241.     xmlParseEntityDecl(ctxt);
  2242.     xmlParseNotationDecl(ctxt);
  2243.     xmlParsePI(ctxt);
  2244.     xmlParseComment(ctxt);
  2245.     /*
  2246.      * This is only for internal subset. On external entities,
  2247.      * the replacement is done before parsing stage
  2248.      */
  2249.     if ((ctxt->external == 0) && (ctxt->inputNr == 1))
  2250. xmlParsePEReference(ctxt);
  2251.     ctxt->instate = XML_PARSER_DTD;
  2252. }
  2253. /**
  2254.  * xmlParseTextDecl:
  2255.  * @ctxt:  an XML parser context
  2256.  * 
  2257.  * parse an XML declaration header for external entities
  2258.  *
  2259.  * [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
  2260.  *
  2261.  * Question: Seems that EncodingDecl is mandatory ? Is that a typo ?
  2262.  */
  2263. void
  2264. xmlParseTextDecl(xmlParserCtxtPtr ctxt) {
  2265.     xmlChar *version;
  2266.     /*
  2267.      * We know that '<?xml' is here.
  2268.      */
  2269.     SKIP(5);
  2270.     if (!IS_BLANK(CUR)) {
  2271. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2272.     ctxt->sax->error(ctxt->userData,
  2273.                      "Space needed after '<?xml'n");
  2274. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  2275. ctxt->wellFormed = 0;
  2276. ctxt->disableSAX = 1;
  2277.     }
  2278.     SKIP_BLANKS;
  2279.     /*
  2280.      * We may have the VersionInfo here.
  2281.      */
  2282.     version = xmlParseVersionInfo(ctxt);
  2283.     if (version == NULL)
  2284. version = xmlCharStrdup(XML_DEFAULT_VERSION);
  2285.     ctxt->input->version = version;
  2286.     /*
  2287.      * We must have the encoding declaration
  2288.      */
  2289.     if (!IS_BLANK(CUR)) {
  2290. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2291.     ctxt->sax->error(ctxt->userData, "Space needed heren");
  2292. ctxt->errNo = XML_ERR_SPACE_REQUIRED;
  2293. ctxt->wellFormed = 0;
  2294. ctxt->disableSAX = 1;
  2295.     }
  2296.     ctxt->input->encoding = xmlParseEncodingDecl(ctxt);
  2297.     SKIP_BLANKS;
  2298.     if ((RAW == '?') && (NXT(1) == '>')) {
  2299.         SKIP(2);
  2300.     } else if (RAW == '>') {
  2301.         /* Deprecated old WD ... */
  2302. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2303.     ctxt->sax->error(ctxt->userData,
  2304.                      "XML declaration must end-up with '?>'n");
  2305. ctxt->errNo = XML_ERR_XMLDECL_NOT_FINISHED;
  2306. ctxt->wellFormed = 0;
  2307. ctxt->disableSAX = 1;
  2308. NEXT;
  2309.     } else {
  2310. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2311.     ctxt->sax->error(ctxt->userData,
  2312.                      "parsing XML declaration: '?>' expectedn");
  2313. ctxt->errNo = XML_ERR_XMLDECL_NOT_FINISHED;
  2314. ctxt->wellFormed = 0;
  2315. ctxt->disableSAX = 1;
  2316. MOVETO_ENDTAG(CUR_PTR);
  2317. NEXT;
  2318.     }
  2319. }
  2320. /*
  2321.  * xmlParseConditionalSections
  2322.  * @ctxt:  an XML parser context
  2323.  *
  2324.  * TODO : Conditionnal section are not yet supported !
  2325.  *
  2326.  * [61] conditionalSect ::= includeSect | ignoreSect 
  2327.  * [62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' 
  2328.  * [63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
  2329.  * [64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*
  2330.  * [65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)
  2331.  */
  2332. void
  2333. xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
  2334.     SKIP(3);
  2335.     SKIP_BLANKS;
  2336.     if ((RAW == 'I') && (NXT(1) == 'N') && (NXT(2) == 'C') &&
  2337.         (NXT(3) == 'L') && (NXT(4) == 'U') && (NXT(5) == 'D') &&
  2338.         (NXT(6) == 'E')) {
  2339. SKIP(7);
  2340. SKIP_BLANKS;
  2341. if (RAW != '[') {
  2342.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2343. ctxt->sax->error(ctxt->userData,
  2344.     "XML conditional section '[' expectedn");
  2345.     ctxt->errNo = XML_ERR_CONDSEC_INVALID;
  2346.     ctxt->wellFormed = 0;
  2347.     ctxt->disableSAX = 1;
  2348. } else {
  2349.     NEXT;
  2350. }
  2351. while ((RAW != 0) && ((RAW != ']') || (NXT(1) != ']') ||
  2352.        (NXT(2) != '>'))) {
  2353.     const xmlChar *check = CUR_PTR;
  2354.     int cons = ctxt->input->consumed;
  2355.     int tok = ctxt->token;
  2356.     if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) {
  2357. xmlParseConditionalSections(ctxt);
  2358.     } else if (IS_BLANK(CUR)) {
  2359. NEXT;
  2360.     } else if (RAW == '%') {
  2361. xmlParsePEReference(ctxt);
  2362.     } else
  2363. xmlParseMarkupDecl(ctxt);
  2364.     /*
  2365.      * Pop-up of finished entities.
  2366.      */
  2367.     while ((RAW == 0) && (ctxt->inputNr > 1))
  2368. xmlPopInput(ctxt);
  2369.     if ((CUR_PTR == check) && (cons == ctxt->input->consumed) &&
  2370. (tok == ctxt->token)) {
  2371. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2372.     ctxt->sax->error(ctxt->userData,
  2373. "Content error in the external subsetn");
  2374. ctxt->wellFormed = 0;
  2375. ctxt->disableSAX = 1;
  2376. ctxt->errNo = XML_ERR_EXT_SUBSET_NOT_FINISHED;
  2377. break;
  2378.     }
  2379. }
  2380.     } else if ((RAW == 'I') && (NXT(1) == 'G') && (NXT(2) == 'N') &&
  2381.             (NXT(3) == 'O') && (NXT(4) == 'R') && (NXT(5) == 'E')) {
  2382. int state;
  2383. SKIP(6);
  2384. SKIP_BLANKS;
  2385. if (RAW != '[') {
  2386.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2387. ctxt->sax->error(ctxt->userData,
  2388.     "XML conditional section '[' expectedn");
  2389.     ctxt->errNo = XML_ERR_CONDSEC_INVALID;
  2390.     ctxt->wellFormed = 0;
  2391.     ctxt->disableSAX = 1;
  2392. } else {
  2393.     NEXT;
  2394. }
  2395. /*
  2396.  * Parse up to the end of the conditionnal section
  2397.  * But disable SAX event generating DTD building in the meantime
  2398.  */
  2399. state = ctxt->disableSAX;
  2400. while ((RAW != 0) && ((RAW != ']') || (NXT(1) != ']') ||
  2401.        (NXT(2) != '>'))) {
  2402.     const xmlChar *check = CUR_PTR;
  2403.     int cons = ctxt->input->consumed;
  2404.     int tok = ctxt->token;
  2405.     if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) {
  2406. xmlParseConditionalSections(ctxt);
  2407.     } else if (IS_BLANK(CUR)) {
  2408. NEXT;
  2409.     } else if (RAW == '%') {
  2410. xmlParsePEReference(ctxt);
  2411.     } else
  2412. xmlParseMarkupDecl(ctxt);
  2413.     /*
  2414.      * Pop-up of finished entities.
  2415.      */
  2416.     while ((RAW == 0) && (ctxt->inputNr > 1))
  2417. xmlPopInput(ctxt);
  2418.     if ((CUR_PTR == check) && (cons == ctxt->input->consumed) &&
  2419. (tok == ctxt->token)) {
  2420. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2421.     ctxt->sax->error(ctxt->userData,
  2422. "Content error in the external subsetn");
  2423. ctxt->wellFormed = 0;
  2424. ctxt->disableSAX = 1;
  2425. ctxt->errNo = XML_ERR_EXT_SUBSET_NOT_FINISHED;
  2426. break;
  2427.     }
  2428. }
  2429. ctxt->disableSAX = state;
  2430.     } else {
  2431. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2432.     ctxt->sax->error(ctxt->userData,
  2433. "XML conditional section INCLUDE or IGNORE keyword expectedn");
  2434. ctxt->errNo = XML_ERR_CONDSEC_INVALID;
  2435. ctxt->wellFormed = 0;
  2436. ctxt->disableSAX = 1;
  2437.     }
  2438.     if (RAW == 0)
  2439.         SHRINK;
  2440.     if (RAW == 0) {
  2441. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2442.     ctxt->sax->error(ctxt->userData,
  2443.         "XML conditional section not closedn");
  2444. ctxt->errNo = XML_ERR_CONDSEC_NOT_FINISHED;
  2445. ctxt->wellFormed = 0;
  2446. ctxt->disableSAX = 1;
  2447.     } else {
  2448.         SKIP(3);
  2449.     }
  2450. }
  2451. /**
  2452.  * xmlParseExternalSubset:
  2453.  * @ctxt:  an XML parser context
  2454.  * @ExternalID: the external identifier
  2455.  * @SystemID: the system identifier (or URL)
  2456.  * 
  2457.  * parse Markup declarations from an external subset
  2458.  *
  2459.  * [30] extSubset ::= textDecl? extSubsetDecl
  2460.  *
  2461.  * [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) *
  2462.  */
  2463. void
  2464. xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID,
  2465.                        const xmlChar *SystemID) {
  2466.     GROW;
  2467.     if ((RAW == '<') && (NXT(1) == '?') &&
  2468.         (NXT(2) == 'x') && (NXT(3) == 'm') &&
  2469. (NXT(4) == 'l')) {
  2470. xmlParseTextDecl(ctxt);
  2471.     }
  2472.     if (ctxt->myDoc == NULL) {
  2473.         ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0");
  2474.     }
  2475.     if ((ctxt->myDoc != NULL) && (ctxt->myDoc->intSubset == NULL))
  2476.         xmlCreateIntSubset(ctxt->myDoc, NULL, ExternalID, SystemID);
  2477.     ctxt->instate = XML_PARSER_DTD;
  2478.     ctxt->external = 1;
  2479.     while (((RAW == '<') && (NXT(1) == '?')) ||
  2480.            ((RAW == '<') && (NXT(1) == '!')) ||
  2481.            IS_BLANK(CUR)) {
  2482. const xmlChar *check = CUR_PTR;
  2483. int cons = ctxt->input->consumed;
  2484. int tok = ctxt->token;
  2485.         if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) {
  2486.     xmlParseConditionalSections(ctxt);
  2487. } else if (IS_BLANK(CUR)) {
  2488.     NEXT;
  2489. } else if (RAW == '%') {
  2490.             xmlParsePEReference(ctxt);
  2491. } else
  2492.     xmlParseMarkupDecl(ctxt);
  2493. /*
  2494.  * Pop-up of finished entities.
  2495.  */
  2496. while ((RAW == 0) && (ctxt->inputNr > 1))
  2497.     xmlPopInput(ctxt);
  2498. if ((CUR_PTR == check) && (cons == ctxt->input->consumed) &&
  2499.     (tok == ctxt->token)) {
  2500.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2501. ctxt->sax->error(ctxt->userData,
  2502.     "Content error in the external subsetn");
  2503.     ctxt->wellFormed = 0;
  2504.     ctxt->disableSAX = 1;
  2505.     ctxt->errNo = XML_ERR_EXT_SUBSET_NOT_FINISHED;
  2506.     break;
  2507. }
  2508.     }
  2509.     
  2510.     if (RAW != 0) {
  2511. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2512.     ctxt->sax->error(ctxt->userData,
  2513.         "Extra content at the end of the documentn");
  2514. ctxt->errNo = XML_ERR_EXT_SUBSET_NOT_FINISHED;
  2515. ctxt->wellFormed = 0;
  2516. ctxt->disableSAX = 1;
  2517.     }
  2518. }
  2519. /**
  2520.  * xmlParseReference:
  2521.  * @ctxt:  an XML parser context
  2522.  * 
  2523.  * parse and handle entity references in content, depending on the SAX
  2524.  * interface, this may end-up in a call to character() if this is a
  2525.  * CharRef, a predefined entity, if there is no reference() callback.
  2526.  * or if the parser was asked to switch to that mode.
  2527.  *
  2528.  * [67] Reference ::= EntityRef | CharRef
  2529.  */
  2530. void
  2531. xmlParseReference(xmlParserCtxtPtr ctxt) {
  2532.     xmlEntityPtr ent;
  2533.     xmlChar *val;
  2534.     if (RAW != '&') return;
  2535.     if (ctxt->inputNr > 1) {
  2536.         xmlChar cur[2] = { '&' , 0 } ;
  2537. if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) &&
  2538.     (!ctxt->disableSAX))
  2539.     ctxt->sax->characters(ctxt->userData, cur, 1);
  2540. if (ctxt->token == '&')
  2541.     ctxt->token = 0;
  2542.         else {
  2543.     SKIP(1);
  2544. }
  2545. return;
  2546.     }
  2547.     if (NXT(1) == '#') {
  2548. int i = 0;
  2549. xmlChar out[10];
  2550. int hex = NXT(2);
  2551. int val = xmlParseCharRef(ctxt);
  2552. if (ctxt->encoding != NULL) {
  2553.     /*
  2554.      * So we are using non-UTF-8 buffers
  2555.      * Check that the char fit on 8bits, if not
  2556.      * generate a CharRef.
  2557.      */
  2558.     if (val <= 0xFF) {
  2559. out[0] = val;
  2560. out[1] = 0;
  2561. if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) &&
  2562.     (!ctxt->disableSAX))
  2563.     ctxt->sax->characters(ctxt->userData, out, 1);
  2564.     } else {
  2565. if ((hex == 'x') || (hex == 'X'))
  2566.     sprintf((char *)out, "#x%X", val);
  2567. else
  2568.     sprintf((char *)out, "#%d", val);
  2569. if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) &&
  2570.     (!ctxt->disableSAX))
  2571.     ctxt->sax->reference(ctxt->userData, out);
  2572.     }
  2573. } else {
  2574.     /*
  2575.      * Just encode the value in UTF-8
  2576.      */
  2577.     COPY_BUF(0 ,out, i, val);
  2578.     out[i] = 0;
  2579.     if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) &&
  2580. (!ctxt->disableSAX))
  2581. ctxt->sax->characters(ctxt->userData, out, i);
  2582. }
  2583.     } else {
  2584. ent = xmlParseEntityRef(ctxt);
  2585. if (ent == NULL) return;
  2586. if ((ent->name != NULL) && 
  2587.     (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY)) {
  2588.     xmlNodePtr list = NULL;
  2589.     int ret;
  2590.     /*
  2591.      * The first reference to the entity trigger a parsing phase
  2592.      * where the ent->children is filled with the result from
  2593.      * the parsing.
  2594.      */
  2595.     if (ent->children == NULL) {
  2596. xmlChar *value;
  2597. value = ent->content;
  2598. /*
  2599.  * Check that this entity is well formed
  2600.  */
  2601. if ((value != NULL) &&
  2602.     (value[1] == 0) && (value[0] == '<') &&
  2603.     (!xmlStrcmp(ent->name, BAD_CAST "lt"))) {
  2604.     /*
  2605.      * TODO: get definite answer on this !!!
  2606.      * Lots of entity decls are used to declare a single
  2607.      * char 
  2608.      *    <!ENTITY lt     "<">
  2609.      * Which seems to be valid since
  2610.      * 2.4: The ampersand character (&) and the left angle
  2611.      * bracket (<) may appear in their literal form only
  2612.      * when used ... They are also legal within the literal
  2613.      * entity value of an internal entity declaration;i
  2614.      * see "4.3.2 Well-Formed Parsed Entities". 
  2615.      * IMHO 2.4 and 4.3.2 are directly in contradiction.
  2616.      * Looking at the OASIS test suite and James Clark 
  2617.      * tests, this is broken. However the XML REC uses
  2618.      * it. Is the XML REC not well-formed ????
  2619.      * This is a hack to avoid this problem
  2620.      */
  2621.     list = xmlNewDocText(ctxt->myDoc, value);
  2622.     if (list != NULL) {
  2623. if ((ent->etype == XML_INTERNAL_GENERAL_ENTITY) &&
  2624.     (ent->children == NULL)) {
  2625.     ent->children = list;
  2626.     ent->last = list;
  2627.     list->parent = (xmlNodePtr) ent;
  2628. } else {
  2629.     xmlFreeNodeList(list);
  2630. }
  2631.     } else if (list != NULL) {
  2632. xmlFreeNodeList(list);
  2633.     }
  2634. } else {
  2635.     /*
  2636.      * 4.3.2: An internal general parsed entity is well-formed
  2637.      * if its replacement text matches the production labeled
  2638.      * content.
  2639.      */
  2640.     if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) {
  2641. ctxt->depth++;
  2642. ret = xmlParseBalancedChunkMemory(ctxt->myDoc,
  2643.            ctxt->sax, NULL, ctxt->depth,
  2644.    value, &list);
  2645. ctxt->depth--;
  2646.     } else if (ent->etype ==
  2647.        XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
  2648. ctxt->depth++;
  2649. ret = xmlParseExternalEntity(ctxt->myDoc,
  2650.    ctxt->sax, NULL, ctxt->depth,
  2651.    ent->SystemID, ent->ExternalID, &list);
  2652. ctxt->depth--;
  2653.     } else {
  2654. ret = -1;
  2655. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2656.     ctxt->sax->error(ctxt->userData,
  2657. "Internal: invalid entity typen");
  2658.     }
  2659.     if (ret == XML_ERR_ENTITY_LOOP) {
  2660. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2661.     ctxt->sax->error(ctxt->userData,
  2662. "Detected entity reference loopn");
  2663. ctxt->wellFormed = 0;
  2664. ctxt->disableSAX = 1;
  2665. ctxt->errNo = XML_ERR_ENTITY_LOOP;
  2666.     } else if ((ret == 0) && (list != NULL)) {
  2667. if ((ent->etype == XML_INTERNAL_GENERAL_ENTITY) &&
  2668.     (ent->children == NULL)) {
  2669.     ent->children = list;
  2670.     while (list != NULL) {
  2671. list->parent = (xmlNodePtr) ent;
  2672. if (list->next == NULL)
  2673.     ent->last = list;
  2674. list = list->next;
  2675.     }
  2676. } else {
  2677.     xmlFreeNodeList(list);
  2678. }
  2679.     } else if (ret > 0) {
  2680. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2681.     ctxt->sax->error(ctxt->userData,
  2682. "Entity value requiredn");
  2683. ctxt->errNo = ret;
  2684. ctxt->wellFormed = 0;
  2685. ctxt->disableSAX = 1;
  2686.     } else if (list != NULL) {
  2687. xmlFreeNodeList(list);
  2688.     }
  2689. }
  2690.     }
  2691.     if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) &&
  2692. (ctxt->replaceEntities == 0) && (!ctxt->disableSAX)) {
  2693. /*
  2694.  * Create a node.
  2695.  */
  2696. ctxt->sax->reference(ctxt->userData, ent->name);
  2697. return;
  2698.     } else if (ctxt->replaceEntities) {
  2699. xmlParserInputPtr input;
  2700. input = xmlNewEntityInputStream(ctxt, ent);
  2701. xmlPushInput(ctxt, input);
  2702. if ((ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) &&
  2703.     (RAW == '<') && (NXT(1) == '?') &&
  2704.     (NXT(2) == 'x') && (NXT(3) == 'm') &&
  2705.     (NXT(4) == 'l') && (IS_BLANK(NXT(5)))) {
  2706.     xmlParseTextDecl(ctxt);
  2707.     if (input->standalone) {
  2708. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2709.     ctxt->sax->error(ctxt->userData,
  2710.     "external parsed entities cannot be standalonen");
  2711. ctxt->errNo = XML_ERR_EXT_ENTITY_STANDALONE;
  2712. ctxt->wellFormed = 0;
  2713. ctxt->disableSAX = 1;
  2714.     }
  2715. }
  2716. /*
  2717.  * !!! TODO: build the tree under the entity first
  2718.  * 1234
  2719.  */
  2720. return;
  2721.     }
  2722. }
  2723. val = ent->content;
  2724. if (val == NULL) return;
  2725. /*
  2726.  * inline the entity.
  2727.  */
  2728. if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) &&
  2729.     (!ctxt->disableSAX))
  2730.     ctxt->sax->characters(ctxt->userData, val, xmlStrlen(val));
  2731.     }
  2732. }
  2733. /**
  2734.  * xmlParseEntityRef:
  2735.  * @ctxt:  an XML parser context
  2736.  *
  2737.  * parse ENTITY references declarations
  2738.  *
  2739.  * [68] EntityRef ::= '&' Name ';'
  2740.  *
  2741.  * [ WFC: Entity Declared ]
  2742.  * In a document without any DTD, a document with only an internal DTD
  2743.  * subset which contains no parameter entity references, or a document
  2744.  * with "standalone='yes'", the Name given in the entity reference
  2745.  * must match that in an entity declaration, except that well-formed
  2746.  * documents need not declare any of the following entities: amp, lt,
  2747.  * gt, apos, quot.  The declaration of a parameter entity must precede
  2748.  * any reference to it.  Similarly, the declaration of a general entity
  2749.  * must precede any reference to it which appears in a default value in an
  2750.  * attribute-list declaration. Note that if entities are declared in the
  2751.  * external subset or in external parameter entities, a non-validating
  2752.  * processor is not obligated to read and process their declarations;
  2753.  * for such documents, the rule that an entity must be declared is a
  2754.  * well-formedness constraint only if standalone='yes'.
  2755.  *
  2756.  * [ WFC: Parsed Entity ]
  2757.  * An entity reference must not contain the name of an unparsed entity
  2758.  *
  2759.  * Returns the xmlEntityPtr if found, or NULL otherwise.
  2760.  */
  2761. xmlEntityPtr
  2762. xmlParseEntityRef(xmlParserCtxtPtr ctxt) {
  2763.     xmlChar *name;
  2764.     xmlEntityPtr ent = NULL;
  2765.     GROW;
  2766.     
  2767.     if (RAW == '&') {
  2768.         NEXT;
  2769.         name = xmlParseName(ctxt);
  2770. if (name == NULL) {
  2771.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2772.         ctxt->sax->error(ctxt->userData,
  2773.                  "xmlParseEntityRef: no namen");
  2774.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  2775.     ctxt->wellFormed = 0;
  2776.     ctxt->disableSAX = 1;
  2777. } else {
  2778.     if (RAW == ';') {
  2779.         NEXT;
  2780. /*
  2781.  * Ask first SAX for entity resolution, otherwise try the
  2782.  * predefined set.
  2783.  */
  2784. if (ctxt->sax != NULL) {
  2785.     if (ctxt->sax->getEntity != NULL)
  2786. ent = ctxt->sax->getEntity(ctxt->userData, name);
  2787.     if (ent == NULL)
  2788.         ent = xmlGetPredefinedEntity(name);
  2789. }
  2790. /*
  2791.  * [ WFC: Entity Declared ]
  2792.  * In a document without any DTD, a document with only an
  2793.  * internal DTD subset which contains no parameter entity
  2794.  * references, or a document with "standalone='yes'", the
  2795.  * Name given in the entity reference must match that in an
  2796.  * entity declaration, except that well-formed documents
  2797.  * need not declare any of the following entities: amp, lt,
  2798.  * gt, apos, quot.
  2799.  * The declaration of a parameter entity must precede any
  2800.  * reference to it.
  2801.  * Similarly, the declaration of a general entity must
  2802.  * precede any reference to it which appears in a default
  2803.  * value in an attribute-list declaration. Note that if
  2804.  * entities are declared in the external subset or in
  2805.  * external parameter entities, a non-validating processor
  2806.  * is not obligated to read and process their declarations;
  2807.  * for such documents, the rule that an entity must be
  2808.  * declared is a well-formedness constraint only if
  2809.  * standalone='yes'. 
  2810.  */
  2811. if (ent == NULL) {
  2812.     if ((ctxt->standalone == 1) ||
  2813.         ((ctxt->hasExternalSubset == 0) &&
  2814.  (ctxt->hasPErefs == 0))) {
  2815. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2816.     ctxt->sax->error(ctxt->userData, 
  2817.  "Entity '%s' not definedn", name);
  2818. ctxt->errNo = XML_ERR_UNDECLARED_ENTITY;
  2819. ctxt->wellFormed = 0;
  2820. ctxt->disableSAX = 1;
  2821.     } else {
  2822. if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
  2823.     ctxt->sax->warning(ctxt->userData, 
  2824.  "Entity '%s' not definedn", name);
  2825. ctxt->errNo = XML_WAR_UNDECLARED_ENTITY;
  2826.     }
  2827. }
  2828. /*
  2829.  * [ WFC: Parsed Entity ]
  2830.  * An entity reference must not contain the name of an
  2831.  * unparsed entity
  2832.  */
  2833. else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) {
  2834.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2835. ctxt->sax->error(ctxt->userData, 
  2836.      "Entity reference to unparsed entity %sn", name);
  2837.     ctxt->errNo = XML_ERR_UNPARSED_ENTITY;
  2838.     ctxt->wellFormed = 0;
  2839.     ctxt->disableSAX = 1;
  2840. }
  2841. /*
  2842.  * [ WFC: No External Entity References ]
  2843.  * Attribute values cannot contain direct or indirect
  2844.  * entity references to external entities.
  2845.  */
  2846. else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) &&
  2847.          (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) {
  2848.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2849. ctxt->sax->error(ctxt->userData, 
  2850.      "Attribute references external entity '%s'n", name);
  2851.     ctxt->errNo = XML_ERR_ENTITY_IS_EXTERNAL;
  2852.     ctxt->wellFormed = 0;
  2853.     ctxt->disableSAX = 1;
  2854. }
  2855. /*
  2856.  * [ WFC: No < in Attribute Values ]
  2857.  * The replacement text of any entity referred to directly or
  2858.  * indirectly in an attribute value (other than "&lt;") must
  2859.  * not contain a <. 
  2860.  */
  2861. else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) &&
  2862.          (ent != NULL) &&
  2863.  (xmlStrcmp(ent->name, BAD_CAST "lt")) &&
  2864.          (ent->content != NULL) &&
  2865.  (xmlStrchr(ent->content, '<'))) {
  2866.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2867. ctxt->sax->error(ctxt->userData, 
  2868.  "'<' in entity '%s' is not allowed in attributes valuesn", name);
  2869.     ctxt->errNo = XML_ERR_LT_IN_ATTRIBUTE;
  2870.     ctxt->wellFormed = 0;
  2871.     ctxt->disableSAX = 1;
  2872. }
  2873. /*
  2874.  * Internal check, no parameter entities here ...
  2875.  */
  2876. else {
  2877.     switch (ent->etype) {
  2878. case XML_INTERNAL_PARAMETER_ENTITY:
  2879. case XML_EXTERNAL_PARAMETER_ENTITY:
  2880. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2881.     ctxt->sax->error(ctxt->userData, 
  2882.      "Attempt to reference the parameter entity '%s'n", name);
  2883. ctxt->errNo = XML_ERR_ENTITY_IS_PARAMETER;
  2884. ctxt->wellFormed = 0;
  2885. ctxt->disableSAX = 1;
  2886. break;
  2887. default:
  2888. break;
  2889.     }
  2890. }
  2891. /*
  2892.  * [ WFC: No Recursion ]
  2893.  * TODO A parsed entity must not contain a recursive reference
  2894.  * to itself, either directly or indirectly. 
  2895.  */
  2896.     } else {
  2897. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2898.     ctxt->sax->error(ctxt->userData,
  2899.                      "xmlParseEntityRef: expecting ';'n");
  2900. ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
  2901. ctxt->wellFormed = 0;
  2902. ctxt->disableSAX = 1;
  2903.     }
  2904.     xmlFree(name);
  2905. }
  2906.     }
  2907.     return(ent);
  2908. }
  2909. /**
  2910.  * xmlParseStringEntityRef:
  2911.  * @ctxt:  an XML parser context
  2912.  * @str:  a pointer to an index in the string
  2913.  *
  2914.  * parse ENTITY references declarations, but this version parses it from
  2915.  * a string value.
  2916.  *
  2917.  * [68] EntityRef ::= '&' Name ';'
  2918.  *
  2919.  * [ WFC: Entity Declared ]
  2920.  * In a document without any DTD, a document with only an internal DTD
  2921.  * subset which contains no parameter entity references, or a document
  2922.  * with "standalone='yes'", the Name given in the entity reference
  2923.  * must match that in an entity declaration, except that well-formed
  2924.  * documents need not declare any of the following entities: amp, lt,
  2925.  * gt, apos, quot.  The declaration of a parameter entity must precede
  2926.  * any reference to it.  Similarly, the declaration of a general entity
  2927.  * must precede any reference to it which appears in a default value in an
  2928.  * attribute-list declaration. Note that if entities are declared in the
  2929.  * external subset or in external parameter entities, a non-validating
  2930.  * processor is not obligated to read and process their declarations;
  2931.  * for such documents, the rule that an entity must be declared is a
  2932.  * well-formedness constraint only if standalone='yes'.
  2933.  *
  2934.  * [ WFC: Parsed Entity ]
  2935.  * An entity reference must not contain the name of an unparsed entity
  2936.  *
  2937.  * Returns the xmlEntityPtr if found, or NULL otherwise. The str pointer
  2938.  * is updated to the current location in the string.
  2939.  */
  2940. xmlEntityPtr
  2941. xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, const xmlChar ** str) {
  2942.     xmlChar *name;
  2943.     const xmlChar *ptr;
  2944.     xmlChar cur;
  2945.     xmlEntityPtr ent = NULL;
  2946.     if ((str == NULL) || (*str == NULL))
  2947.         return(NULL);
  2948.     ptr = *str;
  2949.     cur = *ptr;
  2950.     if (cur == '&') {
  2951.         ptr++;
  2952. cur = *ptr;
  2953.         name = xmlParseStringName(ctxt, &ptr);
  2954. if (name == NULL) {
  2955.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  2956.         ctxt->sax->error(ctxt->userData,
  2957.                  "xmlParseEntityRef: no namen");
  2958.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  2959.     ctxt->wellFormed = 0;
  2960.     ctxt->disableSAX = 1;
  2961. } else {
  2962.     if (*ptr == ';') {
  2963.         ptr++;
  2964. /*
  2965.  * Ask first SAX for entity resolution, otherwise try the
  2966.  * predefined set.
  2967.  */
  2968. if (ctxt->sax != NULL) {
  2969.     if (ctxt->sax->getEntity != NULL)
  2970. ent = ctxt->sax->getEntity(ctxt->userData, name);
  2971.     if (ent == NULL)
  2972.         ent = xmlGetPredefinedEntity(name);
  2973. }
  2974. /*
  2975.  * [ WFC: Entity Declared ]
  2976.  * In a document without any DTD, a document with only an
  2977.  * internal DTD subset which contains no parameter entity
  2978.  * references, or a document with "standalone='yes'", the
  2979.  * Name given in the entity reference must match that in an
  2980.  * entity declaration, except that well-formed documents
  2981.  * need not declare any of the following entities: amp, lt,
  2982.  * gt, apos, quot.
  2983.  * The declaration of a parameter entity must precede any
  2984.  * reference to it.
  2985.  * Similarly, the declaration of a general entity must
  2986.  * precede any reference to it which appears in a default
  2987.  * value in an attribute-list declaration. Note that if
  2988.  * entities are declared in the external subset or in
  2989.  * external parameter entities, a non-validating processor
  2990.  * is not obligated to read and process their declarations;
  2991.  * for such documents, the rule that an entity must be
  2992.  * declared is a well-formedness constraint only if
  2993.  * standalone='yes'. 
  2994.  */
  2995. if (ent == NULL) {
  2996.     if ((ctxt->standalone == 1) ||
  2997.         ((ctxt->hasExternalSubset == 0) &&
  2998.  (ctxt->hasPErefs == 0))) {
  2999. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3000.     ctxt->sax->error(ctxt->userData, 
  3001.  "Entity '%s' not definedn", name);
  3002. ctxt->errNo = XML_ERR_UNDECLARED_ENTITY;
  3003. ctxt->wellFormed = 0;
  3004. ctxt->disableSAX = 1;
  3005.     } else {
  3006. if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
  3007.     ctxt->sax->warning(ctxt->userData, 
  3008.  "Entity '%s' not definedn", name);
  3009. ctxt->errNo = XML_WAR_UNDECLARED_ENTITY;
  3010.     }
  3011. }
  3012. /*
  3013.  * [ WFC: Parsed Entity ]
  3014.  * An entity reference must not contain the name of an
  3015.  * unparsed entity
  3016.  */
  3017. else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) {
  3018.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3019. ctxt->sax->error(ctxt->userData, 
  3020.      "Entity reference to unparsed entity %sn", name);
  3021.     ctxt->errNo = XML_ERR_UNPARSED_ENTITY;
  3022.     ctxt->wellFormed = 0;
  3023.     ctxt->disableSAX = 1;
  3024. }
  3025. /*
  3026.  * [ WFC: No External Entity References ]
  3027.  * Attribute values cannot contain direct or indirect
  3028.  * entity references to external entities.
  3029.  */
  3030. else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) &&
  3031.          (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) {
  3032.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3033. ctxt->sax->error(ctxt->userData, 
  3034.      "Attribute references external entity '%s'n", name);
  3035.     ctxt->errNo = XML_ERR_ENTITY_IS_EXTERNAL;
  3036.     ctxt->wellFormed = 0;
  3037.     ctxt->disableSAX = 1;
  3038. }
  3039. /*
  3040.  * [ WFC: No < in Attribute Values ]
  3041.  * The replacement text of any entity referred to directly or
  3042.  * indirectly in an attribute value (other than "&lt;") must
  3043.  * not contain a <. 
  3044.  */
  3045. else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) &&
  3046.          (ent != NULL) &&
  3047.  (xmlStrcmp(ent->name, BAD_CAST "lt")) &&
  3048.          (ent->content != NULL) &&
  3049.  (xmlStrchr(ent->content, '<'))) {
  3050.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3051. ctxt->sax->error(ctxt->userData, 
  3052.  "'<' in entity '%s' is not allowed in attributes valuesn", name);
  3053.     ctxt->errNo = XML_ERR_LT_IN_ATTRIBUTE;
  3054.     ctxt->wellFormed = 0;
  3055.     ctxt->disableSAX = 1;
  3056. }
  3057. /*
  3058.  * Internal check, no parameter entities here ...
  3059.  */
  3060. else {
  3061.     switch (ent->etype) {
  3062. case XML_INTERNAL_PARAMETER_ENTITY:
  3063. case XML_EXTERNAL_PARAMETER_ENTITY:
  3064. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3065.     ctxt->sax->error(ctxt->userData, 
  3066.      "Attempt to reference the parameter entity '%s'n", name);
  3067. ctxt->errNo = XML_ERR_ENTITY_IS_PARAMETER;
  3068. ctxt->wellFormed = 0;
  3069. ctxt->disableSAX = 1;
  3070. break;
  3071. default:
  3072. break;
  3073.     }
  3074. }
  3075. /*
  3076.  * [ WFC: No Recursion ]
  3077.  * TODO A parsed entity must not contain a recursive reference
  3078.  * to itself, either directly or indirectly. 
  3079.  */
  3080.     } else {
  3081. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3082.     ctxt->sax->error(ctxt->userData,
  3083.                      "xmlParseEntityRef: expecting ';'n");
  3084. ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
  3085. ctxt->wellFormed = 0;
  3086. ctxt->disableSAX = 1;
  3087.     }
  3088.     xmlFree(name);
  3089. }
  3090.     }
  3091.     *str = ptr;
  3092.     return(ent);
  3093. }
  3094. /**
  3095.  * xmlParsePEReference:
  3096.  * @ctxt:  an XML parser context
  3097.  *
  3098.  * parse PEReference declarations
  3099.  * The entity content is handled directly by pushing it's content as
  3100.  * a new input stream.
  3101.  *
  3102.  * [69] PEReference ::= '%' Name ';'
  3103.  *
  3104.  * [ WFC: No Recursion ]
  3105.  * TODO A parsed entity must not contain a recursive
  3106.  * reference to itself, either directly or indirectly. 
  3107.  *
  3108.  * [ WFC: Entity Declared ]
  3109.  * In a document without any DTD, a document with only an internal DTD
  3110.  * subset which contains no parameter entity references, or a document
  3111.  * with "standalone='yes'", ...  ... The declaration of a parameter
  3112.  * entity must precede any reference to it...
  3113.  *
  3114.  * [ VC: Entity Declared ]
  3115.  * In a document with an external subset or external parameter entities
  3116.  * with "standalone='no'", ...  ... The declaration of a parameter entity
  3117.  * must precede any reference to it...
  3118.  *
  3119.  * [ WFC: In DTD ]
  3120.  * Parameter-entity references may only appear in the DTD.
  3121.  * NOTE: misleading but this is handled.
  3122.  */
  3123. void
  3124. xmlParsePEReference(xmlParserCtxtPtr ctxt) {
  3125.     xmlChar *name;
  3126.     xmlEntityPtr entity = NULL;
  3127.     xmlParserInputPtr input;
  3128.     if (RAW == '%') {
  3129.         NEXT;
  3130.         name = xmlParseName(ctxt);
  3131. if (name == NULL) {
  3132.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3133.         ctxt->sax->error(ctxt->userData,
  3134.                  "xmlParsePEReference: no namen");
  3135.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  3136.     ctxt->wellFormed = 0;
  3137.     ctxt->disableSAX = 1;
  3138. } else {
  3139.     if (RAW == ';') {
  3140.         NEXT;
  3141. if ((ctxt->sax != NULL) &&
  3142.     (ctxt->sax->getParameterEntity != NULL))
  3143.     entity = ctxt->sax->getParameterEntity(ctxt->userData,
  3144.                                            name);
  3145. if (entity == NULL) {
  3146.     /*
  3147.      * [ WFC: Entity Declared ]
  3148.      * In a document without any DTD, a document with only an
  3149.      * internal DTD subset which contains no parameter entity
  3150.      * references, or a document with "standalone='yes'", ...
  3151.      * ... The declaration of a parameter entity must precede
  3152.      * any reference to it...
  3153.      */
  3154.     if ((ctxt->standalone == 1) ||
  3155. ((ctxt->hasExternalSubset == 0) &&
  3156.  (ctxt->hasPErefs == 0))) {
  3157. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3158.     ctxt->sax->error(ctxt->userData,
  3159.      "PEReference: %%%s; not foundn", name);
  3160. ctxt->errNo = XML_ERR_UNDECLARED_ENTITY;
  3161. ctxt->wellFormed = 0;
  3162. ctxt->disableSAX = 1;
  3163.     } else {
  3164. /*
  3165.  * [ VC: Entity Declared ]
  3166.  * In a document with an external subset or external
  3167.  * parameter entities with "standalone='no'", ...
  3168.  * ... The declaration of a parameter entity must precede
  3169.  * any reference to it...
  3170.  */
  3171. if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
  3172.     ctxt->sax->warning(ctxt->userData,
  3173.      "PEReference: %%%s; not foundn", name);
  3174. ctxt->valid = 0;
  3175.     }
  3176. } else {
  3177.     /*
  3178.      * Internal checking in case the entity quest barfed
  3179.      */
  3180.     if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) &&
  3181.         (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) {
  3182. if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
  3183.     ctxt->sax->warning(ctxt->userData,
  3184.  "Internal: %%%s; is not a parameter entityn", name);
  3185.     } else {
  3186. /*
  3187.  * TODO !!!
  3188.  * handle the extra spaces added before and after
  3189.  * c.f. http://www.w3.org/TR/REC-xml#as-PE
  3190.  */
  3191. input = xmlNewEntityInputStream(ctxt, entity);
  3192. xmlPushInput(ctxt, input);
  3193. if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
  3194.     (RAW == '<') && (NXT(1) == '?') &&
  3195.     (NXT(2) == 'x') && (NXT(3) == 'm') &&
  3196.     (NXT(4) == 'l') && (IS_BLANK(NXT(5)))) {
  3197.     xmlParseTextDecl(ctxt);
  3198. }
  3199. if (ctxt->token == 0)
  3200.     ctxt->token = ' ';
  3201.     }
  3202. }
  3203. ctxt->hasPErefs = 1;
  3204.     } else {
  3205. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3206.     ctxt->sax->error(ctxt->userData,
  3207.                      "xmlParsePEReference: expecting ';'n");
  3208. ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
  3209. ctxt->wellFormed = 0;
  3210. ctxt->disableSAX = 1;
  3211.     }
  3212.     xmlFree(name);
  3213. }
  3214.     }
  3215. }
  3216. /**
  3217.  * xmlParseStringPEReference:
  3218.  * @ctxt:  an XML parser context
  3219.  * @str:  a pointer to an index in the string
  3220.  *
  3221.  * parse PEReference declarations
  3222.  *
  3223.  * [69] PEReference ::= '%' Name ';'
  3224.  *
  3225.  * [ WFC: No Recursion ]
  3226.  * TODO A parsed entity must not contain a recursive
  3227.  * reference to itself, either directly or indirectly. 
  3228.  *
  3229.  * [ WFC: Entity Declared ]
  3230.  * In a document without any DTD, a document with only an internal DTD
  3231.  * subset which contains no parameter entity references, or a document
  3232.  * with "standalone='yes'", ...  ... The declaration of a parameter
  3233.  * entity must precede any reference to it...
  3234.  *
  3235.  * [ VC: Entity Declared ]
  3236.  * In a document with an external subset or external parameter entities
  3237.  * with "standalone='no'", ...  ... The declaration of a parameter entity
  3238.  * must precede any reference to it...
  3239.  *
  3240.  * [ WFC: In DTD ]
  3241.  * Parameter-entity references may only appear in the DTD.
  3242.  * NOTE: misleading but this is handled.
  3243.  *
  3244.  * Returns the string of the entity content.
  3245.  *         str is updated to the current value of the index
  3246.  */
  3247. xmlEntityPtr
  3248. xmlParseStringPEReference(xmlParserCtxtPtr ctxt, const xmlChar **str) {
  3249.     const xmlChar *ptr;
  3250.     xmlChar cur;
  3251.     xmlChar *name;
  3252.     xmlEntityPtr entity = NULL;
  3253.     if ((str == NULL) || (*str == NULL)) return(NULL);
  3254.     ptr = *str;
  3255.     cur = *ptr;
  3256.     if (cur == '%') {
  3257.         ptr++;
  3258. cur = *ptr;
  3259.         name = xmlParseStringName(ctxt, &ptr);
  3260. if (name == NULL) {
  3261.     if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3262.         ctxt->sax->error(ctxt->userData,
  3263.                  "xmlParseStringPEReference: no namen");
  3264.     ctxt->errNo = XML_ERR_NAME_REQUIRED;
  3265.     ctxt->wellFormed = 0;
  3266.     ctxt->disableSAX = 1;
  3267. } else {
  3268.     cur = *ptr;
  3269.     if (cur == ';') {
  3270. ptr++;
  3271. cur = *ptr;
  3272. if ((ctxt->sax != NULL) &&
  3273.     (ctxt->sax->getParameterEntity != NULL))
  3274.     entity = ctxt->sax->getParameterEntity(ctxt->userData,
  3275.                                            name);
  3276. if (entity == NULL) {
  3277.     /*
  3278.      * [ WFC: Entity Declared ]
  3279.      * In a document without any DTD, a document with only an
  3280.      * internal DTD subset which contains no parameter entity
  3281.      * references, or a document with "standalone='yes'", ...
  3282.      * ... The declaration of a parameter entity must precede
  3283.      * any reference to it...
  3284.      */
  3285.     if ((ctxt->standalone == 1) ||
  3286. ((ctxt->hasExternalSubset == 0) &&
  3287.  (ctxt->hasPErefs == 0))) {
  3288. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3289.     ctxt->sax->error(ctxt->userData,
  3290.      "PEReference: %%%s; not foundn", name);
  3291. ctxt->errNo = XML_ERR_UNDECLARED_ENTITY;
  3292. ctxt->wellFormed = 0;
  3293. ctxt->disableSAX = 1;
  3294.     } else {
  3295. /*
  3296.  * [ VC: Entity Declared ]
  3297.  * In a document with an external subset or external
  3298.  * parameter entities with "standalone='no'", ...
  3299.  * ... The declaration of a parameter entity must
  3300.  * precede any reference to it...
  3301.  */
  3302. if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
  3303.     ctxt->sax->warning(ctxt->userData,
  3304.      "PEReference: %%%s; not foundn", name);
  3305. ctxt->valid = 0;
  3306.     }
  3307. } else {
  3308.     /*
  3309.      * Internal checking in case the entity quest barfed
  3310.      */
  3311.     if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) &&
  3312.         (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) {
  3313. if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
  3314.     ctxt->sax->warning(ctxt->userData,
  3315.  "Internal: %%%s; is not a parameter entityn", name);
  3316.     }
  3317. }
  3318. ctxt->hasPErefs = 1;
  3319.     } else {
  3320. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3321.     ctxt->sax->error(ctxt->userData,
  3322.                      "xmlParseStringPEReference: expecting ';'n");
  3323. ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
  3324. ctxt->wellFormed = 0;
  3325. ctxt->disableSAX = 1;
  3326.     }
  3327.     xmlFree(name);
  3328. }
  3329.     }
  3330.     *str = ptr;
  3331.     return(entity);
  3332. }
  3333. /**
  3334.  * xmlParseDocTypeDecl:
  3335.  * @ctxt:  an XML parser context
  3336.  *
  3337.  * parse a DOCTYPE declaration
  3338.  *
  3339.  * [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? 
  3340.  *                      ('[' (markupdecl | PEReference | S)* ']' S?)? '>'
  3341.  *
  3342.  * [ VC: Root Element Type ]
  3343.  * The Name in the document type declaration must match the element
  3344.  * type of the root element. 
  3345.  */
  3346. void
  3347. xmlParseDocTypeDecl(xmlParserCtxtPtr ctxt) {
  3348.     xmlChar *name = NULL;
  3349.     xmlChar *ExternalID = NULL;
  3350.     xmlChar *URI = NULL;
  3351.     /*
  3352.      * We know that '<!DOCTYPE' has been detected.
  3353.      */
  3354.     SKIP(9);
  3355.     SKIP_BLANKS;
  3356.     /*
  3357.      * Parse the DOCTYPE name.
  3358.      */
  3359.     name = xmlParseName(ctxt);
  3360.     if (name == NULL) {
  3361. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3362.     ctxt->sax->error(ctxt->userData, 
  3363.         "xmlParseDocTypeDecl : no DOCTYPE name !n");
  3364. ctxt->wellFormed = 0;
  3365. ctxt->disableSAX = 1;
  3366. ctxt->errNo = XML_ERR_NAME_REQUIRED;
  3367.     }
  3368.     ctxt->intSubName = name;
  3369.     SKIP_BLANKS;
  3370.     /*
  3371.      * Check for SystemID and ExternalID
  3372.      */
  3373.     URI = xmlParseExternalID(ctxt, &ExternalID, 1);
  3374.     if ((URI != NULL) || (ExternalID != NULL)) {
  3375.         ctxt->hasExternalSubset = 1;
  3376.     }
  3377.     ctxt->extSubURI = URI;
  3378.     ctxt->extSubSystem = ExternalID;
  3379.     SKIP_BLANKS;
  3380.     /*
  3381.      * Create and update the internal subset.
  3382.      */
  3383.     if ((ctxt->sax != NULL) && (ctxt->sax->internalSubset != NULL) &&
  3384. (!ctxt->disableSAX))
  3385. ctxt->sax->internalSubset(ctxt->userData, name, ExternalID, URI);
  3386.     /*
  3387.      * Is there any internal subset declarations ?
  3388.      * they are handled separately in xmlParseInternalSubset()
  3389.      */
  3390.     if (RAW == '[')
  3391. return;
  3392.     /*
  3393.      * We should be at the end of the DOCTYPE declaration.
  3394.      */
  3395.     if (RAW != '>') {
  3396. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3397.     ctxt->sax->error(ctxt->userData, "DOCTYPE unproperly terminatedn");
  3398. ctxt->wellFormed = 0;
  3399. ctxt->disableSAX = 1;
  3400. ctxt->errNo = XML_ERR_DOCTYPE_NOT_FINISHED;
  3401.     }
  3402.     NEXT;
  3403. }
  3404. /**
  3405.  * xmlParseInternalsubset:
  3406.  * @ctxt:  an XML parser context
  3407.  *
  3408.  * parse the internal subset declaration
  3409.  *
  3410.  * [28 end] ('[' (markupdecl | PEReference | S)* ']' S?)? '>'
  3411.  */
  3412. void
  3413. xmlParseInternalSubset(xmlParserCtxtPtr ctxt) {
  3414.     /*
  3415.      * Is there any DTD definition ?
  3416.      */
  3417.     if (RAW == '[') {
  3418.         ctxt->instate = XML_PARSER_DTD;
  3419.         NEXT;
  3420. /*
  3421.  * Parse the succession of Markup declarations and 
  3422.  * PEReferences.
  3423.  * Subsequence (markupdecl | PEReference | S)*
  3424.  */
  3425. while (RAW != ']') {
  3426.     const xmlChar *check = CUR_PTR;
  3427.     int cons = ctxt->input->consumed;
  3428.     SKIP_BLANKS;
  3429.     xmlParseMarkupDecl(ctxt);
  3430.     xmlParsePEReference(ctxt);
  3431.     /*
  3432.      * Pop-up of finished entities.
  3433.      */
  3434.     while ((RAW == 0) && (ctxt->inputNr > 1))
  3435. xmlPopInput(ctxt);
  3436.     if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) {
  3437. if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
  3438.     ctxt->sax->error(ctxt->userData, 
  3439.      "xmlParseInternalSubset: error detected in Markup declarationn");
  3440. ctxt->wellFormed = 0;
  3441. ctxt->disableSAX = 1;
  3442. ctxt->errNo = XML_ERR_INTERNAL_ERROR;
  3443. break;
  3444.     }
  3445. }
  3446. if (RAW == ']') NEXT;
  3447.     }