PageRenderTime 49ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/ext/xml/compat.c

http://github.com/php/php-src
C | 749 lines | 620 code | 105 blank | 24 comment | 113 complexity | 16c653472cd365bba1c5435ca086314c MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause, MPL-2.0-no-copyleft-exception, LGPL-2.1
  1. /*
  2. +----------------------------------------------------------------------+
  3. | Copyright (c) The PHP Group |
  4. +----------------------------------------------------------------------+
  5. | This source file is subject to version 3.01 of the PHP license, |
  6. | that is bundled with this package in the file LICENSE, and is |
  7. | available through the world-wide-web at the following url: |
  8. | http://www.php.net/license/3_01.txt |
  9. | If you did not receive a copy of the PHP license and are unable to |
  10. | obtain it through the world-wide-web, please send a note to |
  11. | license@php.net so we can mail you a copy immediately. |
  12. +----------------------------------------------------------------------+
  13. | Authors: Sterling Hughes <sterling@php.net> |
  14. +----------------------------------------------------------------------+
  15. */
  16. #include "php.h"
  17. #if defined(HAVE_LIBXML) && (defined(HAVE_XML) || defined(HAVE_XMLRPC)) && !defined(HAVE_LIBEXPAT)
  18. #include "expat_compat.h"
  19. typedef struct _php_xml_ns {
  20. xmlNsPtr nsptr;
  21. int ref_count;
  22. void *next;
  23. void *prev;
  24. } php_xml_ns;
  25. #ifdef LIBXML_EXPAT_COMPAT
  26. #define IS_NS_DECL(__ns) \
  27. ((__ns) != NULL && strlen(__ns) == 5 && *(__ns) == 'x' && *((__ns)+1) == 'm' && \
  28. *((__ns)+2) == 'l' && *((__ns)+3) == 'n' && *((__ns)+4) == 's')
  29. static void
  30. _qualify_namespace(XML_Parser parser, const xmlChar *name, const xmlChar *URI, xmlChar **qualified)
  31. {
  32. if (URI) {
  33. /* Use libxml functions otherwise its memory deallocation is screwed up */
  34. *qualified = xmlStrdup(URI);
  35. *qualified = xmlStrncat(*qualified, parser->_ns_separator, 1);
  36. *qualified = xmlStrncat(*qualified, name, xmlStrlen(name));
  37. } else {
  38. *qualified = xmlStrdup(name);
  39. }
  40. }
  41. static void
  42. _start_element_handler(void *user, const xmlChar *name, const xmlChar **attributes)
  43. {
  44. XML_Parser parser = (XML_Parser) user;
  45. xmlChar *qualified_name = NULL;
  46. if (parser->h_start_element == NULL) {
  47. if (parser->h_default) {
  48. int attno = 0;
  49. qualified_name = xmlStrncatNew((xmlChar *)"<", name, xmlStrlen(name));
  50. if (attributes) {
  51. while (attributes[attno] != NULL) {
  52. int att_len;
  53. char *att_string, *att_name, *att_value;
  54. att_name = (char *)attributes[attno++];
  55. att_value = (char *)attributes[attno++];
  56. att_len = spprintf(&att_string, 0, " %s=\"%s\"", att_name, att_value);
  57. qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_string, att_len);
  58. efree(att_string);
  59. }
  60. }
  61. qualified_name = xmlStrncat(qualified_name, (xmlChar *)">", 1);
  62. parser->h_default(parser->user, (const XML_Char *) qualified_name, xmlStrlen(qualified_name));
  63. xmlFree(qualified_name);
  64. }
  65. return;
  66. }
  67. qualified_name = xmlStrdup(name);
  68. parser->h_start_element(parser->user, (const XML_Char *) qualified_name, (const XML_Char **) attributes);
  69. xmlFree(qualified_name);
  70. }
  71. static void
  72. _start_element_handler_ns(void *user, const xmlChar *name, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar ** namespaces, int nb_attributes, int nb_defaulted, const xmlChar ** attributes)
  73. {
  74. XML_Parser parser = (XML_Parser) user;
  75. xmlChar *qualified_name = NULL;
  76. xmlChar **attrs = NULL;
  77. int i;
  78. int z = 0;
  79. int y = 0;
  80. if (nb_namespaces > 0 && parser->h_start_ns != NULL) {
  81. for (i = 0; i < nb_namespaces; i += 1) {
  82. parser->h_start_ns(parser->user, (const XML_Char *) namespaces[y], (const XML_Char *) namespaces[y+1]);
  83. y += 2;
  84. }
  85. y = 0;
  86. }
  87. if (parser->h_start_element == NULL) {
  88. if (parser->h_default) {
  89. if (prefix) {
  90. qualified_name = xmlStrncatNew((xmlChar *)"<", prefix, xmlStrlen(prefix));
  91. qualified_name = xmlStrncat(qualified_name, (xmlChar *)":", 1);
  92. qualified_name = xmlStrncat(qualified_name, name, xmlStrlen(name));
  93. } else {
  94. qualified_name = xmlStrncatNew((xmlChar *)"<", name, xmlStrlen(name));
  95. }
  96. if (namespaces) {
  97. int i, j;
  98. for (i = 0,j = 0;j < nb_namespaces;j++) {
  99. int ns_len;
  100. char *ns_string, *ns_prefix, *ns_url;
  101. ns_prefix = (char *) namespaces[i++];
  102. ns_url = (char *) namespaces[i++];
  103. if (ns_prefix) {
  104. ns_len = spprintf(&ns_string, 0, " xmlns:%s=\"%s\"", ns_prefix, ns_url);
  105. } else {
  106. ns_len = spprintf(&ns_string, 0, " xmlns=\"%s\"", ns_url);
  107. }
  108. qualified_name = xmlStrncat(qualified_name, (xmlChar *)ns_string, ns_len);
  109. efree(ns_string);
  110. }
  111. }
  112. if (attributes) {
  113. for (i = 0; i < nb_attributes; i += 1) {
  114. int att_len;
  115. char *att_string, *att_name, *att_value, *att_prefix, *att_valueend;
  116. att_name = (char *) attributes[y++];
  117. att_prefix = (char *)attributes[y++];
  118. y++;
  119. att_value = (char *)attributes[y++];
  120. att_valueend = (char *)attributes[y++];
  121. if (att_prefix) {
  122. att_len = spprintf(&att_string, 0, " %s:%s=\"", att_prefix, att_name);
  123. } else {
  124. att_len = spprintf(&att_string, 0, " %s=\"", att_name);
  125. }
  126. qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_string, att_len);
  127. qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_value, att_valueend - att_value);
  128. qualified_name = xmlStrncat(qualified_name, (xmlChar *)"\"", 1);
  129. efree(att_string);
  130. }
  131. }
  132. qualified_name = xmlStrncat(qualified_name, (xmlChar *)">", 1);
  133. parser->h_default(parser->user, (const XML_Char *) qualified_name, xmlStrlen(qualified_name));
  134. xmlFree(qualified_name);
  135. }
  136. return;
  137. }
  138. _qualify_namespace(parser, name, URI, &qualified_name);
  139. if (attributes != NULL) {
  140. xmlChar *qualified_name_attr = NULL;
  141. attrs = safe_emalloc((nb_attributes * 2) + 1, sizeof(int *), 0);
  142. for (i = 0; i < nb_attributes; i += 1) {
  143. if (attributes[y+1] != NULL) {
  144. _qualify_namespace(parser, attributes[y] , attributes[y + 2], &qualified_name_attr);
  145. } else {
  146. qualified_name_attr = xmlStrdup(attributes[y]);
  147. }
  148. attrs[z] = qualified_name_attr;
  149. attrs[z + 1] = xmlStrndup(attributes[y + 3] , (int) (attributes[y + 4] - attributes[y + 3]));
  150. z += 2;
  151. y += 5;
  152. }
  153. attrs[z] = NULL;
  154. }
  155. parser->h_start_element(parser->user, (const XML_Char *) qualified_name, (const XML_Char **) attrs);
  156. if (attrs) {
  157. for (i = 0; i < z; i++) {
  158. xmlFree(attrs[i]);
  159. }
  160. efree(attrs);
  161. }
  162. xmlFree(qualified_name);
  163. }
  164. static void
  165. _end_element_handler(void *user, const xmlChar *name)
  166. {
  167. xmlChar *qualified_name;
  168. XML_Parser parser = (XML_Parser) user;
  169. if (parser->h_end_element == NULL) {
  170. if (parser->h_default) {
  171. char *end_element;
  172. spprintf(&end_element, 0, "</%s>", (char *)name);
  173. parser->h_default(parser->user, (const XML_Char *) end_element, strlen(end_element));
  174. efree(end_element);
  175. }
  176. return;
  177. }
  178. qualified_name = xmlStrdup(name);
  179. parser->h_end_element(parser->user, (const XML_Char *) qualified_name);
  180. xmlFree(qualified_name);
  181. }
  182. static void
  183. _end_element_handler_ns(void *user, const xmlChar *name, const xmlChar * prefix, const xmlChar *URI)
  184. {
  185. xmlChar *qualified_name;
  186. XML_Parser parser = (XML_Parser) user;
  187. if (parser->h_end_element == NULL) {
  188. if (parser->h_default) {
  189. char *end_element;
  190. int end_element_len;
  191. if (prefix) {
  192. end_element_len = spprintf(&end_element, 0, "</%s:%s>", (char *) prefix, (char *)name);
  193. } else {
  194. end_element_len = spprintf(&end_element, 0, "</%s>", (char *)name);
  195. }
  196. parser->h_default(parser->user, (const XML_Char *) end_element, end_element_len);
  197. efree(end_element);
  198. }
  199. return;
  200. }
  201. _qualify_namespace(parser, name, URI, &qualified_name);
  202. parser->h_end_element(parser->user, (const XML_Char *) qualified_name);
  203. xmlFree(qualified_name);
  204. }
  205. static void
  206. _cdata_handler(void *user, const xmlChar *cdata, int cdata_len)
  207. {
  208. XML_Parser parser = (XML_Parser) user;
  209. if (parser->h_cdata == NULL) {
  210. if (parser->h_default) {
  211. parser->h_default(parser->user, (const XML_Char *) cdata, cdata_len);
  212. }
  213. return;
  214. }
  215. parser->h_cdata(parser->user, (const XML_Char *) cdata, cdata_len);
  216. }
  217. static void
  218. _pi_handler(void *user, const xmlChar *target, const xmlChar *data)
  219. {
  220. XML_Parser parser = (XML_Parser) user;
  221. if (parser->h_pi == NULL) {
  222. if (parser->h_default) {
  223. char *full_pi;
  224. spprintf(&full_pi, 0, "<?%s %s?>", (char *)target, (char *)data);
  225. parser->h_default(parser->user, (const XML_Char *) full_pi, strlen(full_pi));
  226. efree(full_pi);
  227. }
  228. return;
  229. }
  230. parser->h_pi(parser->user, (const XML_Char *) target, (const XML_Char *) data);
  231. }
  232. static void
  233. _unparsed_entity_decl_handler(void *user,
  234. const xmlChar *name,
  235. const xmlChar *pub_id,
  236. const xmlChar *sys_id,
  237. const xmlChar *notation)
  238. {
  239. XML_Parser parser = (XML_Parser) user;
  240. if (parser->h_unparsed_entity_decl == NULL) {
  241. return;
  242. }
  243. parser->h_unparsed_entity_decl(parser->user, name, NULL, sys_id, pub_id, notation);
  244. }
  245. static void
  246. _notation_decl_handler(void *user, const xmlChar *notation, const xmlChar *pub_id, const xmlChar *sys_id)
  247. {
  248. XML_Parser parser = (XML_Parser) user;
  249. if (parser->h_notation_decl == NULL) {
  250. return;
  251. }
  252. parser->h_notation_decl(parser->user, notation, NULL, sys_id, pub_id);
  253. }
  254. static void
  255. _build_comment(const xmlChar *data, int data_len, xmlChar **comment, int *comment_len)
  256. {
  257. *comment_len = data_len + 7;
  258. *comment = xmlMalloc(*comment_len + 1);
  259. memcpy(*comment, "<!--", 4);
  260. memcpy(*comment + 4, data, data_len);
  261. memcpy(*comment + 4 + data_len, "-->", 3);
  262. (*comment)[*comment_len] = '\0';
  263. }
  264. static void
  265. _comment_handler(void *user, const xmlChar *comment)
  266. {
  267. XML_Parser parser = (XML_Parser) user;
  268. if (parser->h_default) {
  269. xmlChar *d_comment;
  270. int d_comment_len;
  271. _build_comment(comment, xmlStrlen(comment), &d_comment, &d_comment_len);
  272. parser->h_default(parser->user, d_comment, d_comment_len);
  273. xmlFree(d_comment);
  274. }
  275. }
  276. static void
  277. _build_entity(const xmlChar *name, int len, xmlChar **entity, int *entity_len)
  278. {
  279. *entity_len = len + 2;
  280. *entity = xmlMalloc(*entity_len + 1);
  281. (*entity)[0] = '&';
  282. memcpy(*entity+1, name, len);
  283. (*entity)[len+1] = ';';
  284. (*entity)[*entity_len] = '\0';
  285. }
  286. static void
  287. _external_entity_ref_handler(void *user, const xmlChar *names, int type, const xmlChar *sys_id, const xmlChar *pub_id, xmlChar *content)
  288. {
  289. XML_Parser parser = (XML_Parser) user;
  290. if (parser->h_external_entity_ref == NULL) {
  291. return;
  292. }
  293. if (!parser->h_external_entity_ref(parser, names, (XML_Char *) "", sys_id, pub_id)) {
  294. xmlStopParser(parser->parser);
  295. parser->parser->errNo = XML_ERROR_EXTERNAL_ENTITY_HANDLING;
  296. };
  297. }
  298. static xmlEntityPtr
  299. _get_entity(void *user, const xmlChar *name)
  300. {
  301. XML_Parser parser = (XML_Parser) user;
  302. xmlEntityPtr ret = NULL;
  303. if (parser->parser->inSubset == 0) {
  304. ret = xmlGetPredefinedEntity(name);
  305. if (ret == NULL)
  306. ret = xmlGetDocEntity(parser->parser->myDoc, name);
  307. if (ret == NULL || (parser->parser->instate != XML_PARSER_ENTITY_VALUE && parser->parser->instate != XML_PARSER_ATTRIBUTE_VALUE)) {
  308. if (ret == NULL || ret->etype == XML_INTERNAL_GENERAL_ENTITY || ret->etype == XML_INTERNAL_PARAMETER_ENTITY || ret->etype == XML_INTERNAL_PREDEFINED_ENTITY) {
  309. /* Predefined entities will expand unless no cdata handler is present */
  310. if (parser->h_default && ! (ret && ret->etype == XML_INTERNAL_PREDEFINED_ENTITY && parser->h_cdata)) {
  311. xmlChar *entity;
  312. int len;
  313. _build_entity(name, xmlStrlen(name), &entity, &len);
  314. parser->h_default(parser->user, (const xmlChar *) entity, len);
  315. xmlFree(entity);
  316. } else {
  317. /* expat will not expand internal entities if default handler is present otherwise
  318. it will expand and pass them to cdata handler */
  319. if (parser->h_cdata && ret) {
  320. parser->h_cdata(parser->user, ret->content, xmlStrlen(ret->content));
  321. }
  322. }
  323. } else {
  324. if (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
  325. _external_entity_ref_handler(user, ret->name, ret->etype, ret->SystemID, ret->ExternalID, NULL);
  326. }
  327. }
  328. }
  329. }
  330. return ret;
  331. }
  332. static const xmlSAXHandler
  333. php_xml_compat_handlers = {
  334. NULL, /* internalSubset */
  335. NULL, /* isStandalone */
  336. NULL, /* hasInternalSubset */
  337. NULL, /* hasExternalSubset */
  338. NULL, /* resolveEntity */
  339. _get_entity, /* getEntity */
  340. NULL, /* entityDecl */
  341. _notation_decl_handler,
  342. NULL, /* attributeDecl */
  343. NULL, /* elementDecl */
  344. _unparsed_entity_decl_handler, /* unparsedEntity */
  345. NULL, /* setDocumentLocator */
  346. NULL, /* startDocument */
  347. NULL, /* endDocument */
  348. _start_element_handler, /* startElement */
  349. _end_element_handler, /* endElement */
  350. NULL, /* reference */
  351. _cdata_handler,
  352. NULL, /* ignorableWhitespace */
  353. _pi_handler,
  354. _comment_handler, /* comment */
  355. NULL, /* warning */
  356. NULL, /* error */
  357. NULL, /* fatalError */
  358. NULL, /* getParameterEntity */
  359. _cdata_handler, /* cdataBlock */
  360. NULL, /* externalSubset */
  361. XML_SAX2_MAGIC,
  362. NULL,
  363. _start_element_handler_ns,
  364. _end_element_handler_ns,
  365. NULL
  366. };
  367. PHP_XML_API XML_Parser
  368. XML_ParserCreate(const XML_Char *encoding)
  369. {
  370. return XML_ParserCreate_MM(encoding, NULL, NULL);
  371. }
  372. PHP_XML_API XML_Parser
  373. XML_ParserCreateNS(const XML_Char *encoding, const XML_Char sep)
  374. {
  375. XML_Char tmp[2];
  376. tmp[0] = sep;
  377. tmp[1] = '\0';
  378. return XML_ParserCreate_MM(encoding, NULL, tmp);
  379. }
  380. PHP_XML_API XML_Parser
  381. XML_ParserCreate_MM(const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, const XML_Char *sep)
  382. {
  383. XML_Parser parser;
  384. parser = (XML_Parser) emalloc(sizeof(struct _XML_Parser));
  385. memset(parser, 0, sizeof(struct _XML_Parser));
  386. parser->use_namespace = 0;
  387. parser->_ns_separator = NULL;
  388. parser->parser = xmlCreatePushParserCtxt((xmlSAXHandlerPtr) &php_xml_compat_handlers, (void *) parser, NULL, 0, NULL);
  389. if (parser->parser == NULL) {
  390. efree(parser);
  391. return NULL;
  392. }
  393. xmlCtxtUseOptions(parser->parser, XML_PARSE_OLDSAX);
  394. parser->parser->replaceEntities = 1;
  395. parser->parser->wellFormed = 0;
  396. if (sep != NULL) {
  397. parser->use_namespace = 1;
  398. parser->parser->sax2 = 1;
  399. parser->_ns_separator = xmlStrdup(sep);
  400. } else {
  401. /* Reset flag as XML_SAX2_MAGIC is needed for xmlCreatePushParserCtxt
  402. so must be set in the handlers */
  403. parser->parser->sax->initialized = 1;
  404. }
  405. return parser;
  406. }
  407. PHP_XML_API void
  408. XML_SetUserData(XML_Parser parser, void *user)
  409. {
  410. parser->user = user;
  411. }
  412. PHP_XML_API void *
  413. XML_GetUserData(XML_Parser parser)
  414. {
  415. return parser->user;
  416. }
  417. PHP_XML_API void
  418. XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end)
  419. {
  420. parser->h_start_element = start;
  421. parser->h_end_element = end;
  422. }
  423. PHP_XML_API void
  424. XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler cdata)
  425. {
  426. parser->h_cdata = cdata;
  427. }
  428. PHP_XML_API void
  429. XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler pi)
  430. {
  431. parser->h_pi = pi;
  432. }
  433. PHP_XML_API void
  434. XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler comment)
  435. {
  436. parser->h_comment = comment;
  437. }
  438. PHP_XML_API void
  439. XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler d)
  440. {
  441. parser->h_default = d;
  442. }
  443. PHP_XML_API void
  444. XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler unparsed_decl)
  445. {
  446. parser->h_unparsed_entity_decl = unparsed_decl;
  447. }
  448. PHP_XML_API void
  449. XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler notation_decl)
  450. {
  451. parser->h_notation_decl = notation_decl;
  452. }
  453. PHP_XML_API void
  454. XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler ext_entity)
  455. {
  456. parser->h_external_entity_ref = ext_entity;
  457. }
  458. PHP_XML_API void
  459. XML_SetStartNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start_ns)
  460. {
  461. parser->h_start_ns = start_ns;
  462. }
  463. PHP_XML_API void
  464. XML_SetEndNamespaceDeclHandler(XML_Parser parser, XML_EndNamespaceDeclHandler end_ns)
  465. {
  466. parser->h_end_ns = end_ns;
  467. }
  468. PHP_XML_API int
  469. XML_Parse(XML_Parser parser, const XML_Char *data, int data_len, int is_final)
  470. {
  471. int error;
  472. if (parser->parser->lastError.level >= XML_ERR_WARNING) {
  473. return 0;
  474. }
  475. error = xmlParseChunk(parser->parser, (char *) data, data_len, is_final);
  476. if (error) {
  477. return 0;
  478. } else {
  479. return 1;
  480. }
  481. }
  482. PHP_XML_API int
  483. XML_GetErrorCode(XML_Parser parser)
  484. {
  485. return parser->parser->errNo;
  486. }
  487. static const XML_Char *const error_mapping[] = {
  488. (const XML_Char *)"No error",
  489. (const XML_Char *)"No memory",
  490. (const XML_Char *)"Invalid document start",
  491. (const XML_Char *)"Empty document",
  492. (const XML_Char *)"Not well-formed (invalid token)",
  493. (const XML_Char *)"Invalid document end",
  494. (const XML_Char *)"Invalid hexadecimal character reference",
  495. (const XML_Char *)"Invalid decimal character reference",
  496. (const XML_Char *)"Invalid character reference",
  497. (const XML_Char *)"Invalid character",
  498. (const XML_Char *)"XML_ERR_CHARREF_AT_EOF",
  499. (const XML_Char *)"XML_ERR_CHARREF_IN_PROLOG",
  500. (const XML_Char *)"XML_ERR_CHARREF_IN_EPILOG",
  501. (const XML_Char *)"XML_ERR_CHARREF_IN_DTD",
  502. (const XML_Char *)"XML_ERR_ENTITYREF_AT_EOF",
  503. (const XML_Char *)"XML_ERR_ENTITYREF_IN_PROLOG",
  504. (const XML_Char *)"XML_ERR_ENTITYREF_IN_EPILOG",
  505. (const XML_Char *)"XML_ERR_ENTITYREF_IN_DTD",
  506. (const XML_Char *)"PEReference at end of document",
  507. (const XML_Char *)"PEReference in prolog",
  508. (const XML_Char *)"PEReference in epilog",
  509. (const XML_Char *)"PEReference: forbidden within markup decl in internal subset",
  510. (const XML_Char *)"XML_ERR_ENTITYREF_NO_NAME",
  511. (const XML_Char *)"EntityRef: expecting ';'",
  512. (const XML_Char *)"PEReference: no name",
  513. (const XML_Char *)"PEReference: expecting ';'",
  514. (const XML_Char *)"Undeclared entity error",
  515. (const XML_Char *)"Undeclared entity warning",
  516. (const XML_Char *)"Unparsed Entity",
  517. (const XML_Char *)"XML_ERR_ENTITY_IS_EXTERNAL",
  518. (const XML_Char *)"XML_ERR_ENTITY_IS_PARAMETER",
  519. (const XML_Char *)"Unknown encoding",
  520. (const XML_Char *)"Unsupported encoding",
  521. (const XML_Char *)"String not started expecting ' or \"",
  522. (const XML_Char *)"String not closed expecting \" or '",
  523. (const XML_Char *)"Namespace declaration error",
  524. (const XML_Char *)"EntityValue: \" or ' expected",
  525. (const XML_Char *)"EntityValue: \" or ' expected",
  526. (const XML_Char *)"< in attribute",
  527. (const XML_Char *)"Attribute not started",
  528. (const XML_Char *)"Attribute not finished",
  529. (const XML_Char *)"Attribute without value",
  530. (const XML_Char *)"Attribute redefined",
  531. (const XML_Char *)"SystemLiteral \" or ' expected",
  532. (const XML_Char *)"SystemLiteral \" or ' expected",
  533. /* (const XML_Char *)"XML_ERR_COMMENT_NOT_STARTED", <= eliminated on purpose */
  534. (const XML_Char *)"Comment not finished",
  535. (const XML_Char *)"Processing Instruction not started",
  536. (const XML_Char *)"Processing Instruction not finished",
  537. (const XML_Char *)"NOTATION: Name expected here",
  538. (const XML_Char *)"'>' required to close NOTATION declaration",
  539. (const XML_Char *)"'(' required to start ATTLIST enumeration",
  540. (const XML_Char *)"'(' required to start ATTLIST enumeration",
  541. (const XML_Char *)"MixedContentDecl : '|' or ')*' expected",
  542. (const XML_Char *)"XML_ERR_MIXED_NOT_FINISHED",
  543. (const XML_Char *)"ELEMENT in DTD not started",
  544. (const XML_Char *)"ELEMENT in DTD not finished",
  545. (const XML_Char *)"XML declaration not started",
  546. (const XML_Char *)"XML declaration not finished",
  547. (const XML_Char *)"XML_ERR_CONDSEC_NOT_STARTED",
  548. (const XML_Char *)"XML conditional section not closed",
  549. (const XML_Char *)"Content error in the external subset",
  550. (const XML_Char *)"DOCTYPE not finished",
  551. (const XML_Char *)"Sequence ']]>' not allowed in content",
  552. (const XML_Char *)"CDATA not finished",
  553. (const XML_Char *)"Reserved XML Name",
  554. (const XML_Char *)"Space required",
  555. (const XML_Char *)"XML_ERR_SEPARATOR_REQUIRED",
  556. (const XML_Char *)"NmToken expected in ATTLIST enumeration",
  557. (const XML_Char *)"XML_ERR_NAME_REQUIRED",
  558. (const XML_Char *)"MixedContentDecl : '#PCDATA' expected",
  559. (const XML_Char *)"SYSTEM or PUBLIC, the URI is missing",
  560. (const XML_Char *)"PUBLIC, the Public Identifier is missing",
  561. (const XML_Char *)"< required",
  562. (const XML_Char *)"> required",
  563. (const XML_Char *)"</ required",
  564. (const XML_Char *)"= required",
  565. (const XML_Char *)"Mismatched tag",
  566. (const XML_Char *)"Tag not finished",
  567. (const XML_Char *)"standalone accepts only 'yes' or 'no'",
  568. (const XML_Char *)"Invalid XML encoding name",
  569. (const XML_Char *)"Comment must not contain '--' (double-hyphen)",
  570. (const XML_Char *)"Invalid encoding",
  571. (const XML_Char *)"external parsed entities cannot be standalone",
  572. (const XML_Char *)"XML conditional section '[' expected",
  573. (const XML_Char *)"Entity value required",
  574. (const XML_Char *)"chunk is not well balanced",
  575. (const XML_Char *)"extra content at the end of well balanced chunk",
  576. (const XML_Char *)"XML_ERR_ENTITY_CHAR_ERROR",
  577. (const XML_Char *)"PEReferences forbidden in internal subset",
  578. (const XML_Char *)"Detected an entity reference loop",
  579. (const XML_Char *)"XML_ERR_ENTITY_BOUNDARY",
  580. (const XML_Char *)"Invalid URI",
  581. (const XML_Char *)"Fragment not allowed",
  582. (const XML_Char *)"XML_WAR_CATALOG_PI",
  583. (const XML_Char *)"XML_ERR_NO_DTD",
  584. (const XML_Char *)"conditional section INCLUDE or IGNORE keyword expected", /* 95 */
  585. (const XML_Char *)"Version in XML Declaration missing", /* 96 */
  586. (const XML_Char *)"XML_WAR_UNKNOWN_VERSION", /* 97 */
  587. (const XML_Char *)"XML_WAR_LANG_VALUE", /* 98 */
  588. (const XML_Char *)"XML_WAR_NS_URI", /* 99 */
  589. (const XML_Char *)"XML_WAR_NS_URI_RELATIVE", /* 100 */
  590. (const XML_Char *)"Missing encoding in text declaration" /* 101 */
  591. };
  592. PHP_XML_API const XML_Char *
  593. XML_ErrorString(int code)
  594. {
  595. if (code < 0 || code >= (int)(sizeof(error_mapping) / sizeof(error_mapping[0]))) {
  596. return (const XML_Char *) "Unknown";
  597. }
  598. return error_mapping[code];
  599. }
  600. PHP_XML_API int
  601. XML_GetCurrentLineNumber(XML_Parser parser)
  602. {
  603. return parser->parser->input->line;
  604. }
  605. PHP_XML_API int
  606. XML_GetCurrentColumnNumber(XML_Parser parser)
  607. {
  608. return parser->parser->input->col;
  609. }
  610. PHP_XML_API int
  611. XML_GetCurrentByteIndex(XML_Parser parser)
  612. {
  613. return parser->parser->input->consumed +
  614. (parser->parser->input->cur - parser->parser->input->base);
  615. }
  616. PHP_XML_API int
  617. XML_GetCurrentByteCount(XML_Parser parser)
  618. {
  619. /* WARNING: this is identical to ByteIndex; it should probably
  620. * be different */
  621. return parser->parser->input->consumed +
  622. (parser->parser->input->cur - parser->parser->input->base);
  623. }
  624. PHP_XML_API const XML_Char *XML_ExpatVersion(void)
  625. {
  626. return (const XML_Char *) "1.0";
  627. }
  628. PHP_XML_API void
  629. XML_ParserFree(XML_Parser parser)
  630. {
  631. if (parser->use_namespace) {
  632. if (parser->_ns_separator) {
  633. xmlFree(parser->_ns_separator);
  634. }
  635. }
  636. if (parser->parser->myDoc) {
  637. xmlFreeDoc(parser->parser->myDoc);
  638. parser->parser->myDoc = NULL;
  639. }
  640. xmlFreeParserCtxt(parser->parser);
  641. efree(parser);
  642. }
  643. #endif /* LIBXML_EXPAT_COMPAT */
  644. #endif