xref: /freebsd/contrib/expat/lib/xmltok.h (revision 4543ef51)
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>
134543ef51SXin 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 
2924543ef51SXin LI int XmlInitEncoding(INIT_ENCODING *p, const ENCODING **encPtr,
2934543ef51SXin 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 
3114543ef51SXin LI int XmlInitEncodingNS(INIT_ENCODING *p, const ENCODING **encPtr,
3124543ef51SXin 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