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