@helm2/poc_jenki_rce 0.0.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of @helm2/poc_jenki_rce might be problematic. Click here for more details.

Files changed (160) hide show
  1. package/LICENSE +19 -0
  2. package/Makefile +18 -0
  3. package/README.md +52 -0
  4. package/binding.gyp +81 -0
  5. package/index.d.ts +273 -0
  6. package/index.js +45 -0
  7. package/lib/bindings.js +1 -0
  8. package/lib/document.js +118 -0
  9. package/lib/element.js +82 -0
  10. package/lib/sax_parser.js +38 -0
  11. package/package.json +70 -0
  12. package/src/html_document.cc +7 -0
  13. package/src/html_document.h +18 -0
  14. package/src/libxmljs.cc +252 -0
  15. package/src/libxmljs.h +53 -0
  16. package/src/xml_attribute.cc +173 -0
  17. package/src/xml_attribute.h +40 -0
  18. package/src/xml_comment.cc +117 -0
  19. package/src/xml_comment.h +30 -0
  20. package/src/xml_document.cc +810 -0
  21. package/src/xml_document.h +67 -0
  22. package/src/xml_element.cc +565 -0
  23. package/src/xml_element.h +61 -0
  24. package/src/xml_namespace.cc +158 -0
  25. package/src/xml_namespace.h +39 -0
  26. package/src/xml_node.cc +761 -0
  27. package/src/xml_node.h +73 -0
  28. package/src/xml_pi.cc +161 -0
  29. package/src/xml_pi.h +34 -0
  30. package/src/xml_sax_parser.cc +424 -0
  31. package/src/xml_sax_parser.h +73 -0
  32. package/src/xml_syntax_error.cc +66 -0
  33. package/src/xml_syntax_error.h +25 -0
  34. package/src/xml_text.cc +320 -0
  35. package/src/xml_text.h +48 -0
  36. package/src/xml_textwriter.cc +315 -0
  37. package/src/xml_textwriter.h +62 -0
  38. package/src/xml_xpath_context.cc +70 -0
  39. package/src/xml_xpath_context.h +23 -0
  40. package/vendor/libxml/Copyright +23 -0
  41. package/vendor/libxml/DOCBparser.c +305 -0
  42. package/vendor/libxml/HTMLparser.c +7287 -0
  43. package/vendor/libxml/HTMLtree.c +1200 -0
  44. package/vendor/libxml/Makefile +2983 -0
  45. package/vendor/libxml/SAX.c +180 -0
  46. package/vendor/libxml/SAX2.c +3036 -0
  47. package/vendor/libxml/buf.c +1351 -0
  48. package/vendor/libxml/buf.h +72 -0
  49. package/vendor/libxml/c14n.c +2234 -0
  50. package/vendor/libxml/catalog.c +3828 -0
  51. package/vendor/libxml/chvalid.c +336 -0
  52. package/vendor/libxml/config.h +294 -0
  53. package/vendor/libxml/config.h.gch +0 -0
  54. package/vendor/libxml/debugXML.c +3423 -0
  55. package/vendor/libxml/dict.c +1298 -0
  56. package/vendor/libxml/elfgcchack.h +17818 -0
  57. package/vendor/libxml/enc.h +32 -0
  58. package/vendor/libxml/encoding.c +3975 -0
  59. package/vendor/libxml/entities.c +1163 -0
  60. package/vendor/libxml/error.c +998 -0
  61. package/vendor/libxml/globals.c +1126 -0
  62. package/vendor/libxml/hash.c +1146 -0
  63. package/vendor/libxml/include/libxml/DOCBparser.h +96 -0
  64. package/vendor/libxml/include/libxml/HTMLparser.h +306 -0
  65. package/vendor/libxml/include/libxml/HTMLtree.h +147 -0
  66. package/vendor/libxml/include/libxml/Makefile +725 -0
  67. package/vendor/libxml/include/libxml/Makefile.am +54 -0
  68. package/vendor/libxml/include/libxml/Makefile.in +725 -0
  69. package/vendor/libxml/include/libxml/SAX.h +173 -0
  70. package/vendor/libxml/include/libxml/SAX2.h +178 -0
  71. package/vendor/libxml/include/libxml/c14n.h +128 -0
  72. package/vendor/libxml/include/libxml/catalog.h +182 -0
  73. package/vendor/libxml/include/libxml/chvalid.h +230 -0
  74. package/vendor/libxml/include/libxml/debugXML.h +217 -0
  75. package/vendor/libxml/include/libxml/dict.h +79 -0
  76. package/vendor/libxml/include/libxml/encoding.h +245 -0
  77. package/vendor/libxml/include/libxml/entities.h +151 -0
  78. package/vendor/libxml/include/libxml/globals.h +508 -0
  79. package/vendor/libxml/include/libxml/hash.h +236 -0
  80. package/vendor/libxml/include/libxml/list.h +137 -0
  81. package/vendor/libxml/include/libxml/nanoftp.h +163 -0
  82. package/vendor/libxml/include/libxml/nanohttp.h +81 -0
  83. package/vendor/libxml/include/libxml/parser.h +1243 -0
  84. package/vendor/libxml/include/libxml/parserInternals.h +644 -0
  85. package/vendor/libxml/include/libxml/pattern.h +100 -0
  86. package/vendor/libxml/include/libxml/relaxng.h +217 -0
  87. package/vendor/libxml/include/libxml/schemasInternals.h +958 -0
  88. package/vendor/libxml/include/libxml/schematron.h +142 -0
  89. package/vendor/libxml/include/libxml/threads.h +89 -0
  90. package/vendor/libxml/include/libxml/tree.h +1311 -0
  91. package/vendor/libxml/include/libxml/uri.h +94 -0
  92. package/vendor/libxml/include/libxml/valid.h +458 -0
  93. package/vendor/libxml/include/libxml/xinclude.h +129 -0
  94. package/vendor/libxml/include/libxml/xlink.h +189 -0
  95. package/vendor/libxml/include/libxml/xmlIO.h +368 -0
  96. package/vendor/libxml/include/libxml/xmlautomata.h +146 -0
  97. package/vendor/libxml/include/libxml/xmlerror.h +945 -0
  98. package/vendor/libxml/include/libxml/xmlexports.h +77 -0
  99. package/vendor/libxml/include/libxml/xmlmemory.h +224 -0
  100. package/vendor/libxml/include/libxml/xmlmodule.h +57 -0
  101. package/vendor/libxml/include/libxml/xmlreader.h +428 -0
  102. package/vendor/libxml/include/libxml/xmlregexp.h +222 -0
  103. package/vendor/libxml/include/libxml/xmlsave.h +88 -0
  104. package/vendor/libxml/include/libxml/xmlschemas.h +246 -0
  105. package/vendor/libxml/include/libxml/xmlschemastypes.h +151 -0
  106. package/vendor/libxml/include/libxml/xmlstring.h +140 -0
  107. package/vendor/libxml/include/libxml/xmlunicode.h +202 -0
  108. package/vendor/libxml/include/libxml/xmlversion.h +484 -0
  109. package/vendor/libxml/include/libxml/xmlwin32version.h +239 -0
  110. package/vendor/libxml/include/libxml/xmlwriter.h +488 -0
  111. package/vendor/libxml/include/libxml/xpath.h +564 -0
  112. package/vendor/libxml/include/libxml/xpathInternals.h +632 -0
  113. package/vendor/libxml/include/libxml/xpointer.h +114 -0
  114. package/vendor/libxml/include/win32config.h +122 -0
  115. package/vendor/libxml/include/wsockcompat.h +54 -0
  116. package/vendor/libxml/legacy.c +1343 -0
  117. package/vendor/libxml/libxml.h +134 -0
  118. package/vendor/libxml/list.c +779 -0
  119. package/vendor/libxml/nanoftp.c +2118 -0
  120. package/vendor/libxml/nanohttp.c +1899 -0
  121. package/vendor/libxml/parser.c +15553 -0
  122. package/vendor/libxml/parserInternals.c +2164 -0
  123. package/vendor/libxml/pattern.c +2621 -0
  124. package/vendor/libxml/relaxng.c +11101 -0
  125. package/vendor/libxml/rngparser.c +1595 -0
  126. package/vendor/libxml/runsuite.c +1157 -0
  127. package/vendor/libxml/save.h +36 -0
  128. package/vendor/libxml/schematron.c +1787 -0
  129. package/vendor/libxml/threads.c +1049 -0
  130. package/vendor/libxml/timsort.h +601 -0
  131. package/vendor/libxml/tree.c +10183 -0
  132. package/vendor/libxml/trio.c +6895 -0
  133. package/vendor/libxml/trio.h +230 -0
  134. package/vendor/libxml/triodef.h +228 -0
  135. package/vendor/libxml/trionan.c +914 -0
  136. package/vendor/libxml/trionan.h +84 -0
  137. package/vendor/libxml/triop.h +150 -0
  138. package/vendor/libxml/triostr.c +2112 -0
  139. package/vendor/libxml/triostr.h +144 -0
  140. package/vendor/libxml/uri.c +2561 -0
  141. package/vendor/libxml/valid.c +7138 -0
  142. package/vendor/libxml/xinclude.c +2657 -0
  143. package/vendor/libxml/xlink.c +183 -0
  144. package/vendor/libxml/xmlIO.c +4135 -0
  145. package/vendor/libxml/xmlcatalog.c +624 -0
  146. package/vendor/libxml/xmllint.c +3796 -0
  147. package/vendor/libxml/xmlmemory.c +1163 -0
  148. package/vendor/libxml/xmlmodule.c +468 -0
  149. package/vendor/libxml/xmlreader.c +6033 -0
  150. package/vendor/libxml/xmlregexp.c +8271 -0
  151. package/vendor/libxml/xmlsave.c +2735 -0
  152. package/vendor/libxml/xmlschemas.c +29173 -0
  153. package/vendor/libxml/xmlschemastypes.c +6276 -0
  154. package/vendor/libxml/xmlstring.c +1050 -0
  155. package/vendor/libxml/xmlunicode.c +3179 -0
  156. package/vendor/libxml/xmlwriter.c +4738 -0
  157. package/vendor/libxml/xpath.c +14734 -0
  158. package/vendor/libxml/xpointer.c +2969 -0
  159. package/vendor/libxml/xzlib.c +815 -0
  160. package/vendor/libxml/xzlib.h +19 -0
@@ -0,0 +1,1163 @@
1
+ /*
2
+ * entities.c : implementation for the XML entities handling
3
+ *
4
+ * See Copyright for the status of this software.
5
+ *
6
+ * daniel@veillard.com
7
+ */
8
+
9
+ /* To avoid EBCDIC trouble when parsing on zOS */
10
+ #if defined(__MVS__)
11
+ #pragma convert("ISO8859-1")
12
+ #endif
13
+
14
+ #define IN_LIBXML
15
+ #include "libxml.h"
16
+
17
+ #include <string.h>
18
+ #ifdef HAVE_STDLIB_H
19
+ #include <stdlib.h>
20
+ #endif
21
+ #include <libxml/xmlmemory.h>
22
+ #include <libxml/hash.h>
23
+ #include <libxml/entities.h>
24
+ #include <libxml/parser.h>
25
+ #include <libxml/parserInternals.h>
26
+ #include <libxml/xmlerror.h>
27
+ #include <libxml/globals.h>
28
+ #include <libxml/dict.h>
29
+
30
+ #include "save.h"
31
+
32
+ /*
33
+ * The XML predefined entities.
34
+ */
35
+
36
+ static xmlEntity xmlEntityLt = {
37
+ NULL, XML_ENTITY_DECL, BAD_CAST "lt",
38
+ NULL, NULL, NULL, NULL, NULL, NULL,
39
+ BAD_CAST "<", BAD_CAST "<", 1,
40
+ XML_INTERNAL_PREDEFINED_ENTITY,
41
+ NULL, NULL, NULL, NULL, 0, 1
42
+ };
43
+ static xmlEntity xmlEntityGt = {
44
+ NULL, XML_ENTITY_DECL, BAD_CAST "gt",
45
+ NULL, NULL, NULL, NULL, NULL, NULL,
46
+ BAD_CAST ">", BAD_CAST ">", 1,
47
+ XML_INTERNAL_PREDEFINED_ENTITY,
48
+ NULL, NULL, NULL, NULL, 0, 1
49
+ };
50
+ static xmlEntity xmlEntityAmp = {
51
+ NULL, XML_ENTITY_DECL, BAD_CAST "amp",
52
+ NULL, NULL, NULL, NULL, NULL, NULL,
53
+ BAD_CAST "&", BAD_CAST "&", 1,
54
+ XML_INTERNAL_PREDEFINED_ENTITY,
55
+ NULL, NULL, NULL, NULL, 0, 1
56
+ };
57
+ static xmlEntity xmlEntityQuot = {
58
+ NULL, XML_ENTITY_DECL, BAD_CAST "quot",
59
+ NULL, NULL, NULL, NULL, NULL, NULL,
60
+ BAD_CAST "\"", BAD_CAST "\"", 1,
61
+ XML_INTERNAL_PREDEFINED_ENTITY,
62
+ NULL, NULL, NULL, NULL, 0, 1
63
+ };
64
+ static xmlEntity xmlEntityApos = {
65
+ NULL, XML_ENTITY_DECL, BAD_CAST "apos",
66
+ NULL, NULL, NULL, NULL, NULL, NULL,
67
+ BAD_CAST "'", BAD_CAST "'", 1,
68
+ XML_INTERNAL_PREDEFINED_ENTITY,
69
+ NULL, NULL, NULL, NULL, 0, 1
70
+ };
71
+
72
+ /**
73
+ * xmlEntitiesErrMemory:
74
+ * @extra: extra information
75
+ *
76
+ * Handle an out of memory condition
77
+ */
78
+ static void
79
+ xmlEntitiesErrMemory(const char *extra)
80
+ {
81
+ __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra);
82
+ }
83
+
84
+ /**
85
+ * xmlEntitiesErr:
86
+ * @code: the error code
87
+ * @msg: the message
88
+ *
89
+ * Handle an out of memory condition
90
+ */
91
+ static void LIBXML_ATTR_FORMAT(2,0)
92
+ xmlEntitiesErr(xmlParserErrors code, const char *msg)
93
+ {
94
+ __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL);
95
+ }
96
+
97
+ /*
98
+ * xmlFreeEntity : clean-up an entity record.
99
+ */
100
+ static void
101
+ xmlFreeEntity(xmlEntityPtr entity)
102
+ {
103
+ xmlDictPtr dict = NULL;
104
+
105
+ if (entity == NULL)
106
+ return;
107
+
108
+ if (entity->doc != NULL)
109
+ dict = entity->doc->dict;
110
+
111
+
112
+ if ((entity->children) && (entity->owner == 1) &&
113
+ (entity == (xmlEntityPtr) entity->children->parent))
114
+ xmlFreeNodeList(entity->children);
115
+ if (dict != NULL) {
116
+ if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name)))
117
+ xmlFree((char *) entity->name);
118
+ if ((entity->ExternalID != NULL) &&
119
+ (!xmlDictOwns(dict, entity->ExternalID)))
120
+ xmlFree((char *) entity->ExternalID);
121
+ if ((entity->SystemID != NULL) &&
122
+ (!xmlDictOwns(dict, entity->SystemID)))
123
+ xmlFree((char *) entity->SystemID);
124
+ if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI)))
125
+ xmlFree((char *) entity->URI);
126
+ if ((entity->content != NULL)
127
+ && (!xmlDictOwns(dict, entity->content)))
128
+ xmlFree((char *) entity->content);
129
+ if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig)))
130
+ xmlFree((char *) entity->orig);
131
+ } else {
132
+ if (entity->name != NULL)
133
+ xmlFree((char *) entity->name);
134
+ if (entity->ExternalID != NULL)
135
+ xmlFree((char *) entity->ExternalID);
136
+ if (entity->SystemID != NULL)
137
+ xmlFree((char *) entity->SystemID);
138
+ if (entity->URI != NULL)
139
+ xmlFree((char *) entity->URI);
140
+ if (entity->content != NULL)
141
+ xmlFree((char *) entity->content);
142
+ if (entity->orig != NULL)
143
+ xmlFree((char *) entity->orig);
144
+ }
145
+ xmlFree(entity);
146
+ }
147
+
148
+ /*
149
+ * xmlCreateEntity:
150
+ *
151
+ * internal routine doing the entity node structures allocations
152
+ */
153
+ static xmlEntityPtr
154
+ xmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type,
155
+ const xmlChar *ExternalID, const xmlChar *SystemID,
156
+ const xmlChar *content) {
157
+ xmlEntityPtr ret;
158
+
159
+ ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
160
+ if (ret == NULL) {
161
+ xmlEntitiesErrMemory("xmlCreateEntity: malloc failed");
162
+ return(NULL);
163
+ }
164
+ memset(ret, 0, sizeof(xmlEntity));
165
+ ret->type = XML_ENTITY_DECL;
166
+ ret->checked = 0;
167
+
168
+ /*
169
+ * fill the structure.
170
+ */
171
+ ret->etype = (xmlEntityType) type;
172
+ if (dict == NULL) {
173
+ ret->name = xmlStrdup(name);
174
+ if (ExternalID != NULL)
175
+ ret->ExternalID = xmlStrdup(ExternalID);
176
+ if (SystemID != NULL)
177
+ ret->SystemID = xmlStrdup(SystemID);
178
+ } else {
179
+ ret->name = xmlDictLookup(dict, name, -1);
180
+ if (ExternalID != NULL)
181
+ ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);
182
+ if (SystemID != NULL)
183
+ ret->SystemID = xmlDictLookup(dict, SystemID, -1);
184
+ }
185
+ if (content != NULL) {
186
+ ret->length = xmlStrlen(content);
187
+ if ((dict != NULL) && (ret->length < 5))
188
+ ret->content = (xmlChar *)
189
+ xmlDictLookup(dict, content, ret->length);
190
+ else
191
+ ret->content = xmlStrndup(content, ret->length);
192
+ } else {
193
+ ret->length = 0;
194
+ ret->content = NULL;
195
+ }
196
+ ret->URI = NULL; /* to be computed by the layer knowing
197
+ the defining entity */
198
+ ret->orig = NULL;
199
+ ret->owner = 0;
200
+
201
+ return(ret);
202
+ }
203
+
204
+ /*
205
+ * xmlAddEntity : register a new entity for an entities table.
206
+ */
207
+ static xmlEntityPtr
208
+ xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type,
209
+ const xmlChar *ExternalID, const xmlChar *SystemID,
210
+ const xmlChar *content) {
211
+ xmlDictPtr dict = NULL;
212
+ xmlEntitiesTablePtr table = NULL;
213
+ xmlEntityPtr ret, predef;
214
+
215
+ if (name == NULL)
216
+ return(NULL);
217
+ if (dtd == NULL)
218
+ return(NULL);
219
+ if (dtd->doc != NULL)
220
+ dict = dtd->doc->dict;
221
+
222
+ switch (type) {
223
+ case XML_INTERNAL_GENERAL_ENTITY:
224
+ case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
225
+ case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
226
+ predef = xmlGetPredefinedEntity(name);
227
+ if (predef != NULL) {
228
+ int valid = 0;
229
+
230
+ /* 4.6 Predefined Entities */
231
+ if ((type == XML_INTERNAL_GENERAL_ENTITY) &&
232
+ (content != NULL)) {
233
+ int c = predef->content[0];
234
+
235
+ if (((content[0] == c) && (content[1] == 0)) &&
236
+ ((c == '>') || (c == '\'') || (c == '"'))) {
237
+ valid = 1;
238
+ } else if ((content[0] == '&') && (content[1] == '#')) {
239
+ if (content[2] == 'x') {
240
+ xmlChar *hex = BAD_CAST "0123456789ABCDEF";
241
+ xmlChar ref[] = "00;";
242
+
243
+ ref[0] = hex[c / 16 % 16];
244
+ ref[1] = hex[c % 16];
245
+ if (xmlStrcasecmp(&content[3], ref) == 0)
246
+ valid = 1;
247
+ } else {
248
+ xmlChar ref[] = "00;";
249
+
250
+ ref[0] = '0' + c / 10 % 10;
251
+ ref[1] = '0' + c % 10;
252
+ if (xmlStrEqual(&content[2], ref))
253
+ valid = 1;
254
+ }
255
+ }
256
+ }
257
+ if (!valid) {
258
+ xmlEntitiesErr(XML_ERR_ENTITY_PROCESSING,
259
+ "xmlAddEntity: invalid redeclaration of predefined"
260
+ " entity");
261
+ return(NULL);
262
+ }
263
+ }
264
+ if (dtd->entities == NULL)
265
+ dtd->entities = xmlHashCreateDict(0, dict);
266
+ table = dtd->entities;
267
+ break;
268
+ case XML_INTERNAL_PARAMETER_ENTITY:
269
+ case XML_EXTERNAL_PARAMETER_ENTITY:
270
+ if (dtd->pentities == NULL)
271
+ dtd->pentities = xmlHashCreateDict(0, dict);
272
+ table = dtd->pentities;
273
+ break;
274
+ case XML_INTERNAL_PREDEFINED_ENTITY:
275
+ return(NULL);
276
+ }
277
+ if (table == NULL)
278
+ return(NULL);
279
+ ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content);
280
+ if (ret == NULL)
281
+ return(NULL);
282
+ ret->doc = dtd->doc;
283
+
284
+ if (xmlHashAddEntry(table, name, ret)) {
285
+ /*
286
+ * entity was already defined at another level.
287
+ */
288
+ xmlFreeEntity(ret);
289
+ return(NULL);
290
+ }
291
+ return(ret);
292
+ }
293
+
294
+ /**
295
+ * xmlGetPredefinedEntity:
296
+ * @name: the entity name
297
+ *
298
+ * Check whether this name is an predefined entity.
299
+ *
300
+ * Returns NULL if not, otherwise the entity
301
+ */
302
+ xmlEntityPtr
303
+ xmlGetPredefinedEntity(const xmlChar *name) {
304
+ if (name == NULL) return(NULL);
305
+ switch (name[0]) {
306
+ case 'l':
307
+ if (xmlStrEqual(name, BAD_CAST "lt"))
308
+ return(&xmlEntityLt);
309
+ break;
310
+ case 'g':
311
+ if (xmlStrEqual(name, BAD_CAST "gt"))
312
+ return(&xmlEntityGt);
313
+ break;
314
+ case 'a':
315
+ if (xmlStrEqual(name, BAD_CAST "amp"))
316
+ return(&xmlEntityAmp);
317
+ if (xmlStrEqual(name, BAD_CAST "apos"))
318
+ return(&xmlEntityApos);
319
+ break;
320
+ case 'q':
321
+ if (xmlStrEqual(name, BAD_CAST "quot"))
322
+ return(&xmlEntityQuot);
323
+ break;
324
+ default:
325
+ break;
326
+ }
327
+ return(NULL);
328
+ }
329
+
330
+ /**
331
+ * xmlAddDtdEntity:
332
+ * @doc: the document
333
+ * @name: the entity name
334
+ * @type: the entity type XML_xxx_yyy_ENTITY
335
+ * @ExternalID: the entity external ID if available
336
+ * @SystemID: the entity system ID if available
337
+ * @content: the entity content
338
+ *
339
+ * Register a new entity for this document DTD external subset.
340
+ *
341
+ * Returns a pointer to the entity or NULL in case of error
342
+ */
343
+ xmlEntityPtr
344
+ xmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type,
345
+ const xmlChar *ExternalID, const xmlChar *SystemID,
346
+ const xmlChar *content) {
347
+ xmlEntityPtr ret;
348
+ xmlDtdPtr dtd;
349
+
350
+ if (doc == NULL) {
351
+ xmlEntitiesErr(XML_DTD_NO_DOC,
352
+ "xmlAddDtdEntity: document is NULL");
353
+ return(NULL);
354
+ }
355
+ if (doc->extSubset == NULL) {
356
+ xmlEntitiesErr(XML_DTD_NO_DTD,
357
+ "xmlAddDtdEntity: document without external subset");
358
+ return(NULL);
359
+ }
360
+ dtd = doc->extSubset;
361
+ ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
362
+ if (ret == NULL) return(NULL);
363
+
364
+ /*
365
+ * Link it to the DTD
366
+ */
367
+ ret->parent = dtd;
368
+ ret->doc = dtd->doc;
369
+ if (dtd->last == NULL) {
370
+ dtd->children = dtd->last = (xmlNodePtr) ret;
371
+ } else {
372
+ dtd->last->next = (xmlNodePtr) ret;
373
+ ret->prev = dtd->last;
374
+ dtd->last = (xmlNodePtr) ret;
375
+ }
376
+ return(ret);
377
+ }
378
+
379
+ /**
380
+ * xmlAddDocEntity:
381
+ * @doc: the document
382
+ * @name: the entity name
383
+ * @type: the entity type XML_xxx_yyy_ENTITY
384
+ * @ExternalID: the entity external ID if available
385
+ * @SystemID: the entity system ID if available
386
+ * @content: the entity content
387
+ *
388
+ * Register a new entity for this document.
389
+ *
390
+ * Returns a pointer to the entity or NULL in case of error
391
+ */
392
+ xmlEntityPtr
393
+ xmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type,
394
+ const xmlChar *ExternalID, const xmlChar *SystemID,
395
+ const xmlChar *content) {
396
+ xmlEntityPtr ret;
397
+ xmlDtdPtr dtd;
398
+
399
+ if (doc == NULL) {
400
+ xmlEntitiesErr(XML_DTD_NO_DOC,
401
+ "xmlAddDocEntity: document is NULL");
402
+ return(NULL);
403
+ }
404
+ if (doc->intSubset == NULL) {
405
+ xmlEntitiesErr(XML_DTD_NO_DTD,
406
+ "xmlAddDocEntity: document without internal subset");
407
+ return(NULL);
408
+ }
409
+ dtd = doc->intSubset;
410
+ ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
411
+ if (ret == NULL) return(NULL);
412
+
413
+ /*
414
+ * Link it to the DTD
415
+ */
416
+ ret->parent = dtd;
417
+ ret->doc = dtd->doc;
418
+ if (dtd->last == NULL) {
419
+ dtd->children = dtd->last = (xmlNodePtr) ret;
420
+ } else {
421
+ dtd->last->next = (xmlNodePtr) ret;
422
+ ret->prev = dtd->last;
423
+ dtd->last = (xmlNodePtr) ret;
424
+ }
425
+ return(ret);
426
+ }
427
+
428
+ /**
429
+ * xmlNewEntity:
430
+ * @doc: the document
431
+ * @name: the entity name
432
+ * @type: the entity type XML_xxx_yyy_ENTITY
433
+ * @ExternalID: the entity external ID if available
434
+ * @SystemID: the entity system ID if available
435
+ * @content: the entity content
436
+ *
437
+ * Create a new entity, this differs from xmlAddDocEntity() that if
438
+ * the document is NULL or has no internal subset defined, then an
439
+ * unlinked entity structure will be returned, it is then the responsibility
440
+ * of the caller to link it to the document later or free it when not needed
441
+ * anymore.
442
+ *
443
+ * Returns a pointer to the entity or NULL in case of error
444
+ */
445
+ xmlEntityPtr
446
+ xmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type,
447
+ const xmlChar *ExternalID, const xmlChar *SystemID,
448
+ const xmlChar *content) {
449
+ xmlEntityPtr ret;
450
+ xmlDictPtr dict;
451
+
452
+ if ((doc != NULL) && (doc->intSubset != NULL)) {
453
+ return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content));
454
+ }
455
+ if (doc != NULL)
456
+ dict = doc->dict;
457
+ else
458
+ dict = NULL;
459
+ ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content);
460
+ if (ret == NULL)
461
+ return(NULL);
462
+ ret->doc = doc;
463
+ return(ret);
464
+ }
465
+
466
+ /**
467
+ * xmlGetEntityFromTable:
468
+ * @table: an entity table
469
+ * @name: the entity name
470
+ * @parameter: look for parameter entities
471
+ *
472
+ * Do an entity lookup in the table.
473
+ * returns the corresponding parameter entity, if found.
474
+ *
475
+ * Returns A pointer to the entity structure or NULL if not found.
476
+ */
477
+ static xmlEntityPtr
478
+ xmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {
479
+ return((xmlEntityPtr) xmlHashLookup(table, name));
480
+ }
481
+
482
+ /**
483
+ * xmlGetParameterEntity:
484
+ * @doc: the document referencing the entity
485
+ * @name: the entity name
486
+ *
487
+ * Do an entity lookup in the internal and external subsets and
488
+ * returns the corresponding parameter entity, if found.
489
+ *
490
+ * Returns A pointer to the entity structure or NULL if not found.
491
+ */
492
+ xmlEntityPtr
493
+ xmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) {
494
+ xmlEntitiesTablePtr table;
495
+ xmlEntityPtr ret;
496
+
497
+ if (doc == NULL)
498
+ return(NULL);
499
+ if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {
500
+ table = (xmlEntitiesTablePtr) doc->intSubset->pentities;
501
+ ret = xmlGetEntityFromTable(table, name);
502
+ if (ret != NULL)
503
+ return(ret);
504
+ }
505
+ if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {
506
+ table = (xmlEntitiesTablePtr) doc->extSubset->pentities;
507
+ return(xmlGetEntityFromTable(table, name));
508
+ }
509
+ return(NULL);
510
+ }
511
+
512
+ /**
513
+ * xmlGetDtdEntity:
514
+ * @doc: the document referencing the entity
515
+ * @name: the entity name
516
+ *
517
+ * Do an entity lookup in the DTD entity hash table and
518
+ * returns the corresponding entity, if found.
519
+ * Note: the first argument is the document node, not the DTD node.
520
+ *
521
+ * Returns A pointer to the entity structure or NULL if not found.
522
+ */
523
+ xmlEntityPtr
524
+ xmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) {
525
+ xmlEntitiesTablePtr table;
526
+
527
+ if (doc == NULL)
528
+ return(NULL);
529
+ if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
530
+ table = (xmlEntitiesTablePtr) doc->extSubset->entities;
531
+ return(xmlGetEntityFromTable(table, name));
532
+ }
533
+ return(NULL);
534
+ }
535
+
536
+ /**
537
+ * xmlGetDocEntity:
538
+ * @doc: the document referencing the entity
539
+ * @name: the entity name
540
+ *
541
+ * Do an entity lookup in the document entity hash table and
542
+ * returns the corresponding entity, otherwise a lookup is done
543
+ * in the predefined entities too.
544
+ *
545
+ * Returns A pointer to the entity structure or NULL if not found.
546
+ */
547
+ xmlEntityPtr
548
+ xmlGetDocEntity(const xmlDoc *doc, const xmlChar *name) {
549
+ xmlEntityPtr cur;
550
+ xmlEntitiesTablePtr table;
551
+
552
+ if (doc != NULL) {
553
+ if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
554
+ table = (xmlEntitiesTablePtr) doc->intSubset->entities;
555
+ cur = xmlGetEntityFromTable(table, name);
556
+ if (cur != NULL)
557
+ return(cur);
558
+ }
559
+ if (doc->standalone != 1) {
560
+ if ((doc->extSubset != NULL) &&
561
+ (doc->extSubset->entities != NULL)) {
562
+ table = (xmlEntitiesTablePtr) doc->extSubset->entities;
563
+ cur = xmlGetEntityFromTable(table, name);
564
+ if (cur != NULL)
565
+ return(cur);
566
+ }
567
+ }
568
+ }
569
+ return(xmlGetPredefinedEntity(name));
570
+ }
571
+
572
+ /*
573
+ * Macro used to grow the current buffer.
574
+ */
575
+ #define growBufferReentrant() { \
576
+ xmlChar *tmp; \
577
+ size_t new_size = buffer_size * 2; \
578
+ if (new_size < buffer_size) goto mem_error; \
579
+ tmp = (xmlChar *) xmlRealloc(buffer, new_size); \
580
+ if (tmp == NULL) goto mem_error; \
581
+ buffer = tmp; \
582
+ buffer_size = new_size; \
583
+ }
584
+
585
+ /**
586
+ * xmlEncodeEntitiesInternal:
587
+ * @doc: the document containing the string
588
+ * @input: A string to convert to XML.
589
+ * @attr: are we handling an attribute value
590
+ *
591
+ * Do a global encoding of a string, replacing the predefined entities
592
+ * and non ASCII values with their entities and CharRef counterparts.
593
+ * Contrary to xmlEncodeEntities, this routine is reentrant, and result
594
+ * must be deallocated.
595
+ *
596
+ * Returns A newly allocated string with the substitution done.
597
+ */
598
+ static xmlChar *
599
+ xmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) {
600
+ const xmlChar *cur = input;
601
+ xmlChar *buffer = NULL;
602
+ xmlChar *out = NULL;
603
+ size_t buffer_size = 0;
604
+ int html = 0;
605
+
606
+ if (input == NULL) return(NULL);
607
+ if (doc != NULL)
608
+ html = (doc->type == XML_HTML_DOCUMENT_NODE);
609
+
610
+ /*
611
+ * allocate an translation buffer.
612
+ */
613
+ buffer_size = 1000;
614
+ buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
615
+ if (buffer == NULL) {
616
+ xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed");
617
+ return(NULL);
618
+ }
619
+ out = buffer;
620
+
621
+ while (*cur != '\0') {
622
+ size_t indx = out - buffer;
623
+ if (indx + 100 > buffer_size) {
624
+
625
+ growBufferReentrant();
626
+ out = &buffer[indx];
627
+ }
628
+
629
+ /*
630
+ * By default one have to encode at least '<', '>', '"' and '&' !
631
+ */
632
+ if (*cur == '<') {
633
+ const xmlChar *end;
634
+
635
+ /*
636
+ * Special handling of server side include in HTML attributes
637
+ */
638
+ if (html && attr &&
639
+ (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') &&
640
+ ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) {
641
+ while (cur != end) {
642
+ *out++ = *cur++;
643
+ indx = out - buffer;
644
+ if (indx + 100 > buffer_size) {
645
+ growBufferReentrant();
646
+ out = &buffer[indx];
647
+ }
648
+ }
649
+ *out++ = *cur++;
650
+ *out++ = *cur++;
651
+ *out++ = *cur++;
652
+ continue;
653
+ }
654
+ *out++ = '&';
655
+ *out++ = 'l';
656
+ *out++ = 't';
657
+ *out++ = ';';
658
+ } else if (*cur == '>') {
659
+ *out++ = '&';
660
+ *out++ = 'g';
661
+ *out++ = 't';
662
+ *out++ = ';';
663
+ } else if (*cur == '&') {
664
+ /*
665
+ * Special handling of &{...} construct from HTML 4, see
666
+ * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1
667
+ */
668
+ if (html && attr && (cur[1] == '{') &&
669
+ (strchr((const char *) cur, '}'))) {
670
+ while (*cur != '}') {
671
+ *out++ = *cur++;
672
+ indx = out - buffer;
673
+ if (indx + 100 > buffer_size) {
674
+ growBufferReentrant();
675
+ out = &buffer[indx];
676
+ }
677
+ }
678
+ *out++ = *cur++;
679
+ continue;
680
+ }
681
+ *out++ = '&';
682
+ *out++ = 'a';
683
+ *out++ = 'm';
684
+ *out++ = 'p';
685
+ *out++ = ';';
686
+ } else if (((*cur >= 0x20) && (*cur < 0x80)) ||
687
+ (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) {
688
+ /*
689
+ * default case, just copy !
690
+ */
691
+ *out++ = *cur;
692
+ } else if (*cur >= 0x80) {
693
+ if (((doc != NULL) && (doc->encoding != NULL)) || (html)) {
694
+ /*
695
+ * Bjørn Reese <br@sseusa.com> provided the patch
696
+ xmlChar xc;
697
+ xc = (*cur & 0x3F) << 6;
698
+ if (cur[1] != 0) {
699
+ xc += *(++cur) & 0x3F;
700
+ *out++ = xc;
701
+ } else
702
+ */
703
+ *out++ = *cur;
704
+ } else {
705
+ /*
706
+ * We assume we have UTF-8 input.
707
+ * It must match either:
708
+ * 110xxxxx 10xxxxxx
709
+ * 1110xxxx 10xxxxxx 10xxxxxx
710
+ * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
711
+ * That is:
712
+ * cur[0] is 11xxxxxx
713
+ * cur[1] is 10xxxxxx
714
+ * cur[2] is 10xxxxxx if cur[0] is 111xxxxx
715
+ * cur[3] is 10xxxxxx if cur[0] is 1111xxxx
716
+ * cur[0] is not 11111xxx
717
+ */
718
+ char buf[11], *ptr;
719
+ int val = 0, l = 1;
720
+
721
+ if (((cur[0] & 0xC0) != 0xC0) ||
722
+ ((cur[1] & 0xC0) != 0x80) ||
723
+ (((cur[0] & 0xE0) == 0xE0) && ((cur[2] & 0xC0) != 0x80)) ||
724
+ (((cur[0] & 0xF0) == 0xF0) && ((cur[3] & 0xC0) != 0x80)) ||
725
+ (((cur[0] & 0xF8) == 0xF8))) {
726
+ xmlEntitiesErr(XML_CHECK_NOT_UTF8,
727
+ "xmlEncodeEntities: input not UTF-8");
728
+ if (doc != NULL)
729
+ doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
730
+ snprintf(buf, sizeof(buf), "&#%d;", *cur);
731
+ buf[sizeof(buf) - 1] = 0;
732
+ ptr = buf;
733
+ while (*ptr != 0) *out++ = *ptr++;
734
+ cur++;
735
+ continue;
736
+ } else if (*cur < 0xE0) {
737
+ val = (cur[0]) & 0x1F;
738
+ val <<= 6;
739
+ val |= (cur[1]) & 0x3F;
740
+ l = 2;
741
+ } else if (*cur < 0xF0) {
742
+ val = (cur[0]) & 0x0F;
743
+ val <<= 6;
744
+ val |= (cur[1]) & 0x3F;
745
+ val <<= 6;
746
+ val |= (cur[2]) & 0x3F;
747
+ l = 3;
748
+ } else if (*cur < 0xF8) {
749
+ val = (cur[0]) & 0x07;
750
+ val <<= 6;
751
+ val |= (cur[1]) & 0x3F;
752
+ val <<= 6;
753
+ val |= (cur[2]) & 0x3F;
754
+ val <<= 6;
755
+ val |= (cur[3]) & 0x3F;
756
+ l = 4;
757
+ }
758
+ if ((l == 1) || (!IS_CHAR(val))) {
759
+ xmlEntitiesErr(XML_ERR_INVALID_CHAR,
760
+ "xmlEncodeEntities: char out of range\n");
761
+ if (doc != NULL)
762
+ doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
763
+ snprintf(buf, sizeof(buf), "&#%d;", *cur);
764
+ buf[sizeof(buf) - 1] = 0;
765
+ ptr = buf;
766
+ while (*ptr != 0) *out++ = *ptr++;
767
+ cur++;
768
+ continue;
769
+ }
770
+ /*
771
+ * We could do multiple things here. Just save as a char ref
772
+ */
773
+ snprintf(buf, sizeof(buf), "&#x%X;", val);
774
+ buf[sizeof(buf) - 1] = 0;
775
+ ptr = buf;
776
+ while (*ptr != 0) *out++ = *ptr++;
777
+ cur += l;
778
+ continue;
779
+ }
780
+ } else if (IS_BYTE_CHAR(*cur)) {
781
+ char buf[11], *ptr;
782
+
783
+ snprintf(buf, sizeof(buf), "&#%d;", *cur);
784
+ buf[sizeof(buf) - 1] = 0;
785
+ ptr = buf;
786
+ while (*ptr != 0) *out++ = *ptr++;
787
+ }
788
+ cur++;
789
+ }
790
+ *out = 0;
791
+ return(buffer);
792
+
793
+ mem_error:
794
+ xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed");
795
+ xmlFree(buffer);
796
+ return(NULL);
797
+ }
798
+
799
+ /**
800
+ * xmlEncodeAttributeEntities:
801
+ * @doc: the document containing the string
802
+ * @input: A string to convert to XML.
803
+ *
804
+ * Do a global encoding of a string, replacing the predefined entities
805
+ * and non ASCII values with their entities and CharRef counterparts for
806
+ * attribute values.
807
+ *
808
+ * Returns A newly allocated string with the substitution done.
809
+ */
810
+ xmlChar *
811
+ xmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) {
812
+ return xmlEncodeEntitiesInternal(doc, input, 1);
813
+ }
814
+
815
+ /**
816
+ * xmlEncodeEntitiesReentrant:
817
+ * @doc: the document containing the string
818
+ * @input: A string to convert to XML.
819
+ *
820
+ * Do a global encoding of a string, replacing the predefined entities
821
+ * and non ASCII values with their entities and CharRef counterparts.
822
+ * Contrary to xmlEncodeEntities, this routine is reentrant, and result
823
+ * must be deallocated.
824
+ *
825
+ * Returns A newly allocated string with the substitution done.
826
+ */
827
+ xmlChar *
828
+ xmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) {
829
+ return xmlEncodeEntitiesInternal(doc, input, 0);
830
+ }
831
+
832
+ /**
833
+ * xmlEncodeSpecialChars:
834
+ * @doc: the document containing the string
835
+ * @input: A string to convert to XML.
836
+ *
837
+ * Do a global encoding of a string, replacing the predefined entities
838
+ * this routine is reentrant, and result must be deallocated.
839
+ *
840
+ * Returns A newly allocated string with the substitution done.
841
+ */
842
+ xmlChar *
843
+ xmlEncodeSpecialChars(const xmlDoc *doc ATTRIBUTE_UNUSED, const xmlChar *input) {
844
+ const xmlChar *cur = input;
845
+ xmlChar *buffer = NULL;
846
+ xmlChar *out = NULL;
847
+ size_t buffer_size = 0;
848
+ if (input == NULL) return(NULL);
849
+
850
+ /*
851
+ * allocate an translation buffer.
852
+ */
853
+ buffer_size = 1000;
854
+ buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
855
+ if (buffer == NULL) {
856
+ xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed");
857
+ return(NULL);
858
+ }
859
+ out = buffer;
860
+
861
+ while (*cur != '\0') {
862
+ size_t indx = out - buffer;
863
+ if (indx + 10 > buffer_size) {
864
+
865
+ growBufferReentrant();
866
+ out = &buffer[indx];
867
+ }
868
+
869
+ /*
870
+ * By default one have to encode at least '<', '>', '"' and '&' !
871
+ */
872
+ if (*cur == '<') {
873
+ *out++ = '&';
874
+ *out++ = 'l';
875
+ *out++ = 't';
876
+ *out++ = ';';
877
+ } else if (*cur == '>') {
878
+ *out++ = '&';
879
+ *out++ = 'g';
880
+ *out++ = 't';
881
+ *out++ = ';';
882
+ } else if (*cur == '&') {
883
+ *out++ = '&';
884
+ *out++ = 'a';
885
+ *out++ = 'm';
886
+ *out++ = 'p';
887
+ *out++ = ';';
888
+ } else if (*cur == '"') {
889
+ *out++ = '&';
890
+ *out++ = 'q';
891
+ *out++ = 'u';
892
+ *out++ = 'o';
893
+ *out++ = 't';
894
+ *out++ = ';';
895
+ } else if (*cur == '\r') {
896
+ *out++ = '&';
897
+ *out++ = '#';
898
+ *out++ = '1';
899
+ *out++ = '3';
900
+ *out++ = ';';
901
+ } else {
902
+ /*
903
+ * Works because on UTF-8, all extended sequences cannot
904
+ * result in bytes in the ASCII range.
905
+ */
906
+ *out++ = *cur;
907
+ }
908
+ cur++;
909
+ }
910
+ *out = 0;
911
+ return(buffer);
912
+
913
+ mem_error:
914
+ xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed");
915
+ xmlFree(buffer);
916
+ return(NULL);
917
+ }
918
+
919
+ /**
920
+ * xmlCreateEntitiesTable:
921
+ *
922
+ * create and initialize an empty entities hash table.
923
+ * This really doesn't make sense and should be deprecated
924
+ *
925
+ * Returns the xmlEntitiesTablePtr just created or NULL in case of error.
926
+ */
927
+ xmlEntitiesTablePtr
928
+ xmlCreateEntitiesTable(void) {
929
+ return((xmlEntitiesTablePtr) xmlHashCreate(0));
930
+ }
931
+
932
+ /**
933
+ * xmlFreeEntityWrapper:
934
+ * @entity: An entity
935
+ * @name: its name
936
+ *
937
+ * Deallocate the memory used by an entities in the hash table.
938
+ */
939
+ static void
940
+ xmlFreeEntityWrapper(void *entity, const xmlChar *name ATTRIBUTE_UNUSED) {
941
+ if (entity != NULL)
942
+ xmlFreeEntity((xmlEntityPtr) entity);
943
+ }
944
+
945
+ /**
946
+ * xmlFreeEntitiesTable:
947
+ * @table: An entity table
948
+ *
949
+ * Deallocate the memory used by an entities hash table.
950
+ */
951
+ void
952
+ xmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
953
+ xmlHashFree(table, xmlFreeEntityWrapper);
954
+ }
955
+
956
+ #ifdef LIBXML_TREE_ENABLED
957
+ /**
958
+ * xmlCopyEntity:
959
+ * @ent: An entity
960
+ *
961
+ * Build a copy of an entity
962
+ *
963
+ * Returns the new xmlEntitiesPtr or NULL in case of error.
964
+ */
965
+ static void *
966
+ xmlCopyEntity(void *payload, const xmlChar *name ATTRIBUTE_UNUSED) {
967
+ xmlEntityPtr ent = (xmlEntityPtr) payload;
968
+ xmlEntityPtr cur;
969
+
970
+ cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
971
+ if (cur == NULL) {
972
+ xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed");
973
+ return(NULL);
974
+ }
975
+ memset(cur, 0, sizeof(xmlEntity));
976
+ cur->type = XML_ENTITY_DECL;
977
+
978
+ cur->etype = ent->etype;
979
+ if (ent->name != NULL)
980
+ cur->name = xmlStrdup(ent->name);
981
+ if (ent->ExternalID != NULL)
982
+ cur->ExternalID = xmlStrdup(ent->ExternalID);
983
+ if (ent->SystemID != NULL)
984
+ cur->SystemID = xmlStrdup(ent->SystemID);
985
+ if (ent->content != NULL)
986
+ cur->content = xmlStrdup(ent->content);
987
+ if (ent->orig != NULL)
988
+ cur->orig = xmlStrdup(ent->orig);
989
+ if (ent->URI != NULL)
990
+ cur->URI = xmlStrdup(ent->URI);
991
+ return(cur);
992
+ }
993
+
994
+ /**
995
+ * xmlCopyEntitiesTable:
996
+ * @table: An entity table
997
+ *
998
+ * Build a copy of an entity table.
999
+ *
1000
+ * Returns the new xmlEntitiesTablePtr or NULL in case of error.
1001
+ */
1002
+ xmlEntitiesTablePtr
1003
+ xmlCopyEntitiesTable(xmlEntitiesTablePtr table) {
1004
+ return(xmlHashCopy(table, xmlCopyEntity));
1005
+ }
1006
+ #endif /* LIBXML_TREE_ENABLED */
1007
+
1008
+ #ifdef LIBXML_OUTPUT_ENABLED
1009
+
1010
+ /**
1011
+ * xmlDumpEntityContent:
1012
+ * @buf: An XML buffer.
1013
+ * @content: The entity content.
1014
+ *
1015
+ * This will dump the quoted string value, taking care of the special
1016
+ * treatment required by %
1017
+ */
1018
+ static void
1019
+ xmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) {
1020
+ if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
1021
+ if (xmlStrchr(content, '%')) {
1022
+ const xmlChar * base, *cur;
1023
+
1024
+ xmlBufferCCat(buf, "\"");
1025
+ base = cur = content;
1026
+ while (*cur != 0) {
1027
+ if (*cur == '"') {
1028
+ if (base != cur)
1029
+ xmlBufferAdd(buf, base, cur - base);
1030
+ xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
1031
+ cur++;
1032
+ base = cur;
1033
+ } else if (*cur == '%') {
1034
+ if (base != cur)
1035
+ xmlBufferAdd(buf, base, cur - base);
1036
+ xmlBufferAdd(buf, BAD_CAST "&#x25;", 6);
1037
+ cur++;
1038
+ base = cur;
1039
+ } else {
1040
+ cur++;
1041
+ }
1042
+ }
1043
+ if (base != cur)
1044
+ xmlBufferAdd(buf, base, cur - base);
1045
+ xmlBufferCCat(buf, "\"");
1046
+ } else {
1047
+ xmlBufferWriteQuotedString(buf, content);
1048
+ }
1049
+ }
1050
+
1051
+ /**
1052
+ * xmlDumpEntityDecl:
1053
+ * @buf: An XML buffer.
1054
+ * @ent: An entity table
1055
+ *
1056
+ * This will dump the content of the entity table as an XML DTD definition
1057
+ */
1058
+ void
1059
+ xmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) {
1060
+ if ((buf == NULL) || (ent == NULL)) return;
1061
+ switch (ent->etype) {
1062
+ case XML_INTERNAL_GENERAL_ENTITY:
1063
+ xmlBufferWriteChar(buf, "<!ENTITY ");
1064
+ xmlBufferWriteCHAR(buf, ent->name);
1065
+ xmlBufferWriteChar(buf, " ");
1066
+ if (ent->orig != NULL)
1067
+ xmlBufferWriteQuotedString(buf, ent->orig);
1068
+ else
1069
+ xmlDumpEntityContent(buf, ent->content);
1070
+ xmlBufferWriteChar(buf, ">\n");
1071
+ break;
1072
+ case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
1073
+ xmlBufferWriteChar(buf, "<!ENTITY ");
1074
+ xmlBufferWriteCHAR(buf, ent->name);
1075
+ if (ent->ExternalID != NULL) {
1076
+ xmlBufferWriteChar(buf, " PUBLIC ");
1077
+ xmlBufferWriteQuotedString(buf, ent->ExternalID);
1078
+ xmlBufferWriteChar(buf, " ");
1079
+ xmlBufferWriteQuotedString(buf, ent->SystemID);
1080
+ } else {
1081
+ xmlBufferWriteChar(buf, " SYSTEM ");
1082
+ xmlBufferWriteQuotedString(buf, ent->SystemID);
1083
+ }
1084
+ xmlBufferWriteChar(buf, ">\n");
1085
+ break;
1086
+ case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
1087
+ xmlBufferWriteChar(buf, "<!ENTITY ");
1088
+ xmlBufferWriteCHAR(buf, ent->name);
1089
+ if (ent->ExternalID != NULL) {
1090
+ xmlBufferWriteChar(buf, " PUBLIC ");
1091
+ xmlBufferWriteQuotedString(buf, ent->ExternalID);
1092
+ xmlBufferWriteChar(buf, " ");
1093
+ xmlBufferWriteQuotedString(buf, ent->SystemID);
1094
+ } else {
1095
+ xmlBufferWriteChar(buf, " SYSTEM ");
1096
+ xmlBufferWriteQuotedString(buf, ent->SystemID);
1097
+ }
1098
+ if (ent->content != NULL) { /* Should be true ! */
1099
+ xmlBufferWriteChar(buf, " NDATA ");
1100
+ if (ent->orig != NULL)
1101
+ xmlBufferWriteCHAR(buf, ent->orig);
1102
+ else
1103
+ xmlBufferWriteCHAR(buf, ent->content);
1104
+ }
1105
+ xmlBufferWriteChar(buf, ">\n");
1106
+ break;
1107
+ case XML_INTERNAL_PARAMETER_ENTITY:
1108
+ xmlBufferWriteChar(buf, "<!ENTITY % ");
1109
+ xmlBufferWriteCHAR(buf, ent->name);
1110
+ xmlBufferWriteChar(buf, " ");
1111
+ if (ent->orig == NULL)
1112
+ xmlDumpEntityContent(buf, ent->content);
1113
+ else
1114
+ xmlBufferWriteQuotedString(buf, ent->orig);
1115
+ xmlBufferWriteChar(buf, ">\n");
1116
+ break;
1117
+ case XML_EXTERNAL_PARAMETER_ENTITY:
1118
+ xmlBufferWriteChar(buf, "<!ENTITY % ");
1119
+ xmlBufferWriteCHAR(buf, ent->name);
1120
+ if (ent->ExternalID != NULL) {
1121
+ xmlBufferWriteChar(buf, " PUBLIC ");
1122
+ xmlBufferWriteQuotedString(buf, ent->ExternalID);
1123
+ xmlBufferWriteChar(buf, " ");
1124
+ xmlBufferWriteQuotedString(buf, ent->SystemID);
1125
+ } else {
1126
+ xmlBufferWriteChar(buf, " SYSTEM ");
1127
+ xmlBufferWriteQuotedString(buf, ent->SystemID);
1128
+ }
1129
+ xmlBufferWriteChar(buf, ">\n");
1130
+ break;
1131
+ default:
1132
+ xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY,
1133
+ "xmlDumpEntitiesDecl: internal: unknown type entity type");
1134
+ }
1135
+ }
1136
+
1137
+ /**
1138
+ * xmlDumpEntityDeclScan:
1139
+ * @ent: An entity table
1140
+ * @buf: An XML buffer.
1141
+ *
1142
+ * When using the hash table scan function, arguments need to be reversed
1143
+ */
1144
+ static void
1145
+ xmlDumpEntityDeclScan(void *ent, void *buf,
1146
+ const xmlChar *name ATTRIBUTE_UNUSED) {
1147
+ xmlDumpEntityDecl((xmlBufferPtr) buf, (xmlEntityPtr) ent);
1148
+ }
1149
+
1150
+ /**
1151
+ * xmlDumpEntitiesTable:
1152
+ * @buf: An XML buffer.
1153
+ * @table: An entity table
1154
+ *
1155
+ * This will dump the content of the entity table as an XML DTD definition
1156
+ */
1157
+ void
1158
+ xmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) {
1159
+ xmlHashScan(table, xmlDumpEntityDeclScan, buf);
1160
+ }
1161
+ #endif /* LIBXML_OUTPUT_ENABLED */
1162
+ #define bottom_entities
1163
+ #include "elfgcchack.h"