1/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd 2 See the file COPYING for copying permission. 3*/ 4 5/* This file is included! */ 6#ifdef XML_TOK_NS_C 7 8const ENCODING * 9NS(XmlGetUtf8InternalEncoding)(void) 10{ 11 return &ns(internal_utf8_encoding).enc; 12} 13 14const ENCODING * 15NS(XmlGetUtf16InternalEncoding)(void) 16{ 17#if BYTEORDER == 1234 18 return &ns(internal_little2_encoding).enc; 19#elif BYTEORDER == 4321 20 return &ns(internal_big2_encoding).enc; 21#else 22 const short n = 1; 23 return (*(const char *)&n 24 ? &ns(internal_little2_encoding).enc 25 : &ns(internal_big2_encoding).enc); 26#endif 27} 28 29static const ENCODING * const NS(encodings)[] = { 30 &ns(latin1_encoding).enc, 31 &ns(ascii_encoding).enc, 32 &ns(utf8_encoding).enc, 33 &ns(big2_encoding).enc, 34 &ns(big2_encoding).enc, 35 &ns(little2_encoding).enc, 36 &ns(utf8_encoding).enc /* NO_ENC */ 37}; 38 39static int PTRCALL 40NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, 41 const char **nextTokPtr) 42{ 43 return initScan(NS(encodings), (const INIT_ENCODING *)enc, 44 XML_PROLOG_STATE, ptr, end, nextTokPtr); 45} 46 47static int PTRCALL 48NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, 49 const char **nextTokPtr) 50{ 51 return initScan(NS(encodings), (const INIT_ENCODING *)enc, 52 XML_CONTENT_STATE, ptr, end, nextTokPtr); 53} 54 55int 56NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, 57 const char *name) 58{ 59 int i = getEncodingIndex(name); 60 if (i == UNKNOWN_ENC) 61 return 0; 62 SET_INIT_ENC_INDEX(p, i); 63 p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); 64 p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); 65 p->initEnc.updatePosition = initUpdatePosition; 66 p->encPtr = encPtr; 67 *encPtr = &(p->initEnc); 68 return 1; 69} 70 71static const ENCODING * 72NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) 73{ 74#define ENCODING_MAX 128 75 char buf[ENCODING_MAX]; 76 char *p = buf; 77 int i; 78 XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); 79 if (ptr != end) 80 return 0; 81 *p = 0; 82 if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) 83 return enc; 84 i = getEncodingIndex(buf); 85 if (i == UNKNOWN_ENC) 86 return 0; 87 return NS(encodings)[i]; 88} 89 90int 91NS(XmlParseXmlDecl)(int isGeneralTextEntity, 92 const ENCODING *enc, 93 const char *ptr, 94 const char *end, 95 const char **badPtr, 96 const char **versionPtr, 97 const char **versionEndPtr, 98 const char **encodingName, 99 const ENCODING **encoding, 100 int *standalone) 101{ 102 return doParseXmlDecl(NS(findEncoding), 103 isGeneralTextEntity, 104 enc, 105 ptr, 106 end, 107 badPtr, 108 versionPtr, 109 versionEndPtr, 110 encodingName, 111 encoding, 112 standalone); 113} 114 115#endif /* XML_TOK_NS_C */ 116