1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* Copyright (C) 1997-2013, International Business Machines 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* FILE NAME : putil.c (previously putil.cpp and ptypes.cpp) 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/14/97 aliu Creation. 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/24/97 aliu Added getDefaultDataDirectory() and 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* getDefaultLocaleID(). 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/28/97 aliu Rewritten to assume Unix and apply general methods 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* for assumed case. Non-UNIX platforms must be 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* special-cased. Rewrote numeric methods dealing 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* with NaN and Infinity to be platform independent 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* over all IEEE 754 platforms. 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 05/13/97 aliu Restored sign of timezone 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* (semantics are hours West of GMT) 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 06/16/98 erm Added IEEE_754 stuff, cleaned up isInfinite, isNan, 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* nextDouble.. 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 07/22/98 stephen Added remainder, max, min, trunc 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 08/13/98 stephen Added isNegativeInfinity, isPositiveInfinity 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 08/24/98 stephen Added longBitsFromDouble 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 09/08/98 stephen Minor changes for Mac Port 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 03/02/99 stephen Removed openFile(). Added AS400 support. 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Fixed EBCDIC tables 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/15/99 stephen Converted to C. 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 06/28/99 stephen Removed mutex locking in u_isBigEndian(). 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 08/04/99 jeffrey R. Added OS/2 changes 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11/15/99 helena Integrated S/390 IEEE support. 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/26/01 Barry N. OS/400 support for uprv_getDefaultLocaleID 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 08/15/01 Steven H. OS/400 support for uprv_getDefaultCodepage 3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* 01/03/08 Steven L. Fake Time Support 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 40103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Defines _XOPEN_SOURCE for access to POSIX functions. 41103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Must be before any other #includes. 42103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "uposixdefs.h" 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* include ICU headers */ 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h" 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h" 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h" 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h" 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "locmap.h" 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucln_cmn.h" 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Include standard headers. */ 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <math.h> 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <locale.h> 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <float.h> 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 64103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifndef U_COMMON_IMPLEMENTATION 65103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#error U_COMMON_IMPLEMENTATION not set - must be set for all ICU source files in common/ - see http://userguide.icu-project.org/howtouseicu 66103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 67103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 68103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* include system headers */ 70103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 71103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 72103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * TODO: U_PLATFORM_USES_ONLY_WIN32_API includes MinGW. 73103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Should Cygwin be included as well (U_PLATFORM_HAS_WIN32_API) 74103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * to use native APIs as much as possible? 75103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define WIN32_LEAN_AND_MEAN 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define VC_EXTRALEAN 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOUSER 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOSERVICE 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOIME 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define NOMCX 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <windows.h> 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include "wintz.h" 84103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <float.h> 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <qusec.h> /* error code structure */ 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <qusrjobi.h> 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <qliept.h> /* EPT_CALL macro - this include must be after all other "QSYSINCs" */ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <mih/testptr.h> /* For uprv_maximumPtr */ 90103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CLASSIC_MACOS 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <Files.h> 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <IntlResources.h> 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <Script.h> 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <Folders.h> 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <MacTypes.h> 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# include <TextUtils.h> 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define ICU_NO_USER_DATA_OVERRIDE 1 98103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS390 99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# include "unicode/ucnv.h" /* Needed for UCNV_SWAP_LFNL_OPTION_STRING */ 1008393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#elif U_PLATFORM_IS_DARWIN_BASED || U_PLATFORM_IS_LINUX_BASED || U_PLATFORM == U_PF_BSD || U_PLATFORM == U_PF_SOLARIS 101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# include <limits.h> 102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# include <unistd.h> 1038393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius# if U_PLATFORM == U_PF_SOLARIS 1048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius# ifndef _XPG4_2 1058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius# define _XPG4_2 1068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius# endif 1078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius# endif 108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_QNX 109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# include <sys/neutrino.h> 11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 112103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if (U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) 113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* tzset isn't defined in strict ANSI on Cygwin and MinGW. */ 114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#undef __STRICT_ANSI__ 115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Cygwin with GCC requires inclusion of time.h after the above disabling strict asci mode statement. 119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */ 120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <time.h> 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 122103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_PLATFORM_USES_ONLY_WIN32_API 12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <sys/time.h> 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Only include langinfo.h if we have a way to get the codeset. If we later 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * depend on more feature, we can test on U_HAVE_NL_LANGINFO. 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_NL_LANGINFO_CODESET 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <langinfo.h> 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Simple things (presence of functions, etc) should just go in configure.in and be added to 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * icucfg.h via autoheader. 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 140103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_IMPLEMENTS_POSIX 141103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# if U_PLATFORM == U_PF_OS400 142103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_DLFCN_H 0 143103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_DLOPEN 0 144103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# else 145103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# ifndef HAVE_DLFCN_H 146103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_DLFCN_H 1 147103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# endif 148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# ifndef HAVE_DLOPEN 149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_DLOPEN 1 150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# endif 151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# endif 152103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# ifndef HAVE_GETTIMEOFDAY 153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_GETTIMEOFDAY 1 154103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# endif 155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_DLFCN_H 0 157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_DLOPEN 0 158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# define HAVE_GETTIMEOFDAY 0 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Define the extension for data files, again... */ 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define DATA_TYPE "dat" 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Leave this copyright notice here! */ 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char copyright[] = U_COPYRIGHT_STRING; 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* floating point implementations ------------------------------------------- */ 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* We return QNAN rather than SNAN*/ 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define SIGN 0x80000000U 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Make it easy to define certain types of constants */ 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef union { 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int64_t i64; /* This must be defined first in order to allow the initialization to work. This is a C89 feature. */ 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double d64; 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} BitPatternConversion; 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const BitPatternConversion gNan = { (int64_t) INT64_C(0x7FF8000000000000) }; 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const BitPatternConversion gInf = { (int64_t) INT64_C(0x7FF0000000000000) }; 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*--------------------------------------------------------------------------- 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Platform utilities 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Our general strategy is to assume we're on a POSIX platform. Platforms which 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru are non-POSIX must declare themselves so. The default POSIX implementation 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru will sometimes work for non-POSIX platforms as well (e.g., the NaN-related 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru functions). 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ---------------------------------------------------------------------------*/ 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_CLASSIC_MACOS || U_PLATFORM == U_PF_OS400 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# undef U_POSIX_LOCALE 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define U_POSIX_LOCALE 1 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru WARNING! u_topNBytesOfDouble and u_bottomNBytesOfDouble 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru can't be properly optimized by the gcc compiler sometimes (i.e. gcc 3.2). 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !IEEE_754 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_topNBytesOfDouble(double* d, int n) 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_IS_BIG_ENDIAN 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (char*)d; 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (char*)(d + 1) - n; 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_bottomNBytesOfDouble(double* d, int n) 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_IS_BIG_ENDIAN 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (char*)(d + 1) - n; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (char*)d; 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 22027f654740f2a26ad62a5c155af9199af9e69b889claireho#endif /* !IEEE_754 */ 22127f654740f2a26ad62a5c155af9199af9e69b889claireho 22227f654740f2a26ad62a5c155af9199af9e69b889claireho#if IEEE_754 22327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic UBool 22427f654740f2a26ad62a5c155af9199af9e69b889clairehou_signBit(double d) { 22527f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t hiByte; 22627f654740f2a26ad62a5c155af9199af9e69b889claireho#if U_IS_BIG_ENDIAN 22727f654740f2a26ad62a5c155af9199af9e69b889claireho hiByte = *(uint8_t *)&d; 22827f654740f2a26ad62a5c155af9199af9e69b889claireho#else 22927f654740f2a26ad62a5c155af9199af9e69b889claireho hiByte = *(((uint8_t *)&d) + sizeof(double) - 1); 23027f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 23127f654740f2a26ad62a5c155af9199af9e69b889claireho return (hiByte & 0x80) != 0; 23227f654740f2a26ad62a5c155af9199af9e69b889claireho} 23327f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 23427f654740f2a26ad62a5c155af9199af9e69b889claireho 23527f654740f2a26ad62a5c155af9199af9e69b889claireho 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if defined (U_DEBUG_FAKETIME) 23885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Override the clock to test things without having to move the system clock. 23985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Assumes POSIX gettimeofday() will function 24085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 24185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUDate fakeClock_t0 = 0; /** Time to start the clock from **/ 24285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUDate fakeClock_dt = 0; /** Offset (fake time - real time) **/ 24385bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUBool fakeClock_set = FALSE; /** True if fake clock has spun up **/ 24454dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic UMutex fakeClockMutex = U_MUTEX_INTIALIZER; 24585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 24685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UDate getUTCtime_real() { 24785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho struct timeval posixTime; 24885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gettimeofday(&posixTime, NULL); 24985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return (UDate)(((int64_t)posixTime.tv_sec * U_MILLIS_PER_SECOND) + (posixTime.tv_usec/1000)); 25085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 25185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 25285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UDate getUTCtime_fake() { 25385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho umtx_lock(&fakeClockMutex); 25485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!fakeClock_set) { 25585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UDate real = getUTCtime_real(); 25685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *fake_start = getenv("U_FAKETIME_START"); 25727f654740f2a26ad62a5c155af9199af9e69b889claireho if((fake_start!=NULL) && (fake_start[0]!=0)) { 25885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sscanf(fake_start,"%lf",&fakeClock_t0); 25927f654740f2a26ad62a5c155af9199af9e69b889claireho fakeClock_dt = fakeClock_t0 - real; 26027f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"U_DEBUG_FAKETIME was set at compile time, so the ICU clock will start at a preset value\n" 26127f654740f2a26ad62a5c155af9199af9e69b889claireho "env variable U_FAKETIME_START=%.0f (%s) for an offset of %.0f ms from the current time %.0f\n", 26227f654740f2a26ad62a5c155af9199af9e69b889claireho fakeClock_t0, fake_start, fakeClock_dt, real); 26327f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 26427f654740f2a26ad62a5c155af9199af9e69b889claireho fakeClock_dt = 0; 26527f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"U_DEBUG_FAKETIME was set at compile time, but U_FAKETIME_START was not set.\n" 26627f654740f2a26ad62a5c155af9199af9e69b889claireho "Set U_FAKETIME_START to the number of milliseconds since 1/1/1970 to set the ICU clock.\n"); 26785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 26885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fakeClock_set = TRUE; 26985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 27085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho umtx_unlock(&fakeClockMutex); 27185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getUTCtime_real() + fakeClock_dt; 27385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 27485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 27585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 276103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef union { 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int64_t int64; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FILETIME fileTime; 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} FileTimeConversion; /* This is like a ULARGE_INTEGER */ 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Number of 100 nanoseconds from 1/1/1601 to 1/1/1970 */ 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define EPOCH_BIAS INT64_C(116444736000000000) 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define HECTONANOSECOND_PER_MILLISECOND 10000 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*--------------------------------------------------------------------------- 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Universal Implementations 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru These are designed to work on all platforms. Try these, and if they 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru don't work on your platform, then special case your platform with new 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru implementations. 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru---------------------------------------------------------------------------*/ 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UDate U_EXPORT2 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_getUTCtime() 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 29885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if defined(U_DEBUG_FAKETIME) 29985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return getUTCtime_fake(); /* Hook for overriding the clock */ 30027f654740f2a26ad62a5c155af9199af9e69b889claireho#else 30127f654740f2a26ad62a5c155af9199af9e69b889claireho return uprv_getRawUTCtime(); 30227f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 30327f654740f2a26ad62a5c155af9199af9e69b889claireho} 30427f654740f2a26ad62a5c155af9199af9e69b889claireho 30527f654740f2a26ad62a5c155af9199af9e69b889claireho/* Return UTC (GMT) time measured in milliseconds since 0:00 on 1/1/70.*/ 30627f654740f2a26ad62a5c155af9199af9e69b889clairehoU_CAPI UDate U_EXPORT2 30727f654740f2a26ad62a5c155af9199af9e69b889clairehouprv_getRawUTCtime() 30827f654740f2a26ad62a5c155af9199af9e69b889claireho{ 309103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CLASSIC_MACOS 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time_t t, t1, t2; 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct tm tmrec; 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset( &tmrec, 0, sizeof(tmrec) ); 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tmrec.tm_year = 70; 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tmrec.tm_mon = 0; 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tmrec.tm_mday = 1; 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t1 = mktime(&tmrec); /* seconds of 1/1/1970*/ 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time(&t); 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) ); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t2 = mktime(&tmrec); /* seconds of current GMT*/ 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UDate)(t2 - t1) * U_MILLIS_PER_SECOND; /* GMT (or UTC) in seconds since 1970*/ 323103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FileTimeConversion winTime; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru GetSystemTimeAsFileTime(&winTime.fileTime); 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UDate)((winTime.int64 - EPOCH_BIAS) / HECTONANOSECOND_PER_MILLISECOND); 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 330103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if HAVE_GETTIMEOFDAY 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct timeval posixTime; 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gettimeofday(&posixTime, NULL); 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UDate)(((int64_t)posixTime.tv_sec * U_MILLIS_PER_SECOND) + (posixTime.tv_usec/1000)); 33450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time_t epochtime; 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time(&epochtime); 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UDate)epochtime * U_MILLIS_PER_SECOND; 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*----------------------------------------------------------------------------- 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IEEE 754 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru These methods detect and return NaN and infinity values for doubles 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru conforming to IEEE 754. Platforms which support this standard include X86, 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Mac 680x0, Mac PowerPC, AIX RS/6000, and most others. 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru If this doesn't work on your platform, you have non-IEEE floating-point, and 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru will need to code your own versions. A naive implementation is to return 0.0 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for getNaN and getInfinity, and false for isNaN and isInfinite. 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ---------------------------------------------------------------------------*/ 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_isNaN(double number) 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if IEEE_754 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BitPatternConversion convertedNumber; 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru convertedNumber.d64 = number; 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Infinity is 0x7FF0000000000000U. Anything greater than that is a NaN */ 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)((convertedNumber.i64 & U_INT64_MAX) > gInf.i64); 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 362103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS390 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sizeof(uint32_t)); 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t lowBits = *(uint32_t*)u_bottomNBytesOfDouble(&number, 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sizeof(uint32_t)); 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((highBits & 0x7F080000L) == 0x7F080000L) && 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (lowBits == 0x00000000L); 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If your platform doesn't support IEEE 754 but *does* have an NaN value,*/ 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* you'll need to replace this default implementation with what's correct*/ 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* for your platform.*/ 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return number != number; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_isInfinite(double number) 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if IEEE_754 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BitPatternConversion convertedNumber; 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru convertedNumber.d64 = number; 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Infinity is exactly 0x7FF0000000000000U. */ 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)((convertedNumber.i64 & U_INT64_MAX) == gInf.i64); 387103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS390 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sizeof(uint32_t)); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t lowBits = *(uint32_t*)u_bottomNBytesOfDouble(&number, 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sizeof(uint32_t)); 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((highBits & ~SIGN) == 0x70FF0000L) && (lowBits == 0x00000000L); 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If your platform doesn't support IEEE 754 but *does* have an infinity*/ 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* value, you'll need to replace this default implementation with what's*/ 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* correct for your platform.*/ 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return number == (2.0 * number); 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_isPositiveInfinity(double number) 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 406103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if IEEE_754 || U_PLATFORM == U_PF_OS390 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)(number > 0 && uprv_isInfinite(number)); 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uprv_isInfinite(number); 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_isNegativeInfinity(double number) 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 416103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if IEEE_754 || U_PLATFORM == U_PF_OS390 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)(number < 0 && uprv_isInfinite(number)); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sizeof(uint32_t)); 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return((highBits & SIGN) && uprv_isInfinite(number)); 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_getNaN() 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 430103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if IEEE_754 || U_PLATFORM == U_PF_OS390 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gNan.d64; 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If your platform doesn't support IEEE 754 but *does* have an NaN value,*/ 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* you'll need to replace this default implementation with what's correct*/ 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* for your platform.*/ 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0.0; 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_getInfinity() 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 443103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if IEEE_754 || U_PLATFORM == U_PF_OS390 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gInf.d64; 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If your platform doesn't support IEEE 754 but *does* have an infinity*/ 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* value, you'll need to replace this default implementation with what's*/ 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* correct for your platform.*/ 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0.0; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_floor(double x) 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return floor(x); 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_ceil(double x) 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ceil(x); 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_round(double x) 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uprv_floor(x + 0.5); 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_fabs(double x) 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fabs(x); 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_modf(double x, double* y) 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return modf(x, y); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_fmod(double x, double y) 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fmod(x, y); 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_pow(double x, double y) 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* This is declared as "double pow(double x, double y)" */ 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pow(x, y); 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_pow10(int32_t x) 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pow(10.0, (double)x); 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_fmax(double x, double y) 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if IEEE_754 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* first handle NaN*/ 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uprv_isNaN(x) || uprv_isNaN(y)) 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uprv_getNaN(); 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check for -0 and 0*/ 51127f654740f2a26ad62a5c155af9199af9e69b889claireho if(x == 0.0 && y == 0.0 && u_signBit(x)) 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return y; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 51627f654740f2a26ad62a5c155af9199af9e69b889claireho /* this should work for all flt point w/o NaN and Inf special cases */ 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (x > y ? x : y); 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_fmin(double x, double y) 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if IEEE_754 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* first handle NaN*/ 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uprv_isNaN(x) || uprv_isNaN(y)) 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uprv_getNaN(); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check for -0 and 0*/ 52927f654740f2a26ad62a5c155af9199af9e69b889claireho if(x == 0.0 && y == 0.0 && u_signBit(y)) 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return y; 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this should work for all flt point w/o NaN and Inf special cases */ 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (x > y ? y : x); 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Truncates the given double. 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * trunc(3.3) = 3.0, trunc (-3.3) = -3.0 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is different than calling floor() or ceil(): 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * floor(3.3) = 3, floor(-3.3) = -4 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ceil(3.3) = 4, ceil(-3.3) = -3 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_trunc(double d) 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if IEEE_754 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* handle error cases*/ 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uprv_isNaN(d)) 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uprv_getNaN(); 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uprv_isInfinite(d)) 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uprv_getInfinity(); 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 55527f654740f2a26ad62a5c155af9199af9e69b889claireho if(u_signBit(d)) /* Signbit() picks up -0.0; d<0 does not. */ 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ceil(d); 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return floor(d); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return d >= 0 ? floor(d) : ceil(d); 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the largest positive number that can be represented by an integer 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * type of arbitrary bit length. 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_maxMantissa(void) 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pow(2.0, DBL_MANT_DIG + 1.0) - 1.0; 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_log(double d) 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return log(d); 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void * U_EXPORT2 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_maximumPtr(void * base) 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS400 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 58785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * With the provided function we should never be out of range of a given segment 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (a traditional/typical segment that is). Our segments have 5 bytes for the 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * id and 3 bytes for the offset. The key is that the casting takes care of 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * only retrieving the offset portion minus x1000. Hence, the smallest offset 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * seen in a program is x001000 and when casted to an int would be 0. 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * That's why we can only add 0xffefff. Otherwise, we would exceed the segment. 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 59485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Currently, 16MB is the current addressing limitation on i5/OS if the activation is 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * non-TERASPACE. If it is TERASPACE it is 2GB - 4k(header information). 59685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This function determines the activation based on the pointer that is passed in and 59785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * calculates the appropriate maximum available size for 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * each pointer type (TERASPACE and non-TERASPACE) 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Unlike other operating systems, the pointer model isn't determined at 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * compile time on i5/OS. 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((base != NULL) && (_TESTPTR(base, _C_TERASPACE_CHECK))) { 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* if it is a TERASPACE pointer the max is 2GB - 4k */ 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((void *)(((char *)base)-((uint32_t)(base))+((uint32_t)0x7fffefff))); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* otherwise 16MB since NULL ptr is not checkable or the ptr is not TERASPACE */ 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((void *)(((char *)base)-((uint32_t)(base))+((uint32_t)0xffefff))); 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 61185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return U_MAX_PTR(base); 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*--------------------------------------------------------------------------- 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Platform-specific Implementations 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Try these, and if they don't work on your platform, then special case your 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru platform with new implementations. 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ---------------------------------------------------------------------------*/ 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Generic time zone layer -------------------------------------------------- */ 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Time zone utilities */ 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_tzset() 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if defined(U_TZSET) 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_TZSET(); 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* no initialization*/ 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_timezone() 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TIMEZONE 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return U_TIMEZONE; 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time_t t, t1, t2; 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct tm tmrec; 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool dst_checked; 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t tdiff = 0; 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time(&t); 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy( &tmrec, localtime(&t), sizeof(tmrec) ); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dst_checked = (tmrec.tm_isdst != 0); /* daylight savings time is checked*/ 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t1 = mktime(&tmrec); /* local time in seconds*/ 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) ); 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t2 = mktime(&tmrec); /* GMT (or UTC) in seconds*/ 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tdiff = t2 - t1; 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* imitate NT behaviour, which returns same timezone offset to GMT for 65354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius winter and summer. 65454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius This does not work on all platforms. For instance, on glibc on Linux 65554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius and on Mac OS 10.5, tdiff calculated above remains the same 65654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius regardless of whether DST is in effect or not. However, U_TIMEZONE 65754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius is defined on those platforms and this code is not reached so that 65854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius we can leave this alone. If there's a platform behaving 65954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius like glibc that uses this code, we need to add platform-dependent 66054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius preprocessor here. */ 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dst_checked) 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tdiff += 3600; 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return tdiff; 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Note that U_TZNAME does *not* have to be tzname, but if it is, 66885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho some platforms need to have it declared here. */ 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(U_TZNAME) && (U_PLATFORM == U_PF_IRIX || U_PLATFORM_IS_DARWIN_BASED || (U_PLATFORM == U_PF_CYGWIN && !U_PLATFORM_USES_ONLY_WIN32_API)) 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* RS6000 and others reject char **tzname. */ 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruextern U_IMPORT char *U_TZNAME[]; 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 6758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#if !UCONFIG_NO_FILE_IO && (U_PLATFORM_IS_DARWIN_BASED || U_PLATFORM_IS_LINUX_BASED || U_PLATFORM == U_PF_BSD || U_PLATFORM == U_PF_SOLARIS) 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* These platforms are likely to use Olson timezone IDs. */ 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHECK_LOCALTIME_LINK 1 678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_IS_DARWIN_BASED 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <tzfile.h> 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TZZONEINFO (TZDIR "/") 6818393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#elif U_PLATFORM == U_PF_SOLARIS 6828393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#define TZDEFAULT "/etc/localtime" 6838393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#define TZZONEINFO "/usr/share/lib/zoneinfo/" 6848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#define TZ_ENV_CHECK "localtime" 68585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 68685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define TZDEFAULT "/etc/localtime" 68785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define TZZONEINFO "/usr/share/zoneinfo/" 68885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 68985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if U_HAVE_DIRENT_H 69050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define TZFILE_SKIP "posixrules" /* tz file to skip when searching. */ 69127f654740f2a26ad62a5c155af9199af9e69b889claireho/* Some Linux distributions have 'localtime' in /usr/share/zoneinfo 69227f654740f2a26ad62a5c155af9199af9e69b889claireho symlinked to /etc/localtime, which makes searchForTZFile return 69327f654740f2a26ad62a5c155af9199af9e69b889claireho 'localtime' when it's the first match. */ 69427f654740f2a26ad62a5c155af9199af9e69b889claireho#define TZFILE_SKIP2 "localtime" 69585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SEARCH_TZFILE 69685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <dirent.h> /* Needed to search through system timezone files */ 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char gTimeZoneBuffer[PATH_MAX]; 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *gTimeZoneBufferPtr = NULL; 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 702103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_PLATFORM_USES_ONLY_WIN32_API 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define isNonDigit(ch) (ch < '0' || '9' < ch) 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool isValidOlsonID(const char *id) { 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t idx = 0; 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Determine if this is something like Iceland (Olson ID) 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru or AST4ADT (non-Olson ID) */ 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (id[idx] && isNonDigit(id[idx]) && id[idx] != ',') { 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru idx++; 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If we went through the whole string, then it might be okay. 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru The timezone is sometimes set to "CST-7CDT", "CST6CDT5,J129,J131/19:30", 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GRNLNDST3GRNLNDDT" or similar, so we cannot use it. 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru The rest of the time it could be an Olson ID. George */ 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)(id[idx] == 0 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uprv_strcmp(id, "PST8PDT") == 0 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uprv_strcmp(id, "MST7MDT") == 0 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uprv_strcmp(id, "CST6CDT") == 0 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uprv_strcmp(id, "EST5EDT") == 0); 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 72327f654740f2a26ad62a5c155af9199af9e69b889claireho 72427f654740f2a26ad62a5c155af9199af9e69b889claireho/* On some Unix-like OS, 'posix' subdirectory in 72527f654740f2a26ad62a5c155af9199af9e69b889claireho /usr/share/zoneinfo replicates the top-level contents. 'right' 72627f654740f2a26ad62a5c155af9199af9e69b889claireho subdirectory has the same set of files, but individual files 72727f654740f2a26ad62a5c155af9199af9e69b889claireho are different from those in the top-level directory or 'posix' 72827f654740f2a26ad62a5c155af9199af9e69b889claireho because 'right' has files for TAI (Int'l Atomic Time) while 'posix' 72927f654740f2a26ad62a5c155af9199af9e69b889claireho has files for UTC. 73027f654740f2a26ad62a5c155af9199af9e69b889claireho When the first match for /etc/localtime is in either of them 73127f654740f2a26ad62a5c155af9199af9e69b889claireho (usually in posix because 'right' has different file contents), 73227f654740f2a26ad62a5c155af9199af9e69b889claireho or TZ environment variable points to one of them, createTimeZone 73327f654740f2a26ad62a5c155af9199af9e69b889claireho fails because, say, 'posix/America/New_York' is not an Olson 73427f654740f2a26ad62a5c155af9199af9e69b889claireho timezone id ('America/New_York' is). So, we have to skip 73527f654740f2a26ad62a5c155af9199af9e69b889claireho 'posix/' and 'right/' at the beginning. */ 73627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void skipZoneIDPrefix(const char** id) { 73727f654740f2a26ad62a5c155af9199af9e69b889claireho if (uprv_strncmp(*id, "posix/", 6) == 0 73827f654740f2a26ad62a5c155af9199af9e69b889claireho || uprv_strncmp(*id, "right/", 6) == 0) 73927f654740f2a26ad62a5c155af9199af9e69b889claireho { 74027f654740f2a26ad62a5c155af9199af9e69b889claireho *id += 6; 74127f654740f2a26ad62a5c155af9199af9e69b889claireho } 74227f654740f2a26ad62a5c155af9199af9e69b889claireho} 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 745103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(U_TZNAME) && !U_PLATFORM_USES_ONLY_WIN32_API 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CONVERT_HOURS_TO_SECONDS(offset) (int32_t)(offset*3600) 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct OffsetZoneMapping { 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t offsetSeconds; 750103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t daylightType; /* 0=U_DAYLIGHT_NONE, 1=daylight in June-U_DAYLIGHT_JUNE, 2=daylight in December=U_DAYLIGHT_DECEMBER*/ 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *stdID; 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *dstID; 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *olsonID; 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} OffsetZoneMapping; 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 756103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusenum { U_DAYLIGHT_NONE=0,U_DAYLIGHT_JUNE=1,U_DAYLIGHT_DECEMBER=2 }; 757103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThis list tries to disambiguate a set of abbreviated timezone IDs and offsets 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruand maps it to an Olson ID. 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBefore adding anything to this list, take a look at 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruicu/source/tools/tzcode/tz.alias 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSometimes no daylight savings (0) is important to define due to aliases. 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThis list can be tested with icu/source/test/compat/tzone.pl 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMore values could be added to daylightType to increase precision. 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const struct OffsetZoneMapping OFFSET_ZONE_MAPPINGS[] = { 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-45900, 2, "CHAST", "CHADT", "Pacific/Chatham"}, 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-43200, 1, "PETT", "PETST", "Asia/Kamchatka"}, 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-43200, 2, "NZST", "NZDT", "Pacific/Auckland"}, 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-43200, 1, "ANAT", "ANAST", "Asia/Anadyr"}, 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-39600, 1, "MAGT", "MAGST", "Asia/Magadan"}, 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-37800, 2, "LHST", "LHST", "Australia/Lord_Howe"}, 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-36000, 2, "EST", "EST", "Australia/Sydney"}, 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-36000, 1, "SAKT", "SAKST", "Asia/Sakhalin"}, 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-36000, 1, "VLAT", "VLAST", "Asia/Vladivostok"}, 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-34200, 2, "CST", "CST", "Australia/South"}, 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-32400, 1, "YAKT", "YAKST", "Asia/Yakutsk"}, 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-32400, 1, "CHOT", "CHOST", "Asia/Choibalsan"}, 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-31500, 2, "CWST", "CWST", "Australia/Eucla"}, 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-28800, 1, "IRKT", "IRKST", "Asia/Irkutsk"}, 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-28800, 1, "ULAT", "ULAST", "Asia/Ulaanbaatar"}, 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-28800, 2, "WST", "WST", "Australia/West"}, 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-25200, 1, "HOVT", "HOVST", "Asia/Hovd"}, 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-25200, 1, "KRAT", "KRAST", "Asia/Krasnoyarsk"}, 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-21600, 1, "NOVT", "NOVST", "Asia/Novosibirsk"}, 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-21600, 1, "OMST", "OMSST", "Asia/Omsk"}, 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-18000, 1, "YEKT", "YEKST", "Asia/Yekaterinburg"}, 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-14400, 1, "SAMT", "SAMST", "Europe/Samara"}, 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-14400, 1, "AMT", "AMST", "Asia/Yerevan"}, 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-14400, 1, "AZT", "AZST", "Asia/Baku"}, 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-10800, 1, "AST", "ADT", "Asia/Baghdad"}, 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-10800, 1, "MSK", "MSD", "Europe/Moscow"}, 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-10800, 1, "VOLT", "VOLST", "Europe/Volgograd"}, 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-7200, 0, "EET", "CEST", "Africa/Tripoli"}, 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-7200, 1, "EET", "EEST", "Europe/Athens"}, /* Conflicts with Africa/Cairo */ 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-7200, 1, "IST", "IDT", "Asia/Jerusalem"}, 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-3600, 0, "CET", "WEST", "Africa/Algiers"}, 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {-3600, 2, "WAT", "WAST", "Africa/Windhoek"}, 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0, 1, "GMT", "IST", "Europe/Dublin"}, 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0, 1, "GMT", "BST", "Europe/London"}, 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0, 0, "WET", "WEST", "Africa/Casablanca"}, 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0, 0, "WET", "WET", "Africa/El_Aaiun"}, 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {3600, 1, "AZOT", "AZOST", "Atlantic/Azores"}, 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {3600, 1, "EGT", "EGST", "America/Scoresbysund"}, 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {10800, 1, "PMST", "PMDT", "America/Miquelon"}, 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {10800, 2, "UYT", "UYST", "America/Montevideo"}, 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {10800, 1, "WGT", "WGST", "America/Godthab"}, 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {10800, 2, "BRT", "BRST", "Brazil/East"}, 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {12600, 1, "NST", "NDT", "America/St_Johns"}, 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {14400, 1, "AST", "ADT", "Canada/Atlantic"}, 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {14400, 2, "AMT", "AMST", "America/Cuiaba"}, 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {14400, 2, "CLT", "CLST", "Chile/Continental"}, 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {14400, 2, "FKT", "FKST", "Atlantic/Stanley"}, 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {14400, 2, "PYT", "PYST", "America/Asuncion"}, 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {18000, 1, "CST", "CDT", "America/Havana"}, 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {18000, 1, "EST", "EDT", "US/Eastern"}, /* Conflicts with America/Grand_Turk */ 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {21600, 2, "EAST", "EASST", "Chile/EasterIsland"}, 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {21600, 0, "CST", "MDT", "Canada/Saskatchewan"}, 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {21600, 0, "CST", "CDT", "America/Guatemala"}, 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {21600, 1, "CST", "CDT", "US/Central"}, /* Conflicts with Mexico/General */ 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {25200, 1, "MST", "MDT", "US/Mountain"}, /* Conflicts with Mexico/BajaSur */ 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {28800, 0, "PST", "PST", "Pacific/Pitcairn"}, 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {28800, 1, "PST", "PDT", "US/Pacific"}, /* Conflicts with Mexico/BajaNorte */ 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {32400, 1, "AKST", "AKDT", "US/Alaska"}, 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {36000, 1, "HAST", "HADT", "US/Aleutian"} 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*#define DEBUG_TZNAME*/ 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* remapShortTimeZone(const char *stdID, const char *dstID, int32_t daylightType, int32_t offset) 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t idx; 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef DEBUG_TZNAME 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "TZ=%s std=%s dst=%s daylight=%d offset=%d\n", getenv("TZ"), stdID, dstID, daylightType, offset); 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 837103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for (idx = 0; idx < LENGTHOF(OFFSET_ZONE_MAPPINGS); idx++) 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (offset == OFFSET_ZONE_MAPPINGS[idx].offsetSeconds 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && daylightType == OFFSET_ZONE_MAPPINGS[idx].daylightType 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && strcmp(OFFSET_ZONE_MAPPINGS[idx].stdID, stdID) == 0 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && strcmp(OFFSET_ZONE_MAPPINGS[idx].dstID, dstID) == 0) 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return OFFSET_ZONE_MAPPINGS[idx].olsonID; 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef SEARCH_TZFILE 85285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define MAX_PATH_SIZE PATH_MAX /* Set the limit for the size of the path. */ 85385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define MAX_READ_SIZE 512 85485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 85585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef struct DefaultTZInfo { 85685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char* defaultTZBuffer; 85785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int64_t defaultTZFileSize; 85885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FILE* defaultTZFilePtr; 85985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool defaultTZstatus; 86085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t defaultTZPosition; 86185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} DefaultTZInfo; 86285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 86385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 86485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This method compares the two files given to see if they are a match. 86585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * It is currently use to compare two TZ files. 86685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 86785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UBool compareBinaryFiles(const char* defaultTZFileName, const char* TZFileName, DefaultTZInfo* tzInfo) { 86885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FILE* file; 86985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int64_t sizeFile; 87085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int64_t sizeFileLeft; 87185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t sizeFileRead; 87285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t sizeFileToRead; 87385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char bufferFile[MAX_READ_SIZE]; 87485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool result = TRUE; 87585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 87685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (tzInfo->defaultTZFilePtr == NULL) { 87785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZFilePtr = fopen(defaultTZFileName, "r"); 87885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 87985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho file = fopen(TZFileName, "r"); 88085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 88185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZPosition = 0; /* reset position to begin search */ 88285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 88385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (file != NULL && tzInfo->defaultTZFilePtr != NULL) { 88485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* First check that the file size are equal. */ 88585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (tzInfo->defaultTZFileSize == 0) { 88685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fseek(tzInfo->defaultTZFilePtr, 0, SEEK_END); 88785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZFileSize = ftell(tzInfo->defaultTZFilePtr); 88885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 88985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fseek(file, 0, SEEK_END); 89085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sizeFile = ftell(file); 89185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sizeFileLeft = sizeFile; 89285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 89385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (sizeFile != tzInfo->defaultTZFileSize) { 89485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = FALSE; 89585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 89685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Store the data from the files in seperate buffers and 89785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * compare each byte to determine equality. 89885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 89985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (tzInfo->defaultTZBuffer == NULL) { 90085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rewind(tzInfo->defaultTZFilePtr); 90185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZBuffer = (char*)uprv_malloc(sizeof(char) * tzInfo->defaultTZFileSize); 902b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sizeFileRead = fread(tzInfo->defaultTZBuffer, 1, tzInfo->defaultTZFileSize, tzInfo->defaultTZFilePtr); 90385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 90485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rewind(file); 90585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(sizeFileLeft > 0) { 90685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(bufferFile, 0, MAX_READ_SIZE); 90785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sizeFileToRead = sizeFileLeft < MAX_READ_SIZE ? sizeFileLeft : MAX_READ_SIZE; 90885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 90985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sizeFileRead = fread(bufferFile, 1, sizeFileToRead, file); 91085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (memcmp(tzInfo->defaultTZBuffer + tzInfo->defaultTZPosition, bufferFile, sizeFileRead) != 0) { 91185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = FALSE; 91285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 91385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 91485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sizeFileLeft -= sizeFileRead; 91585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZPosition += sizeFileRead; 91685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 91785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 91885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 91985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = FALSE; 92085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 92185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 92285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (file != NULL) { 92385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fclose(file); 92485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 92585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 92685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 92785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 92885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 92985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This method recursively traverses the directory given for a matching TZ file and returns the first match. 93085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 93185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* dirent also lists two entries: "." and ".." that we can safely ignore. */ 93285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SKIP1 "." 93385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SKIP2 ".." 93485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic char SEARCH_TZFILE_RESULT[MAX_PATH_SIZE] = ""; 93585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { 93650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char curpath[MAX_PATH_SIZE]; 93785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DIR* dirp = opendir(path); 93885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DIR* subDirp = NULL; 93985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho struct dirent* dirEntry = NULL; 94085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 94185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char* result = NULL; 94250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (dirp == NULL) { 94350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 94450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 94585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 94685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Save the current path */ 94785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(curpath, 0, MAX_PATH_SIZE); 94885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(curpath, path); 94985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 95085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Check each entry in the directory. */ 95185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while((dirEntry = readdir(dirp)) != NULL) { 95227f654740f2a26ad62a5c155af9199af9e69b889claireho const char* dirName = dirEntry->d_name; 95327f654740f2a26ad62a5c155af9199af9e69b889claireho if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0) { 95485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Create a newpath with the new entry to test each entry in the directory. */ 95585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char newpath[MAX_PATH_SIZE]; 95685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(newpath, curpath); 95727f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(newpath, dirName); 95885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 95985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((subDirp = opendir(newpath)) != NULL) { 96085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* If this new path is a directory, make a recursive call with the newpath. */ 96185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho closedir(subDirp); 96285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(newpath, "/"); 96385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = searchForTZFile(newpath, tzInfo); 96427f654740f2a26ad62a5c155af9199af9e69b889claireho /* 96527f654740f2a26ad62a5c155af9199af9e69b889claireho Have to get out here. Otherwise, we'd keep looking 96627f654740f2a26ad62a5c155af9199af9e69b889claireho and return the first match in the top-level directory 96727f654740f2a26ad62a5c155af9199af9e69b889claireho if there's a match in the top-level. If not, this function 96827f654740f2a26ad62a5c155af9199af9e69b889claireho would return NULL and set gTimeZoneBufferPtr to NULL in initDefault(). 96927f654740f2a26ad62a5c155af9199af9e69b889claireho It worked without this in most cases because we have a fallback of calling 97027f654740f2a26ad62a5c155af9199af9e69b889claireho localtime_r to figure out the default timezone. 97127f654740f2a26ad62a5c155af9199af9e69b889claireho */ 97227f654740f2a26ad62a5c155af9199af9e69b889claireho if (result != NULL) 97327f654740f2a26ad62a5c155af9199af9e69b889claireho break; 97427f654740f2a26ad62a5c155af9199af9e69b889claireho } else if (uprv_strcmp(TZFILE_SKIP, dirName) != 0 && uprv_strcmp(TZFILE_SKIP2, dirName) != 0) { 97585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(compareBinaryFiles(TZDEFAULT, newpath, tzInfo)) { 97627f654740f2a26ad62a5c155af9199af9e69b889claireho const char* zoneid = newpath + (sizeof(TZZONEINFO)) - 1; 97727f654740f2a26ad62a5c155af9199af9e69b889claireho skipZoneIDPrefix(&zoneid); 97827f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcpy(SEARCH_TZFILE_RESULT, zoneid); 97985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = SEARCH_TZFILE_RESULT; 98085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Get out after the first one found. */ 98185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 98285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 98385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 98485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 98585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 98685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho closedir(dirp); 98785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 98885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 98985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_tzname(int n) 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *tzid = NULL; 994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tzid = uprv_detectWindowsTimeZone(); 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tzid != NULL) { 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return tzid; 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1002103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*#if U_PLATFORM_IS_DARWIN_BASED 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int ret; 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tzid = getenv("TZFILE"); 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tzid != NULL) { 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return tzid; 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif*/ 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This code can be temporarily disabled to test tzname resolution later on. */ 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef DEBUG_TZNAME 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tzid = getenv("TZ"); 10148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (tzid != NULL && isValidOlsonID(tzid) 10158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#if U_PLATFORM == U_PF_SOLARIS 10168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius /* When TZ equals localtime on Solaris, check the /etc/localtime file. */ 10178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius && uprv_strcmp(tzid, TZ_ENV_CHECK) != 0 10188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif 10198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius ) { 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* This might be a good Olson ID. */ 102127f654740f2a26ad62a5c155af9199af9e69b889claireho skipZoneIDPrefix(&tzid); 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return tzid; 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* else U_TZNAME will give a better result. */ 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1027103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(CHECK_LOCALTIME_LINK) && !defined(DEBUG_SKIP_LOCALTIME_LINK) 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Caller must handle threading issues */ 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gTimeZoneBufferPtr == NULL) { 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru This is a trick to look at the name of the link to get the Olson ID 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru because the tzfile contents is underspecified. 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru This isn't guaranteed to work because it may not be a symlink. 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ret = (int32_t)readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)); 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 < ret) { 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t tzZoneInfoLen = uprv_strlen(TZZONEINFO); 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gTimeZoneBuffer[ret] = 0; 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, tzZoneInfoLen) == 0 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 104485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 104585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if defined(SEARCH_TZFILE) 104685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DefaultTZInfo* tzInfo = (DefaultTZInfo*)uprv_malloc(sizeof(DefaultTZInfo)); 104785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (tzInfo != NULL) { 104885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZBuffer = NULL; 104985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZFileSize = 0; 105085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZFilePtr = NULL; 105185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZstatus = FALSE; 105285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzInfo->defaultTZPosition = 0; 105385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 105485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gTimeZoneBufferPtr = searchForTZFile(TZZONEINFO, tzInfo); 105585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 105685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Free previously allocated memory */ 105785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (tzInfo->defaultTZBuffer != NULL) { 105885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(tzInfo->defaultTZBuffer); 105985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 106085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (tzInfo->defaultTZFilePtr != NULL) { 106185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fclose(tzInfo->defaultTZFilePtr); 106285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 106385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(tzInfo); 106485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 106585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 106685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (gTimeZoneBufferPtr != NULL && isValidOlsonID(gTimeZoneBufferPtr)) { 106785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return gTimeZoneBufferPtr; 106885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 106985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gTimeZoneBufferPtr; 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TZNAME 1079103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 108050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The return value is free'd in timezone.cpp on Windows because 108150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * the other code path returns a pointer to a heap location. */ 108250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return uprv_strdup(U_TZNAME[n]); 108350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_TZNAME is usually a non-unique abbreviation, which isn't normally usable. 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru So we remap the abbreviation to an olson ID. 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Since Windows exposes a little more timezone information, 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru we normally don't use this code on Windows because 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_detectWindowsTimeZone should have already given the correct answer. 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct tm juneSol, decemberSol; 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int daylightType; 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const time_t juneSolstice=1182478260; /*2007-06-21 18:11 UT*/ 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const time_t decemberSolstice=1198332540; /*2007-12-22 06:09 UT*/ 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* This probing will tell us when daylight savings occurs. */ 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localtime_r(&juneSolstice, &juneSol); 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localtime_r(&decemberSolstice, &decemberSol); 1101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(decemberSol.tm_isdst > 0) { 1102103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius daylightType = U_DAYLIGHT_DECEMBER; 1103103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(juneSol.tm_isdst > 0) { 1104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius daylightType = U_DAYLIGHT_JUNE; 1105103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1106103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius daylightType = U_DAYLIGHT_NONE; 1107103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tzid = remapShortTimeZone(U_TZNAME[0], U_TZNAME[1], daylightType, uprv_timezone()); 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tzid != NULL) { 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return tzid; 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return U_TZNAME[n]; 111450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ""; 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Get and set the ICU data directory --------------------------------------- */ 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *gDataDirectory = NULL; 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_POSIX_LOCALE 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char *gCorrectedPOSIXLocale = NULL; /* Heap allocated */ 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_CALLCONV putil_cleanup(void) 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gDataDirectory && *gDataDirectory) { 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(gDataDirectory); 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gDataDirectory = NULL; 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_POSIX_LOCALE 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gCorrectedPOSIXLocale) { 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(gCorrectedPOSIXLocale); 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gCorrectedPOSIXLocale = NULL; 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the data directory. 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Make a copy of the passed string, and set the global data dir to point to it. 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TODO: see bug #2849, regarding thread safety. 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_setDataDirectory(const char *directory) { 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *newDataDir; 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(directory==NULL || *directory==0) { 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* A small optimization to prevent the malloc and copy when the 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru shared library is used, and this is a way to make sure that NULL 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru is never returned. 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newDataDir = (char *)""; 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=(int32_t)uprv_strlen(directory); 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newDataDir = (char *)uprv_malloc(length + 2); 116285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Exit out if newDataDir could not be created. */ 116385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (newDataDir == NULL) { 116485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 116585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(newDataDir, directory); 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *p; 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) { 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *p = U_FILE_SEP_CHAR; 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gDataDirectory && *gDataDirectory) { 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(gDataDirectory); 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gDataDirectory = newDataDir; 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 118885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Houprv_pathIsAbsolute(const char *path) 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 119085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!path || !*path) { 119185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(*path == U_FILE_SEP_CHAR) { 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(*path == U_FILE_ALT_SEP_CHAR) { 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1204103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (((path[0] >= 'A') && (path[0] <= 'Z')) || 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((path[0] >= 'a') && (path[0] <= 'z'))) && 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru path[1] == ':' ) { 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121527f654740f2a26ad62a5c155af9199af9e69b889claireho/* Temporary backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR 121627f654740f2a26ad62a5c155af9199af9e69b889claireho until some client wrapper makefiles are updated */ 1217103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_IS_DARWIN_BASED && TARGET_IPHONE_SIMULATOR 121827f654740f2a26ad62a5c155af9199af9e69b889claireho# if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR) 121927f654740f2a26ad62a5c155af9199af9e69b889claireho# define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT" 122027f654740f2a26ad62a5c155af9199af9e69b889claireho# endif 122127f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 122227f654740f2a26ad62a5c155af9199af9e69b889claireho 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char * U_EXPORT2 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getDataDirectory(void) { 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *path = NULL; 122602fdd983fede27bf25bddfbe3b5deb20813df5efElliott Hughes#if defined(ICU_DATA_DIR_PREFIX_ENV_VAR) 122750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char datadir_path_buffer[PATH_MAX]; 122850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* if we have the directory, then return it immediately */ 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX_CHECK(NULL, gDataDirectory, path); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(path) { 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return path; 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru When ICU_NO_USER_DATA_OVERRIDE is defined, users aren't allowed to 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru override ICU's data with the ICU_DATA environment variable. This prevents 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru problems where multiple custom copies of ICU's specific version of data 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru are installed on a system. Either the application must define the data 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru directory with u_setDataDirectory, define ICU_DATA_DIR when compiling 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ICU, set the data with udata_setCommonData or trust that all of the 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru required data is contained in ICU's data library that contains 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru the entry point defined by U_ICUDATA_ENTRY_POINT. 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru There may also be some platforms where environment variables 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru are not allowed. 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* First try to get the environment variable */ 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru path=getenv("ICU_DATA"); 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# endif 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125527f654740f2a26ad62a5c155af9199af9e69b889claireho /* ICU_DATA_DIR may be set as a compile option. 125627f654740f2a26ad62a5c155af9199af9e69b889claireho * U_ICU_DATA_DEFAULT_DIR is provided and is set by ICU at compile time 125727f654740f2a26ad62a5c155af9199af9e69b889claireho * and is used only when data is built in archive mode eliminating the need 125827f654740f2a26ad62a5c155af9199af9e69b889claireho * for ICU_DATA_DIR to be set. U_ICU_DATA_DEFAULT_DIR is set to the installation 125927f654740f2a26ad62a5c155af9199af9e69b889claireho * directory of the data dat file. Users should use ICU_DATA_DIR if they want to 126027f654740f2a26ad62a5c155af9199af9e69b889claireho * set their own path. 126127f654740f2a26ad62a5c155af9199af9e69b889claireho */ 126227f654740f2a26ad62a5c155af9199af9e69b889claireho#if defined(ICU_DATA_DIR) || defined(U_ICU_DATA_DEFAULT_DIR) 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(path==NULL || *path==0) { 126427f654740f2a26ad62a5c155af9199af9e69b889claireho# if defined(ICU_DATA_DIR_PREFIX_ENV_VAR) 126502fdd983fede27bf25bddfbe3b5deb20813df5efElliott Hughes const char *prefix = getenv(ICU_DATA_DIR_PREFIX_ENV_VAR); 126627f654740f2a26ad62a5c155af9199af9e69b889claireho# endif 126727f654740f2a26ad62a5c155af9199af9e69b889claireho# ifdef ICU_DATA_DIR 126827f654740f2a26ad62a5c155af9199af9e69b889claireho path=ICU_DATA_DIR; 126927f654740f2a26ad62a5c155af9199af9e69b889claireho# else 127027f654740f2a26ad62a5c155af9199af9e69b889claireho path=U_ICU_DATA_DEFAULT_DIR; 127127f654740f2a26ad62a5c155af9199af9e69b889claireho# endif 127227f654740f2a26ad62a5c155af9199af9e69b889claireho# if defined(ICU_DATA_DIR_PREFIX_ENV_VAR) 127302fdd983fede27bf25bddfbe3b5deb20813df5efElliott Hughes if (prefix != NULL) { 127427f654740f2a26ad62a5c155af9199af9e69b889claireho snprintf(datadir_path_buffer, PATH_MAX, "%s%s", prefix, path); 127550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho path=datadir_path_buffer; 127650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 127727f654740f2a26ad62a5c155af9199af9e69b889claireho# endif 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 127927f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(path==NULL) { 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* It looks really bad, set it to something. */ 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru path = ""; 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_setDataDirectory(path); 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gDataDirectory; 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Macintosh-specific locale information ------------------------------------ */ 1295103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CLASSIC_MACOS 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct { 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t script; 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t region; 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lang; 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t date_region; 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* posixID; 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} mac_lc_rec; 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Todo: This will be updated with a newer version from www.unicode.org web 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru page when it's available.*/ 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAC_LC_MAGIC_NUMBER -5 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAC_LC_INIT_NUMBER -9 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const mac_lc_rec mac_lc_recs[] = { 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 0, "en_US", 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* United States*/ 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 1, "fr_FR", 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* France*/ 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 2, "en_GB", 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Great Britain*/ 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 3, "de_DE", 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Germany*/ 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 4, "it_IT", 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Italy*/ 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 5, "nl_NL", 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Metherlands*/ 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 6, "fr_BE", 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* French for Belgium or Lxembourg*/ 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 7, "sv_SE", 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Sweden*/ 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 9, "da_DK", 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Denmark*/ 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 10, "pt_PT", 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Portugal*/ 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 11, "fr_CA", 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* French Canada*/ 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 13, "is_IS", 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Israel*/ 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 14, "ja_JP", 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Japan*/ 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 15, "en_AU", 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Australia*/ 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 16, "ar_AE", 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* the Arabic world (?)*/ 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 17, "fi_FI", 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Finland*/ 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 18, "fr_CH", 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* French for Switzerland*/ 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 19, "de_CH", 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* German for Switzerland*/ 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 20, "el_GR", 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Greece*/ 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 21, "is_IS", 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Iceland ===*/ 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 22, "",*/ 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Malta ===*/ 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 23, "",*/ 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Cyprus ===*/ 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 24, "tr_TR", 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Turkey ===*/ 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 25, "sh_YU", 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Croatian system for Yugoslavia*/ 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 33, "",*/ 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Hindi system for India*/ 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 34, "",*/ 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Pakistan*/ 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 41, "lt_LT", 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Lithuania*/ 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 42, "pl_PL", 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Poland*/ 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 43, "hu_HU", 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Hungary*/ 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 44, "et_EE", 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Estonia*/ 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 45, "lv_LV", 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Latvia*/ 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 46, "",*/ 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Lapland [Ask Rich for the data. HS]*/ 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 47, "",*/ 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Faeroe Islands*/ 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 48, "fa_IR", 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Iran*/ 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 49, "ru_RU", 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Russia*/ 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 50, "en_IE", 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Ireland*/ 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 51, "ko_KR", 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Korea*/ 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 52, "zh_CN", 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* People's Republic of China*/ 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 53, "zh_TW", 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Taiwan*/ 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 54, "th_TH", 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Thailand*/ 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* fallback is en_US*/ 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MAC_LC_MAGIC_NUMBER, "en_US" 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_POSIX_LOCALE 140027f654740f2a26ad62a5c155af9199af9e69b889claireho/* A helper function used by uprv_getPOSIXIDForDefaultLocale and 140127f654740f2a26ad62a5c155af9199af9e69b889claireho * uprv_getPOSIXIDForDefaultCodepage. Returns the posix locale id for 140227f654740f2a26ad62a5c155af9199af9e69b889claireho * LC_CTYPE and LC_MESSAGES. It doesn't support other locale categories. 140327f654740f2a26ad62a5c155af9199af9e69b889claireho */ 140427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char *uprv_getPOSIXIDForCategory(int category) 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 140627f654740f2a26ad62a5c155af9199af9e69b889claireho const char* posixID = NULL; 140727f654740f2a26ad62a5c155af9199af9e69b889claireho if (category == LC_MESSAGES || category == LC_CTYPE) { 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 140985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * On Solaris two different calls to setlocale can result in 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * different values. Only get this value once. 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * We must check this first because an application can set this. 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * LC_ALL can't be used because it's platform dependent. The LANG 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * environment variable seems to affect LC_CTYPE variable by default. 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Here is what setlocale(LC_ALL, NULL) can return. 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * HPUX can return 'C C C C C C C' 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Solaris can return /en_US/C/C/C/C/C on the second try. 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Linux can return LC_CTYPE=C;LC_NUMERIC=C;... 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The default codepage detection also needs to use LC_CTYPE. 142285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Do not call setlocale(LC_*, "")! Using an empty string instead 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of NULL, will modify the libc behavior. 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 142627f654740f2a26ad62a5c155af9199af9e69b889claireho posixID = setlocale(category, NULL); 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((posixID == 0) 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (uprv_strcmp("C", posixID) == 0) 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (uprv_strcmp("POSIX", posixID) == 0)) 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Maybe we got some garbage. Try something more reasonable */ 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru posixID = getenv("LC_ALL"); 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posixID == 0) { 143427f654740f2a26ad62a5c155af9199af9e69b889claireho posixID = getenv(category == LC_MESSAGES ? "LC_MESSAGES" : "LC_CTYPE"); 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posixID == 0) { 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru posixID = getenv("LANG"); 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 144027f654740f2a26ad62a5c155af9199af9e69b889claireho } 144127f654740f2a26ad62a5c155af9199af9e69b889claireho if ((posixID==0) 144227f654740f2a26ad62a5c155af9199af9e69b889claireho || (uprv_strcmp("C", posixID) == 0) 144327f654740f2a26ad62a5c155af9199af9e69b889claireho || (uprv_strcmp("POSIX", posixID) == 0)) 144427f654740f2a26ad62a5c155af9199af9e69b889claireho { 144527f654740f2a26ad62a5c155af9199af9e69b889claireho /* Nothing worked. Give it a nice POSIX default value. */ 144627f654740f2a26ad62a5c155af9199af9e69b889claireho posixID = "en_US_POSIX"; 144727f654740f2a26ad62a5c155af9199af9e69b889claireho } 144827f654740f2a26ad62a5c155af9199af9e69b889claireho return posixID; 144927f654740f2a26ad62a5c155af9199af9e69b889claireho} 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 145127f654740f2a26ad62a5c155af9199af9e69b889claireho/* Return just the POSIX id for the default locale, whatever happens to be in 145227f654740f2a26ad62a5c155af9199af9e69b889claireho * it. It gets the value from LC_MESSAGES and indirectly from LC_ALL and LANG. 145327f654740f2a26ad62a5c155af9199af9e69b889claireho */ 145427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char *uprv_getPOSIXIDForDefaultLocale(void) 145527f654740f2a26ad62a5c155af9199af9e69b889claireho{ 145627f654740f2a26ad62a5c155af9199af9e69b889claireho static const char* posixID = NULL; 145727f654740f2a26ad62a5c155af9199af9e69b889claireho if (posixID == 0) { 145827f654740f2a26ad62a5c155af9199af9e69b889claireho posixID = uprv_getPOSIXIDForCategory(LC_MESSAGES); 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 146027f654740f2a26ad62a5c155af9199af9e69b889claireho return posixID; 146127f654740f2a26ad62a5c155af9199af9e69b889claireho} 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 146354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !U_CHARSET_IS_UTF8 146427f654740f2a26ad62a5c155af9199af9e69b889claireho/* Return just the POSIX id for the default codepage, whatever happens to be in 146527f654740f2a26ad62a5c155af9199af9e69b889claireho * it. It gets the value from LC_CTYPE and indirectly from LC_ALL and LANG. 146627f654740f2a26ad62a5c155af9199af9e69b889claireho */ 146727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char *uprv_getPOSIXIDForDefaultCodepage(void) 146827f654740f2a26ad62a5c155af9199af9e69b889claireho{ 146927f654740f2a26ad62a5c155af9199af9e69b889claireho static const char* posixID = NULL; 147027f654740f2a26ad62a5c155af9199af9e69b889claireho if (posixID == 0) { 147127f654740f2a26ad62a5c155af9199af9e69b889claireho posixID = uprv_getPOSIXIDForCategory(LC_CTYPE); 147227f654740f2a26ad62a5c155af9199af9e69b889claireho } 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return posixID; 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 147654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* NOTE: The caller should handle thread safety */ 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_getDefaultLocaleID() 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_POSIX_LOCALE 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Note that: (a '!' means the ID is improper somehow) 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LC_ALL ----> default_loc codepage 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru-------------------------------------------------------- 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ab.CD ab CD 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ab@CD ab__CD - 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ab@CD.EF ab__CD EF 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ab_CD.EF@GH ab_CD_GH EF 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSome 'improper' ways to do the same as above: 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ! ab_CD@GH.EF ab_CD_GH EF 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ! ab_CD.EF@GH.IJ ab_CD_GH EF 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ! ab_CD@ZZ.EF@GH.IJ ab_CD_GH EF 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _CD@GH _CD_GH - 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _CD.EF@GH _CD_GH EF 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThe variant cannot have dots in it. 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThe 'rightmost' variant (@xxx) wins. 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThe leftmost codepage (.xxx) wins. 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *correctedPOSIXLocale = 0; 150627f654740f2a26ad62a5c155af9199af9e69b889claireho const char* posixID = uprv_getPOSIXIDForDefaultLocale(); 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *p; 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *q; 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len; 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Format: (no spaces) 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ll [ _CC ] [ . MM ] [ @ VV] 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru l = lang, C = ctry, M = charmap, V = variant 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gCorrectedPOSIXLocale != NULL) { 151885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return gCorrectedPOSIXLocale; 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((p = uprv_strchr(posixID, '.')) != NULL) { 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* assume new locale can't be larger than old one? */ 152354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius correctedPOSIXLocale = static_cast<char *>(uprv_malloc(uprv_strlen(posixID)+1)); 152485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Exit on memory allocation error. */ 152585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (correctedPOSIXLocale == NULL) { 152685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 152785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedPOSIXLocale[p-posixID] = 0; 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do not copy after the @ */ 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((p = uprv_strchr(correctedPOSIXLocale, '@')) != NULL) { 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedPOSIXLocale[p-correctedPOSIXLocale] = 0; 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Note that we scan the *uncorrected* ID. */ 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((p = uprv_strrchr(posixID, '@')) != NULL) { 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (correctedPOSIXLocale == NULL) { 154054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius correctedPOSIXLocale = static_cast<char *>(uprv_malloc(uprv_strlen(posixID)+1)); 154185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Exit on memory allocation error. */ 154285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (correctedPOSIXLocale == NULL) { 154385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 154485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedPOSIXLocale[p-posixID] = 0; 1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p++; 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Take care of any special cases here.. */ 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!uprv_strcmp(p, "nynorsk")) { 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p = "NY"; 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Don't worry about no__NY. In practice, it won't appear. */ 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strchr(correctedPOSIXLocale,'_') == NULL) { 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(correctedPOSIXLocale, "__"); /* aa@b -> aa__b */ 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(correctedPOSIXLocale, "_"); /* aa_CC@b -> aa_CC_b */ 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((q = uprv_strchr(p, '.')) != NULL) { 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* How big will the resulting string be? */ 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strncat(correctedPOSIXLocale, p, q-p); 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedPOSIXLocale[len] = 0; 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Anything following the @ sign */ 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(correctedPOSIXLocale, p); 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Should there be a map from 'no@nynorsk' -> no_NO_NY here? 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * How about 'russian' -> 'ru'? 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Many of the other locales using ISO codes will be handled by the 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * canonicalization functions in uloc_getDefault. 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Was a correction made? */ 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (correctedPOSIXLocale != NULL) { 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru posixID = correctedPOSIXLocale; 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* copy it, just in case the original pointer goes away. See j2395 */ 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedPOSIXLocale = (char *)uprv_malloc(uprv_strlen(posixID) + 1); 158885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Exit on memory allocation error. */ 158985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (correctedPOSIXLocale == NULL) { 159085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return NULL; 159185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru posixID = uprv_strcpy(correctedPOSIXLocale, posixID); 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gCorrectedPOSIXLocale == NULL) { 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gCorrectedPOSIXLocale = correctedPOSIXLocale; 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedPOSIXLocale = NULL; 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (correctedPOSIXLocale != NULL) { /* Was already set - clean up. */ 160285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(correctedPOSIXLocale); 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return posixID; 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LCID id = GetThreadLocale(); 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* locID = uprv_convertToPosix(id, &status); 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru locID = "en_US"; 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return locID; 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CLASSIC_MACOS 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t script = MAC_LC_INIT_NUMBER; 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* = IntlScript(); or GetScriptManagerVariable(smSysScript);*/ 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t region = MAC_LC_INIT_NUMBER; 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* = GetScriptManagerVariable(smRegionCode);*/ 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lang = MAC_LC_INIT_NUMBER; 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* = GetScriptManagerVariable(smScriptLang);*/ 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t date_region = MAC_LC_INIT_NUMBER; 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* posixID = 0; 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = sizeof(mac_lc_recs) / sizeof(mac_lc_rec); 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Intl1Hndl ih; 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ih = (Intl1Hndl) GetIntlResource(1); 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ih) 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru date_region = ((uint16_t)(*ih)->intl1Vers) >> 8; 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < count; i++) { 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( ((mac_lc_recs[i].script == MAC_LC_MAGIC_NUMBER) 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (mac_lc_recs[i].script == script)) 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && ((mac_lc_recs[i].region == MAC_LC_MAGIC_NUMBER) 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (mac_lc_recs[i].region == region)) 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && ((mac_lc_recs[i].lang == MAC_LC_MAGIC_NUMBER) 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (mac_lc_recs[i].lang == lang)) 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && ((mac_lc_recs[i].date_region == MAC_LC_MAGIC_NUMBER) 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (mac_lc_recs[i].date_region == date_region)) 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru posixID = mac_lc_recs[i].posixID; 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return posixID; 1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1652103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* locales are process scoped and are by definition thread safe */ 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char correctedLocale[64]; 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *localeID = getenv("LC_ALL"); 1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *p; 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localeID == NULL) 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localeID = getenv("LANG"); 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localeID == NULL) 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localeID = setlocale(LC_ALL, NULL); 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Make sure we have something... */ 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localeID == NULL) 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return "en_US_POSIX"; 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Extract the locale name from the path. */ 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((p = uprv_strrchr(localeID, '/')) != NULL) 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Increment p to start of locale name. */ 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p++; 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localeID = p; 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Copy to work location. */ 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(correctedLocale, localeID); 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Strip off the '.locale' extension. */ 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((p = uprv_strchr(correctedLocale, '.')) != NULL) { 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *p = 0; 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Upper case the locale name. */ 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru T_CString_toUpperCase(correctedLocale); 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* See if we are using the POSIX locale. Any of the 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * following are equivalent and use the same QLGPGCMA 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (POSIX) locale. 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * QLGPGCMA2 means UCS2 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * QLGPGCMA_4 means UTF-32 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * QLGPGCMA_8 means UTF-8 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((uprv_strcmp("C", correctedLocale) == 0) || 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (uprv_strcmp("POSIX", correctedLocale) == 0) || 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (uprv_strncmp("QLGPGCMA", correctedLocale, 8) == 0)) 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(correctedLocale, "en_US_POSIX"); 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int16_t LocaleLen; 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Lower case the lang portion. */ 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(p = correctedLocale; *p != 0 && *p != '_'; p++) 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *p = uprv_tolower(*p); 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Adjust for Euro. After '_E' add 'URO'. */ 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocaleLen = uprv_strlen(correctedLocale); 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (correctedLocale[LocaleLen - 2] == '_' && 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedLocale[LocaleLen - 1] == 'E') 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(correctedLocale, "URO"); 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If using Lotus-based locale then convert to 1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * equivalent non Lotus. 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (correctedLocale[LocaleLen - 2] == '_' && 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedLocale[LocaleLen - 1] == 'L') 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru correctedLocale[LocaleLen - 2] = 0; 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* There are separate simplified and traditional 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * locales called zh_HK_S and zh_HK_T. 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strncmp(correctedLocale, "zh_HK", 5) == 0) 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(correctedLocale, "zh_HK"); 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* A special zh_CN_GBK locale... 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strcmp(correctedLocale, "zh_CN_GBK") == 0) 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(correctedLocale, "zh_CN"); 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return correctedLocale; 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 174785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if !U_CHARSET_IS_UTF8 1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_POSIX_LOCALE 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDue to various platform differences, one platform may specify a charset, 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruwhen they really mean a different charset. Remap the names so that they are 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucompatible with ICU. Only conflicting/ambiguous aliases should be resolved 1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruhere. Before adding anything to this function, please consider adding unique 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunames to the ICU alias table in the data directory. 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* 1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruremapPlatformDependentCodepage(const char *locale, const char *name) { 1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (locale != NULL && *locale == 0) { 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Make sure that an empty locale is handled the same way. */ 1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru locale = NULL; 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (name == NULL) { 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1765103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_AIX 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strcmp(name, "IBM-943") == 0) { 1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Use the ASCII compatible ibm-943 */ 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "Shift-JIS"; 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strcmp(name, "IBM-1252") == 0) { 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Use the windows-1252 that contains the Euro */ 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "IBM-5348"; 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1774103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_SOLARIS 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (locale != NULL && uprv_strcmp(name, "EUC") == 0) { 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Solaris underspecifies the "EUC" name. */ 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strcmp(locale, "zh_CN") == 0) { 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "EUC-CN"; 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strcmp(locale, "zh_TW") == 0) { 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "EUC-TW"; 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strcmp(locale, "ko_KR") == 0) { 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "EUC-KR"; 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strcmp(name, "eucJP") == 0) { 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-954 is the best match. 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-33722 is the default for eucJP (similar to Windows). 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "eucjis"; 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 179485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho else if (uprv_strcmp(name, "646") == 0) { 179585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 179685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The default codepage given by Solaris is 646 but the C library routines treat it as if it was 179785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * ISO-8859-1 instead of US-ASCII(646). 179885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 179985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho name = "ISO-8859-1"; 180085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1801103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_IS_DARWIN_BASED 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (locale == NULL && *name == 0) { 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru No locale was specified, and an empty name was passed in. 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru This usually indicates that nl_langinfo didn't return valid information. 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Mac OS X uses UTF-8 by default (especially the locale data and console). 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "UTF-8"; 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 181085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho else if (uprv_strcmp(name, "CP949") == 0) { 181185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remap CP949 to a similar codepage to avoid issues with backslash and won symbol. */ 181285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho name = "EUC-KR"; 181385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 181450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else if (locale != NULL && uprv_strcmp(locale, "en_US_POSIX") != 0 && uprv_strcmp(name, "US-ASCII") == 0) { 181550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 181650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * For non C/POSIX locale, default the code page to UTF-8 instead of US-ASCII. 181750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 181850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name = "UTF-8"; 181950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1820103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_BSD 182185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (uprv_strcmp(name, "CP949") == 0) { 182285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remap CP949 to a similar codepage to avoid issues with backslash and won symbol. */ 182385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho name = "EUC-KR"; 182485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1825103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_HPUX 182685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (locale != NULL && uprv_strcmp(locale, "zh_HK") == 0 && uprv_strcmp(name, "big5") == 0) { 182785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* HP decided to extend big5 as hkbig5 even though it's not compatible :-( */ 182885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* zh_TW.big5 is not the same charset as zh_HK.big5! */ 182985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho name = "hkbig5"; 183085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 183185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho else if (uprv_strcmp(name, "eucJP") == 0) { 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-1350 is the best match, but unavailable. 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-954 is mostly a superset of ibm-1350. 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-33722 is the default for eucJP (similar to Windows). 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "eucjis"; 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1839103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_LINUX 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (locale != NULL && uprv_strcmp(name, "euc") == 0) { 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Linux underspecifies the "EUC" name. */ 1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strcmp(locale, "korean") == 0) { 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "EUC-KR"; 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strcmp(locale, "japanese") == 0) { 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* See comment below about eucJP */ 1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "eucjis"; 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uprv_strcmp(name, "eucjp") == 0) { 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-1350 is the best match, but unavailable. 1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-954 is mostly a superset of ibm-1350. 1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ibm-33722 is the default for eucJP (similar to Windows). 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = "eucjis"; 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 185850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else if (locale != NULL && uprv_strcmp(locale, "en_US_POSIX") != 0 && 185950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (uprv_strcmp(name, "ANSI_X3.4-1968") == 0 || uprv_strcmp(name, "US-ASCII") == 0)) { 186050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 186150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * For non C/POSIX locale, default the code page to UTF-8 instead of US-ASCII. 186250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 186350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name = "UTF-8"; 186450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 186527f654740f2a26ad62a5c155af9199af9e69b889claireho /* 186627f654740f2a26ad62a5c155af9199af9e69b889claireho * Linux returns ANSI_X3.4-1968 for C/POSIX, but the call site takes care of 186727f654740f2a26ad62a5c155af9199af9e69b889claireho * it by falling back to 'US-ASCII' when NULL is returned from this 186827f654740f2a26ad62a5c155af9199af9e69b889claireho * function. So, we don't have to worry about it here. 186927f654740f2a26ad62a5c155af9199af9e69b889claireho */ 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* return NULL when "" is passed in */ 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*name == 0) { 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = NULL; 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return name; 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 187885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char* 1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetCodepageFromPOSIXID(const char *localeName, char * buffer, int32_t buffCapacity) 1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char localeBuf[100]; 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *name = NULL; 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *variant = NULL; 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { 1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size_t localeCapacity = uprv_min(sizeof(localeBuf), (name-localeName)+1); 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strncpy(localeBuf, localeName, localeCapacity); 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localeBuf[localeCapacity-1] = 0; /* ensure NULL termination */ 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = uprv_strncpy(buffer, name+1, buffCapacity); 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[buffCapacity-1] = 0; /* ensure NULL termination */ 1891103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ((variant = const_cast<char *>(uprv_strchr(name, '@'))) != NULL) { 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *variant = 0; 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = remapPlatformDependentCodepage(localeBuf, name); 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return name; 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 190085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const char* 1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint_getDefaultCodepage() 1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1903103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS400 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t ccsid = 37; /* Default to ibm-37 */ 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char codepage[64]; 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Qwc_JOBI0400_t jobinfo; 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Qus_EC_t error = { sizeof(Qus_EC_t) }; /* SPI error code */ 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EPT_CALL(QUSRJOBI)(&jobinfo, sizeof(jobinfo), "JOBI0400", 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "* ", " ", &error); 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (error.Bytes_Available == 0) { 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (jobinfo.Coded_Char_Set_ID != 0xFFFF) { 1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ccsid = (uint32_t)jobinfo.Coded_Char_Set_ID; 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (jobinfo.Default_Coded_Char_Set_Id != 0xFFFF) { 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ccsid = (uint32_t)jobinfo.Default_Coded_Char_Set_Id; 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* else use the default */ 1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(codepage,"ibm-%d", ccsid); 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return codepage; 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1924103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS390 1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char codepage[64]; 192685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 192785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho strncpy(codepage, nl_langinfo(CODESET),63-strlen(UCNV_SWAP_LFNL_OPTION_STRING)); 192885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho strcat(codepage,UCNV_SWAP_LFNL_OPTION_STRING); 1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru codepage[63] = 0; /* NULL terminate */ 193085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return codepage; 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1933103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CLASSIC_MACOS 1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return "macintosh"; /* TODO: Macintosh Roman. There must be a better way. fixme! */ 1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1936103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API 1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char codepage[64]; 1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(codepage, "windows-%d", GetACP()); 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return codepage; 1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#elif U_POSIX_LOCALE 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char codesetName[100]; 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *localeName = NULL; 1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *name = NULL; 1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 194627f654740f2a26ad62a5c155af9199af9e69b889claireho localeName = uprv_getPOSIXIDForDefaultCodepage(); 1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(codesetName, 0, sizeof(codesetName)); 1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_NL_LANGINFO_CODESET 194927f654740f2a26ad62a5c155af9199af9e69b889claireho /* When available, check nl_langinfo first because it usually gives more 195027f654740f2a26ad62a5c155af9199af9e69b889claireho useful names. It depends on LC_CTYPE. 1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nl_langinfo may use the same buffer as setlocale. */ 1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *codeset = nl_langinfo(U_NL_LANGINFO_CODESET); 1954103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_IS_DARWIN_BASED || U_PLATFORM_IS_LINUX_BASED 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 195650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * On Linux and MacOSX, ensure that default codepage for non C/POSIX locale is UTF-8 195750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * instead of ASCII. 195850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 195950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (uprv_strcmp(localeName, "en_US_POSIX") != 0) { 196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho codeset = remapPlatformDependentCodepage(localeName, codeset); 196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else 196250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 196350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 196450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho codeset = remapPlatformDependentCodepage(NULL, codeset); 196550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 196650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (codeset != NULL) { 1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strncpy(codesetName, codeset, sizeof(codesetName)); 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru codesetName[sizeof(codesetName)-1] = 0; 1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return codesetName; 1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 197527f654740f2a26ad62a5c155af9199af9e69b889claireho /* Use setlocale in a nice way, and then check some environment variables. 197627f654740f2a26ad62a5c155af9199af9e69b889claireho Maybe the application used setlocale already. 197727f654740f2a26ad62a5c155af9199af9e69b889claireho */ 197827f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_memset(codesetName, 0, sizeof(codesetName)); 197927f654740f2a26ad62a5c155af9199af9e69b889claireho name = getCodepageFromPOSIXID(localeName, codesetName, sizeof(codesetName)); 198027f654740f2a26ad62a5c155af9199af9e69b889claireho if (name) { 198127f654740f2a26ad62a5c155af9199af9e69b889claireho /* if we can find the codeset name from setlocale, return that. */ 198227f654740f2a26ad62a5c155af9199af9e69b889claireho return name; 198327f654740f2a26ad62a5c155af9199af9e69b889claireho } 198427f654740f2a26ad62a5c155af9199af9e69b889claireho 1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*codesetName == 0) 1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Everything failed. Return US ASCII (ISO 646). */ 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void)uprv_strcpy(codesetName, "US-ASCII"); 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return codesetName; 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return "US-ASCII"; 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_getDefaultCodepage() 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char const *name = NULL; 2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (name == NULL) { 2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = int_getDefaultCodepage(); 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return name; 2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 200885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif /* !U_CHARSET_IS_UTF8 */ 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* end of platform-specific implementation -------------- */ 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* version handling --------------------------------------------------------- */ 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_versionFromString(UVersionInfo versionArray, const char *versionString) { 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *end; 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint16_t part=0; 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(versionArray==NULL) { 2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(versionString!=NULL) { 2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(;;) { 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru versionArray[part]=(uint8_t)uprv_strtoul(versionString, &end, 10); 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(end==versionString || ++part==U_MAX_VERSION_LENGTH || *end!=U_VERSION_DELIMITER) { 2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru versionString=end+1; 2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(part<U_MAX_VERSION_LENGTH) { 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru versionArray[part++]=0; 2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 204085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hou_versionFromUString(UVersionInfo versionArray, const UChar *versionString) { 204185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(versionArray!=NULL && versionString!=NULL) { 204285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char versionChars[U_MAX_VERSION_STRING_LENGTH+1]; 204385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t len = u_strlen(versionString); 204485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(len>U_MAX_VERSION_STRING_LENGTH) { 204585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho len = U_MAX_VERSION_STRING_LENGTH; 204685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 204785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_UCharsToChars(versionString, versionChars, len); 204850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho versionChars[len]=0; 204985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_versionFromString(versionArray, versionChars); 205085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 205185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 205285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 205385bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CAPI void U_EXPORT2 2054103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusu_versionToString(const UVersionInfo versionArray, char *versionString) { 2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint16_t count, part; 2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t field; 2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(versionString==NULL) { 2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(versionArray==NULL) { 2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru versionString[0]=0; 2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* count how many fields need to be written */ 2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(count=4; count>0 && versionArray[count-1]==0; --count) { 2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(count <= 1) { 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = 2; 2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* write the first part */ 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* write the decimal field value */ 2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field=versionArray[0]; 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(field>=100) { 2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString++=(char)('0'+field/100); 2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field%=100; 2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(field>=10) { 2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString++=(char)('0'+field/10); 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field%=10; 2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString++=(char)('0'+field); 2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* write the following parts */ 2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(part=1; part<count; ++part) { 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* write a dot first */ 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString++=U_VERSION_DELIMITER; 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* write the decimal field value */ 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field=versionArray[part]; 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(field>=100) { 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString++=(char)('0'+field/100); 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field%=100; 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(field>=10) { 2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString++=(char)('0'+field/10); 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field%=10; 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString++=(char)('0'+field); 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NUL-terminate */ 2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *versionString=0; 2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getVersion(UVersionInfo versionArray) { 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_versionFromString(versionArray, U_ICU_VERSION); 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 211650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * icucfg.h dependent code 211750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 211850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 211950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if U_ENABLE_DYLOAD 212050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 212154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API 212250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2123103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if HAVE_DLFCN_H 212450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 212550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef __MVS__ 212650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifndef __SUSV3 212750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define __SUSV3 1 212850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 212950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 213050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <dlfcn.h> 213150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 213250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 213350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void * U_EXPORT2 213450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_open(const char *libName, UErrorCode *status) { 213527f654740f2a26ad62a5c155af9199af9e69b889claireho void *ret = NULL; 213627f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*status)) return ret; 213727f654740f2a26ad62a5c155af9199af9e69b889claireho ret = dlopen(libName, RTLD_NOW|RTLD_GLOBAL); 213827f654740f2a26ad62a5c155af9199af9e69b889claireho if(ret==NULL) { 2139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_TRACE_DYLOAD 2140103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("dlerror on dlopen(%s): %s\n", libName, dlerror()); 214127f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 214227f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_MISSING_RESOURCE_ERROR; 214327f654740f2a26ad62a5c155af9199af9e69b889claireho } 214427f654740f2a26ad62a5c155af9199af9e69b889claireho return ret; 214550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 214650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 214750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void U_EXPORT2 214850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_close(void *lib, UErrorCode *status) { 214927f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*status)) return; 215027f654740f2a26ad62a5c155af9199af9e69b889claireho dlclose(lib); 215150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 215250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_INTERNAL UVoidFunction* U_EXPORT2 2154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehouprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { 2155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho union { 2156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UVoidFunction *fp; 2157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius void *vp; 2158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } uret; 2159103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uret.fp = NULL; 2160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) return uret.fp; 2161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uret.vp = dlsym(lib, sym); 2162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(uret.vp == NULL) { 2163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_TRACE_DYLOAD 2164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("dlerror on dlsym(%p,%s): %s\n", lib,sym, dlerror()); 2165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 216627f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_MISSING_RESOURCE_ERROR; 216727f654740f2a26ad62a5c155af9199af9e69b889claireho } 2168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return uret.fp; 216950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 217050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 217150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 217250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 217350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* null (nonexistent) implementation. */ 217450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 217550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void * U_EXPORT2 217650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_open(const char *libName, UErrorCode *status) { 217727f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*status)) return NULL; 217827f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_UNSUPPORTED_ERROR; 217927f654740f2a26ad62a5c155af9199af9e69b889claireho return NULL; 218050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 218150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 218250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void U_EXPORT2 218350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_close(void *lib, UErrorCode *status) { 218427f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*status)) return; 218527f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_UNSUPPORTED_ERROR; 218627f654740f2a26ad62a5c155af9199af9e69b889claireho return; 218750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 218850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 218950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_INTERNAL UVoidFunction* U_EXPORT2 2191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehouprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { 2192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_SUCCESS(*status)) { 2193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *status = U_UNSUPPORTED_ERROR; 2194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return (UVoidFunction*)NULL; 219650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 219750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 219850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 219950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 220050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 220150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 220254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API 220350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 220450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void * U_EXPORT2 220550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_open(const char *libName, UErrorCode *status) { 220627f654740f2a26ad62a5c155af9199af9e69b889claireho HMODULE lib = NULL; 220727f654740f2a26ad62a5c155af9199af9e69b889claireho 220827f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*status)) return NULL; 220927f654740f2a26ad62a5c155af9199af9e69b889claireho 2210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho lib = LoadLibraryA(libName); 221127f654740f2a26ad62a5c155af9199af9e69b889claireho 221227f654740f2a26ad62a5c155af9199af9e69b889claireho if(lib==NULL) { 221327f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_MISSING_RESOURCE_ERROR; 221427f654740f2a26ad62a5c155af9199af9e69b889claireho } 221527f654740f2a26ad62a5c155af9199af9e69b889claireho 221627f654740f2a26ad62a5c155af9199af9e69b889claireho return (void*)lib; 221750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 221850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 221950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void U_EXPORT2 222050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_close(void *lib, UErrorCode *status) { 222127f654740f2a26ad62a5c155af9199af9e69b889claireho HMODULE handle = (HMODULE)lib; 222227f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*status)) return; 222327f654740f2a26ad62a5c155af9199af9e69b889claireho 222427f654740f2a26ad62a5c155af9199af9e69b889claireho FreeLibrary(handle); 222527f654740f2a26ad62a5c155af9199af9e69b889claireho 222627f654740f2a26ad62a5c155af9199af9e69b889claireho return; 222750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 222850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 222950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_INTERNAL UVoidFunction* U_EXPORT2 2231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehouprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { 223227f654740f2a26ad62a5c155af9199af9e69b889claireho HMODULE handle = (HMODULE)lib; 2233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UVoidFunction* addr = NULL; 223427f654740f2a26ad62a5c155af9199af9e69b889claireho 223527f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*status) || lib==NULL) return NULL; 223627f654740f2a26ad62a5c155af9199af9e69b889claireho 2237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho addr = (UVoidFunction*)GetProcAddress(handle, sym); 223827f654740f2a26ad62a5c155af9199af9e69b889claireho 223927f654740f2a26ad62a5c155af9199af9e69b889claireho if(addr==NULL) { 224027f654740f2a26ad62a5c155af9199af9e69b889claireho DWORD lastError = GetLastError(); 224127f654740f2a26ad62a5c155af9199af9e69b889claireho if(lastError == ERROR_PROC_NOT_FOUND) { 224227f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_MISSING_RESOURCE_ERROR; 224327f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 224427f654740f2a26ad62a5c155af9199af9e69b889claireho *status = U_UNSUPPORTED_ERROR; /* other unknown error. */ 224527f654740f2a26ad62a5c155af9199af9e69b889claireho } 224627f654740f2a26ad62a5c155af9199af9e69b889claireho } 224727f654740f2a26ad62a5c155af9199af9e69b889claireho 224827f654740f2a26ad62a5c155af9199af9e69b889claireho return addr; 224950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 225050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 225150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 225250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 225350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 225450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* No dynamic loading set. */ 225550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 225650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void * U_EXPORT2 225750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_open(const char *libName, UErrorCode *status) { 225850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*status)) return NULL; 225950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_UNSUPPORTED_ERROR; 226050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 226150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 226250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 226350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void U_EXPORT2 226450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_dl_close(void *lib, UErrorCode *status) { 226550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*status)) return; 226650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_UNSUPPORTED_ERROR; 226750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 226850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 226950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 227050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_INTERNAL UVoidFunction* U_EXPORT2 2272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehouprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { 2273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_SUCCESS(*status)) { 227450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_UNSUPPORTED_ERROR; 2275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return (UVoidFunction*)NULL; 227750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 227850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 227950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* U_ENABLE_DYLOAD */ 228050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Hey, Emacs, please set the following: 2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables: 2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil 2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End: 2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2289