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 8 const ENCODING * 9 NS(XmlGetUtf8InternalEncoding)(void) 10 { 11 return &ns(internal_utf8_encoding).enc; 12 } 13 14 const ENCODING * 15 NS(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 29 static 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 39 static int PTRCALL 40 NS(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 47 static int PTRCALL 48 NS(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 55 int 56 NS(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 71 static const ENCODING * 72 NS(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 90 int 91 NS(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