Andrew Bonney / expatlib

Dependents:   giken9_HTMLServer_Temp_Sample

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers xmltok_ns.c Source File

xmltok_ns.c

00001 /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
00002    See the file COPYING for copying permission.
00003 */
00004 
00005 /* This file is included! */
00006 #ifdef XML_TOK_NS_C
00007 
00008 const ENCODING *
00009 NS(XmlGetUtf8InternalEncoding)(void)
00010 {
00011   return &ns(internal_utf8_encoding).enc;
00012 }
00013 
00014 const ENCODING *
00015 NS(XmlGetUtf16InternalEncoding)(void)
00016 {
00017 #if BYTEORDER == 1234
00018   return &ns(internal_little2_encoding).enc;
00019 #elif BYTEORDER == 4321
00020   return &ns(internal_big2_encoding).enc;
00021 #else
00022   const short n = 1;
00023   return (*(const char *)&n
00024           ? &ns(internal_little2_encoding).enc
00025           : &ns(internal_big2_encoding).enc);
00026 #endif
00027 }
00028 
00029 static const ENCODING * const NS(encodings)[] = {
00030   &ns(latin1_encoding).enc,
00031   &ns(ascii_encoding).enc,
00032   &ns(utf8_encoding).enc,
00033   &ns(big2_encoding).enc,
00034   &ns(big2_encoding).enc,
00035   &ns(little2_encoding).enc,
00036   &ns(utf8_encoding).enc /* NO_ENC */
00037 };
00038 
00039 static int PTRCALL
00040 NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end,
00041                    const char **nextTokPtr)
00042 {
00043   return initScan(NS(encodings), (const INIT_ENCODING *)enc,
00044                   XML_PROLOG_STATE, ptr, end, nextTokPtr);
00045 }
00046 
00047 static int PTRCALL
00048 NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end,
00049                     const char **nextTokPtr)
00050 {
00051   return initScan(NS(encodings), (const INIT_ENCODING *)enc,
00052                   XML_CONTENT_STATE, ptr, end, nextTokPtr);
00053 }
00054 
00055 int
00056 NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
00057                     const char *name)
00058 {
00059   int i = getEncodingIndex(name);
00060   if (i == UNKNOWN_ENC)
00061     return 0;
00062   SET_INIT_ENC_INDEX(p, i);
00063   p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog);
00064   p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent);
00065   p->initEnc.updatePosition = initUpdatePosition;
00066   p->encPtr = encPtr;
00067   *encPtr = &(p->initEnc);
00068   return 1;
00069 }
00070 
00071 static const ENCODING *
00072 NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end)
00073 {
00074 #define ENCODING_MAX 128
00075   char buf[ENCODING_MAX];
00076   char *p = buf;
00077   int i;
00078   XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
00079   if (ptr != end)
00080     return 0;
00081   *p = 0;
00082   if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2)
00083     return enc;
00084   i = getEncodingIndex(buf);
00085   if (i == UNKNOWN_ENC)
00086     return 0;
00087   return NS(encodings)[i];
00088 }
00089 
00090 int
00091 NS(XmlParseXmlDecl)(int isGeneralTextEntity,
00092                     const ENCODING *enc,
00093                     const char *ptr,
00094                     const char *end,
00095                     const char **badPtr,
00096                     const char **versionPtr,
00097                     const char **versionEndPtr,
00098                     const char **encodingName,
00099                     const ENCODING **encoding,
00100                     int *standalone)
00101 {
00102   return doParseXmlDecl(NS(findEncoding),
00103                         isGeneralTextEntity,
00104                         enc,
00105                         ptr,
00106                         end,
00107                         badPtr,
00108                         versionPtr,
00109                         versionEndPtr,
00110                         encodingName,
00111                         encoding,
00112                         standalone);
00113 }
00114 
00115 #endif /* XML_TOK_NS_C */