Piotr Caban : msvcrt: Added _mbstok_s_l implementation.

Alexandre Julliard julliard at winehq.org
Tue Apr 30 12:51:28 CDT 2013


Module: wine
Branch: master
Commit: ff7388ca3fe27d5910c161e7074ca89dbdeff54a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ff7388ca3fe27d5910c161e7074ca89dbdeff54a

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Apr 30 14:29:11 2013 +0200

msvcrt: Added _mbstok_s_l implementation.

---

 dlls/msvcr100/msvcr100.spec |    6 +-
 dlls/msvcr110/msvcr110.spec |    6 +-
 dlls/msvcr80/msvcr80.spec   |    6 +-
 dlls/msvcr90/msvcr90.spec   |    6 +-
 dlls/msvcrt/mbcs.c          |   94 ++++++++++++++++++++++++++++---------------
 dlls/msvcrt/msvcrt.h        |    1 +
 dlls/msvcrt/msvcrt.spec     |    6 +-
 7 files changed, 77 insertions(+), 48 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 52835cb..e60e0fb 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1183,9 +1183,9 @@
 @ cdecl _mbsstr(str str) msvcrt._mbsstr
 @ stub _mbsstr_l
 @ cdecl _mbstok(str str) msvcrt._mbstok
-@ stub _mbstok_l
-@ stub _mbstok_s
-@ stub _mbstok_s_l
+@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l
+@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s
+@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l
 @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l
 @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l
 @ cdecl _mbstrlen(str) msvcrt._mbstrlen
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index 171bf37..9f36dad 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1545,9 +1545,9 @@
 @ cdecl _mbsstr(str str) msvcrt._mbsstr
 @ stub _mbsstr_l
 @ cdecl _mbstok(str str) msvcrt._mbstok
-@ stub _mbstok_l
-@ stub _mbstok_s
-@ stub _mbstok_s_l
+@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l
+@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s
+@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l
 @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l
 @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l
 @ cdecl _mbstrlen(str) msvcrt._mbstrlen
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index f45095e..a8490e1 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -854,9 +854,9 @@
 @ cdecl _mbsstr(str str) msvcrt._mbsstr
 @ stub _mbsstr_l
 @ cdecl _mbstok(str str) msvcrt._mbstok
-@ stub _mbstok_l
-@ stub _mbstok_s
-@ stub _mbstok_s_l
+@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l
+@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s
+@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l
 @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l
 @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l
 @ cdecl _mbstrlen(str) msvcrt._mbstrlen
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 140797d..9783c2f 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -832,9 +832,9 @@
 @ cdecl _mbsstr(str str) msvcrt._mbsstr
 @ stub _mbsstr_l
 @ cdecl _mbstok(str str) msvcrt._mbstok
-@ stub _mbstok_l
-@ stub _mbstok_s
-@ stub _mbstok_s_l
+@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l
+@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s
+@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l
 @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l
 @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l
 @ cdecl _mbstrlen(str) msvcrt._mbstrlen
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index 3d50d6c..b70ffa0 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -145,11 +145,6 @@ static inline unsigned char *u_strrchr( const unsigned char *s, unsigned char x
   return (unsigned char*) strrchr( (const char*)s, x );
 }
 
-static inline unsigned char *u_strtok( unsigned char *s, const unsigned char *delim )
-{
-  return (unsigned char*) strtok( (char*)s, (const char*)delim );
-}
-
 static inline unsigned char *u__strset( unsigned char *s, unsigned char c )
 {
   return (unsigned char*) _strset( (char*)s, c);
@@ -1090,38 +1085,71 @@ unsigned char* CDECL _mbsrchr(const unsigned char* s, unsigned int x)
 }
 
 /*********************************************************************
- *		_mbstok(MSVCRT.@)
- *
- * Find and extract tokens from strings
+ *              _mbstok_s_l(MSVCRT.@)
  */
-unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim)
+unsigned char* CDECL _mbstok_s_l(unsigned char *str, const unsigned char *delim,
+        unsigned char **ctx, MSVCRT__locale_t locale)
 {
-    thread_data_t *data = msvcrt_get_thread_data();
-    unsigned char *ret;
+    MSVCRT_pthreadmbcinfo mbcinfo;
+    unsigned int c;
 
-    if(get_mbcinfo()->ismbcodepage)
-    {
-	unsigned int c;
+    if(!MSVCRT_CHECK_PMT(delim != NULL)) return NULL;
+    if(!MSVCRT_CHECK_PMT(ctx != NULL)) return NULL;
+    if(!MSVCRT_CHECK_PMT(str || *ctx)) return NULL;
+
+    if(locale)
+        mbcinfo = locale->mbcinfo;
+    else
+        mbcinfo = get_mbcinfo();
 
-	if (!str)
-    	    if (!(str = data->mbstok_next)) return NULL;
+    if(!mbcinfo->ismbcodepage)
+        return (unsigned char*)MSVCRT_strtok_s((char*)str, (const char*)delim, (char**)ctx);
 
-	while ((c = _mbsnextc(str)) && _mbschr(delim, c)) {
-	    str += c > 255 ? 2 : 1;
-	}
-	if (!*str) return NULL;
-	ret = str++;
-	while ((c = _mbsnextc(str)) && !_mbschr(delim, c)) {
-	    str += c > 255 ? 2 : 1;
-	}
-	if (*str) {
-	    *str++ = 0;
-	    if (c > 255) *str++ = 0;
-	}
-	data->mbstok_next = str;
-	return ret;
+    if(!str)
+        str = *ctx;
+
+    while((c=_mbsnextc(str)) && _mbschr(delim, c))
+        str += c>255 ? 2 : 1;
+    if(!*str)
+        return NULL;
+
+    *ctx = str + (c>255 ? 2 : 1);
+    while((c=_mbsnextc(*ctx)) && !_mbschr(delim, c))
+        *ctx += c>255 ? 2 : 1;
+    if (**ctx) {
+        *(*ctx)++ = 0;
+        if(c > 255)
+            *(*ctx)++ = 0;
     }
-    return u_strtok(str, delim); /* ASCII CP */
+
+    return str;
+}
+
+
+/*********************************************************************
+ *              _mbstok_s(MSVCRT.@)
+ */
+unsigned char* CDECL _mbstok_s(unsigned char *str,
+        const unsigned char *delim, unsigned char **ctx)
+{
+    return _mbstok_s_l(str, delim, ctx, NULL);
+}
+
+/*********************************************************************
+ *              _mbstok_l(MSVCRT.@)
+ */
+unsigned char* CDECL _mbstok_l(unsigned char *str,
+        const unsigned char *delim, MSVCRT__locale_t locale)
+{
+    return _mbstok_s_l(str, delim, &msvcrt_get_thread_data()->mbstok_next, locale);
+}
+
+/*********************************************************************
+ *		_mbstok(MSVCRT.@)
+ */
+unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim)
+{
+    return _mbstok_s_l(str, delim, &msvcrt_get_thread_data()->mbstok_next, NULL);
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index b51ff81..35e9c7d 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -989,6 +989,7 @@ int __cdecl      MSVCRT__tolower_l(int,MSVCRT__locale_t);
 int __cdecl      MSVCRT__strnicoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t);
 int __cdecl      MSVCRT__strncoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t);
 unsigned int __cdecl _get_output_format(void);
+char* __cdecl MSVCRT_strtok_s(char*, const char*, char**);
 
 /* Maybe one day we'll enable the invalid parameter handlers with the full set of information (msvcrXXd)
  *      #define MSVCRT_INVALID_PMT(x) MSVCRT_call_invalid_parameter_handler(x, __FUNCTION__, __FILE__, __LINE__, 0)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 0af2423..43d3c45 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -808,9 +808,9 @@
 @ cdecl _mbsstr(str str)
 # stub _mbsstr_l(str str ptr)
 @ cdecl _mbstok(str str)
-# stub _mbstok_l(str str ptr)
-# stub _mbstok_s(str str ptr)
-# stub _mbstok_s_l(str str ptr ptr)
+@ cdecl _mbstok_l(str str ptr)
+@ cdecl _mbstok_s(str str ptr)
+@ cdecl _mbstok_s_l(str str ptr ptr)
 @ cdecl _mbstowcs_l(ptr str long ptr) MSVCRT__mbstowcs_l
 @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) MSVCRT__mbstowcs_s_l
 @ cdecl _mbstrlen(str)




More information about the wine-cvs mailing list