17db96d56Sopenharmony_ci/* This file is included!
27db96d56Sopenharmony_ci                            __  __            _
37db96d56Sopenharmony_ci                         ___\ \/ /_ __   __ _| |_
47db96d56Sopenharmony_ci                        / _ \\  /| '_ \ / _` | __|
57db96d56Sopenharmony_ci                       |  __//  \| |_) | (_| | |_
67db96d56Sopenharmony_ci                        \___/_/\_\ .__/ \__,_|\__|
77db96d56Sopenharmony_ci                                 |_| XML parser
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
107db96d56Sopenharmony_ci   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
117db96d56Sopenharmony_ci   Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
127db96d56Sopenharmony_ci   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
137db96d56Sopenharmony_ci   Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
147db96d56Sopenharmony_ci   Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
157db96d56Sopenharmony_ci   Licensed under the MIT license:
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci   Permission is  hereby granted,  free of charge,  to any  person obtaining
187db96d56Sopenharmony_ci   a  copy  of  this  software   and  associated  documentation  files  (the
197db96d56Sopenharmony_ci   "Software"),  to  deal in  the  Software  without restriction,  including
207db96d56Sopenharmony_ci   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
217db96d56Sopenharmony_ci   distribute, sublicense, and/or sell copies of the Software, and to permit
227db96d56Sopenharmony_ci   persons  to whom  the Software  is  furnished to  do so,  subject to  the
237db96d56Sopenharmony_ci   following conditions:
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci   The above copyright  notice and this permission notice  shall be included
267db96d56Sopenharmony_ci   in all copies or substantial portions of the Software.
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
297db96d56Sopenharmony_ci   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
307db96d56Sopenharmony_ci   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
317db96d56Sopenharmony_ci   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
327db96d56Sopenharmony_ci   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
337db96d56Sopenharmony_ci   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
347db96d56Sopenharmony_ci   USE OR OTHER DEALINGS IN THE SOFTWARE.
357db96d56Sopenharmony_ci*/
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci#ifdef XML_TOK_NS_C
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ciconst ENCODING *
407db96d56Sopenharmony_ciNS(XmlGetUtf8InternalEncoding)(void) {
417db96d56Sopenharmony_ci  return &ns(internal_utf8_encoding).enc;
427db96d56Sopenharmony_ci}
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ciconst ENCODING *
457db96d56Sopenharmony_ciNS(XmlGetUtf16InternalEncoding)(void) {
467db96d56Sopenharmony_ci#  if BYTEORDER == 1234
477db96d56Sopenharmony_ci  return &ns(internal_little2_encoding).enc;
487db96d56Sopenharmony_ci#  elif BYTEORDER == 4321
497db96d56Sopenharmony_ci  return &ns(internal_big2_encoding).enc;
507db96d56Sopenharmony_ci#  else
517db96d56Sopenharmony_ci  const short n = 1;
527db96d56Sopenharmony_ci  return (*(const char *)&n ? &ns(internal_little2_encoding).enc
537db96d56Sopenharmony_ci                            : &ns(internal_big2_encoding).enc);
547db96d56Sopenharmony_ci#  endif
557db96d56Sopenharmony_ci}
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_cistatic const ENCODING *const NS(encodings)[] = {
587db96d56Sopenharmony_ci    &ns(latin1_encoding).enc, &ns(ascii_encoding).enc,
597db96d56Sopenharmony_ci    &ns(utf8_encoding).enc,   &ns(big2_encoding).enc,
607db96d56Sopenharmony_ci    &ns(big2_encoding).enc,   &ns(little2_encoding).enc,
617db96d56Sopenharmony_ci    &ns(utf8_encoding).enc /* NO_ENC */
627db96d56Sopenharmony_ci};
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_cistatic int PTRCALL
657db96d56Sopenharmony_ciNS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end,
667db96d56Sopenharmony_ci                   const char **nextTokPtr) {
677db96d56Sopenharmony_ci  return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_PROLOG_STATE,
687db96d56Sopenharmony_ci                  ptr, end, nextTokPtr);
697db96d56Sopenharmony_ci}
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_cistatic int PTRCALL
727db96d56Sopenharmony_ciNS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end,
737db96d56Sopenharmony_ci                    const char **nextTokPtr) {
747db96d56Sopenharmony_ci  return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_CONTENT_STATE,
757db96d56Sopenharmony_ci                  ptr, end, nextTokPtr);
767db96d56Sopenharmony_ci}
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ciint
797db96d56Sopenharmony_ciNS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
807db96d56Sopenharmony_ci                    const char *name) {
817db96d56Sopenharmony_ci  int i = getEncodingIndex(name);
827db96d56Sopenharmony_ci  if (i == UNKNOWN_ENC)
837db96d56Sopenharmony_ci    return 0;
847db96d56Sopenharmony_ci  SET_INIT_ENC_INDEX(p, i);
857db96d56Sopenharmony_ci  p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog);
867db96d56Sopenharmony_ci  p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent);
877db96d56Sopenharmony_ci  p->initEnc.updatePosition = initUpdatePosition;
887db96d56Sopenharmony_ci  p->encPtr = encPtr;
897db96d56Sopenharmony_ci  *encPtr = &(p->initEnc);
907db96d56Sopenharmony_ci  return 1;
917db96d56Sopenharmony_ci}
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_cistatic const ENCODING *
947db96d56Sopenharmony_ciNS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) {
957db96d56Sopenharmony_ci#  define ENCODING_MAX 128
967db96d56Sopenharmony_ci  char buf[ENCODING_MAX] = "";
977db96d56Sopenharmony_ci  char *p = buf;
987db96d56Sopenharmony_ci  int i;
997db96d56Sopenharmony_ci  XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
1007db96d56Sopenharmony_ci  if (ptr != end)
1017db96d56Sopenharmony_ci    return 0;
1027db96d56Sopenharmony_ci  *p = 0;
1037db96d56Sopenharmony_ci  if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2)
1047db96d56Sopenharmony_ci    return enc;
1057db96d56Sopenharmony_ci  i = getEncodingIndex(buf);
1067db96d56Sopenharmony_ci  if (i == UNKNOWN_ENC)
1077db96d56Sopenharmony_ci    return 0;
1087db96d56Sopenharmony_ci  return NS(encodings)[i];
1097db96d56Sopenharmony_ci}
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ciint
1127db96d56Sopenharmony_ciNS(XmlParseXmlDecl)(int isGeneralTextEntity, const ENCODING *enc,
1137db96d56Sopenharmony_ci                    const char *ptr, const char *end, const char **badPtr,
1147db96d56Sopenharmony_ci                    const char **versionPtr, const char **versionEndPtr,
1157db96d56Sopenharmony_ci                    const char **encodingName, const ENCODING **encoding,
1167db96d56Sopenharmony_ci                    int *standalone) {
1177db96d56Sopenharmony_ci  return doParseXmlDecl(NS(findEncoding), isGeneralTextEntity, enc, ptr, end,
1187db96d56Sopenharmony_ci                        badPtr, versionPtr, versionEndPtr, encodingName,
1197db96d56Sopenharmony_ci                        encoding, standalone);
1207db96d56Sopenharmony_ci}
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci#endif /* XML_TOK_NS_C */
123