Piotr Caban : msvcrt: Added _stricmp_l implementation.
Alexandre Julliard
julliard at winehq.org
Mon Dec 24 14:02:58 CST 2012
Module: wine
Branch: master
Commit: dbec250635d6bef389dbbf3296e949f4653b1276
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dbec250635d6bef389dbbf3296e949f4653b1276
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Dec 24 12:10:21 2012 +0100
msvcrt: Added _stricmp_l implementation.
---
dlls/msvcr100/msvcr100.spec | 2 +-
dlls/msvcr80/msvcr80.spec | 2 +-
dlls/msvcr90/msvcr90.spec | 2 +-
dlls/msvcrt/msvcrt.h | 2 ++
dlls/msvcrt/msvcrt.spec | 6 +++---
dlls/msvcrt/string.c | 39 ++++++++++++++++++++++++++++++++++++++-
dlls/msvcrt/tests/string.c | 31 +++++++++++++++++++++++++++++++
7 files changed, 77 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index a09b142..64b4105 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1331,7 +1331,7 @@
@ stub _strerror_s
@ stub _strftime_l
@ cdecl _stricmp(str str) msvcrt._stricmp
-@ stub _stricmp_l
+@ cdecl _stricmp_l(str str ptr) msvcrt._stricmp_l
@ cdecl _stricoll(str str) msvcrt._stricoll
@ cdecl _stricoll_l(str str ptr) msvcrt._stricoll_l
@ cdecl _strlwr(str) msvcrt._strlwr
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 4457c2c..91147cf 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -993,7 +993,7 @@
@ stub _strerror_s
@ stub _strftime_l
@ cdecl _stricmp(str str) msvcrt._stricmp
-@ stub _stricmp_l
+@ cdecl _stricmp_l(str str ptr) msvcrt._stricmp_l
@ cdecl _stricoll(str str) msvcrt._stricoll
@ cdecl _stricoll_l(str str ptr) msvcrt._stricoll_l
@ cdecl _strlwr(str) msvcrt._strlwr
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index c20c5fd..abde141 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -986,7 +986,7 @@
@ stub _strerror_s
@ stub _strftime_l
@ cdecl _stricmp(str str) msvcrt._stricmp
-@ stub _stricmp_l
+@ cdecl _stricmp_l(str str ptr) msvcrt._stricmp_l
@ cdecl _stricoll(str str) msvcrt._stricoll
@ cdecl _stricoll_l(str str ptr) msvcrt._stricoll_l
@ cdecl _strlwr(str) msvcrt._strlwr
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 0d0886f..096f77a 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -863,6 +863,8 @@ typedef void (__cdecl *MSVCRT___sighandler_t)(int);
/* _get_output_format return code */
#define MSVCRT__TWO_DIGIT_EXPONENT 0x1
+#define MSVCRT__NLSCMPERROR ((unsigned int)0x7fffffff)
+
void __cdecl MSVCRT_free(void*);
void* __cdecl MSVCRT_malloc(MSVCRT_size_t);
void* __cdecl MSVCRT_calloc(MSVCRT_size_t,MSVCRT_size_t);
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 6802104..3d15a21 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -918,7 +918,7 @@
@ cdecl _stat64(str ptr) MSVCRT_stat64
@ cdecl _stati64(str ptr) MSVCRT_stati64
@ cdecl _statusfp()
-@ cdecl _strcmpi(str str) ntdll._strcmpi
+@ cdecl _strcmpi(str str) MSVCRT__stricmp
@ cdecl _strcoll_l(str str ptr) MSVCRT_strcoll_l
@ cdecl _strdate(ptr) MSVCRT__strdate
@ cdecl _strdate_s(ptr long)
@@ -926,8 +926,8 @@
# stub _strdup_dbg(str long str long)
@ cdecl _strerror(long) MSVCRT__strerror
# stub _strerror_s(ptr long long)
-@ cdecl _stricmp(str str) ntdll._stricmp
-# stub _stricmp_l(str str ptr)
+@ cdecl _stricmp(str str) MSVCRT__stricmp
+@ cdecl _stricmp_l(str str ptr) MSVCRT__stricmp_l
@ cdecl _stricoll(str str) MSVCRT__stricoll
@ cdecl _stricoll_l(str str ptr) MSVCRT__stricoll_l
@ cdecl _strlwr(str) MSVCRT__strlwr
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index a254158..b457510 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -1551,9 +1551,46 @@ int CDECL MSVCRT_I10_OUTPUT(MSVCRT__LDOUBLE ld80, int prec, int flag, struct _I1
#undef I10_OUTPUT_MAX_PREC
/*********************************************************************
- * memcpy (NTDLL.@)
+ * memcpy (MSVCRT.@)
*/
void * __cdecl MSVCRT_memcpy( void *dst, const void *src, size_t n )
{
return memmove( dst, src, n );
}
+
+/*********************************************************************
+ * _stricmp_l (MSVCRT.@)
+ */
+int __cdecl MSVCRT__stricmp_l(const char *s1, const char *s2, MSVCRT__locale_t locale)
+{
+ MSVCRT_pthreadlocinfo locinfo;
+ char c1, c2;
+
+ if(!MSVCRT_CHECK_PMT(s1!=NULL && s2!=NULL))
+ return MSVCRT__NLSCMPERROR;
+
+ if(!locale)
+ locinfo = get_locinfo();
+ else
+ locinfo = locale->locinfo;
+
+ if(!locinfo->lc_handle[MSVCRT_LC_CTYPE])
+ return strcasecmp(s1, s2);
+
+ do {
+ c1 = MSVCRT__tolower_l(*s1++, locale);
+ c2 = MSVCRT__tolower_l(*s2++, locale);
+ if(c1 != c2)
+ break;
+ }while(c1 && c1==c2);
+
+ return c1-c2;
+}
+
+/*********************************************************************
+ * _stricmp (MSVCRT.@)
+ */
+int __cdecl MSVCRT__stricmp(const char *s1, const char *s2)
+{
+ return MSVCRT__stricmp_l(s1, s2, NULL);
+}
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index bbaeda0..f2fd8f9 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -2438,6 +2438,36 @@ static void test__atodbl(void)
ok(ret == _OVERFLOW, "_atodbl(&d, \"1e309\") returned %d, expected _OVERFLOW\n", ret);
}
+static void test__stricmp(void)
+{
+ int ret;
+
+ ret = _stricmp("test", "test");
+ ok(ret == 0, "_stricmp returned %d\n", ret);
+ ret = _stricmp("a", "z");
+ ok(ret < 0, "_stricmp returned %d\n", ret);
+ ret = _stricmp("z", "a");
+ ok(ret > 0, "_stricmp returned %d\n", ret);
+ ret = _stricmp("\xa5", "\xb9");
+ ok(ret < 0, "_stricmp returned %d\n", ret);
+
+ if(!setlocale(LC_ALL, "polish")) {
+ win_skip("stricmp tests");
+ return;
+ }
+
+ ret = _stricmp("test", "test");
+ ok(ret == 0, "_stricmp returned %d\n", ret);
+ ret = _stricmp("a", "z");
+ ok(ret < 0, "_stricmp returned %d\n", ret);
+ ret = _stricmp("z", "a");
+ ok(ret > 0, "_stricmp returned %d\n", ret);
+ ret = _stricmp("\xa5", "\xb9");
+ ok(ret == 0, "_stricmp returned %d\n", ret);
+
+ setlocale(LC_ALL, "C");
+}
+
START_TEST(string)
{
char mem[100];
@@ -2533,4 +2563,5 @@ START_TEST(string)
test_wctomb();
test_tolower();
test__atodbl();
+ test__stricmp();
}
More information about the wine-cvs
mailing list