--- public/common/unicode/pmac.h +++ public/common/unicode/pmac.h @@ -50,6 +50,16 @@ #endif #include +#include + +/** + * Add a second platform define to handle differences between Mac OS X and iOS + */ +#if TARGET_OS_IPHONE +#ifndef U_IOS +#define U_IOS +#endif +#endif /** * \def U_HAVE_DIRENT_H @@ -288,11 +299,16 @@ #if 1 #define U_TZSET tzset #endif +#ifndef U_IOS +/* The iOS version of timezone is busted (at least in the simulator, it is + never set to anything useful). Leave it undefined to avoid a code path + in putil.c. */ #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 #define U_TIMEZONE 0 #else #define U_TIMEZONE timezone #endif +#endif // !U_IOS #if 1 #define U_TZNAME tzname #endif --- source/common/putil.c +++ source/common/putil.c @@ -623,20 +623,28 @@ uprv_timezone() #else time_t t, t1, t2; struct tm tmrec; +#ifndef U_IOS UBool dst_checked; +#endif int32_t tdiff = 0; time(&t); uprv_memcpy( &tmrec, localtime(&t), sizeof(tmrec) ); +#ifndef U_IOS dst_checked = (tmrec.tm_isdst != 0); /* daylight savings time is checked*/ +#endif t1 = mktime(&tmrec); /* local time in seconds*/ uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) ); t2 = mktime(&tmrec); /* GMT (or UTC) in seconds*/ tdiff = t2 - t1; +#ifndef U_IOS + /* On iOS the calculated tdiff is correct so and doesn't need this dst + shift applied. */ /* imitate NT behaviour, which returns same timezone offset to GMT for winter and summer*/ if (dst_checked) tdiff += 3600; +#endif return tdiff; #endif } @@ -649,7 +661,7 @@ uprv_timezone() extern U_IMPORT char *U_TZNAME[]; #endif -#if !UCONFIG_NO_FILE_IO && (defined(U_DARWIN) || defined(U_LINUX) || defined(U_BSD)) +#if !UCONFIG_NO_FILE_IO && ((defined(U_DARWIN) && !defined(U_IOS)) || defined(U_LINUX) || defined(U_BSD)) /* These platforms are likely to use Olson timezone IDs. */ #define CHECK_LOCALTIME_LINK 1 #if defined(U_DARWIN)