10c16b537SWarner Losh /* 2*5ff13fbcSAllan Jude * Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc. 30c16b537SWarner Losh * All rights reserved. 40c16b537SWarner Losh * 50c16b537SWarner Losh * This source code is licensed under both the BSD-style license (found in the 60c16b537SWarner Losh * LICENSE file in the root directory of this source tree) and the GPLv2 (found 70c16b537SWarner Losh * in the COPYING file in the root directory of this source tree). 80c16b537SWarner Losh * You may select, at your option, one of the above-listed licenses. 90c16b537SWarner Losh */ 100c16b537SWarner Losh 110c16b537SWarner Losh #ifndef PLATFORM_H_MODULE 120c16b537SWarner Losh #define PLATFORM_H_MODULE 130c16b537SWarner Losh 140c16b537SWarner Losh #if defined (__cplusplus) 150c16b537SWarner Losh extern "C" { 160c16b537SWarner Losh #endif 170c16b537SWarner Losh 180c16b537SWarner Losh 190c16b537SWarner Losh 200c16b537SWarner Losh /* ************************************** 210c16b537SWarner Losh * Compiler Options 220c16b537SWarner Losh ****************************************/ 230c16b537SWarner Losh #if defined(_MSC_VER) 240c16b537SWarner Losh # define _CRT_SECURE_NO_WARNINGS /* Disable Visual Studio warning messages for fopen, strncpy, strerror */ 25*5ff13fbcSAllan Jude # define _CRT_NONSTDC_NO_WARNINGS /* Disable C4996 complaining about posix function names */ 26052d3c12SConrad Meyer # if (_MSC_VER <= 1800) /* 1800 == Visual Studio 2013 */ 270c16b537SWarner Losh # define _CRT_SECURE_NO_DEPRECATE /* VS2005 - must be declared before <io.h> and <windows.h> */ 280c16b537SWarner Losh # define snprintf sprintf_s /* snprintf unsupported by Visual <= 2013 */ 290c16b537SWarner Losh # endif 30a0483764SConrad Meyer # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ 310c16b537SWarner Losh #endif 320c16b537SWarner Losh 330c16b537SWarner Losh 340c16b537SWarner Losh /* ************************************** 350c16b537SWarner Losh * Detect 64-bit OS 360c16b537SWarner Losh * http://nadeausoftware.com/articles/2012/02/c_c_tip_how_detect_processor_type_using_compiler_predefined_macros 370c16b537SWarner Losh ****************************************/ 380c16b537SWarner Losh #if defined __ia64 || defined _M_IA64 /* Intel Itanium */ \ 390c16b537SWarner Losh || defined __powerpc64__ || defined __ppc64__ || defined __PPC64__ /* POWER 64-bit */ \ 400c16b537SWarner Losh || (defined __sparc && (defined __sparcv9 || defined __sparc_v9__ || defined __arch64__)) || defined __sparc64__ /* SPARC 64-bit */ \ 410c16b537SWarner Losh || defined __x86_64__s || defined _M_X64 /* x86 64-bit */ \ 420c16b537SWarner Losh || defined __arm64__ || defined __aarch64__ || defined __ARM64_ARCH_8__ /* ARM 64-bit */ \ 430c16b537SWarner Losh || (defined __mips && (__mips == 64 || __mips == 4 || __mips == 3)) /* MIPS 64-bit */ \ 440c16b537SWarner Losh || defined _LP64 || defined __LP64__ /* NetBSD, OpenBSD */ || defined __64BIT__ /* AIX */ || defined _ADDR64 /* Cray */ \ 450c16b537SWarner Losh || (defined __SIZEOF_POINTER__ && __SIZEOF_POINTER__ == 8) /* gcc */ 460c16b537SWarner Losh # if !defined(__64BIT__) 470c16b537SWarner Losh # define __64BIT__ 1 480c16b537SWarner Losh # endif 490c16b537SWarner Losh #endif 500c16b537SWarner Losh 510c16b537SWarner Losh 520c16b537SWarner Losh /* ********************************************************* 530c16b537SWarner Losh * Turn on Large Files support (>4GB) for 32-bit Linux/Unix 540c16b537SWarner Losh ***********************************************************/ 550c16b537SWarner Losh #if !defined(__64BIT__) || defined(__MINGW32__) /* No point defining Large file for 64 bit but MinGW-w64 requires it */ 560c16b537SWarner Losh # if !defined(_FILE_OFFSET_BITS) 570c16b537SWarner Losh # define _FILE_OFFSET_BITS 64 /* turn off_t into a 64-bit type for ftello, fseeko */ 580c16b537SWarner Losh # endif 590c16b537SWarner Losh # if !defined(_LARGEFILE_SOURCE) /* obsolete macro, replaced with _FILE_OFFSET_BITS */ 600c16b537SWarner Losh # define _LARGEFILE_SOURCE 1 /* Large File Support extension (LFS) - fseeko, ftello */ 610c16b537SWarner Losh # endif 620c16b537SWarner Losh # if defined(_AIX) || defined(__hpux) 630c16b537SWarner Losh # define _LARGE_FILES /* Large file support on 32-bits AIX and HP-UX */ 640c16b537SWarner Losh # endif 650c16b537SWarner Losh #endif 660c16b537SWarner Losh 670c16b537SWarner Losh 680c16b537SWarner Losh /* ************************************************************ 690c16b537SWarner Losh * Detect POSIX version 700f743729SConrad Meyer * PLATFORM_POSIX_VERSION = 0 for non-Unix e.g. Windows 710f743729SConrad Meyer * PLATFORM_POSIX_VERSION = 1 for Unix-like but non-POSIX 720f743729SConrad Meyer * PLATFORM_POSIX_VERSION > 1 is equal to found _POSIX_VERSION 730f743729SConrad Meyer * Value of PLATFORM_POSIX_VERSION can be forced on command line 740c16b537SWarner Losh ***************************************************************/ 750f743729SConrad Meyer #ifndef PLATFORM_POSIX_VERSION 760f743729SConrad Meyer 7719fcbaf1SConrad Meyer # if (defined(__APPLE__) && defined(__MACH__)) || defined(__SVR4) || defined(_AIX) || defined(__hpux) /* POSIX.1-2001 (SUSv3) conformant */ \ 780c16b537SWarner Losh || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) /* BSD distros */ 790f743729SConrad Meyer /* exception rule : force posix version to 200112L, 800f743729SConrad Meyer * note: it's better to use unistd.h's _POSIX_VERSION whenever possible */ 810c16b537SWarner Losh # define PLATFORM_POSIX_VERSION 200112L 820f743729SConrad Meyer 830f743729SConrad Meyer /* try to determine posix version through official unistd.h's _POSIX_VERSION (http://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html). 840f743729SConrad Meyer * note : there is no simple way to know in advance if <unistd.h> is present or not on target system, 850f743729SConrad Meyer * Posix specification mandates its presence and its content, but target system must respect this spec. 860f743729SConrad Meyer * It's necessary to _not_ #include <unistd.h> whenever target OS is not unix-like 870f743729SConrad Meyer * otherwise it will block preprocessing stage. 880f743729SConrad Meyer * The following list of build macros tries to "guess" if target OS is likely unix-like, and therefore can #include <unistd.h> 890f743729SConrad Meyer */ 900f743729SConrad Meyer # elif !defined(_WIN32) \ 910f743729SConrad Meyer && ( defined(__unix__) || defined(__unix) \ 920f743729SConrad Meyer || defined(__midipix__) || defined(__VMS) || defined(__HAIKU__) ) 930f743729SConrad Meyer 9437f1f268SConrad Meyer # if defined(__linux__) || defined(__linux) || defined(__CYGWIN__) 950c16b537SWarner Losh # ifndef _POSIX_C_SOURCE 969cbefe25SConrad Meyer # define _POSIX_C_SOURCE 200809L /* feature test macro : https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html */ 970c16b537SWarner Losh # endif 980c16b537SWarner Losh # endif 990c16b537SWarner Losh # include <unistd.h> /* declares _POSIX_VERSION */ 1000c16b537SWarner Losh # if defined(_POSIX_VERSION) /* POSIX compliant */ 1010c16b537SWarner Losh # define PLATFORM_POSIX_VERSION _POSIX_VERSION 1020c16b537SWarner Losh # else 1030f743729SConrad Meyer # define PLATFORM_POSIX_VERSION 1 1040c16b537SWarner Losh # endif 1050c16b537SWarner Losh 106f7cd7fe5SConrad Meyer # ifdef __UCLIBC__ 107f7cd7fe5SConrad Meyer # ifndef __USE_MISC 108f7cd7fe5SConrad Meyer # define __USE_MISC /* enable st_mtim on uclibc */ 109f7cd7fe5SConrad Meyer # endif 110f7cd7fe5SConrad Meyer # endif 111f7cd7fe5SConrad Meyer 1120f743729SConrad Meyer # else /* non-unix target platform (like Windows) */ 1130f743729SConrad Meyer # define PLATFORM_POSIX_VERSION 0 1140f743729SConrad Meyer # endif 1150f743729SConrad Meyer 1160f743729SConrad Meyer #endif /* PLATFORM_POSIX_VERSION */ 1172b9c00cbSConrad Meyer 1180c16b537SWarner Losh 11937f1f268SConrad Meyer #if PLATFORM_POSIX_VERSION > 1 12037f1f268SConrad Meyer /* glibc < 2.26 may not expose struct timespec def without this. 12137f1f268SConrad Meyer * See issue #1920. */ 12237f1f268SConrad Meyer # ifndef _ATFILE_SOURCE 12337f1f268SConrad Meyer # define _ATFILE_SOURCE 12437f1f268SConrad Meyer # endif 12537f1f268SConrad Meyer #endif 12637f1f268SConrad Meyer 12737f1f268SConrad Meyer 1280c16b537SWarner Losh /*-********************************************* 1290c16b537SWarner Losh * Detect if isatty() and fileno() are available 1300c16b537SWarner Losh ************************************************/ 1310f743729SConrad Meyer #if (defined(__linux__) && (PLATFORM_POSIX_VERSION > 1)) \ 1320f743729SConrad Meyer || (PLATFORM_POSIX_VERSION >= 200112L) \ 13337f1f268SConrad Meyer || defined(__DJGPP__) 1340c16b537SWarner Losh # include <unistd.h> /* isatty */ 13537f1f268SConrad Meyer # include <stdio.h> /* fileno */ 1360c16b537SWarner Losh # define IS_CONSOLE(stdStream) isatty(fileno(stdStream)) 13737f1f268SConrad Meyer #elif defined(MSDOS) || defined(OS2) 1380c16b537SWarner Losh # include <io.h> /* _isatty */ 1390c16b537SWarner Losh # define IS_CONSOLE(stdStream) _isatty(_fileno(stdStream)) 1400c16b537SWarner Losh #elif defined(WIN32) || defined(_WIN32) 1410c16b537SWarner Losh # include <io.h> /* _isatty */ 1420c16b537SWarner Losh # include <windows.h> /* DeviceIoControl, HANDLE, FSCTL_SET_SPARSE */ 1430c16b537SWarner Losh # include <stdio.h> /* FILE */ 14419fcbaf1SConrad Meyer static __inline int IS_CONSOLE(FILE* stdStream) { 1450c16b537SWarner Losh DWORD dummy; 1460c16b537SWarner Losh return _isatty(_fileno(stdStream)) && GetConsoleMode((HANDLE)_get_osfhandle(_fileno(stdStream)), &dummy); 1470c16b537SWarner Losh } 1480c16b537SWarner Losh #else 1490c16b537SWarner Losh # define IS_CONSOLE(stdStream) 0 1500c16b537SWarner Losh #endif 1510c16b537SWarner Losh 1520c16b537SWarner Losh 1530c16b537SWarner Losh /****************************** 154052d3c12SConrad Meyer * OS-specific IO behaviors 1550c16b537SWarner Losh ******************************/ 1560c16b537SWarner Losh #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(_WIN32) 1570c16b537SWarner Losh # include <fcntl.h> /* _O_BINARY */ 1580c16b537SWarner Losh # include <io.h> /* _setmode, _fileno, _get_osfhandle */ 1590c16b537SWarner Losh # if !defined(__DJGPP__) 1600c16b537SWarner Losh # include <windows.h> /* DeviceIoControl, HANDLE, FSCTL_SET_SPARSE */ 1610c16b537SWarner Losh # include <winioctl.h> /* FSCTL_SET_SPARSE */ 162052d3c12SConrad Meyer # define SET_BINARY_MODE(file) { int const unused=_setmode(_fileno(file), _O_BINARY); (void)unused; } 1630c16b537SWarner Losh # define SET_SPARSE_FILE_MODE(file) { DWORD dw; DeviceIoControl((HANDLE) _get_osfhandle(_fileno(file)), FSCTL_SET_SPARSE, 0, 0, 0, 0, &dw, 0); } 1640c16b537SWarner Losh # else 1650c16b537SWarner Losh # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) 1660c16b537SWarner Losh # define SET_SPARSE_FILE_MODE(file) 1670c16b537SWarner Losh # endif 1680c16b537SWarner Losh #else 1690c16b537SWarner Losh # define SET_BINARY_MODE(file) 1700c16b537SWarner Losh # define SET_SPARSE_FILE_MODE(file) 1710c16b537SWarner Losh #endif 1720c16b537SWarner Losh 1730c16b537SWarner Losh 1740c16b537SWarner Losh #ifndef ZSTD_SPARSE_DEFAULT 1750c16b537SWarner Losh # if (defined(__APPLE__) && defined(__MACH__)) 1760c16b537SWarner Losh # define ZSTD_SPARSE_DEFAULT 0 1770c16b537SWarner Losh # else 1780c16b537SWarner Losh # define ZSTD_SPARSE_DEFAULT 1 1790c16b537SWarner Losh # endif 1800c16b537SWarner Losh #endif 1810c16b537SWarner Losh 1820c16b537SWarner Losh 1830f743729SConrad Meyer #ifndef ZSTD_START_SYMBOLLIST_FRAME 1840f743729SConrad Meyer # ifdef __linux__ 1850f743729SConrad Meyer # define ZSTD_START_SYMBOLLIST_FRAME 2 1860f743729SConrad Meyer # elif defined __APPLE__ 1870f743729SConrad Meyer # define ZSTD_START_SYMBOLLIST_FRAME 4 1880f743729SConrad Meyer # else 1890f743729SConrad Meyer # define ZSTD_START_SYMBOLLIST_FRAME 0 1900f743729SConrad Meyer # endif 1910f743729SConrad Meyer #endif 1920f743729SConrad Meyer 1930f743729SConrad Meyer 1940f743729SConrad Meyer #ifndef ZSTD_SETPRIORITY_SUPPORT 1950f743729SConrad Meyer /* mandates presence of <sys/resource.h> and support for setpriority() : http://man7.org/linux/man-pages/man2/setpriority.2.html */ 1960f743729SConrad Meyer # define ZSTD_SETPRIORITY_SUPPORT (PLATFORM_POSIX_VERSION >= 200112L) 1970f743729SConrad Meyer #endif 1980f743729SConrad Meyer 1990f743729SConrad Meyer 2000f743729SConrad Meyer #ifndef ZSTD_NANOSLEEP_SUPPORT 2010f743729SConrad Meyer /* mandates support of nanosleep() within <time.h> : http://man7.org/linux/man-pages/man2/nanosleep.2.html */ 2020f743729SConrad Meyer # if (defined(__linux__) && (PLATFORM_POSIX_VERSION >= 199309L)) \ 2030f743729SConrad Meyer || (PLATFORM_POSIX_VERSION >= 200112L) 2040f743729SConrad Meyer # define ZSTD_NANOSLEEP_SUPPORT 1 2050f743729SConrad Meyer # else 2060f743729SConrad Meyer # define ZSTD_NANOSLEEP_SUPPORT 0 2070f743729SConrad Meyer # endif 2080f743729SConrad Meyer #endif 2090f743729SConrad Meyer 2100f743729SConrad Meyer 2110c16b537SWarner Losh #if defined (__cplusplus) 2120c16b537SWarner Losh } 2130c16b537SWarner Losh #endif 2140c16b537SWarner Losh 2150c16b537SWarner Losh #endif /* PLATFORM_H_MODULE */ 216