comctl32: datetime: Support literals in apostrophes.

This commit is contained in:
Mikołaj Zalewski 2008-02-22 22:32:47 +01:00 committed by Alexandre Julliard
parent a871830dd3
commit 41025d56e3
2 changed files with 47 additions and 23 deletions

View File

@ -133,8 +133,8 @@ extern int MONTHCAL_MonthLength(int month, int year);
static BOOL DATETIME_SendSimpleNotify (const DATETIME_INFO *infoPtr, UINT code); static BOOL DATETIME_SendSimpleNotify (const DATETIME_INFO *infoPtr, UINT code);
static BOOL DATETIME_SendDateTimeChangeNotify (const DATETIME_INFO *infoPtr); static BOOL DATETIME_SendDateTimeChangeNotify (const DATETIME_INFO *infoPtr);
extern void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to); extern void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to);
static const WCHAR allowedformatchars[] = {'d', 'h', 'H', 'm', 'M', 's', 't', 'y', 'X', '\'', 0}; static const WCHAR allowedformatchars[] = {'d', 'h', 'H', 'm', 'M', 's', 't', 'y', 'X', 0};
static const int maxrepetition [] = {4,2,2,2,4,2,2,4,-1,-1}; static const int maxrepetition [] = {4,2,2,2,4,2,2,4,-1};
static DWORD static DWORD
@ -205,6 +205,7 @@ DATETIME_UseFormat (DATETIME_INFO *infoPtr, LPCWSTR formattxt)
{ {
unsigned int i; unsigned int i;
int j, k, len; int j, k, len;
BOOL inside_literal = FALSE; /* inside '...' */
int *nrFields = &infoPtr->nrFields; int *nrFields = &infoPtr->nrFields;
*nrFields = 0; *nrFields = 0;
@ -214,27 +215,37 @@ DATETIME_UseFormat (DATETIME_INFO *infoPtr, LPCWSTR formattxt)
for (i = 0; formattxt[i]; i++) { for (i = 0; formattxt[i]; i++) {
TRACE ("\n%d %c:", i, formattxt[i]); TRACE ("\n%d %c:", i, formattxt[i]);
for (j = 0; j < len; j++) { if (!inside_literal) {
if (allowedformatchars[j]==formattxt[i]) { for (j = 0; j < len; j++) {
TRACE ("%c[%d,%x]", allowedformatchars[j], *nrFields, infoPtr->fieldspec[*nrFields]); if (allowedformatchars[j]==formattxt[i]) {
if ((*nrFields==0) && (infoPtr->fieldspec[*nrFields]==0)) { TRACE ("%c[%d,%x]", allowedformatchars[j], *nrFields, infoPtr->fieldspec[*nrFields]);
infoPtr->fieldspec[*nrFields] = (j<<4) + 1; if ((*nrFields==0) && (infoPtr->fieldspec[*nrFields]==0)) {
break; infoPtr->fieldspec[*nrFields] = (j<<4) + 1;
} break;
if (infoPtr->fieldspec[*nrFields] >> 4 != j) { }
(*nrFields)++; if (infoPtr->fieldspec[*nrFields] >> 4 != j) {
infoPtr->fieldspec[*nrFields] = (j<<4) + 1; (*nrFields)++;
break; infoPtr->fieldspec[*nrFields] = (j<<4) + 1;
} break;
if ((infoPtr->fieldspec[*nrFields] & 0x0f) == maxrepetition[j]) { }
(*nrFields)++; if ((infoPtr->fieldspec[*nrFields] & 0x0f) == maxrepetition[j]) {
infoPtr->fieldspec[*nrFields] = (j<<4) + 1; (*nrFields)++;
break; infoPtr->fieldspec[*nrFields] = (j<<4) + 1;
} break;
infoPtr->fieldspec[*nrFields]++; }
break; infoPtr->fieldspec[*nrFields]++;
} /* if allowedformatchar */ break;
} /* for j */ } /* if allowedformatchar */
} /* for j */
}
else
j = len;
if (formattxt[i] == '\'')
{
inside_literal = !inside_literal;
continue;
}
/* char is not a specifier: handle char like a string */ /* char is not a specifier: handle char like a string */
if (j == len) { if (j == len) {

View File

@ -193,6 +193,8 @@ static HWND create_datetime_control(DWORD style, DWORD exstyle)
static void test_dtm_set_format(HWND hWndDateTime) static void test_dtm_set_format(HWND hWndDateTime)
{ {
CHAR txt[256];
SYSTEMTIME systime;
LRESULT r; LRESULT r;
r = SendMessage(hWndDateTime, DTM_SETFORMAT, 0, (LPARAM)NULL); r = SendMessage(hWndDateTime, DTM_SETFORMAT, 0, (LPARAM)NULL);
@ -203,6 +205,17 @@ static void test_dtm_set_format(HWND hWndDateTime)
expect(1, r); expect(1, r);
ok_sequence(sequences, DATETIME_SEQ_INDEX, test_dtm_set_format_seq, "test_dtm_set_format", FALSE); ok_sequence(sequences, DATETIME_SEQ_INDEX, test_dtm_set_format_seq, "test_dtm_set_format", FALSE);
r = SendMessage(hWndDateTime, DTM_SETFORMAT, 0,
(LPARAM)"'hh' hh");
expect(1, r);
ZeroMemory(&systime, sizeof(systime));
systime.wYear = 2000;
systime.wMonth = systime.wDay = 1;
r = SendMessage(hWndDateTime, DTM_SETSYSTEMTIME, 0, (LPARAM)&systime);
expect(1, r);
GetWindowText(hWndDateTime, txt, 256);
todo_wine ok(strcmp(txt, "hh 12") == 0, "String mismatch (\"%s\" vs \"hh 12\")\n", txt);
flush_sequences(sequences, NUM_MSG_SEQUENCES); flush_sequences(sequences, NUM_MSG_SEQUENCES);
} }