Module: wine Branch: master Commit: 644f539358e373cb55dd6cc2c2868d797a330cef URL: http://source.winehq.org/git/wine.git/?a=commit;h=644f539358e373cb55dd6cc2c2...
Author: Jörg Höhle hoehle@users.sourceforge.net Date: Sun Feb 20 18:50:47 2011 +0100
winmm: Parse MCI colon notation as in T:MM:SS:F.
---
dlls/winmm/mci.c | 49 +++++++++++++++++++++++++++++++++------------ dlls/winmm/tests/mci.c | 33 ++++++++++++++++++++++++++--- dlls/winmm/tests/mcicda.c | 2 +- 3 files changed, 66 insertions(+), 18 deletions(-)
diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index 9f85bde..ba2fea6 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -974,23 +974,47 @@ static WORD MCI_GetMessage(LPCWSTR lpCmd)
/************************************************************************** * MCI_GetDWord [internal] + * + * Accept 0 -1 255 255:0 255:255:255:255 :::1 1::: 2::3 ::4: 12345678 + * Refuse -1:0 0:-1 :: 256:0 1:256 0::::1 */ static BOOL MCI_GetDWord(DWORD* data, LPWSTR* ptr) { - DWORD val; - LPWSTR ret; - - val = strtoulW(*ptr, &ret, 10); + LPWSTR ret = *ptr; + DWORD total = 0, shift = 0; + BOOL sign = FALSE, digits = FALSE; + + while (*ret == ' ' || *ret == '\t') ret++; + if (*ret == '-') { + ret++; + sign = TRUE; + } + for(;;) { + DWORD val = 0; + while ('0' <= *ret && *ret <= '9') { + val = *ret++ - '0' + 10 * val; + digits = TRUE; + } + switch (*ret) { + case '\0': break; + case '\t': + case ' ': ret++; break; + default: return FALSE; + case ':': + if ((val >= 256) || (shift >= 24)) return FALSE; + total |= val << shift; + shift += 8; + ret++; + continue; + }
- switch (*ret) { - case '\0': break; - case ' ': ret++; break; - default: return FALSE; + if (!digits) return FALSE; + if (shift && (val >= 256 || sign)) return FALSE; + total |= val << shift; + *data = sign ? -total : total; + *ptr = ret; + return TRUE; } - - *data |= val; - *ptr = ret; - return TRUE; }
/************************************************************************** @@ -1116,7 +1140,6 @@ static DWORD MCI_ParseOptArgs(DWORD* data, int _offset, LPCWSTR lpCmd, !MCI_GetDWord(&(data[offset+1]), &args) || !MCI_GetDWord(&(data[offset+2]), &args) || !MCI_GetDWord(&(data[offset+3]), &args)) { - ERR("Bad rect %s\n", debugstr_w(args)); return MCIERR_BAD_INTEGER; } TRACE("flag=%08x for rectangle\n", flg); diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 1cbcc68..5fbd2b8 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -241,7 +241,7 @@ static void test_mciParser(HWND hwnd) ok(!buf[0], "status error buffer %s\n", buf);
err = mciSendString("status x track", buf, sizeof(buf), NULL); - todo_wine ok(err==MCIERR_BAD_INTEGER,"status waveaudio no track: %s\n", dbg_mcierr(err)); + ok(err==MCIERR_BAD_INTEGER,"status waveaudio no track: %s\n", dbg_mcierr(err));
err = mciSendString("status x track 3", buf, sizeof(buf), NULL); ok(err==MCIERR_MISSING_PARAMETER,"status waveaudio track 3: %s\n", dbg_mcierr(err)); @@ -273,6 +273,21 @@ static void test_mciParser(HWND hwnd) err = mciSendString("status x nsa", buf, sizeof(buf), hwnd); todo_wine ok(err==MCIERR_BAD_CONSTANT,"status nsa: %s\n", dbg_mcierr(err));
+ err = mciSendString("seek x to 0:0:0:0:0", buf, sizeof(buf), NULL); + ok(err==MCIERR_BAD_INTEGER,"seek to 0:0:0:0:0 returned %s\n", dbg_mcierr(err)); + + err = mciSendString("seek x to 0:0:0:0:", buf, sizeof(buf), NULL); + ok(err==MCIERR_BAD_INTEGER,"seek to 0:0:0:0: returned %s\n", dbg_mcierr(err)); + + err = mciSendString("seek x to :0:0:0:0", buf, sizeof(buf), NULL); + ok(err==MCIERR_BAD_INTEGER,"seek to :0:0:0:0 returned %s\n", dbg_mcierr(err)); + + err = mciSendString("seek x to 256:0:0:0", buf, sizeof(buf), NULL); + ok(err==MCIERR_BAD_INTEGER,"seek to 256:0:0:0 returned %s\n", dbg_mcierr(err)); + + err = mciSendString("seek x to 0:256", buf, sizeof(buf), NULL); + ok(err==MCIERR_BAD_INTEGER,"seek to 0:256 returned %s\n", dbg_mcierr(err)); + err = mciSendString("status all time format", buf, sizeof(buf), hwnd); ok(err==MCIERR_CANNOT_USE_ALL,"status all: %s\n", dbg_mcierr(err));
@@ -296,7 +311,7 @@ static void test_mciParser(HWND hwnd) if(!err) ok(!strcmp(buf,"1"), "sysinfo digitalvideo quantity open returned %s\n", buf);
err = mciSendString("put a window at 0 0", buf, sizeof(buf), NULL); - todo_wine ok(err==MCIERR_BAD_INTEGER,"put incomplete rect: %s\n", dbg_mcierr(err)); + ok(err==MCIERR_BAD_INTEGER,"put incomplete rect: %s\n", dbg_mcierr(err));
/*w9X-w2k report code from device last opened, newer versions compare them all * and return the one error code or MCIERR_MULTIPLE if they differ. */ @@ -844,8 +859,8 @@ static void test_playWAVE(HWND hwnd) /* No notification (checked below) sent if error */
/* A second play caused Wine<1.1.33 to hang */ - err = mciSendString("play mysound from 500 to 1500 wait", NULL, 0, NULL); - ok(!err,"mci play from 500 to 1500 returned %s\n", dbg_mcierr(err)); + err = mciSendString("play mysound from 500 to 220:5:0 wait", NULL, 0, NULL); + ok(!err,"mci play from 500 to 220:5:0 (=1500) returned %s\n", dbg_mcierr(err));
err = mciSendString("status mysound position", buf, sizeof(buf), hwnd); ok(!err,"mci status position returned %s\n", dbg_mcierr(err)); @@ -880,6 +895,16 @@ static void test_playWAVE(HWND hwnd) err = mciSendString("seek mysound to 0xfa", NULL, 0, NULL); ok(err==MCIERR_BAD_INTEGER,"mci seek to 0xfa returned %s\n", dbg_mcierr(err));
+ /* MCI_INTEGER always accepts colon notation */ + err = mciSendString("seek mysound to :1", NULL, 0, NULL); + ok(!err,"mci seek to :1 (=256) returned %s\n", dbg_mcierr(err)); + + err = mciSendString("seek mysound to 250::", NULL, 0, NULL); + ok(!err,"mci seek to 250:: returned %s\n", dbg_mcierr(err)); + + err = mciSendString("seek mysound to 250:0", NULL, 0, NULL); + ok(!err,"mci seek to 250:0 returned %s\n", dbg_mcierr(err)); + err = mciSendString("status mysound position notify", buf, sizeof(buf), hwnd); ok(!err,"mci status position notify returned %s\n", dbg_mcierr(err)); if(!err) ok(!strcmp(buf,"250"), "mci status position: %s\n", buf); diff --git a/dlls/winmm/tests/mcicda.c b/dlls/winmm/tests/mcicda.c index acd03f0..553679e 100644 --- a/dlls/winmm/tests/mcicda.c +++ b/dlls/winmm/tests/mcicda.c @@ -250,7 +250,7 @@ static void test_play(HWND hwnd) test_notification(hwnd, "status 2flags", err ? 0 : MCI_NOTIFY_SUCCESSFUL);
err = mciSendString("play c from 00:02:00 to 00:01:00 notify", buf, sizeof(buf), hwnd); - todo_wine ok(err == MCIERR_OUTOFRANGE, "play 2s to 1s: %s\n", dbg_mcierr(err)); + ok(err == MCIERR_OUTOFRANGE, "play 2s to 1s: %s\n", dbg_mcierr(err)); test_notification(hwnd, "play 2s to 1s", err ? 0 : MCI_NOTIFY_SUCCESSFUL);
err = mciSendString("resume c", buf, sizeof(buf), hwnd);