10a48773fSEric van Gyzen /* 20a48773fSEric van Gyzen __ __ _ 30a48773fSEric van Gyzen ___\ \/ /_ __ __ _| |_ 40a48773fSEric van Gyzen / _ \\ /| '_ \ / _` | __| 50a48773fSEric van Gyzen | __// \| |_) | (_| | |_ 60a48773fSEric van Gyzen \___/_/\_\ .__/ \__,_|\__| 70a48773fSEric van Gyzen |_| XML parser 80a48773fSEric van Gyzen 90a48773fSEric van Gyzen Copyright (c) 1997-2000 Thai Open Source Software Center Ltd 10cc68614dSXin LI Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> 11cc68614dSXin LI Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> 12cc68614dSXin LI Copyright (c) 2002-2005 Karl Waclawek <karl@waclawek.net> 13*4543ef51SXin LI Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org> 14cc68614dSXin LI Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk> 150a48773fSEric van Gyzen Licensed under the MIT license: 160a48773fSEric van Gyzen 170a48773fSEric van Gyzen Permission is hereby granted, free of charge, to any person obtaining 180a48773fSEric van Gyzen a copy of this software and associated documentation files (the 190a48773fSEric van Gyzen "Software"), to deal in the Software without restriction, including 200a48773fSEric van Gyzen without limitation the rights to use, copy, modify, merge, publish, 210a48773fSEric van Gyzen distribute, sublicense, and/or sell copies of the Software, and to permit 220a48773fSEric van Gyzen persons to whom the Software is furnished to do so, subject to the 230a48773fSEric van Gyzen following conditions: 240a48773fSEric van Gyzen 250a48773fSEric van Gyzen The above copyright notice and this permission notice shall be included 260a48773fSEric van Gyzen in all copies or substantial portions of the Software. 270a48773fSEric van Gyzen 280a48773fSEric van Gyzen THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 290a48773fSEric van Gyzen EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 300a48773fSEric van Gyzen MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 310a48773fSEric van Gyzen NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 320a48773fSEric van Gyzen DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 330a48773fSEric van Gyzen OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 340a48773fSEric van Gyzen USE OR OTHER DEALINGS IN THE SOFTWARE. 355bb6a25fSPoul-Henning Kamp */ 365bb6a25fSPoul-Henning Kamp 375bb6a25fSPoul-Henning Kamp #ifndef XmlTok_INCLUDED 385bb6a25fSPoul-Henning Kamp #define XmlTok_INCLUDED 1 395bb6a25fSPoul-Henning Kamp 405bb6a25fSPoul-Henning Kamp #ifdef __cplusplus 415bb6a25fSPoul-Henning Kamp extern "C" { 425bb6a25fSPoul-Henning Kamp #endif 435bb6a25fSPoul-Henning Kamp 445bb6a25fSPoul-Henning Kamp /* The following token may be returned by XmlContentTok */ 456b2c1e49SXin LI #define XML_TOK_TRAILING_RSQB \ 466b2c1e49SXin LI -5 /* ] or ]] at the end of the scan; might be \ 475bb6a25fSPoul-Henning Kamp start of illegal ]]> sequence */ 485bb6a25fSPoul-Henning Kamp /* The following tokens may be returned by both XmlPrologTok and 495bb6a25fSPoul-Henning Kamp XmlContentTok. 505bb6a25fSPoul-Henning Kamp */ 515bb6a25fSPoul-Henning Kamp #define XML_TOK_NONE -4 /* The string to be scanned is empty */ 526b2c1e49SXin LI #define XML_TOK_TRAILING_CR \ 536b2c1e49SXin LI -3 /* A CR at the end of the scan; \ 545bb6a25fSPoul-Henning Kamp might be part of CRLF sequence */ 555bb6a25fSPoul-Henning Kamp #define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ 565bb6a25fSPoul-Henning Kamp #define XML_TOK_PARTIAL -1 /* only part of a token */ 575bb6a25fSPoul-Henning Kamp #define XML_TOK_INVALID 0 585bb6a25fSPoul-Henning Kamp 595bb6a25fSPoul-Henning Kamp /* The following tokens are returned by XmlContentTok; some are also 605bb6a25fSPoul-Henning Kamp returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. 615bb6a25fSPoul-Henning Kamp */ 625bb6a25fSPoul-Henning Kamp #define XML_TOK_START_TAG_WITH_ATTS 1 635bb6a25fSPoul-Henning Kamp #define XML_TOK_START_TAG_NO_ATTS 2 645bb6a25fSPoul-Henning Kamp #define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag <e/> */ 655bb6a25fSPoul-Henning Kamp #define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 665bb6a25fSPoul-Henning Kamp #define XML_TOK_END_TAG 5 675bb6a25fSPoul-Henning Kamp #define XML_TOK_DATA_CHARS 6 685bb6a25fSPoul-Henning Kamp #define XML_TOK_DATA_NEWLINE 7 695bb6a25fSPoul-Henning Kamp #define XML_TOK_CDATA_SECT_OPEN 8 705bb6a25fSPoul-Henning Kamp #define XML_TOK_ENTITY_REF 9 715bb6a25fSPoul-Henning Kamp #define XML_TOK_CHAR_REF 10 /* numeric character reference */ 725bb6a25fSPoul-Henning Kamp 735bb6a25fSPoul-Henning Kamp /* The following tokens may be returned by both XmlPrologTok and 745bb6a25fSPoul-Henning Kamp XmlContentTok. 755bb6a25fSPoul-Henning Kamp */ 765bb6a25fSPoul-Henning Kamp #define XML_TOK_PI 11 /* processing instruction */ 775bb6a25fSPoul-Henning Kamp #define XML_TOK_XML_DECL 12 /* XML decl or text decl */ 785bb6a25fSPoul-Henning Kamp #define XML_TOK_COMMENT 13 795bb6a25fSPoul-Henning Kamp #define XML_TOK_BOM 14 /* Byte order mark */ 805bb6a25fSPoul-Henning Kamp 815bb6a25fSPoul-Henning Kamp /* The following tokens are returned only by XmlPrologTok */ 825bb6a25fSPoul-Henning Kamp #define XML_TOK_PROLOG_S 15 835bb6a25fSPoul-Henning Kamp #define XML_TOK_DECL_OPEN 16 /* <!foo */ 845bb6a25fSPoul-Henning Kamp #define XML_TOK_DECL_CLOSE 17 /* > */ 855bb6a25fSPoul-Henning Kamp #define XML_TOK_NAME 18 865bb6a25fSPoul-Henning Kamp #define XML_TOK_NMTOKEN 19 875bb6a25fSPoul-Henning Kamp #define XML_TOK_POUND_NAME 20 /* #name */ 885bb6a25fSPoul-Henning Kamp #define XML_TOK_OR 21 /* | */ 895bb6a25fSPoul-Henning Kamp #define XML_TOK_PERCENT 22 905bb6a25fSPoul-Henning Kamp #define XML_TOK_OPEN_PAREN 23 915bb6a25fSPoul-Henning Kamp #define XML_TOK_CLOSE_PAREN 24 925bb6a25fSPoul-Henning Kamp #define XML_TOK_OPEN_BRACKET 25 935bb6a25fSPoul-Henning Kamp #define XML_TOK_CLOSE_BRACKET 26 945bb6a25fSPoul-Henning Kamp #define XML_TOK_LITERAL 27 955bb6a25fSPoul-Henning Kamp #define XML_TOK_PARAM_ENTITY_REF 28 965bb6a25fSPoul-Henning Kamp #define XML_TOK_INSTANCE_START 29 975bb6a25fSPoul-Henning Kamp 985bb6a25fSPoul-Henning Kamp /* The following occur only in element type declarations */ 995bb6a25fSPoul-Henning Kamp #define XML_TOK_NAME_QUESTION 30 /* name? */ 1005bb6a25fSPoul-Henning Kamp #define XML_TOK_NAME_ASTERISK 31 /* name* */ 1015bb6a25fSPoul-Henning Kamp #define XML_TOK_NAME_PLUS 32 /* name+ */ 1025bb6a25fSPoul-Henning Kamp #define XML_TOK_COND_SECT_OPEN 33 /* <![ */ 1035bb6a25fSPoul-Henning Kamp #define XML_TOK_COND_SECT_CLOSE 34 /* ]]> */ 1045bb6a25fSPoul-Henning Kamp #define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ 1055bb6a25fSPoul-Henning Kamp #define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ 1065bb6a25fSPoul-Henning Kamp #define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ 1075bb6a25fSPoul-Henning Kamp #define XML_TOK_COMMA 38 1085bb6a25fSPoul-Henning Kamp 1095bb6a25fSPoul-Henning Kamp /* The following token is returned only by XmlAttributeValueTok */ 1105bb6a25fSPoul-Henning Kamp #define XML_TOK_ATTRIBUTE_VALUE_S 39 1115bb6a25fSPoul-Henning Kamp 1125bb6a25fSPoul-Henning Kamp /* The following token is returned only by XmlCdataSectionTok */ 1135bb6a25fSPoul-Henning Kamp #define XML_TOK_CDATA_SECT_CLOSE 40 1145bb6a25fSPoul-Henning Kamp 1155bb6a25fSPoul-Henning Kamp /* With namespace processing this is returned by XmlPrologTok for a 1165bb6a25fSPoul-Henning Kamp name with a colon. 1175bb6a25fSPoul-Henning Kamp */ 1185bb6a25fSPoul-Henning Kamp #define XML_TOK_PREFIXED_NAME 41 1195bb6a25fSPoul-Henning Kamp 1205bb6a25fSPoul-Henning Kamp #ifdef XML_DTD 1215bb6a25fSPoul-Henning Kamp # define XML_TOK_IGNORE_SECT 42 1225bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */ 1235bb6a25fSPoul-Henning Kamp 1245bb6a25fSPoul-Henning Kamp #ifdef XML_DTD 1255bb6a25fSPoul-Henning Kamp # define XML_N_STATES 4 1265bb6a25fSPoul-Henning Kamp #else /* not XML_DTD */ 1275bb6a25fSPoul-Henning Kamp # define XML_N_STATES 3 1285bb6a25fSPoul-Henning Kamp #endif /* not XML_DTD */ 1295bb6a25fSPoul-Henning Kamp 1305bb6a25fSPoul-Henning Kamp #define XML_PROLOG_STATE 0 1315bb6a25fSPoul-Henning Kamp #define XML_CONTENT_STATE 1 1325bb6a25fSPoul-Henning Kamp #define XML_CDATA_SECTION_STATE 2 1335bb6a25fSPoul-Henning Kamp #ifdef XML_DTD 1345bb6a25fSPoul-Henning Kamp # define XML_IGNORE_SECTION_STATE 3 1355bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */ 1365bb6a25fSPoul-Henning Kamp 1375bb6a25fSPoul-Henning Kamp #define XML_N_LITERAL_TYPES 2 1385bb6a25fSPoul-Henning Kamp #define XML_ATTRIBUTE_VALUE_LITERAL 0 1395bb6a25fSPoul-Henning Kamp #define XML_ENTITY_VALUE_LITERAL 1 1405bb6a25fSPoul-Henning Kamp 1415bb6a25fSPoul-Henning Kamp /* The size of the buffer passed to XmlUtf8Encode must be at least this. */ 1425bb6a25fSPoul-Henning Kamp #define XML_UTF8_ENCODE_MAX 4 1435bb6a25fSPoul-Henning Kamp /* The size of the buffer passed to XmlUtf16Encode must be at least this. */ 1445bb6a25fSPoul-Henning Kamp #define XML_UTF16_ENCODE_MAX 2 1455bb6a25fSPoul-Henning Kamp 1465bb6a25fSPoul-Henning Kamp typedef struct position { 1475bb6a25fSPoul-Henning Kamp /* first line and first column are 0 not 1 */ 148220ed979SColeman Kane XML_Size lineNumber; 149220ed979SColeman Kane XML_Size columnNumber; 1505bb6a25fSPoul-Henning Kamp } POSITION; 1515bb6a25fSPoul-Henning Kamp 1525bb6a25fSPoul-Henning Kamp typedef struct { 1535bb6a25fSPoul-Henning Kamp const char *name; 1545bb6a25fSPoul-Henning Kamp const char *valuePtr; 1555bb6a25fSPoul-Henning Kamp const char *valueEnd; 1565bb6a25fSPoul-Henning Kamp char normalized; 1575bb6a25fSPoul-Henning Kamp } ATTRIBUTE; 1585bb6a25fSPoul-Henning Kamp 1595bb6a25fSPoul-Henning Kamp struct encoding; 1605bb6a25fSPoul-Henning Kamp typedef struct encoding ENCODING; 1615bb6a25fSPoul-Henning Kamp 1626b2c1e49SXin LI typedef int(PTRCALL *SCANNER)(const ENCODING *, const char *, const char *, 1635bb6a25fSPoul-Henning Kamp const char **); 1645bb6a25fSPoul-Henning Kamp 165be8aff81SXin LI enum XML_Convert_Result { 166be8aff81SXin LI XML_CONVERT_COMPLETED = 0, 167be8aff81SXin LI XML_CONVERT_INPUT_INCOMPLETE = 1, 1686b2c1e49SXin LI XML_CONVERT_OUTPUT_EXHAUSTED 1696b2c1e49SXin LI = 2 /* and therefore potentially input remaining as well */ 170be8aff81SXin LI }; 171be8aff81SXin LI 1725bb6a25fSPoul-Henning Kamp struct encoding { 1735bb6a25fSPoul-Henning Kamp SCANNER scanners[XML_N_STATES]; 1745bb6a25fSPoul-Henning Kamp SCANNER literalScanners[XML_N_LITERAL_TYPES]; 1756b2c1e49SXin LI int(PTRCALL *nameMatchesAscii)(const ENCODING *, const char *, const char *, 1765bb6a25fSPoul-Henning Kamp const char *); 177220ed979SColeman Kane int(PTRFASTCALL *nameLength)(const ENCODING *, const char *); 178220ed979SColeman Kane const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); 1796b2c1e49SXin LI int(PTRCALL *getAtts)(const ENCODING *enc, const char *ptr, int attsMax, 1805bb6a25fSPoul-Henning Kamp ATTRIBUTE *atts); 181220ed979SColeman Kane int(PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); 1826b2c1e49SXin LI int(PTRCALL *predefinedEntityName)(const ENCODING *, const char *, 1835bb6a25fSPoul-Henning Kamp const char *); 1846b2c1e49SXin LI void(PTRCALL *updatePosition)(const ENCODING *, const char *ptr, 1856b2c1e49SXin LI const char *end, POSITION *); 1866b2c1e49SXin LI int(PTRCALL *isPublicId)(const ENCODING *enc, const char *ptr, 1876b2c1e49SXin LI const char *end, const char **badPtr); 188be8aff81SXin LI enum XML_Convert_Result(PTRCALL *utf8Convert)(const ENCODING *enc, 1895bb6a25fSPoul-Henning Kamp const char **fromP, 1906b2c1e49SXin LI const char *fromLim, char **toP, 1915bb6a25fSPoul-Henning Kamp const char *toLim); 192be8aff81SXin LI enum XML_Convert_Result(PTRCALL *utf16Convert)(const ENCODING *enc, 1935bb6a25fSPoul-Henning Kamp const char **fromP, 1945bb6a25fSPoul-Henning Kamp const char *fromLim, 1955bb6a25fSPoul-Henning Kamp unsigned short **toP, 1965bb6a25fSPoul-Henning Kamp const unsigned short *toLim); 1975bb6a25fSPoul-Henning Kamp int minBytesPerChar; 1985bb6a25fSPoul-Henning Kamp char isUtf8; 1995bb6a25fSPoul-Henning Kamp char isUtf16; 2005bb6a25fSPoul-Henning Kamp }; 2015bb6a25fSPoul-Henning Kamp 2025bb6a25fSPoul-Henning Kamp /* Scan the string starting at ptr until the end of the next complete 2035bb6a25fSPoul-Henning Kamp token, but do not scan past eptr. Return an integer giving the 2045bb6a25fSPoul-Henning Kamp type of token. 2055bb6a25fSPoul-Henning Kamp 2065bb6a25fSPoul-Henning Kamp Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. 2075bb6a25fSPoul-Henning Kamp 2085bb6a25fSPoul-Henning Kamp Return XML_TOK_PARTIAL when the string does not contain a complete 2095bb6a25fSPoul-Henning Kamp token; nextTokPtr will not be set. 2105bb6a25fSPoul-Henning Kamp 2115bb6a25fSPoul-Henning Kamp Return XML_TOK_INVALID when the string does not start a valid 2125bb6a25fSPoul-Henning Kamp token; nextTokPtr will be set to point to the character which made 2135bb6a25fSPoul-Henning Kamp the token invalid. 2145bb6a25fSPoul-Henning Kamp 2155bb6a25fSPoul-Henning Kamp Otherwise the string starts with a valid token; nextTokPtr will be 2165bb6a25fSPoul-Henning Kamp set to point to the character following the end of that token. 2175bb6a25fSPoul-Henning Kamp 2185bb6a25fSPoul-Henning Kamp Each data character counts as a single token, but adjacent data 2195bb6a25fSPoul-Henning Kamp characters may be returned together. Similarly for characters in 2205bb6a25fSPoul-Henning Kamp the prolog outside literals, comments and processing instructions. 2215bb6a25fSPoul-Henning Kamp */ 2225bb6a25fSPoul-Henning Kamp 2235bb6a25fSPoul-Henning Kamp #define XmlTok(enc, state, ptr, end, nextTokPtr) \ 2245bb6a25fSPoul-Henning Kamp (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) 2255bb6a25fSPoul-Henning Kamp 2265bb6a25fSPoul-Henning Kamp #define XmlPrologTok(enc, ptr, end, nextTokPtr) \ 2275bb6a25fSPoul-Henning Kamp XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) 2285bb6a25fSPoul-Henning Kamp 2295bb6a25fSPoul-Henning Kamp #define XmlContentTok(enc, ptr, end, nextTokPtr) \ 2305bb6a25fSPoul-Henning Kamp XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) 2315bb6a25fSPoul-Henning Kamp 2325bb6a25fSPoul-Henning Kamp #define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ 2335bb6a25fSPoul-Henning Kamp XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) 2345bb6a25fSPoul-Henning Kamp 2355bb6a25fSPoul-Henning Kamp #ifdef XML_DTD 2365bb6a25fSPoul-Henning Kamp 2375bb6a25fSPoul-Henning Kamp # define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ 2385bb6a25fSPoul-Henning Kamp XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) 2395bb6a25fSPoul-Henning Kamp 2405bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */ 2415bb6a25fSPoul-Henning Kamp 2425bb6a25fSPoul-Henning Kamp /* This is used for performing a 2nd-level tokenization on the content 2435bb6a25fSPoul-Henning Kamp of a literal that has already been returned by XmlTok. 2445bb6a25fSPoul-Henning Kamp */ 2455bb6a25fSPoul-Henning Kamp #define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ 2465bb6a25fSPoul-Henning Kamp (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) 2475bb6a25fSPoul-Henning Kamp 2485bb6a25fSPoul-Henning Kamp #define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ 2495bb6a25fSPoul-Henning Kamp XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) 2505bb6a25fSPoul-Henning Kamp 2515bb6a25fSPoul-Henning Kamp #define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ 2525bb6a25fSPoul-Henning Kamp XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) 2535bb6a25fSPoul-Henning Kamp 2545bb6a25fSPoul-Henning Kamp #define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ 2555bb6a25fSPoul-Henning Kamp (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) 2565bb6a25fSPoul-Henning Kamp 2576b2c1e49SXin LI #define XmlNameLength(enc, ptr) (((enc)->nameLength)(enc, ptr)) 2585bb6a25fSPoul-Henning Kamp 2596b2c1e49SXin LI #define XmlSkipS(enc, ptr) (((enc)->skipS)(enc, ptr)) 2605bb6a25fSPoul-Henning Kamp 2615bb6a25fSPoul-Henning Kamp #define XmlGetAttributes(enc, ptr, attsMax, atts) \ 2625bb6a25fSPoul-Henning Kamp (((enc)->getAtts)(enc, ptr, attsMax, atts)) 2635bb6a25fSPoul-Henning Kamp 2646b2c1e49SXin LI #define XmlCharRefNumber(enc, ptr) (((enc)->charRefNumber)(enc, ptr)) 2655bb6a25fSPoul-Henning Kamp 2665bb6a25fSPoul-Henning Kamp #define XmlPredefinedEntityName(enc, ptr, end) \ 2675bb6a25fSPoul-Henning Kamp (((enc)->predefinedEntityName)(enc, ptr, end)) 2685bb6a25fSPoul-Henning Kamp 2695bb6a25fSPoul-Henning Kamp #define XmlUpdatePosition(enc, ptr, end, pos) \ 2705bb6a25fSPoul-Henning Kamp (((enc)->updatePosition)(enc, ptr, end, pos)) 2715bb6a25fSPoul-Henning Kamp 2725bb6a25fSPoul-Henning Kamp #define XmlIsPublicId(enc, ptr, end, badPtr) \ 2735bb6a25fSPoul-Henning Kamp (((enc)->isPublicId)(enc, ptr, end, badPtr)) 2745bb6a25fSPoul-Henning Kamp 2755bb6a25fSPoul-Henning Kamp #define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ 2765bb6a25fSPoul-Henning Kamp (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) 2775bb6a25fSPoul-Henning Kamp 2785bb6a25fSPoul-Henning Kamp #define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ 2795bb6a25fSPoul-Henning Kamp (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) 2805bb6a25fSPoul-Henning Kamp 2815bb6a25fSPoul-Henning Kamp typedef struct { 2825bb6a25fSPoul-Henning Kamp ENCODING initEnc; 2835bb6a25fSPoul-Henning Kamp const ENCODING **encPtr; 2845bb6a25fSPoul-Henning Kamp } INIT_ENCODING; 2855bb6a25fSPoul-Henning Kamp 2866b2c1e49SXin LI int XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc, 2876b2c1e49SXin LI const char *ptr, const char *end, const char **badPtr, 2886b2c1e49SXin LI const char **versionPtr, const char **versionEndPtr, 2895bb6a25fSPoul-Henning Kamp const char **encodingNamePtr, 2906b2c1e49SXin LI const ENCODING **namedEncodingPtr, int *standalonePtr); 2915bb6a25fSPoul-Henning Kamp 292*4543ef51SXin LI int XmlInitEncoding(INIT_ENCODING *p, const ENCODING **encPtr, 293*4543ef51SXin LI const char *name); 2945bb6a25fSPoul-Henning Kamp const ENCODING *XmlGetUtf8InternalEncoding(void); 2955bb6a25fSPoul-Henning Kamp const ENCODING *XmlGetUtf16InternalEncoding(void); 296220ed979SColeman Kane int FASTCALL XmlUtf8Encode(int charNumber, char *buf); 297220ed979SColeman Kane int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); 2985bb6a25fSPoul-Henning Kamp int XmlSizeOfUnknownEncoding(void); 299220ed979SColeman Kane 300220ed979SColeman Kane typedef int(XMLCALL *CONVERTER)(void *userData, const char *p); 301220ed979SColeman Kane 3026b2c1e49SXin LI ENCODING *XmlInitUnknownEncoding(void *mem, int *table, CONVERTER convert, 3035bb6a25fSPoul-Henning Kamp void *userData); 3045bb6a25fSPoul-Henning Kamp 3056b2c1e49SXin LI int XmlParseXmlDeclNS(int isGeneralTextEntity, const ENCODING *enc, 3066b2c1e49SXin LI const char *ptr, const char *end, const char **badPtr, 3076b2c1e49SXin LI const char **versionPtr, const char **versionEndPtr, 3085bb6a25fSPoul-Henning Kamp const char **encodingNamePtr, 3096b2c1e49SXin LI const ENCODING **namedEncodingPtr, int *standalonePtr); 310220ed979SColeman Kane 311*4543ef51SXin LI int XmlInitEncodingNS(INIT_ENCODING *p, const ENCODING **encPtr, 312*4543ef51SXin LI const char *name); 3135bb6a25fSPoul-Henning Kamp const ENCODING *XmlGetUtf8InternalEncodingNS(void); 3145bb6a25fSPoul-Henning Kamp const ENCODING *XmlGetUtf16InternalEncodingNS(void); 3156b2c1e49SXin LI ENCODING *XmlInitUnknownEncodingNS(void *mem, int *table, CONVERTER convert, 3165bb6a25fSPoul-Henning Kamp void *userData); 3175bb6a25fSPoul-Henning Kamp #ifdef __cplusplus 3185bb6a25fSPoul-Henning Kamp } 3195bb6a25fSPoul-Henning Kamp #endif 3205bb6a25fSPoul-Henning Kamp 3215bb6a25fSPoul-Henning Kamp #endif /* not XmlTok_INCLUDED */ 322