Merge to XFA: Restore checked strlen conversions.
[pdfium.git] / core / include / fxcrt / fx_system.h
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4  
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef _FX_SYSTEM_H_
8 #define _FX_SYSTEM_H_
9 #define _FX_WIN32_DESKTOP_              1
10 #define _FX_LINUX_DESKTOP_              4
11 #define _FX_MACOSX_                             7
12 #define _FX_ANDROID_                    12
13 #define _FXM_PLATFORM_WINDOWS_          1
14 #define _FXM_PLATFORM_LINUX_            2
15 #define _FXM_PLATFORM_APPLE_            3
16 #define _FXM_PLATFORM_ANDROID_          4
17
18 #ifndef _FX_OS_
19 #if defined(__ANDROID__)
20 #define _FX_OS_ _FX_ANDROID_
21 #define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_
22 #elif defined(_WIN32) || defined(_WIN64)
23 #define _FX_OS_ _FX_WIN32_DESKTOP_
24 #define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
25 #elif defined(__linux__)
26 #define _FX_OS_ _FX_LINUX_DESKTOP_
27 #define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
28 #elif defined(__APPLE__)
29 #define _FX_OS_ _FX_MACOSX_
30 #define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_
31 #endif
32 #endif
33
34 #if !defined(_FX_OS_) || _FX_OS_ == 0
35 #error Sorry, can not figure out what OS you are targeting to. Please specify _FX_OS_ macro.
36 #endif
37
38 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
39 #define _CRT_SECURE_NO_WARNINGS
40 #include <sal.h>
41 #include <windows.h>
42 #endif  // _FXM_PLATFORM_WINDOWS_
43 #define _FX_W32_                1
44 #define _FX_W64_                2
45 #ifndef _FX_WORDSIZE_
46 #if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64 || defined(__LP64__)
47 #define _FX_WORDSIZE_   _FX_W64_
48 #else
49 #define _FX_WORDSIZE_   _FX_W32_
50 #endif
51 #endif
52
53 #include <stddef.h>
54 #include <stdarg.h>
55 #include <setjmp.h>
56 #include <stdlib.h>
57 #include <stdio.h>
58 #include <string.h>
59 #include <assert.h>
60 #include <wchar.h>
61
62 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
63 #include <libkern/OSAtomic.h>
64 #if _FX_OS_ == _FX_MACOSX_
65 #include <Carbon/Carbon.h>
66 #elif _FX_OS_ == _FX_IOS_
67 #include <CoreText/CoreText.h>
68 #include <CoreGraphics/CoreGraphics.h>
69 #endif
70 #endif
71
72 #ifdef __cplusplus
73 extern "C" {
74 #endif
75 typedef void*                                   FX_LPVOID;
76 typedef void const*                             FX_LPCVOID;
77 typedef void*                                   FX_POSITION;
78 typedef signed char                             FX_INT8;
79 typedef unsigned char                   FX_UINT8;
80 typedef unsigned char                   FX_BYTE;
81 typedef unsigned char*                  FX_LPBYTE;
82 typedef unsigned char const*    FX_LPCBYTE;
83 typedef short                                   FX_INT16;
84 typedef unsigned short                  FX_UINT16;
85 typedef short                                   FX_SHORT;
86 typedef unsigned short                  FX_WORD;
87 typedef unsigned short*                 FX_LPWORD;
88 typedef unsigned short const*   FX_LPCWORD;
89 typedef int                                             FX_INT32;
90 typedef float                                   FX_FLOAT;
91 typedef int                                             FX_BOOL;
92 typedef int                                             FX_ERR;
93 #define FX_SUCCEEDED(Status)    ((FX_ERR)(Status) >= 0)
94 #define FX_FAILED(Status)               ((FX_ERR)(Status) < 0)
95 typedef char                                    FX_CHAR;
96 typedef char*                                   FX_LPSTR;
97 typedef char const*                             FX_LPCSTR;
98 #define FX_DWORD_MAX UINT_MAX
99 typedef unsigned int            FX_DWORD;
100 typedef unsigned int*           FX_LPDWORD;
101 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
102 typedef __int64                         FX_INT64;
103 typedef unsigned __int64        FX_UINT64;
104 #else
105 typedef long long int           FX_INT64;
106 typedef unsigned long long      FX_UINT64;
107 #endif
108 #if _FX_WORDSIZE_ == _FX_W64_
109 typedef FX_INT64                        FX_INTPTR;
110 typedef FX_UINT64                       FX_UINTPTR;
111 #else
112 typedef int                                     FX_INTPTR;
113 typedef unsigned int            FX_UINTPTR;
114 #endif
115 typedef wchar_t                                 FX_WCHAR;
116 typedef wchar_t*                                FX_LPWSTR;
117 typedef wchar_t const*                  FX_LPCWSTR;
118 typedef FX_DWORD                                FX_UINT32;
119 typedef FX_UINT64                               FX_QWORD;
120
121 // PDFium string sizes are limited to 2^31-1, and the value is signed to
122 // allow -1 as a placeholder for "unknown".
123 // TODO(palmer): it should be a |size_t|, or at least unsigned.
124 typedef int FX_STRSIZE;
125
126 #if defined(DEBUG) && !defined(_DEBUG)
127 #define _DEBUG
128 #endif
129 #ifndef TRUE
130
131 #define TRUE    1
132 #endif
133 #ifndef FALSE
134
135 #define FALSE   0
136 #endif
137 #ifndef NULL
138
139 #define NULL    0
140 #endif
141 #define FXSYS_assert assert
142 #ifndef ASSERT
143 #ifdef _DEBUG
144 #define ASSERT FXSYS_assert
145 #else
146
147 #define ASSERT(a)
148 #endif
149 #endif
150 #define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))
151 #define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))
152 #define FX_PI   3.1415926535897932384626433832795f
153
154 // NOTE: prevent use of the return value from snprintf() since some platforms
155 // have different return values (e.g. windows _vsnprintf()), and provide
156 // versions that always NUL-terminate.
157 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ && _MSC_VER < 1900
158 void FXSYS_snprintf(char *str, size_t size, _Printf_format_string_ const char* fmt, ...);
159 void FXSYS_vsnprintf(char *str, size_t size, const char* fmt, va_list ap);
160 #else
161 #define FXSYS_snprintf  (void) snprintf
162 #define FXSYS_vsnprintf (void) vsnprintf
163 #endif
164
165 #define FXSYS_sprintf   DO_NOT_USE_SPRINTF_DIE_DIE_DIE
166 #define FXSYS_vsprintf  DO_NOT_USE_VSPRINTF_DIE_DIE_DIE
167 #define FXSYS_strchr    strchr
168 #define FXSYS_strncmp   strncmp
169 #define FXSYS_strcmp    strcmp
170 #define FXSYS_strcpy    strcpy
171 #define FXSYS_strncpy   strncpy
172 #define FXSYS_strstr    strstr
173 #define FXSYS_FILE              FILE
174 #define FXSYS_fopen             fopen
175 #define FXSYS_fclose    fclose
176 #define FXSYS_SEEK_END  SEEK_END
177 #define FXSYS_SEEK_SET  SEEK_SET
178 #define FXSYS_fseek             fseek
179 #define FXSYS_ftell             ftell
180 #define FXSYS_fread             fread
181 #define FXSYS_fwrite    fwrite
182 #define FXSYS_fprintf   fprintf
183 #define FXSYS_fflush    fflush
184
185 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
186 #ifdef _NATIVE_WCHAR_T_DEFINED
187 #define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))
188 #else
189 #define FXSYS_wfopen _wfopen
190 #endif
191 #else
192 FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);
193 #endif
194
195 #ifdef __cplusplus
196 } // extern "C"
197 #include "../../../third_party/base/numerics/safe_conversions.h"
198 #define FXSYS_strlen(ptr) pdfium::base::checked_cast<FX_STRSIZE>(strlen(ptr))
199 #define FXSYS_wcslen(ptr) pdfium::base::checked_cast<FX_STRSIZE>(wcslen(ptr))
200 extern "C" {
201 #else
202 #define FXSYS_strlen(ptr) ((FX_STRSIZE)strlen(ptr))
203 #define FXSYS_wcslen(ptr) ((FX_STRSIZE)wcslen(ptr))
204 #endif
205
206 #define FXSYS_wcscmp    wcscmp
207 #define FXSYS_wcschr    wcschr
208 #define FXSYS_wcsstr    wcsstr
209 #define FXSYS_wcsncmp   wcsncmp
210 #define FXSYS_vswprintf vswprintf
211 #define FXSYS_mbstowcs  mbstowcs
212 #define FXSYS_wcstombs  wcstombs
213 #define FXSYS_memcmp    memcmp
214 #define FXSYS_memcpy    memcpy
215 #define FXSYS_memmove   memmove
216 #define FXSYS_memset    memset
217 #define FXSYS_memchr    memchr
218 #define FXSYS_qsort             qsort
219 #define FXSYS_bsearch   bsearch
220 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
221 #define FXSYS_GetACP GetACP
222 #define FXSYS_itoa _itoa
223 #define FXSYS_strlwr _strlwr
224 #define FXSYS_strupr _strupr
225 #define FXSYS_stricmp _stricmp
226 #ifdef _NATIVE_WCHAR_T_DEFINED
227 #define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))
228 #define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)
229 #define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)
230 #define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))
231 #define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))
232 #else
233 #define FXSYS_wcsicmp _wcsicmp
234 #define FXSYS_WideCharToMultiByte WideCharToMultiByte
235 #define FXSYS_MultiByteToWideChar MultiByteToWideChar
236 #define FXSYS_wcslwr _wcslwr
237 #define FXSYS_wcsupr _wcsupr
238 #endif
239 #define FXSYS_GetFullPathName GetFullPathName
240 #define FXSYS_GetModuleFileName GetModuleFileName
241 #else
242 int                     FXSYS_GetACP(void);
243 char*           FXSYS_itoa(int value, char* string, int radix);
244 int                     FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,
245                                       char* buf, int buflen, const char* default_str, int* pUseDefault);
246 int                     FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,
247                                       wchar_t* buf, int buflen);
248 FX_DWORD        FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
249 FX_DWORD        FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
250 char*           FXSYS_strlwr(char* str);
251 char*           FXSYS_strupr(char* str);
252 int                     FXSYS_stricmp(const char*, const char*);
253 int                     FXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);
254 wchar_t*        FXSYS_wcslwr(wchar_t* str);
255 wchar_t*        FXSYS_wcsupr(wchar_t* str);
256 #endif
257 #define FXSYS_memcpy32          FXSYS_memcpy
258 #define FXSYS_memcmp32          FXSYS_memcmp
259 #define FXSYS_memset32          FXSYS_memset
260 #define FXSYS_memset8           FXSYS_memset
261 #define FXSYS_memmove32         FXSYS_memmove
262 #ifdef __cplusplus
263 }
264 #endif
265 #include <math.h>
266 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
267 #define FXSYS_pow(a, b)         (FX_FLOAT)powf(a, b)
268 #else
269 #define FXSYS_pow(a, b)         (FX_FLOAT)pow(a, b)
270 #endif
271 #define FXSYS_sqrt(a)           (FX_FLOAT)sqrt(a)
272 #define FXSYS_fabs(a)           (FX_FLOAT)fabs(a)
273 #define FXSYS_atan2(a, b)       (FX_FLOAT)atan2(a, b)
274 #define FXSYS_ceil(a)           (FX_FLOAT)ceil(a)
275 #define FXSYS_floor(a)          (FX_FLOAT)floor(a)
276 #define FXSYS_cos(a)            (FX_FLOAT)cos(a)
277 #define FXSYS_acos(a)           (FX_FLOAT)acos(a)
278 #define FXSYS_sin(a)            (FX_FLOAT)sin(a)
279 #define FXSYS_log(a)            (FX_FLOAT)log(a)
280 #define FXSYS_log10(a)          (FX_FLOAT)log10(a)
281 #define FXSYS_fmod(a, b)        (FX_FLOAT)fmod(a, b)
282 #define FXSYS_abs                       abs
283 #ifdef __cplusplus
284 extern "C" {
285 #endif
286 #define _FX_LSB_FIRST_
287 #define FXDWORD_FROM_LSBFIRST(i)        (i)
288 #define FXDWORD_FROM_MSBFIRST(i)        (((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24))
289 #define FXDWORD_GET_LSBFIRST(p)         ((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))
290 #define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))
291 #define FXSYS_HIBYTE(word)      ((FX_BYTE)((word) >> 8))
292 #define FXSYS_LOBYTE(word)      ((FX_BYTE)(word))
293 #define FXSYS_HIWORD(dword)     ((FX_WORD)((dword) >> 16))
294 #define FXSYS_LOWORD(dword)     ((FX_WORD)(dword))
295 FX_INT32        FXSYS_atoi(FX_LPCSTR str);
296 FX_INT32        FXSYS_wtoi(FX_LPCWSTR str);
297 FX_INT64        FXSYS_atoi64(FX_LPCSTR str);
298 FX_INT64        FXSYS_wtoi64(FX_LPCWSTR str);
299 FX_LPCSTR       FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);
300 FX_LPCWSTR      FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);
301 int                     FXSYS_round(FX_FLOAT f);
302 #define         FXSYS_Mul(a, b) ((a) * (b))
303 #define         FXSYS_Div(a, b) ((a) / (b))
304 #define         FXSYS_MulDiv(a, b, c) ((a) * (b) / (c))
305 #define         FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))
306 #ifdef __cplusplus
307 };
308
309 #if defined(__clang__) || _MSC_VER >= 1700
310 #define FX_FINAL final
311 #define FX_OVERRIDE override
312 #elif defined(__GNUC__) && __cplusplus >= 201103 && \
313       (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700
314 #define FX_FINAL final
315 #define FX_OVERRIDE override
316 #else
317 #define FX_FINAL
318 #define FX_OVERRIDE
319 #endif
320 #endif
321
322 // To print a size_t value in a portable way:
323 //   size_t size;
324 //   printf("xyz: %" PRIuS, size);
325 // The "u" in the macro corresponds to %u, and S is for "size".
326
327 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
328
329 #if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64)
330 #error "inttypes.h has already been included before this header file, but "
331 #error "without __STDC_FORMAT_MACROS defined."
332 #endif
333
334 #if !defined(__STDC_FORMAT_MACROS)
335 #define __STDC_FORMAT_MACROS
336 #endif
337
338 #include <inttypes.h>
339
340 #if !defined(PRIuS)
341 #define PRIuS "zu"
342 #endif
343
344 #else  // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
345
346 #if !defined(PRIuS)
347 #define PRIuS "Iu"
348 #endif
349
350 #endif
351
352 #endif