michael@0: const ENCODING * michael@0: NS(XmlGetUtf8InternalEncoding)(void) michael@0: { michael@0: return &ns(internal_utf8_encoding).enc; michael@0: } michael@0: michael@0: const ENCODING * michael@0: NS(XmlGetUtf16InternalEncoding)(void) michael@0: { michael@0: #if BYTEORDER == 1234 michael@0: return &ns(internal_little2_encoding).enc; michael@0: #elif BYTEORDER == 4321 michael@0: return &ns(internal_big2_encoding).enc; michael@0: #else michael@0: const short n = 1; michael@0: return (*(const char *)&n michael@0: ? &ns(internal_little2_encoding).enc michael@0: : &ns(internal_big2_encoding).enc); michael@0: #endif michael@0: } michael@0: michael@0: static const ENCODING * const NS(encodings)[] = { michael@0: &ns(latin1_encoding).enc, michael@0: &ns(ascii_encoding).enc, michael@0: &ns(utf8_encoding).enc, michael@0: &ns(big2_encoding).enc, michael@0: &ns(big2_encoding).enc, michael@0: &ns(little2_encoding).enc, michael@0: &ns(utf8_encoding).enc /* NO_ENC */ michael@0: }; michael@0: michael@0: static int PTRCALL michael@0: NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, michael@0: const char **nextTokPtr) michael@0: { michael@0: return initScan(NS(encodings), (const INIT_ENCODING *)enc, michael@0: XML_PROLOG_STATE, ptr, end, nextTokPtr); michael@0: } michael@0: michael@0: static int PTRCALL michael@0: NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, michael@0: const char **nextTokPtr) michael@0: { michael@0: return initScan(NS(encodings), (const INIT_ENCODING *)enc, michael@0: XML_CONTENT_STATE, ptr, end, nextTokPtr); michael@0: } michael@0: michael@0: int michael@0: NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, michael@0: const char *name) michael@0: { michael@0: int i = getEncodingIndex(name); michael@0: if (i == UNKNOWN_ENC) michael@0: return 0; michael@0: SET_INIT_ENC_INDEX(p, i); michael@0: p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); michael@0: p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); michael@0: p->initEnc.updatePosition = initUpdatePosition; michael@0: p->encPtr = encPtr; michael@0: *encPtr = &(p->initEnc); michael@0: return 1; michael@0: } michael@0: michael@0: static const ENCODING * michael@0: NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) michael@0: { michael@0: #define ENCODING_MAX 128 michael@0: char buf[ENCODING_MAX]; michael@0: char *p = buf; michael@0: int i; michael@0: XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); michael@0: if (ptr != end) michael@0: return 0; michael@0: *p = 0; michael@0: if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) michael@0: return enc; michael@0: i = getEncodingIndex(buf); michael@0: if (i == UNKNOWN_ENC) michael@0: return 0; michael@0: return NS(encodings)[i]; michael@0: } michael@0: michael@0: int michael@0: NS(XmlParseXmlDecl)(int isGeneralTextEntity, michael@0: const ENCODING *enc, michael@0: const char *ptr, michael@0: const char *end, michael@0: const char **badPtr, michael@0: const char **versionPtr, michael@0: const char **versionEndPtr, michael@0: const char **encodingName, michael@0: const ENCODING **encoding, michael@0: int *standalone) michael@0: { michael@0: return doParseXmlDecl(NS(findEncoding), michael@0: isGeneralTextEntity, michael@0: enc, michael@0: ptr, michael@0: end, michael@0: badPtr, michael@0: versionPtr, michael@0: versionEndPtr, michael@0: encodingName, michael@0: encoding, michael@0: standalone); michael@0: }