1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXCRT_FX_SYSTEM_H_ 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXCRT_FX_SYSTEM_H_ 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <assert.h> 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <math.h> 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <stdarg.h> 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <stddef.h> 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <stdint.h> 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <stdio.h> 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <stdlib.h> 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <string.h> 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <wchar.h> 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// _FX_OS_ values: 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FX_WIN32_DESKTOP_ 1 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FX_WIN64_DESKTOP_ 2 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FX_LINUX_DESKTOP_ 4 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FX_MACOSX_ 7 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FX_ANDROID_ 12 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// _FXM_PLATFORM_ values; 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FXM_PLATFORM_WINDOWS_ 1 // _FX_WIN32_DESKTOP_ or _FX_WIN64_DESKTOP_. 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FXM_PLATFORM_LINUX_ 2 // _FX_LINUX_DESKTOP_ always. 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FXM_PLATFORM_APPLE_ 3 // _FX_MACOSX_ always. 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FXM_PLATFORM_ANDROID_ 4 // _FX_ANDROID_ always. 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifndef _FX_OS_ 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(__ANDROID__) 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FX_OS_ _FX_ANDROID_ 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_ 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#elif defined(_WIN32) 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FX_OS_ _FX_WIN32_DESKTOP_ 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_ 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#elif defined(_WIN64) 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FX_OS_ _FX_WIN64_DESKTOP_ 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_ 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#elif defined(__linux__) 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FX_OS_ _FX_LINUX_DESKTOP_ 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_ 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#elif defined(__APPLE__) 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FX_OS_ _FX_MACOSX_ 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_ 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // _FX_OS_ 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if !defined(_FX_OS_) || _FX_OS_ == 0 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#error Sorry, can not figure out target OS. Please specify _FX_OS_ macro. 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <windows.h> 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <sal.h> 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <Carbon/Carbon.h> 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <libkern/OSAtomic.h> 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef __cplusplus 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern "C" { 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif // __cplusplus 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntypedef void* FX_POSITION; // Keep until fxcrt containers gone 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntypedef float FX_FLOAT; // Keep, allow upgrade to doubles. 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntypedef double FX_DOUBLE; // Keep, allow downgrade to floats. 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntypedef char FX_CHAR; // Keep, questionable signedness. 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntypedef wchar_t FX_WCHAR; // Keep, maybe bad platform wchars. 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// PDFium string sizes are limited to 2^31-1, and the value is signed to 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// allow -1 as a placeholder for "unknown". 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// TODO(palmer): it should be a |size_t|, or at least unsigned. 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef int FX_STRSIZE; 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifndef ASSERT 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef NDEBUG 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define ASSERT assert 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define ASSERT(a) 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(__clang__) || defined(__GNUC__) 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define PDFIUM_IMMEDIATE_CRASH() __builtin_trap() 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#else 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define PDFIUM_IMMEDIATE_CRASH() ((void)(*(volatile char*)0 = 0)) 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// M_PI not universally present on all platforms. 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_PI 3.1415926535897932384626433832795f 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_BEZIER 0.5522847498308f 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// NOTE: prevent use of the return value from snprintf() since some platforms 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// have different return values (e.g. windows _vsnprintf()), and provide 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// versions that always NUL-terminate. 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ && _MSC_VER < 1900 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid FXSYS_snprintf(char* str, 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t size, 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Printf_format_string_ const char* fmt, 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ...); 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid FXSYS_vsnprintf(char* str, size_t size, const char* fmt, va_list ap); 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FXSYS_snprintf (void)snprintf 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FXSYS_vsnprintf (void)vsnprintf 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_sprintf DO_NOT_USE_SPRINTF_DIE_DIE_DIE 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_vsprintf DO_NOT_USE_VSPRINTF_DIE_DIE_DIE 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_strncmp strncmp 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_strcmp strcmp 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_strcpy strcpy 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_strncpy strncpy 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_strstr strstr 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_FILE FILE 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fopen fopen 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fclose fclose 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_SEEK_END SEEK_END 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_SEEK_SET SEEK_SET 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fseek fseek 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_ftell ftell 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fread fread 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fwrite fwrite 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fprintf fprintf 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fflush fflush 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _NATIVE_WCHAR_T_DEFINED 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m)) 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wfopen _wfopen 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFXSYS_FILE* FXSYS_wfopen(const FX_WCHAR* filename, const FX_WCHAR* mode); 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef __cplusplus 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} // extern "C" 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "third_party/base/numerics/safe_conversions.h" 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_strlen(ptr) pdfium::base::checked_cast<FX_STRSIZE>(strlen(ptr)) 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcslen(ptr) pdfium::base::checked_cast<FX_STRSIZE>(wcslen(ptr)) 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Overloaded functions for C++ templates 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline FX_STRSIZE FXSYS_len(const FX_CHAR* ptr) { 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FXSYS_strlen(ptr); 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline FX_STRSIZE FXSYS_len(const FX_WCHAR* ptr) { 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FXSYS_wcslen(ptr); 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline int FXSYS_cmp(const FX_CHAR* ptr1, const FX_CHAR* ptr2, size_t len) { 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return memcmp(ptr1, ptr2, len); 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline int FXSYS_cmp(const FX_WCHAR* ptr1, const FX_WCHAR* ptr2, size_t len) { 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return wmemcmp(ptr1, ptr2, len); 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline const FX_CHAR* FXSYS_chr(const FX_CHAR* ptr, FX_CHAR ch, size_t len) { 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return reinterpret_cast<const FX_CHAR*>(memchr(ptr, ch, len)); 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline const FX_WCHAR* FXSYS_chr(const FX_WCHAR* ptr, FX_WCHAR ch, size_t len) { 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return wmemchr(ptr, ch, len); 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern "C" { 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_strlen(ptr) ((FX_STRSIZE)strlen(ptr)) 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcslen(ptr) ((FX_STRSIZE)wcslen(ptr)) 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_wcscmp wcscmp 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_wcsstr wcsstr 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_wcsncmp wcsncmp 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_vswprintf vswprintf 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_mbstowcs mbstowcs 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_wcstombs wcstombs 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_memcmp memcmp 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_memcpy memcpy 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_memmove memmove 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_memset memset 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_qsort qsort 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_bsearch bsearch 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_GetACP GetACP 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_itoa _itoa 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_strlwr _strlwr 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_strupr _strupr 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_stricmp _stricmp 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _NATIVE_WCHAR_T_DEFINED 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2)) 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) \ 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8) 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) \ 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6) 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str)) 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str)) 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcsicmp _wcsicmp 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_WideCharToMultiByte WideCharToMultiByte 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_MultiByteToWideChar MultiByteToWideChar 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcslwr _wcslwr 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_wcsupr _wcsupr 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_GetFullPathName GetFullPathName 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_GetModuleFileName GetModuleFileName 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint FXSYS_GetACP(); 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannchar* FXSYS_itoa(int value, char* str, int radix); 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint FXSYS_WideCharToMultiByte(uint32_t codepage, 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwFlags, 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const wchar_t* wstr, 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int wlen, 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann char* buf, 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int buflen, 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const char* default_str, 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int* pUseDefault); 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint FXSYS_MultiByteToWideChar(uint32_t codepage, 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwFlags, 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const char* bstr, 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int blen, 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wchar_t* buf, 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int buflen); 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t FXSYS_GetFullPathName(const char* filename, 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t buflen, 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann char* buf, 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann char** filepart); 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t FXSYS_GetModuleFileName(void* hModule, char* buf, uint32_t bufsize); 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannchar* FXSYS_strlwr(char* str); 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannchar* FXSYS_strupr(char* str); 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint FXSYS_stricmp(const char*, const char*); 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint FXSYS_wcsicmp(const wchar_t* str1, const wchar_t* str2); 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannwchar_t* FXSYS_wcslwr(wchar_t* str); 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannwchar_t* FXSYS_wcsupr(wchar_t* str); 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // _FXM_PLATFORM == _FXM_PLATFORM_WINDOWS_ 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_pow(a, b) (FX_FLOAT) powf(a, b) 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_pow(a, b) (FX_FLOAT) pow(a, b) 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_sqrt(a) (FX_FLOAT) sqrt(a) 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fabs(a) (FX_FLOAT) fabs(a) 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_atan2(a, b) (FX_FLOAT) atan2(a, b) 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_ceil(a) (FX_FLOAT) ceil(a) 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_floor(a) (FX_FLOAT) floor(a) 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_cos(a) (FX_FLOAT) cos(a) 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_acos(a) (FX_FLOAT) acos(a) 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_sin(a) (FX_FLOAT) sin(a) 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_log(a) (FX_FLOAT) log(a) 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_log10(a) (FX_FLOAT) log10(a) 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_fmod(a, b) (FX_FLOAT) fmod(a, b) 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_abs abs 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FXDWORD_GET_LSBFIRST(p) \ 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ((static_cast<uint32_t>(p[3]) << 24) | (static_cast<uint32_t>(p[2]) << 16) | \ 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (static_cast<uint32_t>(p[1]) << 8) | (static_cast<uint32_t>(p[0]))) 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FXDWORD_GET_MSBFIRST(p) \ 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ((static_cast<uint32_t>(p[0]) << 24) | (static_cast<uint32_t>(p[1]) << 16) | \ 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (static_cast<uint32_t>(p[2]) << 8) | (static_cast<uint32_t>(p[3]))) 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_HIBYTE(word) ((uint8_t)((word) >> 8)) 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_LOBYTE(word) ((uint8_t)(word)) 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FXSYS_HIWORD(dword) ((uint16_t)((dword) >> 16)) 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FXSYS_LOWORD(dword) ((uint16_t)(dword)) 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t FXSYS_atoi(const FX_CHAR* str); 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t FXSYS_atoui(const FX_CHAR* str); 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t FXSYS_wtoi(const FX_WCHAR* str); 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint64_t FXSYS_atoi64(const FX_CHAR* str); 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint64_t FXSYS_wtoi64(const FX_WCHAR* str); 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix); 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint FXSYS_round(FX_FLOAT f); 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_sqrt2(a, b) (FX_FLOAT) FXSYS_sqrt((a) * (a) + (b) * (b)) 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef __cplusplus 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// To print a size_t value in a portable way: 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// size_t size; 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// printf("xyz: %" PRIuS, size); 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// The "u" in the macro corresponds to %u, and S is for "size". 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64) 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#error "inttypes.h has already been included before this header file, but " 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#error "without __STDC_FORMAT_MACROS defined." 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if !defined(__STDC_FORMAT_MACROS) 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define __STDC_FORMAT_MACROS 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <inttypes.h> 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if !defined(PRIuS) 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PRIuS "zu" 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if !defined(PRIuS) 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PRIuS "Iu" 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Prevent a function from ever being inlined, typically because we'd 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// like it to appear in stack traces. 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define NEVER_INLINE __declspec(noinline) 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define NEVER_INLINE __attribute__((__noinline__)) 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif // CORE_FXCRT_FX_SYSTEM_H_ 330