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