X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/48fd6e9dd7ee68b727a8053ecb4c2956aa862312..88b497c1291889313a82541267dfeac5ab13d06b:/src/common/datetime.cpp diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index d4c2925d7c..90ac0aedf1 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -308,14 +308,15 @@ static const long MILLISECONDS_PER_DAY = 86400000l; // (i.e. JDN(Jan 1, 1970) = 2440587.5) static const long EPOCH_JDN = 2440587l; -// used only in asserts -#ifdef __WXDEBUG__ +// these values are only used in asserts so don't define them if asserts are +// disabled to avoid warnings about unused static variables +#if wxDEBUG_LEVEL // the date of JDN -0.5 (as we don't work with fractional parts, this is the // reference date for us) is Nov 24, 4714BC static const int JDN_0_YEAR = -4713; static const int JDN_0_MONTH = wxDateTime::Nov; static const int JDN_0_DAY = 24; -#endif // __WXDEBUG__ +#endif // wxDEBUG_LEVEL // the constants used for JDN calculations static const long JDN_OFFSET = 32046l; @@ -350,8 +351,8 @@ wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown; // private functions // ---------------------------------------------------------------------------- -// debugger helper: shows what the date really is -#ifdef __WXDEBUG__ +// debugger helper: this function can be called from a debugger to show what +// the date really is extern const char *wxDumpDate(const wxDateTime* dt) { static char buf[128]; @@ -363,7 +364,6 @@ extern const char *wxDumpDate(const wxDateTime* dt) return buf; } -#endif // Debug // get the number of days in the given month of the given year static inline @@ -382,7 +382,8 @@ wxDateTime::wxDateTime_t GetNumOfDaysInMonth(int year, wxDateTime::Month month) // returns the time zone in the C sense, i.e. the difference UTC - local // (in seconds) -static int GetTimeZone() +// NOTE: not static because used by datetimefmt.cpp +int GetTimeZone() { // set to true when the timezone is set static bool s_timezoneSet = false; @@ -455,7 +456,8 @@ static long GetTruncatedJDN(wxDateTime::wxDateTime_t day, #ifdef HAVE_STRFTIME // this function is a wrapper around strftime(3) adding error checking -static wxString CallStrftime(const wxString& format, const tm* tm) +// NOTE: not static because used by datetimefmt.cpp +wxString CallStrftime(const wxString& format, const tm* tm) { wxChar buf[4096]; // Create temp wxString here to work around mingw/cygwin bug 1046059 @@ -499,8 +501,9 @@ static void ReplaceDefaultYearMonthWithCurrent(int *year, } } -// fll the struct tm with default values -static void InitTm(struct tm& tm) +// fill the struct tm with default values +// NOTE: not static because used by datetimefmt.cpp +void InitTm(struct tm& tm) { // struct tm may have etxra fields (undocumented and with unportable // names) which, nevertheless, must be set to 0 @@ -665,6 +668,13 @@ wxDateTime::TimeZone::TimeZone(wxDateTime::TZ tz) // static functions // ---------------------------------------------------------------------------- +/* static */ +struct tm *wxDateTime::GetTmNow(struct tm *tmstruct) +{ + time_t t = GetTimeNow(); + return wxLocaltime_r(&t, tmstruct); +} + /* static */ bool wxDateTime::IsLeapYear(int year, wxDateTime::Calendar cal) { @@ -793,12 +803,61 @@ wxDateTime::wxDateTime_t wxDateTime::GetNumberOfDays(wxDateTime::Month month, } } +namespace +{ + +// helper function used by GetEnglish/WeekDayName(): returns 0 if flags is +// Name_Full and 1 if it is Name_Abbr or -1 if the flags is incorrect (and +// asserts in this case) +// +// the return value of this function is used as an index into 2D array +// containing full names in its first row and abbreviated ones in the 2nd one +int NameArrayIndexFromFlag(wxDateTime::NameFlags flags) +{ + switch ( flags ) + { + case wxDateTime::Name_Full: + return 0; + + case wxDateTime::Name_Abbr: + return 1; + + default: + wxFAIL_MSG( "unknown wxDateTime::NameFlags value" ); + } + + return -1; +} + +} // anonymous namespace + +/* static */ +wxString wxDateTime::GetEnglishMonthName(Month month, NameFlags flags) +{ + wxCHECK_MSG( month != Inv_Month, wxEmptyString, "invalid month" ); + + static const char *monthNames[2][MONTHS_IN_YEAR] = + { + { "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" }, + { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } + }; + + const int idx = NameArrayIndexFromFlag(flags); + if ( idx == -1 ) + return wxString(); + + return monthNames[idx][month]; +} + /* static */ wxString wxDateTime::GetMonthName(wxDateTime::Month month, wxDateTime::NameFlags flags) { - wxCHECK_MSG( month != Inv_Month, wxEmptyString, _T("invalid month") ); #ifdef HAVE_STRFTIME + wxCHECK_MSG( month != Inv_Month, wxEmptyString, _T("invalid month") ); + // notice that we must set all the fields to avoid confusing libc (GNU one // gets confused to a crash if we don't do this) tm tm; @@ -807,56 +866,36 @@ wxString wxDateTime::GetMonthName(wxDateTime::Month month, return CallStrftime(flags == Name_Abbr ? _T("%b") : _T("%B"), &tm); #else // !HAVE_STRFTIME - wxString ret; - switch(month) - { - case Jan: - ret = (flags == Name_Abbr ? wxT("Jan"): wxT("January")); - break; - case Feb: - ret = (flags == Name_Abbr ? wxT("Feb"): wxT("Febuary")); - break; - case Mar: - ret = (flags == Name_Abbr ? wxT("Mar"): wxT("March")); - break; - case Apr: - ret = (flags == Name_Abbr ? wxT("Apr"): wxT("April")); - break; - case May: - ret = (flags == Name_Abbr ? wxT("May"): wxT("May")); - break; - case Jun: - ret = (flags == Name_Abbr ? wxT("Jun"): wxT("June")); - break; - case Jul: - ret = (flags == Name_Abbr ? wxT("Jul"): wxT("July")); - break; - case Aug: - ret = (flags == Name_Abbr ? wxT("Aug"): wxT("August")); - break; - case Sep: - ret = (flags == Name_Abbr ? wxT("Sep"): wxT("September")); - break; - case Oct: - ret = (flags == Name_Abbr ? wxT("Oct"): wxT("October")); - break; - case Nov: - ret = (flags == Name_Abbr ? wxT("Nov"): wxT("November")); - break; - case Dec: - ret = (flags == Name_Abbr ? wxT("Dec"): wxT("December")); - break; - } - return ret; + return GetEnglishMonthName(month, flags); #endif // HAVE_STRFTIME/!HAVE_STRFTIME } +/* static */ +wxString wxDateTime::GetEnglishWeekDayName(WeekDay wday, NameFlags flags) +{ + wxCHECK_MSG( wday != Inv_WeekDay, wxEmptyString, _T("invalid weekday") ); + + static const char *weekdayNames[2][DAYS_PER_400_YEARS] = + { + { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", + "Saturday" }, + { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }, + }; + + const int idx = NameArrayIndexFromFlag(flags); + if ( idx == -1 ) + return wxString(); + + return weekdayNames[idx][wday]; +} + /* static */ wxString wxDateTime::GetWeekDayName(wxDateTime::WeekDay wday, wxDateTime::NameFlags flags) { - wxCHECK_MSG( wday != Inv_WeekDay, wxEmptyString, _T("invalid weekday") ); #ifdef HAVE_STRFTIME + wxCHECK_MSG( wday != Inv_WeekDay, wxEmptyString, _T("invalid weekday") ); + // take some arbitrary Sunday (but notice that the day should be such that // after adding wday to it below we still have a valid date, e.g. don't // take 28 here!) @@ -875,32 +914,7 @@ wxString wxDateTime::GetWeekDayName(wxDateTime::WeekDay wday, // ... and call strftime() return CallStrftime(flags == Name_Abbr ? _T("%a") : _T("%A"), &tm); #else // !HAVE_STRFTIME - wxString ret; - switch(wday) - { - case Sun: - ret = (flags == Name_Abbr ? wxT("Sun") : wxT("Sunday")); - break; - case Mon: - ret = (flags == Name_Abbr ? wxT("Mon") : wxT("Monday")); - break; - case Tue: - ret = (flags == Name_Abbr ? wxT("Tue") : wxT("Tuesday")); - break; - case Wed: - ret = (flags == Name_Abbr ? wxT("Wed") : wxT("Wednesday")); - break; - case Thu: - ret = (flags == Name_Abbr ? wxT("Thu") : wxT("Thursday")); - break; - case Fri: - ret = (flags == Name_Abbr ? wxT("Fri") : wxT("Friday")); - break; - case Sat: - ret = (flags == Name_Abbr ? wxT("Sat") : wxT("Saturday")); - break; - } - return ret; + return GetEnglishWeekDayName(wday, flags); #endif // HAVE_STRFTIME/!HAVE_STRFTIME }