#ifndef __TIDY_PLATFORM_H__ #define __TIDY_PLATFORM_H__ /**************************************************************************//** * @file * Platform specific definitions, specifics, and headers. This file is * included by `tidy.h` already, and need not be included separately. Among * other things, the PLATFORM_NAME is defined and the most common systems * headers are included. * * @note It should be largely unnecessary to modify this file unless adding * support for a completely new architecture. Most options defined in this * file specify defaults that can be overridden by the build system; for * example, passing -D flags to CMake. * * @author Charles Reitzel [creitzel@rcn.com] * @author HTACG, et al (consult git log) * * @copyright * Copyright (c) 1998-2017 World Wide Web Consortium (Massachusetts * Institute of Technology, European Research Consortium for Informatics * and Mathematics, Keio University). * @copyright * See tidy.h for license. * * @date Created 2001-05-20 by Charles Reitzel * @date Updated 2002-07-01 by Charles Reitzel * @date Further modifications: consult git log. ******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /*============================================================================= * Unix console application features * By default on Unix-like systems when building for the console program, * support runtime configuration files in /etc/ and in ~/. To prevent this, * set ENABLE_CONFIG_FILES to NO. Specify -DTIDY_CONFIG_FILE and/or * -DTIDY_USER_CONFIG_FILE to override the default paths in tidyplatform.h. * @note: this section refactored to support #584. *===========================================================================*/ /* #define ENABLE_CONFIG_FILES */ #if defined(TIDY_ENABLE_CONFIG_FILES) # if !defined(TIDY_CONFIG_FILE) # define TIDY_CONFIG_FILE "/etc/tidy.conf" # endif # if !defined(TIDY_USER_CONFIG_FILE) # define TIDY_USER_CONFIG_FILE "~/.tidyrc" # endif #else # if defined(TIDY_CONFIG_FILE) # undef TIDY_CONFIG_FILE # endif # if defined(TIDY_USER_CONFIG_FILE) # undef TIDY_USER_CONFIG_FILE # endif #endif /*============================================================================= * Unix tilde expansion support * By default on Unix-like systems when building for the console program, * this flag is set so that Tidy knows getpwname() is available. It allows * tidy to find files named ~your/foo for use in the HTML_TIDY environment * variable or TIDY_CONFIG_FILE or TIDY_USER_CONFIG_FILE or on the command * command line: -config ~joebob/tidy.cfg * Contributed by Todd Lewis. *===========================================================================*/ /* #define SUPPORT_GETPWNAM */ /*============================================================================= * Optional Tidy features support *===========================================================================*/ /* Enable/disable support for additional languages */ #ifndef SUPPORT_LOCALIZATIONS # define SUPPORT_LOCALIZATIONS 1 #endif /* Enable/disable support for console */ #ifndef SUPPORT_CONSOLE_APP # define SUPPORT_CONSOLE_APP 1 #endif /*============================================================================= * Platform specific convenience definitions *===========================================================================*/ /* === Convenience defines for Mac platforms === */ #if defined(macintosh) /* Mac OS 6.x/7.x/8.x/9.x, with or without CarbonLib - MPW or Metrowerks 68K/PPC compilers */ # define MAC_OS_CLASSIC # ifndef PLATFORM_NAME # define PLATFORM_NAME "Mac OS" # endif /* needed for access() */ # if !defined(_POSIX) && !defined(NO_ACCESS_SUPPORT) # define NO_ACCESS_SUPPORT # endif # ifdef SUPPORT_GETPWNAM # undef SUPPORT_GETPWNAM # endif #elif defined(__APPLE__) && defined(__MACH__) /* Mac OS X (client) 10.x (or server 1.x/10.x) - gcc or Metrowerks MachO compilers */ # define MAC_OS_X # ifndef PLATFORM_NAME # include "TargetConditionals.h" # if TARGET_OS_IOS # define PLATFORM_NAME "Apple iOS" # elif TARGET_OS_MAC # define PLATFORM_NAME "Apple macOS" # elif TARGET_OS_TV # define PLATFORM_NAME "Apple tvOS" # elif TARGET_OS_WATCH # define PLATFORM_NAME "Apple watchOS" # else # define PLATFORM_NAME "Apple Unknown OS" # endif # endif #endif #if defined(MAC_OS_CLASSIC) || defined(MAC_OS_X) /* Any OS on Mac platform */ # define MAC_OS # define FILENAMES_CASE_SENSITIVE 0 # define strcasecmp strcmp #endif /* === Convenience defines for BSD-like platforms === */ #if defined(__FreeBSD__) # define BSD_BASED_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "FreeBSD" # endif #elif defined(__NetBSD__) # define BSD_BASED_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "NetBSD" # endif #elif defined(__OpenBSD__) # define BSD_BASED_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "OpenBSD" # endif #elif defined(__DragonFly__) # define BSD_BASED_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "DragonFly" # endif #elif defined(__MINT__) # define BSD_BASED_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "FreeMiNT" # endif #elif defined(__bsdi__) # define BSD_BASED_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "BSD/OS" # endif #endif /* === Convenience defines for Windows platforms === */ #if defined(WINDOWS) || defined(_WIN32) # define WINDOWS_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Windows" # endif # if defined(__MWERKS__) || defined(__MSL__) /* not available with Metrowerks Standard Library */ # ifdef SUPPORT_GETPWNAM # undef SUPPORT_GETPWNAM # endif /* needed for setmode() */ # if !defined(NO_SETMODE_SUPPORT) # define NO_SETMODE_SUPPORT # endif # define strcasecmp _stricmp # endif # if defined(__BORLANDC__) # define strcasecmp stricmp # endif # define FILENAMES_CASE_SENSITIVE 0 # define SUPPORT_POSIX_MAPPED_FILES 0 #endif /* WINDOWS */ /* === Convenience defines for Linux platforms === */ #if defined(linux) && defined(__alpha__) /* Linux on Alpha - gcc compiler */ # define LINUX_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Linux/Alpha" # endif #elif defined(linux) && defined(__sparc__) /* Linux on Sparc - gcc compiler */ # define LINUX_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Linux/Sparc" # endif #elif defined(linux) && (defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__)) /* Linux on x86 - gcc compiler */ # define LINUX_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Linux/x86" # endif #elif defined(linux) && defined(__powerpc__) /* Linux on PPC - gcc compiler */ # define LINUX_OS # if defined(__linux__) && defined(__powerpc__) # ifndef PLATFORM_NAME /* MkLinux on PPC - gcc (egcs) compiler */ # define PLATFORM_NAME "MkLinux" # endif # else # ifndef PLATFORM_NAME # define PLATFORM_NAME "Linux/PPC" # endif # endif #elif defined(linux) || defined(__linux__) /* generic Linux */ # define LINUX_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Linux" # endif #endif /* === Convenience defines for Solaris platforms === */ #if defined(sun) # define SOLARIS_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Solaris" # endif #endif /* === Convenience defines for HPUX + gcc platforms === */ #if defined(__hpux) # define HPUX_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "HPUX" # endif #endif /* === Convenience defines for RISCOS + gcc platforms === */ #if defined(__riscos__) # define RISC_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "RISC OS" # endif #endif /* === Convenience defines for OS/2 + icc/gcc platforms === */ #if defined(__OS2__) || defined(__EMX__) # define OS2_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "OS/2" # endif # define FILENAMES_CASE_SENSITIVE 0 # define strcasecmp stricmp #endif /* === Convenience defines for IRIX === */ #if defined(__sgi) # define IRIX_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "SGI IRIX" # endif #endif /* === Convenience defines for AIX === */ #if defined(_AIX) # define AIX_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "IBM AIX" # endif #endif /* === Convenience defines for BeOS platforms === */ #if defined(__BEOS__) # define BE_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "BeOS" # endif #endif /* === Convenience defines for Haiku platforms === */ #if defined(__HAIKU__) # define HAIKU # ifndef PLATFORM_NAME # define PLATFORM_NAME "Haiku" # endif #endif /* === Convenience defines for Cygwin platforms === */ #if defined(__CYGWIN__) # define CYGWIN_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Cygwin" # endif # define FILENAMES_CASE_SENSITIVE 0 #endif /* === Convenience defines for OpenVMS === */ #if defined(__VMS) # define OPENVMS_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "OpenVMS" # endif # define FILENAMES_CASE_SENSITIVE 0 #endif /* === Convenience defines for DEC Alpha OSF + gcc platforms === */ #if defined(__osf__) # define OSF_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "DEC Alpha OSF" # endif #endif /* === Convenience defines for ARM platforms === */ #if defined(__arm) # define ARM_OS # if defined(forARM) && defined(__NEWTON_H) /* Using Newton C++ Tools ARMCpp compiler */ # define NEWTON_OS # ifndef PLATFORM_NAME # define PLATFORM_NAME "Newton" # endif # else # ifndef PLATFORM_NAME # define PLATFORM_NAME "ARM" # endif # endif #endif /*============================================================================= * Standard Library Includes *===========================================================================*/ #include #include #include /* for longjmp on error exit */ #include #include /* may need for Unix V */ #include #include #ifdef NEEDS_MALLOC_H # include #endif #ifdef SUPPORT_GETPWNAM # include #endif #ifdef NEEDS_UNISTD_H # include /* needed for unlink on some Unix systems */ #endif /*============================================================================= * Case sensitive file systems *===========================================================================*/ /* By default, use case-sensitive filename comparison. */ #ifndef FILENAMES_CASE_SENSITIVE # define FILENAMES_CASE_SENSITIVE 1 #endif /*============================================================================= * Last modified time preservation * Tidy preserves the last modified time for the files it cleans up. * * If your platform doesn't support and the utime() function, or * and the futime() function then set PRESERVE_FILE_TIMES to 0. * * If your platform doesn't support and the futime() function, * then set HAS_FUTIME to 0. * * If your platform supports and the utime() function requires the * file to be closed first, then set UTIME_NEEDS_CLOSED_FILE to 1. *===========================================================================*/ /* Keep old PRESERVEFILETIMES define for compatibility */ #ifdef PRESERVEFILETIMES # undef PRESERVE_FILE_TIMES # define PRESERVE_FILE_TIMES PRESERVEFILETIMES #endif #ifndef PRESERVE_FILE_TIMES # if defined(RISC_OS) || defined(OPENVMS_OS) || defined(OSF_OS) # define PRESERVE_FILE_TIMES 0 # else # define PRESERVE_FILE_TIMES 1 # endif #endif #if PRESERVE_FILE_TIMES # ifndef HAS_FUTIME # if defined(CYGWIN_OS) || defined(BE_OS) || defined(OS2_OS) || defined(HPUX_OS) || defined(SOLARIS_OS) || defined(LINUX_OS) || defined(BSD_BASED_OS) || defined(MAC_OS) || defined(__MSL__) || defined(IRIX_OS) || defined(AIX_OS) || defined(__BORLANDC__) || defined(__GLIBC__) || defined(__HAIKU__) # define HAS_FUTIME 0 # else # define HAS_FUTIME 1 # endif # endif # ifndef UTIME_NEEDS_CLOSED_FILE # if defined(SOLARIS_OS) || defined(BSD_BASED_OS) || defined(MAC_OS) || defined(__MSL__) || defined(LINUX_OS) # define UTIME_NEEDS_CLOSED_FILE 1 # else # define UTIME_NEEDS_CLOSED_FILE 0 # endif # endif # if defined(MAC_OS_X) || (!defined(MAC_OS_CLASSIC) && !defined(__MSL__)) # include # include # else # include # endif # if HAS_FUTIME # include # else # include # endif #if defined(__HAIKU__) #ifndef va_copy #define va_copy(dest, src) (dest = src) #endif #endif /* MS Windows needs _ prefix for Unix file functions. Not required by Metrowerks Standard Library (MSL). Tidy uses following for preserving the last modified time. WINDOWS automatically set by Win16 compilers. _WIN32 automatically set by Win32 compilers. */ # if defined(_WIN32) && !defined(__MSL__) && !defined(__BORLANDC__) # define futime _futime # define fstat _fstat # define utimbuf _utimbuf /* Windows seems to want utimbuf */ # define stat _stat # define utime _utime # define vsnprintf _vsnprintf # endif #endif /*============================================================================= * Windows file functions * Windows needs _ prefix for Unix file functions. * Not required by Metrowerks Standard Library (MSL). * * WINDOWS automatically set by Win16 compilers. * _WIN32 automatically set by Win32 compilers. *===========================================================================*/ #if defined(_WIN32) && !defined(__MSL__) && !defined(__BORLANDC__) # if !(defined(__WATCOMC__) || defined(__MINGW32__)) # define fileno _fileno # define setmode _setmode # endif # if defined(_MSC_VER) # define fileno _fileno # if !defined(NDEBUG) && !defined(ENABLE_DEBUG_LOG) && !defined(DISABLE_DEBUG_LOG) # define ENABLE_DEBUG_LOG # endif # endif # define access _access # define strcasecmp _stricmp # ifndef va_copy # define va_copy(dest, src) (dest = src) # endif # if _MSC_VER > 1000 # pragma warning( disable : 4189 ) /* local variable is initialized but not referenced */ # pragma warning( disable : 4100 ) /* unreferenced formal parameter */ # pragma warning( disable : 4706 ) /* assignment within conditional expression */ # endif # if _MSC_VER > 1300 # pragma warning( disable : 4996 ) /* disable depreciation warning */ # endif #endif /* _WIN32 */ #if defined(_WIN32) # if (defined(_USRDLL) || defined(_WINDLL) || defined(BUILD_SHARED_LIB)) && !defined(TIDY_EXPORT) && !defined(TIDY_STATIC) # ifdef BUILDING_SHARED_LIB # define TIDY_EXPORT __declspec( dllexport ) # else # define TIDY_EXPORT __declspec( dllimport ) # endif # else # define TIDY_EXPORT extern # endif # ifndef TIDY_CALL # ifdef _WIN64 # define TIDY_CALL __fastcall # else # define TIDY_CALL __stdcall # endif # endif # ifndef TIDY_THREAD_LOCAL # ifdef _MSC_VER # define TIDY_THREAD_LOCAL __declspec( thread ) # endif # endif #endif /* _WIN32 */ /*============================================================================= * Hack for gnu sys/types.h file which defines uint and ulong *===========================================================================*/ #if defined(BE_OS) || defined(SOLARIS_OS) || defined(BSD_BASED_OS) || defined(OSF_OS) || defined(IRIX_OS) || defined(AIX_OS) # include #endif #if !defined(HPUX_OS) && !defined(CYGWIN_OS) && !defined(MAC_OS_X) && !defined(BE_OS) && !defined(SOLARIS_OS) && !defined(BSD_BASED_OS) && !defined(OSF_OS) && !defined(IRIX_OS) && !defined(AIX_OS) && !defined(LINUX_OS) && !defined(__HAIKU__) # undef uint typedef unsigned int uint; #endif #if defined(HPUX_OS) || defined(CYGWIN_OS) || defined(MAC_OS) || defined(BSD_BASED_OS) || defined(_WIN32) || defined(__ANDROID__) # undef ulong typedef unsigned long ulong; #endif /*============================================================================= * Visibility support * With GCC 4, __attribute__ ((visibility("default"))) can be used * along compiling with tidylib with "-fvisibility=hidden". See * https://gcc.gnu.org/wiki/Visibility and build/gmake/Makefile. *===========================================================================*/ /* #if defined(__GNUC__) && __GNUC__ >= 4 # define TIDY_EXPORT __attribute__ ((visibility("default"))) #endif */ /*============================================================================= * Other definitions *===========================================================================*/ #ifndef TIDY_EXPORT /* Define it away for most builds */ # define TIDY_EXPORT #endif #ifndef TIDY_STRUCT # define TIDY_STRUCT #endif #ifndef TIDY_THREAD_LOCAL # define TIDY_THREAD_LOCAL __thread #endif #ifndef TIDY_INDENTATION_LIMIT # define TIDY_INDENTATION_LIMIT 50 #endif typedef unsigned char byte; typedef uint tchar; /* single, full character */ typedef char tmbchar; /* single, possibly partial character */ #ifndef TMBSTR_DEFINED typedef tmbchar* tmbstr; /* pointer to buffer of possibly partial chars */ typedef const tmbchar* ctmbstr; /* Ditto, but const */ # define NULLSTR (tmbstr)"" # define TMBSTR_DEFINED #endif #ifndef TIDY_CALL # define TIDY_CALL #endif #if defined(__GNUC__) || defined(__INTEL_COMPILER) # define ARG_UNUSED(x) x __attribute__((unused)) # define FUNC_UNUSED __attribute__((unused)) #else # define ARG_UNUSED(x) x # define FUNC_UNUSED #endif /* HAS_VSNPRINTF triggers the use of "vsnprintf", which is safe related to buffer overflow. Therefore, we make it the default unless HAS_VSNPRINTF has been defined. */ #ifndef HAS_VSNPRINTF # define HAS_VSNPRINTF 1 #endif #ifndef SUPPORT_POSIX_MAPPED_FILES # define SUPPORT_POSIX_MAPPED_FILES 1 #endif /* `bool` is a reserved word in some but not all C++ compilers depending on age. age. Work around is to avoid bool by introducing a new enum called `Bool`. */ /* We could use the C99 definition where supported typedef _Bool Bool; #define no (_Bool)0 #define yes (_Bool)1 */ typedef enum { no, yes } Bool; /* for NULL pointers #define null ((const void*)0) extern void* null; */ #if defined(DMALLOC) # include "dmalloc.h" #endif /* Opaque data structure. * Cast to implementation type struct within lib. * This will reduce inter-dependencies/conflicts w/ application code. */ #if 1 #define opaque_type( typenam )\ struct _##typenam { int _opaque; };\ typedef struct _##typenam const * typenam #else #define opaque_type(typenam) typedef const void* typenam #endif /* Opaque data structure used to pass back ** and forth to keep current position in a ** list or other collection. */ opaque_type( TidyIterator ); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __TIDY_PLATFORM_H__ */ /* * local variables: * mode: c * indent-tabs-mode: nil * c-basic-offset: 4 * eval: (c-set-offset 'substatement-open 0) * end: */