xref: /aosp_15_r20/external/expat/lib/internal.h (revision 6be67779651aebaf20f11e5663acd1ae59e93f66)
1*6be67779SAndroid Build Coastguard Worker /* internal.h
2*6be67779SAndroid Build Coastguard Worker 
3*6be67779SAndroid Build Coastguard Worker    Internal definitions used by Expat.  This is not needed to compile
4*6be67779SAndroid Build Coastguard Worker    client code.
5*6be67779SAndroid Build Coastguard Worker 
6*6be67779SAndroid Build Coastguard Worker    The following calling convention macros are defined for frequently
7*6be67779SAndroid Build Coastguard Worker    called functions:
8*6be67779SAndroid Build Coastguard Worker 
9*6be67779SAndroid Build Coastguard Worker    FASTCALL    - Used for those internal functions that have a simple
10*6be67779SAndroid Build Coastguard Worker                  body and a low number of arguments and local variables.
11*6be67779SAndroid Build Coastguard Worker 
12*6be67779SAndroid Build Coastguard Worker    PTRCALL     - Used for functions called though function pointers.
13*6be67779SAndroid Build Coastguard Worker 
14*6be67779SAndroid Build Coastguard Worker    PTRFASTCALL - Like PTRCALL, but for low number of arguments.
15*6be67779SAndroid Build Coastguard Worker 
16*6be67779SAndroid Build Coastguard Worker    inline      - Used for selected internal functions for which inlining
17*6be67779SAndroid Build Coastguard Worker                  may improve performance on some platforms.
18*6be67779SAndroid Build Coastguard Worker 
19*6be67779SAndroid Build Coastguard Worker    Note: Use of these macros is based on judgement, not hard rules,
20*6be67779SAndroid Build Coastguard Worker          and therefore subject to change.
21*6be67779SAndroid Build Coastguard Worker                             __  __            _
22*6be67779SAndroid Build Coastguard Worker                          ___\ \/ /_ __   __ _| |_
23*6be67779SAndroid Build Coastguard Worker                         / _ \\  /| '_ \ / _` | __|
24*6be67779SAndroid Build Coastguard Worker                        |  __//  \| |_) | (_| | |_
25*6be67779SAndroid Build Coastguard Worker                         \___/_/\_\ .__/ \__,_|\__|
26*6be67779SAndroid Build Coastguard Worker                                  |_| XML parser
27*6be67779SAndroid Build Coastguard Worker 
28*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2002-2003 Fred L. Drake, Jr. <[email protected]>
29*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2002-2006 Karl Waclawek <[email protected]>
30*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2003      Greg Stein <[email protected]>
31*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2016-2024 Sebastian Pipping <[email protected]>
32*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2018      Yury Gribov <[email protected]>
33*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2019      David Loffredo <[email protected]>
34*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <[email protected]>
35*6be67779SAndroid Build Coastguard Worker    Copyright (c) 2024      Taichi Haradaguchi <[email protected]>
36*6be67779SAndroid Build Coastguard Worker    Licensed under the MIT license:
37*6be67779SAndroid Build Coastguard Worker 
38*6be67779SAndroid Build Coastguard Worker    Permission is  hereby granted,  free of charge,  to any  person obtaining
39*6be67779SAndroid Build Coastguard Worker    a  copy  of  this  software   and  associated  documentation  files  (the
40*6be67779SAndroid Build Coastguard Worker    "Software"),  to  deal in  the  Software  without restriction,  including
41*6be67779SAndroid Build Coastguard Worker    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
42*6be67779SAndroid Build Coastguard Worker    distribute, sublicense, and/or sell copies of the Software, and to permit
43*6be67779SAndroid Build Coastguard Worker    persons  to whom  the Software  is  furnished to  do so,  subject to  the
44*6be67779SAndroid Build Coastguard Worker    following conditions:
45*6be67779SAndroid Build Coastguard Worker 
46*6be67779SAndroid Build Coastguard Worker    The above copyright  notice and this permission notice  shall be included
47*6be67779SAndroid Build Coastguard Worker    in all copies or substantial portions of the Software.
48*6be67779SAndroid Build Coastguard Worker 
49*6be67779SAndroid Build Coastguard Worker    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
50*6be67779SAndroid Build Coastguard Worker    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
51*6be67779SAndroid Build Coastguard Worker    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
52*6be67779SAndroid Build Coastguard Worker    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
53*6be67779SAndroid Build Coastguard Worker    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
54*6be67779SAndroid Build Coastguard Worker    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
55*6be67779SAndroid Build Coastguard Worker    USE OR OTHER DEALINGS IN THE SOFTWARE.
56*6be67779SAndroid Build Coastguard Worker */
57*6be67779SAndroid Build Coastguard Worker 
58*6be67779SAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__i386__) && ! defined(__MINGW32__)
59*6be67779SAndroid Build Coastguard Worker /* We'll use this version by default only where we know it helps.
60*6be67779SAndroid Build Coastguard Worker 
61*6be67779SAndroid Build Coastguard Worker    regparm() generates warnings on Solaris boxes.   See SF bug #692878.
62*6be67779SAndroid Build Coastguard Worker 
63*6be67779SAndroid Build Coastguard Worker    Instability reported with egcs on a RedHat Linux 7.3.
64*6be67779SAndroid Build Coastguard Worker    Let's comment out:
65*6be67779SAndroid Build Coastguard Worker    #define FASTCALL __attribute__((stdcall, regparm(3)))
66*6be67779SAndroid Build Coastguard Worker    and let's try this:
67*6be67779SAndroid Build Coastguard Worker */
68*6be67779SAndroid Build Coastguard Worker #  define FASTCALL __attribute__((regparm(3)))
69*6be67779SAndroid Build Coastguard Worker #  define PTRFASTCALL __attribute__((regparm(3)))
70*6be67779SAndroid Build Coastguard Worker #endif
71*6be67779SAndroid Build Coastguard Worker 
72*6be67779SAndroid Build Coastguard Worker /* Using __fastcall seems to have an unexpected negative effect under
73*6be67779SAndroid Build Coastguard Worker    MS VC++, especially for function pointers, so we won't use it for
74*6be67779SAndroid Build Coastguard Worker    now on that platform. It may be reconsidered for a future release
75*6be67779SAndroid Build Coastguard Worker    if it can be made more effective.
76*6be67779SAndroid Build Coastguard Worker    Likely reason: __fastcall on Windows is like stdcall, therefore
77*6be67779SAndroid Build Coastguard Worker    the compiler cannot perform stack optimizations for call clusters.
78*6be67779SAndroid Build Coastguard Worker */
79*6be67779SAndroid Build Coastguard Worker 
80*6be67779SAndroid Build Coastguard Worker /* Make sure all of these are defined if they aren't already. */
81*6be67779SAndroid Build Coastguard Worker 
82*6be67779SAndroid Build Coastguard Worker #ifndef FASTCALL
83*6be67779SAndroid Build Coastguard Worker #  define FASTCALL
84*6be67779SAndroid Build Coastguard Worker #endif
85*6be67779SAndroid Build Coastguard Worker 
86*6be67779SAndroid Build Coastguard Worker #ifndef PTRCALL
87*6be67779SAndroid Build Coastguard Worker #  define PTRCALL
88*6be67779SAndroid Build Coastguard Worker #endif
89*6be67779SAndroid Build Coastguard Worker 
90*6be67779SAndroid Build Coastguard Worker #ifndef PTRFASTCALL
91*6be67779SAndroid Build Coastguard Worker #  define PTRFASTCALL
92*6be67779SAndroid Build Coastguard Worker #endif
93*6be67779SAndroid Build Coastguard Worker 
94*6be67779SAndroid Build Coastguard Worker #ifndef XML_MIN_SIZE
95*6be67779SAndroid Build Coastguard Worker #  if ! defined(__cplusplus) && ! defined(inline)
96*6be67779SAndroid Build Coastguard Worker #    ifdef __GNUC__
97*6be67779SAndroid Build Coastguard Worker #      define inline __inline
98*6be67779SAndroid Build Coastguard Worker #    endif /* __GNUC__ */
99*6be67779SAndroid Build Coastguard Worker #  endif
100*6be67779SAndroid Build Coastguard Worker #endif /* XML_MIN_SIZE */
101*6be67779SAndroid Build Coastguard Worker 
102*6be67779SAndroid Build Coastguard Worker #ifdef __cplusplus
103*6be67779SAndroid Build Coastguard Worker #  define inline inline
104*6be67779SAndroid Build Coastguard Worker #else
105*6be67779SAndroid Build Coastguard Worker #  ifndef inline
106*6be67779SAndroid Build Coastguard Worker #    define inline
107*6be67779SAndroid Build Coastguard Worker #  endif
108*6be67779SAndroid Build Coastguard Worker #endif
109*6be67779SAndroid Build Coastguard Worker 
110*6be67779SAndroid Build Coastguard Worker #include <limits.h> // ULONG_MAX
111*6be67779SAndroid Build Coastguard Worker 
112*6be67779SAndroid Build Coastguard Worker #if defined(_WIN32)                                                            \
113*6be67779SAndroid Build Coastguard Worker     && (! defined(__USE_MINGW_ANSI_STDIO)                                      \
114*6be67779SAndroid Build Coastguard Worker         || (1 - __USE_MINGW_ANSI_STDIO - 1 == 0))
115*6be67779SAndroid Build Coastguard Worker #  define EXPAT_FMT_ULL(midpart) "%" midpart "I64u"
116*6be67779SAndroid Build Coastguard Worker #  if defined(_WIN64) // Note: modifiers "td" and "zu" do not work for MinGW
117*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "I64d"
118*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_SIZE_T(midpart) "%" midpart "I64u"
119*6be67779SAndroid Build Coastguard Worker #  else
120*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "d"
121*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_SIZE_T(midpart) "%" midpart "u"
122*6be67779SAndroid Build Coastguard Worker #  endif
123*6be67779SAndroid Build Coastguard Worker #else
124*6be67779SAndroid Build Coastguard Worker #  define EXPAT_FMT_ULL(midpart) "%" midpart "llu"
125*6be67779SAndroid Build Coastguard Worker #  if ! defined(ULONG_MAX)
126*6be67779SAndroid Build Coastguard Worker #    error Compiler did not define ULONG_MAX for us
127*6be67779SAndroid Build Coastguard Worker #  elif ULONG_MAX == 18446744073709551615u // 2^64-1
128*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "ld"
129*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_SIZE_T(midpart) "%" midpart "lu"
130*6be67779SAndroid Build Coastguard Worker #  else
131*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "d"
132*6be67779SAndroid Build Coastguard Worker #    define EXPAT_FMT_SIZE_T(midpart) "%" midpart "u"
133*6be67779SAndroid Build Coastguard Worker #  endif
134*6be67779SAndroid Build Coastguard Worker #endif
135*6be67779SAndroid Build Coastguard Worker 
136*6be67779SAndroid Build Coastguard Worker #ifndef UNUSED_P
137*6be67779SAndroid Build Coastguard Worker #  define UNUSED_P(p) (void)p
138*6be67779SAndroid Build Coastguard Worker #endif
139*6be67779SAndroid Build Coastguard Worker 
140*6be67779SAndroid Build Coastguard Worker /* NOTE BEGIN If you ever patch these defaults to greater values
141*6be67779SAndroid Build Coastguard Worker               for non-attack XML payload in your environment,
142*6be67779SAndroid Build Coastguard Worker               please file a bug report with libexpat.  Thank you!
143*6be67779SAndroid Build Coastguard Worker */
144*6be67779SAndroid Build Coastguard Worker #define EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT   \
145*6be67779SAndroid Build Coastguard Worker   100.0f
146*6be67779SAndroid Build Coastguard Worker #define EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT    \
147*6be67779SAndroid Build Coastguard Worker   8388608 // 8 MiB, 2^23
148*6be67779SAndroid Build Coastguard Worker /* NOTE END */
149*6be67779SAndroid Build Coastguard Worker 
150*6be67779SAndroid Build Coastguard Worker #include "expat.h" // so we can use type XML_Parser below
151*6be67779SAndroid Build Coastguard Worker 
152*6be67779SAndroid Build Coastguard Worker #ifdef __cplusplus
153*6be67779SAndroid Build Coastguard Worker extern "C" {
154*6be67779SAndroid Build Coastguard Worker #endif
155*6be67779SAndroid Build Coastguard Worker 
156*6be67779SAndroid Build Coastguard Worker void _INTERNAL_trim_to_complete_utf8_characters(const char *from,
157*6be67779SAndroid Build Coastguard Worker                                                 const char **fromLimRef);
158*6be67779SAndroid Build Coastguard Worker 
159*6be67779SAndroid Build Coastguard Worker #if defined(XML_GE) && XML_GE == 1
160*6be67779SAndroid Build Coastguard Worker unsigned long long testingAccountingGetCountBytesDirect(XML_Parser parser);
161*6be67779SAndroid Build Coastguard Worker unsigned long long testingAccountingGetCountBytesIndirect(XML_Parser parser);
162*6be67779SAndroid Build Coastguard Worker const char *unsignedCharToPrintable(unsigned char c);
163*6be67779SAndroid Build Coastguard Worker #endif
164*6be67779SAndroid Build Coastguard Worker 
165*6be67779SAndroid Build Coastguard Worker extern
166*6be67779SAndroid Build Coastguard Worker #if ! defined(XML_TESTING)
167*6be67779SAndroid Build Coastguard Worker     const
168*6be67779SAndroid Build Coastguard Worker #endif
169*6be67779SAndroid Build Coastguard Worker     XML_Bool g_reparseDeferralEnabledDefault; // written ONLY in runtests.c
170*6be67779SAndroid Build Coastguard Worker #if defined(XML_TESTING)
171*6be67779SAndroid Build Coastguard Worker extern unsigned int g_bytesScanned; // used for testing only
172*6be67779SAndroid Build Coastguard Worker #endif
173*6be67779SAndroid Build Coastguard Worker 
174*6be67779SAndroid Build Coastguard Worker #ifdef __cplusplus
175*6be67779SAndroid Build Coastguard Worker }
176*6be67779SAndroid Build Coastguard Worker #endif
177