Module: wine Branch: master Commit: 7b7cd31f058652d6f8ae760650be34b9f4d32ce7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7b7cd31f058652d6f8ae760650...
Author: Jon Griffiths jon_p_griffiths@yahoo.com Date: Thu Jul 3 12:30:18 2008 -0700
msvcrt: Make tests for [w]makepath pass.
---
dlls/msvcrt/dir.c | 73 +++++++++++++++++++++++------------------------ dlls/msvcrt/tests/dir.c | 34 ++++++++-------------- 2 files changed, 48 insertions(+), 59 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index 7b1199c..0a28c59 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -865,28 +865,29 @@ VOID CDECL _makepath(char * path, const char * drive, { *p++ = drive[0]; *p++ = ':'; - *p = 0; } if (directory && directory[0]) { - strcpy(p, directory); - p += strlen(directory) - 1; - if (*p != '/' && *p != '\') { - strcat(p, "\"); - p++; - } - p++; + unsigned int len = strlen(directory); + memmove(p, directory, len); + p += len; + if (p[-1] != '/' && p[-1] != '\') + *p++ = '\'; } if (filename && filename[0]) { - strcpy(p, filename); - if (extension && extension[0]) - { - if ( extension[0] != '.' ) - strcat(p,"."); - strcat(p,extension); - } + unsigned int len = strlen(filename); + memmove(p, filename, len); + p += len; + } + if (extension && extension[0]) + { + if (extension[0] != '.') + *p++ = '.'; + strcpy(p, extension); } + else + *p = '\0'; TRACE("returning %s\n",path); }
@@ -898,43 +899,41 @@ VOID CDECL _makepath(char * path, const char * drive, VOID CDECL _wmakepath(MSVCRT_wchar_t *path, const MSVCRT_wchar_t *drive, const MSVCRT_wchar_t *directory, const MSVCRT_wchar_t *filename, const MSVCRT_wchar_t *extension) { - MSVCRT_wchar_t ch; + MSVCRT_wchar_t *p = path; + TRACE("%s %s %s %s\n", debugstr_w(drive), debugstr_w(directory), debugstr_w(filename), debugstr_w(extension));
if ( !path ) return;
- path[0] = 0; if (drive && drive[0]) { - path[0] = drive[0]; - path[1] = ':'; - path[2] = 0; + *p++ = drive[0]; + *p++ = ':'; } if (directory && directory[0]) { - strcatW(path, directory); - ch = path[strlenW(path) - 1]; - if (ch != '/' && ch != '\') - { - static const MSVCRT_wchar_t backslashW[] = {'\',0}; - strcatW(path, backslashW); - } + unsigned int len = strlenW(directory); + memmove(p, directory, len * sizeof(MSVCRT_wchar_t)); + p += len; + if (p[-1] != '/' && p[-1] != '\') + *p++ = '\'; } if (filename && filename[0]) { - strcatW(path, filename); - if (extension && extension[0]) - { - if ( extension[0] != '.' ) - { - static const MSVCRT_wchar_t dotW[] = {'.',0}; - strcatW(path, dotW); - } - strcatW(path, extension); - } + unsigned int len = strlenW(filename); + memmove(p, filename, len * sizeof(MSVCRT_wchar_t)); + p += len; + } + if (extension && extension[0]) + { + if (extension[0] != '.') + *p++ = '.'; + strcpyW(p, extension); } + else + *p = '\0';
TRACE("returning %s\n", debugstr_w(path)); } diff --git a/dlls/msvcrt/tests/dir.c b/dlls/msvcrt/tests/dir.c index 507add2..11a9820 100644 --- a/dlls/msvcrt/tests/dir.c +++ b/dlls/msvcrt/tests/dir.c @@ -39,14 +39,12 @@ typedef struct const char* file; const char* ext; const char* expected; - BOOL todoA; - BOOL todoW; } makepath_case;
#define USE_BUFF ((char*)~0ul) static const makepath_case makepath_cases[] = { - { NULL, NULL, NULL, NULL, NULL, "", TRUE }, /* 0 */ + { NULL, NULL, NULL, NULL, NULL, "" }, /* 0 */ { NULL, "c", NULL, NULL, NULL, "c:" }, { NULL, "c:", NULL, NULL, NULL, "c:" }, { NULL, "c:\", NULL, NULL, NULL, "c:" }, @@ -56,15 +54,15 @@ static const makepath_case makepath_cases[] = { NULL, NULL, NULL, "file", NULL, "file" }, { NULL, NULL, NULL, "\file", NULL, "\file" }, { NULL, NULL, NULL, "file", NULL, "file" }, - { NULL, NULL, NULL, NULL, "ext", ".ext", TRUE, TRUE }, /* 10 */ - { NULL, NULL, NULL, NULL, ".ext", ".ext", TRUE, TRUE }, - { "foo", NULL, NULL, NULL, NULL, "", TRUE }, - { "foo", USE_BUFF, NULL, NULL, NULL, "f:", FALSE, TRUE }, - { "foo", NULL, USE_BUFF, NULL, NULL, "foo\", FALSE, TRUE }, - { "foo", NULL, NULL, USE_BUFF, NULL, "foo", FALSE, TRUE }, - { "foo", NULL, USE_BUFF, "file", NULL, "foo\file", FALSE, TRUE }, - { "foo", NULL, USE_BUFF, "file", "ext", "foo\file.ext", FALSE, TRUE }, - { "foo", NULL, NULL, USE_BUFF, "ext", "foo.ext", FALSE, TRUE }, + { NULL, NULL, NULL, NULL, "ext", ".ext" }, /* 10 */ + { NULL, NULL, NULL, NULL, ".ext", ".ext" }, + { "foo", NULL, NULL, NULL, NULL, "" }, + { "foo", USE_BUFF, NULL, NULL, NULL, "f:" }, + { "foo", NULL, USE_BUFF, NULL, NULL, "foo\" }, + { "foo", NULL, NULL, USE_BUFF, NULL, "foo" }, + { "foo", NULL, USE_BUFF, "file", NULL, "foo\file" }, + { "foo", NULL, USE_BUFF, "file", "ext", "foo\file.ext" }, + { "foo", NULL, NULL, USE_BUFF, "ext", "foo.ext" }, /* remaining combinations of USE_BUFF crash native */ { NULL, "c", "dir", "file", "ext", "c:dir\file.ext" }, { NULL, "c:", "dir", "file", "ext", "c:dir\file.ext" }, /* 20 */ @@ -98,11 +96,7 @@ static void test_makepath(void) p->ext == USE_BUFF ? buffer : p->ext);
buffer[MAX_PATH - 1] = '\0'; - if (p->todoA) todo_wine { - ok(!strcmp(p->expected, buffer), "got '%s' for case %d\n", buffer, i); - } - else - ok(!strcmp(p->expected, buffer), "got '%s' for case %d\n", buffer, i); + ok(!strcmp(p->expected, buffer), "got '%s' for case %d\n", buffer, i);
/* Unicode */ if (p->drive != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->drive, -1, driveW, MAX_PATH); @@ -123,11 +117,7 @@ static void test_makepath(void)
bufferW[MAX_PATH - 1] = '\0'; WideCharToMultiByte(CP_ACP, 0, bufferW, -1, buffer, MAX_PATH, NULL, NULL); - if (p->todoW) todo_wine { - ok(!strcmp(p->expected, buffer), "got '%s' for unicode case %d\n", buffer, i); - } - else - ok(!strcmp(p->expected, buffer), "got '%s' for unicode case %d\n", buffer, i); + ok(!strcmp(p->expected, buffer), "got '%s' for unicode case %d\n", buffer, i); } }