ICU-5423 One possible fix for properly detecting the default timezone on Linux.

X-SVN-Rev: 20621
This commit is contained in:
George Rhoten 2006-11-01 09:04:57 +00:00
parent 33659ae69f
commit b64be9aad4
6 changed files with 275 additions and 2 deletions

View file

@ -551,6 +551,15 @@ uprv_tzset()
#endif
}
static int32_t uprv_daylight() {
#ifdef U_DAYLIGHT
return U_DAYLIGHT;
#else
/* Windows documentation says the default is 1. */
return 1;
#endif
}
U_CAPI int32_t U_EXPORT2
uprv_timezone()
{
@ -617,6 +626,94 @@ static UBool isValidOlsonID(const char *id) {
}
#endif
#ifdef U_TZNAME
#include <stdio.h>
#define CONVERT_HOURS_TO_SECONDS(offset) (int32_t)(offset*3600)
typedef struct OffsetZoneMapping {
int32_t offsetSeconds;
int32_t daylight;
const char *stdID;
const char *dstID;
const char *olsonID;
} OffsetZoneMapping;
/*
This list tries to disambiguate a set of abbreviated timezone IDs and offsets
and maps it to an Olson ID.
Before adding anything to this list, take a look at
icu/source/tools/tzcode/tz.alias
*/
static const struct OffsetZoneMapping OFFSET_ZONE_MAPPINGS[] = {
{-45900, 1, "CHAST", "CHADT", "Pacific/Chatham"},
{-43200, 1, "PETT", "PETST", "Asia/Kamchatka"},
{-43200, 1, "NZST", "NZDT", "Pacific/Auckland"},
{-43200, 1, "ANAT", "ANAST", "Asia/Anadyr"},
{-39600, 1, "MAGT", "MAGST", "Asia/Magadan"},
/*{-36000, 1, "EST", "EST", "Australia/Melbourne"},*/
{-36000, 1, "SAKT", "SAKST", "Asia/Sakhalin"},
{-36000, 1, "VLAT", "VLAST", "Asia/Vladivostok"},
/*{-34200, 1, "CST", "CST", "Australia/Adelaide"},*/
{-32400, 1, "YAKT", "YAKST", "Asia/Yakutsk"},
{-32400, 1, "CHOT", "CHOST", "Asia/Choibalsan"},
{-28800, 1, "IRKT", "IRKST", "Asia/Irkutsk"},
{-28800, 1, "ULAT", "ULAST", "Asia/Ulaanbaatar"},
{-25200, 1, "HOVT", "HOVST", "Asia/Hovd"},
{-25200, 1, "KRAT", "KRAST", "Asia/Krasnoyarsk"},
{-21600, 1, "NOVT", "NOVST", "Asia/Novosibirsk"},
{-21600, 1, "OMST", "OMSST", "Asia/Omsk"},
{-18000, 1, "YEKT", "YEKST", "Asia/Yekaterinburg"},
{-14400, 1, "SAMT", "SAMST", "Europe/Samara"},
{-14400, 1, "AMT", "AMST", "Asia/Yerevan"},
{-14400, 1, "AZT", "AZST", "Asia/Baku"},
{-10800, 1, "AST", "ADT", "Asia/Baghdad"},
{-10800, 1, "MSK", "MSD", "Europe/Moscow"},
{-7200, 0, "EET", "CEST", "Africa/Tripoli"},
/*{-7200, 1, "EET", "EEST", "Africa/Cairo"},*/
{-7200, 1, "IST", "IDT", "Asia/Jerusalem"},
{-3600, 0, "CET", "WEST", "Africa/Algiers"},
/*{-3600, 1, "WAT", "WAST", "Africa/Windhoek"},*/
{0, 1, "GMT", "IST", "Europe/Dublin"},
{0, 1, "GMT", "BST", "Europe/London"},
/*{0, 1, "WET", "WEST", "Africa/Casablanca"},*/
{0, 0, "WET", "WET", "Africa/El_Aaiun"},
{3600, 1, "AZOT", "AZOST", "Atlantic/Azores"},
{3600, 1, "EGT", "EGST", "America/Scoresbysund"},
{10800, 1, "PMST", "PMDT", "America/Miquelon"},
{10800, 1, "UYT", "UYST", "America/Montevideo"},
{10800, 1, "WGT", "WGST", "America/Godthab"},
{12600, 1, "NST", "NDT", "America/St_Johns"},
/*{14400, 1, "AST", "ADT", "America/Halifax"},*/
{14400, 1, "CLT", "CLST", "America/Santiago"},
{14400, 1, "FKT", "FKST", "Atlantic/Stanley"},
{14400, 1, "PYT", "PYST", "America/Asuncion"},
{18000, 1, "CST", "CDT", "America/Havana"},
/*{18000, 1, "EST", "EDT", "America/New_York"},*/ /* This doesn't work for America/Indianapolis, America/Jamaica, and some other non-US regions. */
{21600, 1, "EAST", "EASST", "Chile/EasterIsland"},
{21600, 0, "CST", "MDT", "America/Regina"},
/*{25200, 1, "MST", "MDT", "America/Denver"},*/ /* This doesn't work for America/Phoenix and some places in Mexico */
{28800, 0, "PST", "PST", "Pacific/Pitcairn"},
{32400, 1, "AKST", "AKDT", "America/Juneau"},
{36000, 1, "HAST", "HADT", "America/Adak"}
};
static const char* remapShortTimeZone(const char *stdID, const char *dstID, int32_t daylightUsed, int32_t offset)
{
int32_t idx;
fprintf(stderr, "std=%s dst=%s daylight=%d offset=%d\n", stdID, dstID, daylightUsed, offset);
for (idx = 0; idx < (int32_t)sizeof(OFFSET_ZONE_MAPPINGS)/sizeof(OFFSET_ZONE_MAPPINGS[0]); idx++)
{
if (offset == OFFSET_ZONE_MAPPINGS[idx].offsetSeconds
&& daylightUsed == OFFSET_ZONE_MAPPINGS[idx].daylight
&& strcmp(OFFSET_ZONE_MAPPINGS[idx].stdID, stdID) == 0
&& strcmp(OFFSET_ZONE_MAPPINGS[idx].dstID, dstID) == 0)
{
return OFFSET_ZONE_MAPPINGS[idx].olsonID;
}
}
return NULL;
}
#endif
U_CAPI const char* U_EXPORT2
uprv_tzname(int n)
{
@ -682,6 +779,10 @@ uprv_tzname(int n)
U_TZNAME is usually a non-unique abbreviation,
which isn't normally usable.
*/
tzenv = remapShortTimeZone(U_TZNAME[0], U_TZNAME[1], uprv_daylight(), uprv_timezone());
if (tzenv != NULL) {
return tzenv;
}
return U_TZNAME[n];
#else
return "";

View file

@ -246,6 +246,9 @@ typedef unsigned int uint32_t;
#if @U_HAVE_TZNAME@
#define U_TZNAME @U_TZNAME@
#endif
#if @U_HAVE_DAYLIGHT@
#define U_DAYLIGHT @U_DAYLIGHT@
#endif
#define U_HAVE_MMAP @HAVE_MMAP@
#define U_HAVE_POPEN @U_HAVE_POPEN@

View file

@ -253,6 +253,9 @@ Intel can define _M_IX86 or _M_X64
#if 1
#define U_TZNAME _tzname
#endif
#if 1
#define U_DAYLIGHT _daylight
#endif
#define U_HAVE_MMAP 0
#define U_HAVE_POPEN 0

View file

@ -44,7 +44,7 @@ endif
# For a dynamically called DLL module to share access to the POSIX external
# variables, with its caller, the DLL module must define these _SHR_* macros.
SHAREDLIBCPPFLAGS = -D_SHR_TZNAME -D_SHR_TIMEZONE
SHAREDLIBCPPFLAGS = -D_SHR_TZNAME -D_SHR_TIMEZONE -D_SHR_DAYLIGHT
## Additional flags when building libraries and with threads
THREADSCPPFLAGS = -D_OPEN_THREADS

134
icu4c/source/configure vendored
View file

@ -309,7 +309,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS PACKAGE VERSION LIB_VERSION LIB_VERSION_MAJOR UNICODE_VERSION build build_cpu build_vendor build_os host host_cpu host_vendor host_os CPPFLAGS CC CFLAGS LDFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA U_MAKE DOXYGEN ARFLAGS COMPILE_LINK_ENVVAR LIB_M ENABLE_SHARED ENABLE_STATIC ENABLE_DEBUG ENABLE_RELEASE U_DEFAULT_SHOW_DRAFT RANLIB ac_ct_RANLIB AR U_DISABLE_RENAMING U_ENABLE_TRACING ENABLE_RPATH U_INLINE THREADS_TRUE ICU_USE_THREADS HAVE_MMAP GENCCODE_ASSEMBLY CPP EGREP U_HAVE_INTTYPES_H U_IOSTREAM_SOURCE U_IS_BIG_ENDIAN U_HAVE_NL_LANGINFO U_HAVE_NL_LANGINFO_CODESET U_NL_LANGINFO_CODESET U_HAVE_NAMESPACE U_OVERRIDE_CXX_ALLOCATION U_HAVE_PLACEMENT_NEW U_HAVE_POPEN U_HAVE_TZSET U_TZSET U_HAVE_TZNAME U_TZNAME U_HAVE_TIMEZONE U_TIMEZONE HAVE_INT8_T HAVE_UINT8_T HAVE_INT16_T HAVE_UINT16_T HAVE_INT32_T HAVE_UINT32_T HAVE_INT64_T HAVE_UINT64_T U_HAVE_WCHAR_H U_HAVE_WCSCPY U_SIZEOF_WCHAR_T EXTRAS_TRUE ICUIO_TRUE LAYOUT_TRUE thedatadir pkgicudatadir thepkgicudatadir DATA_PACKAGING_MODE ICULIBSUFFIX U_HAVE_LIB_SUFFIX ICULIBSUFFIXCNAME TESTS_TRUE SAMPLES_TRUE ICUDATA_CHAR platform platform_make_fragment_name platform_make_fragment ld_rpath_suf AIX_SHLIB LIBOBJS LTLIBOBJS'
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS PACKAGE VERSION LIB_VERSION LIB_VERSION_MAJOR UNICODE_VERSION build build_cpu build_vendor build_os host host_cpu host_vendor host_os CPPFLAGS CC CFLAGS LDFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA U_MAKE DOXYGEN ARFLAGS COMPILE_LINK_ENVVAR LIB_M ENABLE_SHARED ENABLE_STATIC ENABLE_DEBUG ENABLE_RELEASE U_DEFAULT_SHOW_DRAFT RANLIB ac_ct_RANLIB AR U_DISABLE_RENAMING U_ENABLE_TRACING ENABLE_RPATH U_INLINE THREADS_TRUE ICU_USE_THREADS HAVE_MMAP GENCCODE_ASSEMBLY CPP EGREP U_HAVE_INTTYPES_H U_IOSTREAM_SOURCE U_IS_BIG_ENDIAN U_HAVE_NL_LANGINFO U_HAVE_NL_LANGINFO_CODESET U_NL_LANGINFO_CODESET U_HAVE_NAMESPACE U_OVERRIDE_CXX_ALLOCATION U_HAVE_PLACEMENT_NEW U_HAVE_POPEN U_HAVE_TZSET U_TZSET U_HAVE_TZNAME U_TZNAME U_HAVE_TIMEZONE U_TIMEZONE U_HAVE_DAYLIGHT U_DAYLIGHT HAVE_INT8_T HAVE_UINT8_T HAVE_INT16_T HAVE_UINT16_T HAVE_INT32_T HAVE_UINT32_T HAVE_INT64_T HAVE_UINT64_T U_HAVE_WCHAR_H U_HAVE_WCSCPY U_SIZEOF_WCHAR_T EXTRAS_TRUE ICUIO_TRUE LAYOUT_TRUE thedatadir pkgicudatadir thepkgicudatadir DATA_PACKAGING_MODE ICULIBSUFFIX U_HAVE_LIB_SUFFIX ICULIBSUFFIXCNAME TESTS_TRUE SAMPLES_TRUE ICUDATA_CHAR platform platform_make_fragment_name platform_make_fragment ld_rpath_suf AIX_SHLIB LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@ -6482,6 +6482,136 @@ fi
U_HAVE_DAYLIGHT=0
echo "$as_me:$LINENO: checking for daylight" >&5
echo $ECHO_N "checking for daylight... $ECHO_C" >&6
if test "${ac_cv_var_daylight+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifndef __USE_POSIX
#define __USE_POSIX
#endif
#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#include <stdlib.h>
#include <time.h>
int
main ()
{
daylight = 1;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_var_daylight=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_var_daylight=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_var_daylight" >&5
echo "${ECHO_T}$ac_cv_var_daylight" >&6
if test $ac_cv_var_daylight = yes; then
U_DAYLIGHT=daylight
U_HAVE_DAYLIGHT=1
else
echo "$as_me:$LINENO: checking for __daylight" >&5
echo $ECHO_N "checking for __daylight... $ECHO_C" >&6
if test "${ac_cv_var___daylight+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <time.h>
int
main ()
{
__daylight = 1;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_var___daylight=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_var___daylight=no
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_var___daylight" >&5
echo "${ECHO_T}$ac_cv_var___daylight" >&6
if test $ac_cv_var___daylight = yes; then
U_DAYLIGHT=__daylight
U_HAVE_DAYLIGHT=1
fi
fi
echo "$as_me:$LINENO: checking for int8_t" >&5
echo $ECHO_N "checking for int8_t... $ECHO_C" >&6
if test "${ac_cv_type_int8_t+set}" = set; then
@ -8426,6 +8556,8 @@ s,@U_HAVE_TZNAME@,$U_HAVE_TZNAME,;t t
s,@U_TZNAME@,$U_TZNAME,;t t
s,@U_HAVE_TIMEZONE@,$U_HAVE_TIMEZONE,;t t
s,@U_TIMEZONE@,$U_TIMEZONE,;t t
s,@U_HAVE_DAYLIGHT@,$U_HAVE_DAYLIGHT,;t t
s,@U_DAYLIGHT@,$U_DAYLIGHT,;t t
s,@HAVE_INT8_T@,$HAVE_INT8_T,;t t
s,@HAVE_UINT8_T@,$HAVE_UINT8_T,;t t
s,@HAVE_INT16_T@,$HAVE_INT16_T,;t t

View file

@ -655,6 +655,40 @@ fi
AC_SUBST(U_HAVE_TIMEZONE)
AC_SUBST(U_TIMEZONE)
U_HAVE_DAYLIGHT=0
AC_CACHE_CHECK(for daylight,ac_cv_var_daylight,
[AC_TRY_LINK(
changequote(<<, >>)dnl
<<#ifndef __USE_POSIX
#define __USE_POSIX
#endif
#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#include <stdlib.h>
#include <time.h>
>>,
changequote([, ])dnl
[daylight = 1;], ac_cv_var_daylight=yes, ac_cv_var_daylight=no)])
if test $ac_cv_var_daylight = yes; then
U_DAYLIGHT=daylight
U_HAVE_DAYLIGHT=1
else
AC_CACHE_CHECK(for __daylight,ac_cv_var___daylight,
[AC_TRY_LINK(
changequote(<<, >>)dnl
<<#include <time.h>
>>,
changequote([, ])dnl
[__daylight = 1;], ac_cv_var___daylight=yes, ac_cv_var___daylight=no)])
if test $ac_cv_var___daylight = yes; then
U_DAYLIGHT=__daylight
U_HAVE_DAYLIGHT=1
fi
fi
AC_SUBST(U_HAVE_DAYLIGHT)
AC_SUBST(U_DAYLIGHT)
dnl Checks for typedefs
AC_CHECK_TYPE(int8_t,signed char)
AC_CHECK_TYPE(uint8_t,unsigned char)