{
tm tm;
InitTm(tm);
+ wxChar buffer[64];
+ // @Note: Do not call 'CallStrftime' here! CallStrftime checks the return code
+ // and causes an assertion failed if the buffer is to small (which is good) - OR -
+ // if strftime does not return anything because the format string is invalid - OR -
+ // if there are no 'am' / 'pm' tokens defined for the current locale (which is not good).
+ // wxDateTime::ParseTime will try several different formats to parse the time.
+ // As a result, GetAmPmStrings might get called, even if the current locale
+ // does not define any 'am' / 'pm' tokens. In this case, wxStrftime would
+ // assert, even though it is a perfectly legal use.
if ( am )
{
- *am = CallStrftime(_T("%p"), &tm);
+ if (wxStrftime(buffer, sizeof buffer, _T("%p"), &tm) > 0)
+ *am = wxString(buffer);
+ else
+ *am = wxString();
}
if ( pm )
{
tm.tm_hour = 13;
- *pm = CallStrftime(_T("%p"), &tm);
+ if (wxStrftime(buffer, sizeof buffer, _T("%p"), &tm) > 0)
+ *pm = wxString(buffer);
+ else
+ *pm = wxString();
}
}
wxDateTime& wxDateTime::SetFromDOS(unsigned long ddt)
{
struct tm tm;
+ InitTm(tm);
long year = ddt & 0xFE000000;
year >>= 25;
// for Dec, we can't compare with gs_cumulatedDays[mon + 1], but we
// don't need it neither - because of the CHECK above we know that
// yday lies in December then
- if ( (mon == Dec) || (yday < gs_cumulatedDays[isLeap][mon + 1]) )
+ if ( (mon == Dec) || (yday <= gs_cumulatedDays[isLeap][mon + 1]) )
{
Set(yday - gs_cumulatedDays[isLeap][mon], mon, year);
wxString am, pm, token = GetAlphaToken(input);
GetAmPmStrings(&am, &pm);
+ if (am.IsEmpty() && pm.IsEmpty())
+ return (wxChar *)NULL; // no am/pm strings defined
if ( token.CmpNoCase(pm) == 0 )
{
isPM = TRUE;