1 /*
2    +----------------------------------------------------------------------+
3    | Zend Engine                                                          |
4    +----------------------------------------------------------------------+
5    | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
6    +----------------------------------------------------------------------+
7    | This source file is subject to version 2.00 of the Zend license,     |
8    | that is bundled with this package in the file LICENSE, and is        |
9    | available through the world-wide-web at the following url:           |
10    | http://www.zend.com/license/2_00.txt.                                |
11    | If you did not receive a copy of the Zend license and are unable to  |
12    | obtain it through the world-wide-web, please send a note to          |
13    | license@zend.com so we can mail you a copy immediately.              |
14    +----------------------------------------------------------------------+
15    | Authors: Anatol Belski <ab@php.net>                                  |
16    +----------------------------------------------------------------------+
17 */
18 
19 #ifndef ZEND_STRTOD_INT_H
20 #define ZEND_STRTOD_INT_H
21 
22 #ifdef ZTS
23 #include <TSRM.h>
24 #endif
25 
26 #include <stddef.h>
27 #include <stdio.h>
28 #include <ctype.h>
29 #include <stdarg.h>
30 #include <math.h>
31 
32 #ifdef HAVE_SYS_TYPES_H
33 #include <sys/types.h>
34 #endif
35 
36 /* TODO check to undef this option, this might
37 	make more perf. destroy_freelist()
38 	should be adapted then. */
39 #define Omit_Private_Memory 1
40 
41 /* HEX strings aren't supported as per
42 	https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings */
43 #define NO_HEX_FP 1
44 
45 #if defined(HAVE_INTTYPES_H)
46 #include <inttypes.h>
47 #elif defined(HAVE_STDINT_H)
48 #include <stdint.h>
49 #endif
50 
51 #ifndef HAVE_INT32_T
52 # if SIZEOF_INT == 4
53 typedef int int32_t;
54 # elif SIZEOF_LONG == 4
55 typedef long int int32_t;
56 # endif
57 #endif
58 
59 #ifndef HAVE_UINT32_T
60 # if SIZEOF_INT == 4
61 typedef unsigned int uint32_t;
62 # elif SIZEOF_LONG == 4
63 typedef unsigned long int uint32_t;
64 # endif
65 #endif
66 
67 #ifdef USE_LOCALE
68 #undef USE_LOCALE
69 #endif
70 
71 #ifndef NO_INFNAN_CHECK
72 #define NO_INFNAN_CHECK
73 #endif
74 
75 #ifndef NO_ERRNO
76 #define NO_ERRNO
77 #endif
78 
79 #ifdef WORDS_BIGENDIAN
80 #define IEEE_BIG_ENDIAN 1
81 #else
82 #define IEEE_LITTLE_ENDIAN 1
83 #endif
84 
85 #if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
86 # if defined(__LITTLE_ENDIAN__)
87 #  undef WORDS_BIGENDIAN
88 # else
89 #  if defined(__BIG_ENDIAN__)
90 #   define WORDS_BIGENDIAN
91 #  endif
92 # endif
93 #endif
94 
95 #if defined(__arm__) && !defined(__VFP_FP__)
96 /*
97  *  * Although the CPU is little endian the FP has different
98  *   * byte and word endianness. The byte order is still little endian
99  *    * but the word order is big endian.
100  *     */
101 #define IEEE_BIG_ENDIAN
102 #undef IEEE_LITTLE_ENDIAN
103 #endif
104 
105 #ifdef __vax__
106 #define VAX
107 #undef IEEE_LITTLE_ENDIAN
108 #endif
109 
110 #ifdef IEEE_LITTLE_ENDIAN
111 #define IEEE_8087 1
112 #endif
113 
114 #ifdef IEEE_BIG_ENDIAN
115 #define IEEE_MC68k 1
116 #endif
117 
118 #if defined(_MSC_VER)
119 #ifndef int32_t
120 #define int32_t __int32
121 #endif
122 #ifndef uint32_t
123 #define uint32_t unsigned __int32
124 #endif
125 #endif
126 
127 #ifdef ZTS
128 #define MULTIPLE_THREADS 1
129 
130 #define  ACQUIRE_DTOA_LOCK(x) \
131 	if (0 == x) { \
132 		tsrm_mutex_lock(dtoa_mutex); \
133 	} else if (1 == x) { \
134 		tsrm_mutex_lock(pow5mult_mutex); \
135 	}
136 
137 #define FREE_DTOA_LOCK(x) \
138 	if (0 == x) { \
139 		tsrm_mutex_unlock(dtoa_mutex); \
140 	} else if (1 == x) { \
141 		tsrm_mutex_unlock(pow5mult_mutex); \
142 	}
143 
144 
145 #endif
146 
147 #endif /* ZEND_STRTOD_INT_H */
148