fix for [1357272] . Replace the fake year with unique tokens to prevent

substring matches.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37324 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Roger Gammans 2006-02-05 14:10:51 +00:00
parent 42b62acfc2
commit 1d7bc9130c

View File

@ -2407,34 +2407,40 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
{ {
nLostWeekDays += year++ % 4 ? 1 : 2; nLostWeekDays += year++ % 4 ? 1 : 2;
} }
// Keep year below 2000 so the 2digit year number
// can never match the month or day of the month
if (year>=2000) year-=28;
// at any rate, we couldn't go further than 1988 + 9 + 28! // at any rate, we couldn't go further than 1988 + 9 + 28!
wxASSERT_MSG( year < 2030, wxASSERT_MSG( year < 2030,
_T("logic error in wxDateTime::Format") ); _T("logic error in wxDateTime::Format") );
wxString strYear, strYear2; wxString strYear, strYear2;
strYear.Printf(_T("%d"), year); strYear.Printf(_T("%d"), year);
strYear2.Printf(_T("%d"), year % 100); strYear2.Printf(_T("%d"), year % 100);
// find two strings not occurring in format (this is surely // find four strings not occurring in format (this is surely
// not the optimal way of doing it... improvements welcome!) // not the optimal way of doing it... improvements welcome!)
wxString fmt2 = format; wxString fmt2 = format;
wxString replacement = (wxChar)-1; wxString replacement,replacement2,replacement3,replacement4;
while ( fmt2.Find(replacement) != wxNOT_FOUND ) for (int rnr=1; rnr<5 ; rnr++) {
{ wxString r = (wxChar)-rnr;
replacement << (wxChar)-1; while ( fmt2.Find(r) != wxNOT_FOUND )
} {
r << (wxChar)-rnr;
wxString replacement2 = (wxChar)-2; }
while ( fmt2.Find(replacement) != wxNOT_FOUND )
{
replacement << (wxChar)-2;
}
switch (rnr) {
case 1: replacement=r; break;
case 2: replacement2=r; break;
case 3: replacement3=r; break;
case 4: replacement4=r; break;
}
}
// replace all occurrences of year with it // replace all occurrences of year with it
bool wasReplaced = fmt2.Replace(strYear, replacement) > 0; bool wasReplaced = fmt2.Replace(strYear, replacement) > 0;
if ( !wasReplaced ) // evaluation order ensures we always attempt the replacement.
wasReplaced = fmt2.Replace(strYear2, replacement2) > 0; wasReplaced = (fmt2.Replace(strYear2, replacement2) > 0) | wasReplaced ;
// use strftime() to format the same date but in supported // use strftime() to format the same date but in supported
// year // year
@ -2459,11 +2465,17 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
&tmAdjusted); &tmAdjusted);
// now replace the occurrence of 1999 with the real year // now replace the occurrence of 1999 with the real year
// we do this in two stages to stop the 2 digit year
// matching any substring of the 4 digit year.
// Any day,month hours and minutes components should be safe due
// to ensuring the range of the years.
wxString strYearReal, strYearReal2; wxString strYearReal, strYearReal2;
strYearReal.Printf(_T("%04d"), yearReal); strYearReal.Printf(_T("%04d"), yearReal);
strYearReal2.Printf(_T("%02d"), yearReal % 100); strYearReal2.Printf(_T("%02d"), yearReal % 100);
str.Replace(strYear, strYearReal); str.Replace(strYear, replacement3);
str.Replace(strYear2, strYearReal2); str.Replace(strYear2,replacement4);
str.Replace(replacement3, strYearReal);
str.Replace(replacement4, strYearReal2);
// and replace back all occurrences of replacement string // and replace back all occurrences of replacement string
if ( wasReplaced ) if ( wasReplaced )