Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: source/common/putil.cpp

Issue 845603002: Update ICU to 54.1 step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@master
Patch Set: remove unusued directories Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/common/propname_data.h ('k') | source/common/putilimp.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ****************************************************************************** 2 ******************************************************************************
3 * 3 *
4 * Copyright (C) 1997-2013, International Business Machines 4 * Copyright (C) 1997-2014, International Business Machines
5 * Corporation and others. All Rights Reserved. 5 * Corporation and others. All Rights Reserved.
6 * 6 *
7 ****************************************************************************** 7 ******************************************************************************
8 * 8 *
9 * FILE NAME : putil.c (previously putil.cpp and ptypes.cpp) 9 * FILE NAME : putil.c (previously putil.cpp and ptypes.cpp)
10 * 10 *
11 * Date Name Description 11 * Date Name Description
12 * 04/14/97 aliu Creation. 12 * 04/14/97 aliu Creation.
13 * 04/24/97 aliu Added getDefaultDataDirectory() and 13 * 04/24/97 aliu Added getDefaultDataDirectory() and
14 * getDefaultLocaleID(). 14 * getDefaultLocaleID().
(...skipping 30 matching lines...) Expand all
45 #include "unicode/utypes.h" 45 #include "unicode/utypes.h"
46 #include "unicode/putil.h" 46 #include "unicode/putil.h"
47 #include "unicode/ustring.h" 47 #include "unicode/ustring.h"
48 #include "putilimp.h" 48 #include "putilimp.h"
49 #include "uassert.h" 49 #include "uassert.h"
50 #include "umutex.h" 50 #include "umutex.h"
51 #include "cmemory.h" 51 #include "cmemory.h"
52 #include "cstring.h" 52 #include "cstring.h"
53 #include "locmap.h" 53 #include "locmap.h"
54 #include "ucln_cmn.h" 54 #include "ucln_cmn.h"
55 #include "charstr.h"
55 56
56 /* Include standard headers. */ 57 /* Include standard headers. */
57 #include <stdio.h> 58 #include <stdio.h>
58 #include <stdlib.h> 59 #include <stdlib.h>
59 #include <string.h> 60 #include <string.h>
60 #include <math.h> 61 #include <math.h>
61 #include <locale.h> 62 #include <locale.h>
62 #include <float.h> 63 #include <float.h>
63 64
64 #ifndef U_COMMON_IMPLEMENTATION 65 #ifndef U_COMMON_IMPLEMENTATION
(...skipping 15 matching lines...) Expand all
80 # define NOIME 81 # define NOIME
81 # define NOMCX 82 # define NOMCX
82 # include <windows.h> 83 # include <windows.h>
83 # include "wintz.h" 84 # include "wintz.h"
84 #elif U_PLATFORM == U_PF_OS400 85 #elif U_PLATFORM == U_PF_OS400
85 # include <float.h> 86 # include <float.h>
86 # include <qusec.h> /* error code structure */ 87 # include <qusec.h> /* error code structure */
87 # include <qusrjobi.h> 88 # include <qusrjobi.h>
88 # include <qliept.h> /* EPT_CALL macro - this include must be after all other "QSYSINCs" */ 89 # include <qliept.h> /* EPT_CALL macro - this include must be after all other "QSYSINCs" */
89 # include <mih/testptr.h> /* For uprv_maximumPtr */ 90 # include <mih/testptr.h> /* For uprv_maximumPtr */
90 #elif U_PLATFORM == U_PF_CLASSIC_MACOS
91 # include <Files.h>
92 # include <IntlResources.h>
93 # include <Script.h>
94 # include <Folders.h>
95 # include <MacTypes.h>
96 # include <TextUtils.h>
97 # define ICU_NO_USER_DATA_OVERRIDE 1
98 #elif U_PLATFORM == U_PF_OS390 91 #elif U_PLATFORM == U_PF_OS390
99 # include "unicode/ucnv.h" /* Needed for UCNV_SWAP_LFNL_OPTION_STRING */ 92 # include "unicode/ucnv.h" /* Needed for UCNV_SWAP_LFNL_OPTION_STRING */
100 #elif U_PLATFORM_IS_DARWIN_BASED || U_PLATFORM_IS_LINUX_BASED || U_PLATFORM == U _PF_BSD || U_PLATFORM == U_PF_SOLARIS 93 #elif U_PLATFORM_IS_DARWIN_BASED || U_PLATFORM_IS_LINUX_BASED || U_PLATFORM == U _PF_BSD || U_PLATFORM == U_PF_SOLARIS
101 # include <limits.h> 94 # include <limits.h>
102 # include <unistd.h> 95 # include <unistd.h>
103 # if U_PLATFORM == U_PF_SOLARIS 96 # if U_PLATFORM == U_PF_SOLARIS
104 # ifndef _XPG4_2 97 # ifndef _XPG4_2
105 # define _XPG4_2 98 # define _XPG4_2
106 # endif 99 # endif
107 # endif 100 # endif
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 # endif 144 # endif
152 # ifndef HAVE_GETTIMEOFDAY 145 # ifndef HAVE_GETTIMEOFDAY
153 # define HAVE_GETTIMEOFDAY 1 146 # define HAVE_GETTIMEOFDAY 1
154 # endif 147 # endif
155 #else 148 #else
156 # define HAVE_DLFCN_H 0 149 # define HAVE_DLFCN_H 0
157 # define HAVE_DLOPEN 0 150 # define HAVE_DLOPEN 0
158 # define HAVE_GETTIMEOFDAY 0 151 # define HAVE_GETTIMEOFDAY 0
159 #endif 152 #endif
160 153
161 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 154 U_NAMESPACE_USE
162 155
163 /* Define the extension for data files, again... */ 156 /* Define the extension for data files, again... */
164 #define DATA_TYPE "dat" 157 #define DATA_TYPE "dat"
165 158
166 /* Leave this copyright notice here! */ 159 /* Leave this copyright notice here! */
167 static const char copyright[] = U_COPYRIGHT_STRING; 160 static const char copyright[] = U_COPYRIGHT_STRING;
168 161
169 /* floating point implementations ------------------------------------------- */ 162 /* floating point implementations ------------------------------------------- */
170 163
171 /* We return QNAN rather than SNAN*/ 164 /* We return QNAN rather than SNAN*/
172 #define SIGN 0x80000000U 165 #define SIGN 0x80000000U
173 166
174 /* Make it easy to define certain types of constants */ 167 /* Make it easy to define certain types of constants */
175 typedef union { 168 typedef union {
176 int64_t i64; /* This must be defined first in order to allow the initializat ion to work. This is a C89 feature. */ 169 int64_t i64; /* This must be defined first in order to allow the initializat ion to work. This is a C89 feature. */
177 double d64; 170 double d64;
178 } BitPatternConversion; 171 } BitPatternConversion;
179 static const BitPatternConversion gNan = { (int64_t) INT64_C(0x7FF8000000000000) }; 172 static const BitPatternConversion gNan = { (int64_t) INT64_C(0x7FF8000000000000) };
180 static const BitPatternConversion gInf = { (int64_t) INT64_C(0x7FF0000000000000) }; 173 static const BitPatternConversion gInf = { (int64_t) INT64_C(0x7FF0000000000000) };
181 174
182 /*--------------------------------------------------------------------------- 175 /*---------------------------------------------------------------------------
183 Platform utilities 176 Platform utilities
184 Our general strategy is to assume we're on a POSIX platform. Platforms which 177 Our general strategy is to assume we're on a POSIX platform. Platforms which
185 are non-POSIX must declare themselves so. The default POSIX implementation 178 are non-POSIX must declare themselves so. The default POSIX implementation
186 will sometimes work for non-POSIX platforms as well (e.g., the NaN-related 179 will sometimes work for non-POSIX platforms as well (e.g., the NaN-related
187 functions). 180 functions).
188 ---------------------------------------------------------------------------*/ 181 ---------------------------------------------------------------------------*/
189 182
190 #if U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_CLASSIC_MACOS || U_PLAT FORM == U_PF_OS400 183 #if U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_OS400
191 # undef U_POSIX_LOCALE 184 # undef U_POSIX_LOCALE
192 #else 185 #else
193 # define U_POSIX_LOCALE 1 186 # define U_POSIX_LOCALE 1
194 #endif 187 #endif
195 188
196 /* 189 /*
197 WARNING! u_topNBytesOfDouble and u_bottomNBytesOfDouble 190 WARNING! u_topNBytesOfDouble and u_bottomNBytesOfDouble
198 can't be properly optimized by the gcc compiler sometimes (i.e. gcc 3.2). 191 can't be properly optimized by the gcc compiler sometimes (i.e. gcc 3.2).
199 */ 192 */
200 #if !IEEE_754 193 #if !IEEE_754
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 return getUTCtime_fake(); /* Hook for overriding the clock */ 292 return getUTCtime_fake(); /* Hook for overriding the clock */
300 #else 293 #else
301 return uprv_getRawUTCtime(); 294 return uprv_getRawUTCtime();
302 #endif 295 #endif
303 } 296 }
304 297
305 /* Return UTC (GMT) time measured in milliseconds since 0:00 on 1/1/70.*/ 298 /* Return UTC (GMT) time measured in milliseconds since 0:00 on 1/1/70.*/
306 U_CAPI UDate U_EXPORT2 299 U_CAPI UDate U_EXPORT2
307 uprv_getRawUTCtime() 300 uprv_getRawUTCtime()
308 { 301 {
309 #if U_PLATFORM == U_PF_CLASSIC_MACOS 302 #if U_PLATFORM_USES_ONLY_WIN32_API
310 time_t t, t1, t2;
311 struct tm tmrec;
312
313 uprv_memset( &tmrec, 0, sizeof(tmrec) );
314 tmrec.tm_year = 70;
315 tmrec.tm_mon = 0;
316 tmrec.tm_mday = 1;
317 t1 = mktime(&tmrec); /* seconds of 1/1/1970*/
318
319 time(&t);
320 uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) );
321 t2 = mktime(&tmrec); /* seconds of current GMT*/
322 return (UDate)(t2 - t1) * U_MILLIS_PER_SECOND; /* GMT (or UTC) in se conds since 1970*/
323 #elif U_PLATFORM_USES_ONLY_WIN32_API
324 303
325 FileTimeConversion winTime; 304 FileTimeConversion winTime;
326 GetSystemTimeAsFileTime(&winTime.fileTime); 305 GetSystemTimeAsFileTime(&winTime.fileTime);
327 return (UDate)((winTime.int64 - EPOCH_BIAS) / HECTONANOSECOND_PER_MILLISECON D); 306 return (UDate)((winTime.int64 - EPOCH_BIAS) / HECTONANOSECOND_PER_MILLISECON D);
328 #else 307 #else
329 308
330 #if HAVE_GETTIMEOFDAY 309 #if HAVE_GETTIMEOFDAY
331 struct timeval posixTime; 310 struct timeval posixTime;
332 gettimeofday(&posixTime, NULL); 311 gettimeofday(&posixTime, NULL);
333 return (UDate)(((int64_t)posixTime.tv_sec * U_MILLIS_PER_SECOND) + (posixTim e.tv_usec/1000)); 312 return (UDate)(((int64_t)posixTime.tv_sec * U_MILLIS_PER_SECOND) + (posixTim e.tv_usec/1000));
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 }; 810 };
832 811
833 /*#define DEBUG_TZNAME*/ 812 /*#define DEBUG_TZNAME*/
834 813
835 static const char* remapShortTimeZone(const char *stdID, const char *dstID, int3 2_t daylightType, int32_t offset) 814 static const char* remapShortTimeZone(const char *stdID, const char *dstID, int3 2_t daylightType, int32_t offset)
836 { 815 {
837 int32_t idx; 816 int32_t idx;
838 #ifdef DEBUG_TZNAME 817 #ifdef DEBUG_TZNAME
839 fprintf(stderr, "TZ=%s std=%s dst=%s daylight=%d offset=%d\n", getenv("TZ"), stdID, dstID, daylightType, offset); 818 fprintf(stderr, "TZ=%s std=%s dst=%s daylight=%d offset=%d\n", getenv("TZ"), stdID, dstID, daylightType, offset);
840 #endif 819 #endif
841 for (idx = 0; idx < LENGTHOF(OFFSET_ZONE_MAPPINGS); idx++) 820 for (idx = 0; idx < UPRV_LENGTHOF(OFFSET_ZONE_MAPPINGS); idx++)
842 { 821 {
843 if (offset == OFFSET_ZONE_MAPPINGS[idx].offsetSeconds 822 if (offset == OFFSET_ZONE_MAPPINGS[idx].offsetSeconds
844 && daylightType == OFFSET_ZONE_MAPPINGS[idx].daylightType 823 && daylightType == OFFSET_ZONE_MAPPINGS[idx].daylightType
845 && strcmp(OFFSET_ZONE_MAPPINGS[idx].stdID, stdID) == 0 824 && strcmp(OFFSET_ZONE_MAPPINGS[idx].stdID, stdID) == 0
846 && strcmp(OFFSET_ZONE_MAPPINGS[idx].dstID, dstID) == 0) 825 && strcmp(OFFSET_ZONE_MAPPINGS[idx].dstID, dstID) == 0)
847 { 826 {
848 return OFFSET_ZONE_MAPPINGS[idx].olsonID; 827 return OFFSET_ZONE_MAPPINGS[idx].olsonID;
849 } 828 }
850 } 829 }
851 return NULL; 830 return NULL;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 875
897 if (sizeFile != tzInfo->defaultTZFileSize) { 876 if (sizeFile != tzInfo->defaultTZFileSize) {
898 result = FALSE; 877 result = FALSE;
899 } else { 878 } else {
900 /* Store the data from the files in seperate buffers and 879 /* Store the data from the files in seperate buffers and
901 * compare each byte to determine equality. 880 * compare each byte to determine equality.
902 */ 881 */
903 if (tzInfo->defaultTZBuffer == NULL) { 882 if (tzInfo->defaultTZBuffer == NULL) {
904 rewind(tzInfo->defaultTZFilePtr); 883 rewind(tzInfo->defaultTZFilePtr);
905 tzInfo->defaultTZBuffer = (char*)uprv_malloc(sizeof(char) * tzIn fo->defaultTZFileSize); 884 tzInfo->defaultTZBuffer = (char*)uprv_malloc(sizeof(char) * tzIn fo->defaultTZFileSize);
906 sizeFileRead = fread(tzInfo->defaultTZBuffer, 1, tzInfo->default TZFileSize, tzInfo->defaultTZFilePtr); 885 fread(tzInfo->defaultTZBuffer, 1, tzInfo->defaultTZFileSize, tzI nfo->defaultTZFilePtr);
907 } 886 }
908 rewind(file); 887 rewind(file);
909 while(sizeFileLeft > 0) { 888 while(sizeFileLeft > 0) {
910 uprv_memset(bufferFile, 0, MAX_READ_SIZE); 889 uprv_memset(bufferFile, 0, MAX_READ_SIZE);
911 sizeFileToRead = sizeFileLeft < MAX_READ_SIZE ? sizeFileLeft : M AX_READ_SIZE; 890 sizeFileToRead = sizeFileLeft < MAX_READ_SIZE ? sizeFileLeft : M AX_READ_SIZE;
912 891
913 sizeFileRead = fread(bufferFile, 1, sizeFileToRead, file); 892 sizeFileRead = fread(bufferFile, 1, sizeFileToRead, file);
914 if (memcmp(tzInfo->defaultTZBuffer + tzInfo->defaultTZPosition, bufferFile, sizeFileRead) != 0) { 893 if (memcmp(tzInfo->defaultTZBuffer + tzInfo->defaultTZPosition, bufferFile, sizeFileRead) != 0) {
915 result = FALSE; 894 result = FALSE;
916 break; 895 break;
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 } 1106 }
1128 return U_TZNAME[n]; 1107 return U_TZNAME[n];
1129 #endif 1108 #endif
1130 #else 1109 #else
1131 return ""; 1110 return "";
1132 #endif 1111 #endif
1133 } 1112 }
1134 1113
1135 /* Get and set the ICU data directory --------------------------------------- */ 1114 /* Get and set the ICU data directory --------------------------------------- */
1136 1115
1116 static icu::UInitOnce gDataDirInitOnce = U_INITONCE_INITIALIZER;
1137 static char *gDataDirectory = NULL; 1117 static char *gDataDirectory = NULL;
1118
1119 UInitOnce gTimeZoneFilesInitOnce = U_INITONCE_INITIALIZER;
1120 static CharString *gTimeZoneFilesDirectory = NULL;
1121
1138 #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API 1122 #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API
1139 static char *gCorrectedPOSIXLocale = NULL; /* Heap allocated */ 1123 static char *gCorrectedPOSIXLocale = NULL; /* Heap allocated */
1140 #endif 1124 #endif
1141 1125
1142 static UBool U_CALLCONV putil_cleanup(void) 1126 static UBool U_CALLCONV putil_cleanup(void)
1143 { 1127 {
1144 if (gDataDirectory && *gDataDirectory) { 1128 if (gDataDirectory && *gDataDirectory) {
1145 uprv_free(gDataDirectory); 1129 uprv_free(gDataDirectory);
1146 } 1130 }
1147 gDataDirectory = NULL; 1131 gDataDirectory = NULL;
1132 gDataDirInitOnce.reset();
1133
1134 delete gTimeZoneFilesDirectory;
1135 gTimeZoneFilesDirectory = NULL;
1136 gTimeZoneFilesInitOnce.reset();
1137
1148 #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API 1138 #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API
1149 if (gCorrectedPOSIXLocale) { 1139 if (gCorrectedPOSIXLocale) {
1150 uprv_free(gCorrectedPOSIXLocale); 1140 uprv_free(gCorrectedPOSIXLocale);
1151 gCorrectedPOSIXLocale = NULL; 1141 gCorrectedPOSIXLocale = NULL;
1152 } 1142 }
1153 #endif 1143 #endif
1154 return TRUE; 1144 return TRUE;
1155 } 1145 }
1156 1146
1157 /* 1147 /*
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 } 1215 }
1226 1216
1227 /* Temporary backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR 1217 /* Temporary backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR
1228 until some client wrapper makefiles are updated */ 1218 until some client wrapper makefiles are updated */
1229 #if U_PLATFORM_IS_DARWIN_BASED && TARGET_IPHONE_SIMULATOR 1219 #if U_PLATFORM_IS_DARWIN_BASED && TARGET_IPHONE_SIMULATOR
1230 # if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR) 1220 # if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
1231 # define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT" 1221 # define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT"
1232 # endif 1222 # endif
1233 #endif 1223 #endif
1234 1224
1235 U_CAPI const char * U_EXPORT2 1225 static void U_CALLCONV dataDirectoryInitFn() {
1236 u_getDataDirectory(void) { 1226 /* If we already have the directory, then return immediately. Will happen if user called
1227 * u_setDataDirectory().
1228 */
1229 if (gDataDirectory) {
1230 return;
1231 }
1232
1237 const char *path = NULL; 1233 const char *path = NULL;
1238 #if defined(ICU_DATA_DIR_PREFIX_ENV_VAR) 1234 #if defined(ICU_DATA_DIR_PREFIX_ENV_VAR)
1239 char datadir_path_buffer[PATH_MAX]; 1235 char datadir_path_buffer[PATH_MAX];
1240 #endif 1236 #endif
1241 1237
1242 /* if we have the directory, then return it immediately */
1243 if(gDataDirectory) {
1244 return gDataDirectory;
1245 }
1246
1247 /* 1238 /*
1248 When ICU_NO_USER_DATA_OVERRIDE is defined, users aren't allowed to 1239 When ICU_NO_USER_DATA_OVERRIDE is defined, users aren't allowed to
1249 override ICU's data with the ICU_DATA environment variable. This prevents 1240 override ICU's data with the ICU_DATA environment variable. This prevents
1250 problems where multiple custom copies of ICU's specific version of data 1241 problems where multiple custom copies of ICU's specific version of data
1251 are installed on a system. Either the application must define the data 1242 are installed on a system. Either the application must define the data
1252 directory with u_setDataDirectory, define ICU_DATA_DIR when compiling 1243 directory with u_setDataDirectory, define ICU_DATA_DIR when compiling
1253 ICU, set the data with udata_setCommonData or trust that all of the 1244 ICU, set the data with udata_setCommonData or trust that all of the
1254 required data is contained in ICU's data library that contains 1245 required data is contained in ICU's data library that contains
1255 the entry point defined by U_ICUDATA_ENTRY_POINT. 1246 the entry point defined by U_ICUDATA_ENTRY_POINT.
1256 1247
(...skipping 30 matching lines...) Expand all
1287 # endif 1278 # endif
1288 } 1279 }
1289 #endif 1280 #endif
1290 1281
1291 if(path==NULL) { 1282 if(path==NULL) {
1292 /* It looks really bad, set it to something. */ 1283 /* It looks really bad, set it to something. */
1293 path = ""; 1284 path = "";
1294 } 1285 }
1295 1286
1296 u_setDataDirectory(path); 1287 u_setDataDirectory(path);
1288 return;
1289 }
1290
1291 U_CAPI const char * U_EXPORT2
1292 u_getDataDirectory(void) {
1293 umtx_initOnce(gDataDirInitOnce, &dataDirectoryInitFn);
1297 return gDataDirectory; 1294 return gDataDirectory;
1298 } 1295 }
1299 1296
1297 static void setTimeZoneFilesDir(const char *path, UErrorCode &status) {
1298 if (U_FAILURE(status)) {
1299 return;
1300 }
1301 gTimeZoneFilesDirectory->clear();
1302 gTimeZoneFilesDirectory->append(path, status);
1303 #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
1304 char *p = gTimeZoneFilesDirectory->data();
1305 while (p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) {
1306 *p = U_FILE_SEP_CHAR;
1307 }
1308 #endif
1309 }
1310
1311 #define TO_STRING(x) TO_STRING_2(x)
1312 #define TO_STRING_2(x) #x
1313
1314 static void U_CALLCONV TimeZoneDataDirInitFn(UErrorCode &status) {
1315 U_ASSERT(gTimeZoneFilesDirectory == NULL);
1316 ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup);
1317 gTimeZoneFilesDirectory = new CharString();
1318 if (gTimeZoneFilesDirectory == NULL) {
1319 status = U_MEMORY_ALLOCATION_ERROR;
1320 return;
1321 }
1322 const char *dir = getenv("ICU_TIMEZONE_FILES_DIR");
1323 #if defined(U_TIMEZONE_FILES_DIR)
1324 if (dir == NULL) {
1325 dir = TO_STRING(U_TIMEZONE_FILES_DIR);
1326 }
1327 #endif
1328 if (dir == NULL) {
1329 dir = "";
1330 }
1331 setTimeZoneFilesDir(dir, status);
1332 }
1300 1333
1301 1334
1335 U_CAPI const char * U_EXPORT2
1336 u_getTimeZoneFilesDirectory(UErrorCode *status) {
1337 umtx_initOnce(gTimeZoneFilesInitOnce, &TimeZoneDataDirInitFn, *status);
1338 return U_SUCCESS(*status) ? gTimeZoneFilesDirectory->data() : "";
1339 }
1302 1340
1341 U_CAPI void U_EXPORT2
1342 u_setTimeZoneFilesDirectory(const char *path, UErrorCode *status) {
1343 umtx_initOnce(gTimeZoneFilesInitOnce, &TimeZoneDataDirInitFn, *status);
1344 setTimeZoneFilesDir(path, *status);
1303 1345
1304 /* Macintosh-specific locale information ------------------------------------ */ 1346 // Note: this function does some extra churn, first setting based on the
1305 #if U_PLATFORM == U_PF_CLASSIC_MACOS 1347 // environment, then immediately replacing with the value passed in.
1348 // The logic is simpler that way, and performance shouldn't be an issu e.
1349 }
1306 1350
1307 typedef struct {
1308 int32_t script;
1309 int32_t region;
1310 int32_t lang;
1311 int32_t date_region;
1312 const char* posixID;
1313 } mac_lc_rec;
1314
1315 /* Todo: This will be updated with a newer version from www.unicode.org web
1316 page when it's available.*/
1317 #define MAC_LC_MAGIC_NUMBER -5
1318 #define MAC_LC_INIT_NUMBER -9
1319
1320 static const mac_lc_rec mac_lc_recs[] = {
1321 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 0, "en_US",
1322 /* United States*/
1323 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 1, "fr_FR",
1324 /* France*/
1325 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 2, "en_GB",
1326 /* Great Britain*/
1327 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 3, "de_DE",
1328 /* Germany*/
1329 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 4, "it_IT",
1330 /* Italy*/
1331 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 5, "nl_NL",
1332 /* Metherlands*/
1333 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 6, "fr_BE",
1334 /* French for Belgium or Lxembourg*/
1335 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 7, "sv_SE",
1336 /* Sweden*/
1337 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 9, "da_DK",
1338 /* Denmark*/
1339 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 10, "pt_PT",
1340 /* Portugal*/
1341 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 11, "fr_CA",
1342 /* French Canada*/
1343 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 13, "is_IS",
1344 /* Israel*/
1345 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 14, "ja_JP",
1346 /* Japan*/
1347 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 15, "en_AU",
1348 /* Australia*/
1349 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 16, "ar_AE",
1350 /* the Arabic world (?)*/
1351 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 17, "fi_FI",
1352 /* Finland*/
1353 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 18, "fr_CH",
1354 /* French for Switzerland*/
1355 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 19, "de_CH",
1356 /* German for Switzerland*/
1357 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 20, "el_GR",
1358 /* Greece*/
1359 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 21, "is_IS",
1360 /* Iceland ===*/
1361 /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 22, "",*/
1362 /* Malta ===*/
1363 /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 23, "",*/
1364 /* Cyprus ===*/
1365 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 24, "tr_TR",
1366 /* Turkey ===*/
1367 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 25, "sh_YU",
1368 /* Croatian system for Yugoslavia*/
1369 /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 33, "",*/
1370 /* Hindi system for India*/
1371 /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 34, "",*/
1372 /* Pakistan*/
1373 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 41, "lt_LT",
1374 /* Lithuania*/
1375 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 42, "pl_PL",
1376 /* Poland*/
1377 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 43, "hu_HU",
1378 /* Hungary*/
1379 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 44, "et_EE",
1380 /* Estonia*/
1381 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 45, "lv_LV",
1382 /* Latvia*/
1383 /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 46, "",*/
1384 /* Lapland [Ask Rich for the data. HS]*/
1385 /*MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 47, "",*/
1386 /* Faeroe Islands*/
1387 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 48, "fa_IR",
1388 /* Iran*/
1389 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 49, "ru_RU",
1390 /* Russia*/
1391 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 50, "en_IE",
1392 /* Ireland*/
1393 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 51, "ko_KR",
1394 /* Korea*/
1395 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 52, "zh_CN",
1396 /* People's Republic of China*/
1397 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 53, "zh_TW",
1398 /* Taiwan*/
1399 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, 54, "th_TH",
1400 /* Thailand*/
1401
1402 /* fallback is en_US*/
1403 MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER, MAC_LC_MAGIC_NUMBER,
1404 MAC_LC_MAGIC_NUMBER, "en_US"
1405 };
1406
1407 #endif
1408 1351
1409 #if U_POSIX_LOCALE 1352 #if U_POSIX_LOCALE
1410 /* A helper function used by uprv_getPOSIXIDForDefaultLocale and 1353 /* A helper function used by uprv_getPOSIXIDForDefaultLocale and
1411 * uprv_getPOSIXIDForDefaultCodepage. Returns the posix locale id for 1354 * uprv_getPOSIXIDForDefaultCodepage. Returns the posix locale id for
1412 * LC_CTYPE and LC_MESSAGES. It doesn't support other locale categories. 1355 * LC_CTYPE and LC_MESSAGES. It doesn't support other locale categories.
1413 */ 1356 */
1414 static const char *uprv_getPOSIXIDForCategory(int category) 1357 static const char *uprv_getPOSIXIDForCategory(int category)
1415 { 1358 {
1416 const char* posixID = NULL; 1359 const char* posixID = NULL;
1417 if (category == LC_MESSAGES || category == LC_CTYPE) { 1360 if (category == LC_MESSAGES || category == LC_CTYPE) {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 } else { 1577 } else {
1635 uprv_free(correctedPOSIXLocale); 1578 uprv_free(correctedPOSIXLocale);
1636 } 1579 }
1637 } 1580 }
1638 1581
1639 if (gCorrectedPOSIXLocale == NULL) { 1582 if (gCorrectedPOSIXLocale == NULL) {
1640 return "en_US"; 1583 return "en_US";
1641 } 1584 }
1642 return gCorrectedPOSIXLocale; 1585 return gCorrectedPOSIXLocale;
1643 1586
1644 #elif U_PLATFORM == U_PF_CLASSIC_MACOS
1645 int32_t script = MAC_LC_INIT_NUMBER;
1646 /* = IntlScript(); or GetScriptManagerVariable(smSysScript);*/
1647 int32_t region = MAC_LC_INIT_NUMBER;
1648 /* = GetScriptManagerVariable(smRegionCode);*/
1649 int32_t lang = MAC_LC_INIT_NUMBER;
1650 /* = GetScriptManagerVariable(smScriptLang);*/
1651 int32_t date_region = MAC_LC_INIT_NUMBER;
1652 const char* posixID = 0;
1653 int32_t count = sizeof(mac_lc_recs) / sizeof(mac_lc_rec);
1654 int32_t i;
1655 Intl1Hndl ih;
1656
1657 ih = (Intl1Hndl) GetIntlResource(1);
1658 if (ih)
1659 date_region = ((uint16_t)(*ih)->intl1Vers) >> 8;
1660
1661 for (i = 0; i < count; i++) {
1662 if ( ((mac_lc_recs[i].script == MAC_LC_MAGIC_NUMBER)
1663 || (mac_lc_recs[i].script == script))
1664 && ((mac_lc_recs[i].region == MAC_LC_MAGIC_NUMBER)
1665 || (mac_lc_recs[i].region == region))
1666 && ((mac_lc_recs[i].lang == MAC_LC_MAGIC_NUMBER)
1667 || (mac_lc_recs[i].lang == lang))
1668 && ((mac_lc_recs[i].date_region == MAC_LC_MAGIC_NUMBER)
1669 || (mac_lc_recs[i].date_region == date_region))
1670 )
1671 {
1672 posixID = mac_lc_recs[i].posixID;
1673 break;
1674 }
1675 }
1676
1677 return posixID;
1678
1679 #elif U_PLATFORM == U_PF_OS400 1587 #elif U_PLATFORM == U_PF_OS400
1680 /* locales are process scoped and are by definition thread safe */ 1588 /* locales are process scoped and are by definition thread safe */
1681 static char correctedLocale[64]; 1589 static char correctedLocale[64];
1682 const char *localeID = getenv("LC_ALL"); 1590 const char *localeID = getenv("LC_ALL");
1683 char *p; 1591 char *p;
1684 1592
1685 if (localeID == NULL) 1593 if (localeID == NULL)
1686 localeID = getenv("LANG"); 1594 localeID = getenv("LANG");
1687 if (localeID == NULL) 1595 if (localeID == NULL)
1688 localeID = setlocale(LC_ALL, NULL); 1596 localeID = setlocale(LC_ALL, NULL);
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1950 1858
1951 #elif U_PLATFORM == U_PF_OS390 1859 #elif U_PLATFORM == U_PF_OS390
1952 static char codepage[64]; 1860 static char codepage[64];
1953 1861
1954 strncpy(codepage, nl_langinfo(CODESET),63-strlen(UCNV_SWAP_LFNL_OPTION_STRIN G)); 1862 strncpy(codepage, nl_langinfo(CODESET),63-strlen(UCNV_SWAP_LFNL_OPTION_STRIN G));
1955 strcat(codepage,UCNV_SWAP_LFNL_OPTION_STRING); 1863 strcat(codepage,UCNV_SWAP_LFNL_OPTION_STRING);
1956 codepage[63] = 0; /* NULL terminate */ 1864 codepage[63] = 0; /* NULL terminate */
1957 1865
1958 return codepage; 1866 return codepage;
1959 1867
1960 #elif U_PLATFORM == U_PF_CLASSIC_MACOS
1961 return "macintosh"; /* TODO: Macintosh Roman. There must be a better way. fi xme! */
1962
1963 #elif U_PLATFORM_USES_ONLY_WIN32_API 1868 #elif U_PLATFORM_USES_ONLY_WIN32_API
1964 static char codepage[64]; 1869 static char codepage[64];
1965 sprintf(codepage, "windows-%d", GetACP()); 1870 sprintf(codepage, "windows-%d", GetACP());
1966 return codepage; 1871 return codepage;
1967 1872
1968 #elif U_POSIX_LOCALE 1873 #elif U_POSIX_LOCALE
1969 static char codesetName[100]; 1874 static char codesetName[100];
1970 const char *localeName = NULL; 1875 const char *localeName = NULL;
1971 const char *name = NULL; 1876 const char *name = NULL;
1972 1877
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
2129 } 2034 }
2130 *versionString++=(char)('0'+field); 2035 *versionString++=(char)('0'+field);
2131 } 2036 }
2132 2037
2133 /* NUL-terminate */ 2038 /* NUL-terminate */
2134 *versionString=0; 2039 *versionString=0;
2135 } 2040 }
2136 2041
2137 U_CAPI void U_EXPORT2 2042 U_CAPI void U_EXPORT2
2138 u_getVersion(UVersionInfo versionArray) { 2043 u_getVersion(UVersionInfo versionArray) {
2044 (void)copyright; // Suppress unused variable warning from clang.
2139 u_versionFromString(versionArray, U_ICU_VERSION); 2045 u_versionFromString(versionArray, U_ICU_VERSION);
2140 } 2046 }
2141 2047
2142 /** 2048 /**
2143 * icucfg.h dependent code 2049 * icucfg.h dependent code
2144 */ 2050 */
2145 2051
2146 #if U_ENABLE_DYLOAD 2052 #if U_ENABLE_DYLOAD
2147 2053
2148 #if HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API 2054 #if HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
2306 #endif /* U_ENABLE_DYLOAD */ 2212 #endif /* U_ENABLE_DYLOAD */
2307 2213
2308 /* 2214 /*
2309 * Hey, Emacs, please set the following: 2215 * Hey, Emacs, please set the following:
2310 * 2216 *
2311 * Local Variables: 2217 * Local Variables:
2312 * indent-tabs-mode: nil 2218 * indent-tabs-mode: nil
2313 * End: 2219 * End:
2314 * 2220 *
2315 */ 2221 */
OLDNEW
« no previous file with comments | « source/common/propname_data.h ('k') | source/common/putilimp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698