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