From 48fd6e9dd7ee68b727a8053ecb4c2956aa862312 Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Fri, 20 Mar 2009 21:42:43 +0000 Subject: [PATCH] build fix (part of r59673, r59656) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59676 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/datetime.h | 36 +++++++++++++++++++++++++++++++++++- src/common/datetime.cpp | 37 ++++++------------------------------- src/common/datetimefmt.cpp | 3 ++- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/include/wx/datetime.h b/include/wx/datetime.h index 6e4341618a..95a38f562a 100644 --- a/include/wx/datetime.h +++ b/include/wx/datetime.h @@ -133,6 +133,40 @@ extern WXDLLIMPEXP_DATA_BASE(const wxDateTime) wxDefaultDateTime; #define wxInvalidDateTime wxDefaultDateTime + +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +#if defined(HAVE_STRPTIME) && defined(__GLIBC__) && \ + ((__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)) + // glibc 2.0.7 strptime() is broken - the following snippet causes it to + // crash (instead of just failing): + // + // strncpy(buf, "Tue Dec 21 20:25:40 1999", 128); + // strptime(buf, "%x", &tm); + // + // so don't use it + #undef HAVE_STRPTIME +#endif // broken strptime() + +#if defined(HAVE_STRPTIME) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS + // configure detects strptime as linkable because it's in the OS X + // System library but MSL headers don't declare it. + +// char *strptime(const char *, const char *, struct tm *); + // However, we DON'T want to just provide it here because we would + // crash and/or overwrite data when strptime from OS X tries + // to fill in MW's struct tm which is two fields shorter (no TZ stuff) + // So for now let's just say we don't have strptime + #undef HAVE_STRPTIME +#endif + +// everyone has strftime except Win CE unless VC8 is used +#if !defined(__WXWINCE__) || defined(__VISUALC8__) + #define HAVE_STRFTIME +#endif + // ---------------------------------------------------------------------------- // wxDateTime represents an absolute moment in the time // ---------------------------------------------------------------------------- @@ -233,7 +267,7 @@ public: // adoption of the Gregorian calendar (see IsGregorian()) // // All data and comments taken verbatim from "The Calendar FAQ (v 2.0)" - // by Claus Tøndering, http://www.pip.dknet.dk/~c-t/calendar.html + // by Claus T�ndering, http://www.pip.dknet.dk/~c-t/calendar.html // except for the comments "we take". // // Symbol "->" should be read as "was followed by" in the comments diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index 83790cf9ab..d4c2925d7c 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -88,7 +88,9 @@ #include "wx/datetime.h" -const long wxDateTime::TIME_T_FACTOR = 1000l; +// ---------------------------------------------------------------------------- +// wxXTI +// ---------------------------------------------------------------------------- #if wxUSE_EXTENDED_RTTI @@ -106,35 +108,11 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter , wxFromStringCon #endif // wxUSE_EXTENDED_RTTI -// + // ---------------------------------------------------------------------------- // conditional compilation // ---------------------------------------------------------------------------- -#if defined(HAVE_STRPTIME) && defined(__GLIBC__) && \ - ((__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)) - // glibc 2.0.7 strptime() is broken - the following snippet causes it to - // crash (instead of just failing): - // - // strncpy(buf, "Tue Dec 21 20:25:40 1999", 128); - // strptime(buf, "%x", &tm); - // - // so don't use it - #undef HAVE_STRPTIME -#endif // broken strptime() - -#if defined(HAVE_STRPTIME) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS - // configure detects strptime as linkable because it's in the OS X - // System library but MSL headers don't declare it. - -// char *strptime(const char *, const char *, struct tm *); - // However, we DON'T want to just provide it here because we would - // crash and/or overwrite data when strptime from OS X tries - // to fill in MW's struct tm which is two fields shorter (no TZ stuff) - // So for now let's just say we don't have strptime - #undef HAVE_STRPTIME -#endif - #if defined(__MWERKS__) && wxUSE_UNICODE #include #endif @@ -203,11 +181,6 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter , wxFromStringCon #endif #endif // !WX_TIMEZONE && !WX_GMTOFF_IN_TM -// everyone has strftime except Win CE unless VC8 is used -#if !defined(__WXWINCE__) || defined(__VISUALC8__) - #define HAVE_STRFTIME -#endif - // NB: VC8 safe time functions could/should be used for wxMSW as well probably #if defined(__WXWINCE__) && defined(__VISUALC8__) @@ -358,6 +331,8 @@ static const wxDateTime::wxDateTime_t gs_cumulatedDays[2][MONTHS_IN_YEAR] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; +const long wxDateTime::TIME_T_FACTOR = 1000l; + // ---------------------------------------------------------------------------- // global data // ---------------------------------------------------------------------------- diff --git a/src/common/datetimefmt.cpp b/src/common/datetimefmt.cpp index 98c4d17edd..845d8ead32 100644 --- a/src/common/datetimefmt.cpp +++ b/src/common/datetimefmt.cpp @@ -1183,12 +1183,13 @@ wxDateTime::ParseFormat(const wxString& date, case _T('c'): // locale default date and time representation { wxDateTime dt; - tm tm; const wxString inc(input); // NOTE: %c is locale-dependent; try strptime #ifdef HAVE_STRPTIME + struct tm tm; + // try using strptime() -- it may fail even if the input is // correct but the date is out of range, so we will fall back // to our generic code anyhow