mbcs update

François Gouget fgouget at codeweavers.com
Tue Dec 4 20:51:42 CST 2001


   This patch is supposed to cleanup and improve the mbcs support in
msvcrt:
 * adds include/msvcrt/mbctype.h and include/msvcrt/mbstring.h
 * fixes the function prototypes in dlls/msvcrt/mbcs.c (mostly
char/unsigned char and int/MSVCRT_size_t mismatches)
 * fixes a couple of bugs, e.g. _mbsnccnt could lead to len<0 which
since it's an unsigned int would be pretty bad
 * improves the support, e.g. _mbsicmp, _mbsnicmp, ...
 * and reorders functions a bit so that related functions are
implemented next to each other: e.g. _mbscmp, _mbsicmp, _mbsncmp,
_mbsnicmp
 * somewhat unrelated: implements putwc/putwchar by calling
fputwc/fputwchar (AFAICT they are really identical)


Changelog:

   François Gouget <fgouget at codeweavers.com>

 * include/msvcrt/mbctype.h,
   include/msvcrt/mbstring.h,
   include/Makefile.in,
   include/msvcrt/string.h,
   dlls/msvcrt/mbcs.c,
   dlls/msvcrt/msvcrt.spec

   Cleanup and improve the mbcs support
   Add mbctype.h and mbstring.h
   Implement putwc and putwchar


-- 
François Gouget
fgouget at codeweavers.com
-------------- next part --------------
--- /dev/null	Fri Nov 16 17:06:31 2001
+++ include/msvcrt/mbctype.h	Tue Dec  4 18:12:53 2001
@@ -0,0 +1,38 @@
+/*
+ * Multibyte char definitions
+ *
+ * Copyright 2001 Francois Gouget.
+ */
+#ifndef __WINE_MBCTYPE_H
+#define __WINE_MBCTYPE_H
+#define __WINE_USE_MSVCRT
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+unsigned char* __p__mbctype(void);
+#define _mbctype                   (__p__mbctype())
+
+int         _getmbcp(void);
+int         _ismbbalnum(unsigned int);
+int         _ismbbalpha(unsigned int);
+int         _ismbbgraph(unsigned int);
+int         _ismbbkalnum(unsigned int);
+int         _ismbbkana(unsigned int);
+int         _ismbbkprint(unsigned int);
+int         _ismbbkpunct(unsigned int);
+int         _ismbblead(unsigned int);
+int         _ismbbprint(unsigned int);
+int         _ismbbpunct(unsigned int);
+int         _ismbbtrail(unsigned int);
+int         _ismbslead(const unsigned char*,const unsigned char*);
+int         _ismbstrail(const unsigned char*,const unsigned char*);
+int         _setmbcp(int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WINE_MBCTYPE_H */
--- /dev/null	Fri Nov 16 17:06:31 2001
+++ include/msvcrt/mbstring.h	Tue Dec  4 18:12:58 2001
@@ -0,0 +1,107 @@
+/*
+ * Multibyte string definitions
+ *
+ * Copyright 2001 Francois Gouget.
+ */
+#ifndef __WINE_MBSTRING_H
+#define __WINE_MBSTRING_H
+#define __WINE_USE_MSVCRT
+
+#include "msvcrt/mbctype.h"
+
+#ifdef USE_MSVCRT_PREFIX
+#define MSVCRT(x)    MSVCRT_##x
+#else
+#define MSVCRT(x)    x
+#endif
+
+#ifndef MSVCRT_SIZE_T_DEFINED
+typedef unsigned int MSVCRT(size_t);
+#define MSVCRT_SIZE_T_DEFINED
+#endif
+
+#define _NLSCMPERROR               ((unsigned int)0x7fffffff)
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int         _ismbcalnum(unsigned int);
+int         _ismbcalpha(unsigned int);
+int         _ismbcdigit(unsigned int);
+int         _ismbcgraph(unsigned int);
+int         _ismbchira(unsigned int);
+int         _ismbckata(unsigned int);
+int         _ismbcl0(unsigned int);
+int         _ismbcl1(unsigned int);
+int         _ismbcl2(unsigned int);
+int         _ismbclegal(unsigned int);
+int         _ismbclower(unsigned int);
+int         _ismbcprint(unsigned int);
+int         _ismbcpunct(unsigned int);
+int         _ismbcspace(unsigned int);
+int         _ismbcsymbol(unsigned int);
+int         _ismbcupper(unsigned int);
+unsigned int _mbbtombc(unsigned int);
+int         _mbbtype(unsigned char,int);
+#define     _mbccmp(_cpc1,_cpc2) _mbsncmp((_cpc1),(_cpc2),1)
+void        _mbccpy(unsigned char*,const unsigned char*);
+unsigned int _mbcjistojms(unsigned int);
+unsigned int _mbcjmstojis(unsigned int);
+MSVCRT(size_t) _mbclen(const unsigned char*);
+unsigned int _mbctohira(unsigned int);
+unsigned int _mbctokata(unsigned int);
+unsigned int _mbctolower(unsigned int);
+unsigned int _mbctombb(unsigned int);
+unsigned int _mbctoupper(unsigned int);
+int         _mbsbtype(const unsigned char*,MSVCRT(size_t));
+unsigned char* _mbscat(unsigned char*,const unsigned char*);
+unsigned char* _mbschr(const unsigned char*,unsigned int);
+int         _mbscmp(const unsigned char*,const unsigned char*);
+int         _mbscoll(const unsigned char*,const unsigned char*);
+unsigned char* _mbscpy(unsigned char*,const unsigned char*);
+MSVCRT(size_t) _mbscspn(const unsigned char*,const unsigned char*);
+unsigned char* _mbsdec(const unsigned char*,const unsigned char*);
+unsigned char* _mbsdup(const unsigned char*);
+int         _mbsicmp(const unsigned char*,const unsigned char*);
+int         _mbsicoll(const unsigned char*,const unsigned char*);
+unsigned char* _mbsinc(const unsigned char*);
+MSVCRT(size_t) _mbslen(const unsigned char*);
+unsigned char* _mbslwr(unsigned char*);
+unsigned char* _mbsnbcat(unsigned char*,const unsigned char*,MSVCRT(size_t));
+int         _mbsnbcmp(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+int         _mbsnbcoll(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+MSVCRT(size_t) _mbsnbcnt(const unsigned char*,MSVCRT(size_t));
+unsigned char* _mbsnbcpy(unsigned char*,const unsigned char*
+,MSVCRT(size_t));
+int         _mbsnbicmp(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+int         _mbsnbicoll(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+unsigned char* _mbsnbset(unsigned char*,unsigned int,MSVCRT(size_t))
+;
+unsigned char* _mbsncat(unsigned char*,const unsigned char*,
+ MSVCRT(size_t));
+MSVCRT(size_t) _mbsnccnt(const unsigned char*,MSVCRT(size_t));
+int         _mbsncmp(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+int         _mbsncoll(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+unsigned char* _mbsncpy(unsigned char*,const unsigned char*,MSVCRT(size_t));
+unsigned int _mbsnextc (const unsigned char*);
+int         _mbsnicmp(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+int         _mbsnicoll(const unsigned char*,const unsigned char*,MSVCRT(size_t));
+unsigned char* _mbsninc(const unsigned char*,MSVCRT(size_t));
+unsigned char* _mbsnset(unsigned char*,unsigned int,MSVCRT(size_t));
+unsigned char* _mbspbrk(const unsigned char*,const unsigned char*);
+unsigned char* _mbsrchr(const unsigned char*,unsigned int);
+unsigned char* _mbsrev(unsigned char*);
+unsigned char* _mbsset(unsigned char*,unsigned int);
+MSVCRT(size_t) _mbsspn(const unsigned char*,const unsigned char*);
+unsigned char* _mbsspnp(const unsigned char*,const unsigned char*);
+unsigned char* _mbsstr(const unsigned char*,const unsigned char*);
+unsigned char* _mbstok(unsigned char*,const unsigned char*);
+unsigned char* _mbsupr(unsigned char*);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WINE_MBSTRING_H */
Index: include/Makefile.in
===================================================================
RCS file: /home/wine/wine/include/Makefile.in,v
retrieving revision 1.35
diff -u -r1.35 Makefile.in
--- include/Makefile.in	2001/11/14 21:26:24	1.35
+++ include/Makefile.in	2001/12/05 00:39:24
@@ -61,6 +61,8 @@
 	msvcrt/io.h \
 	msvcrt/locale.h \
 	msvcrt/malloc.h \
+	msvcrt/mbctype.h \
+	msvcrt/mbstring.h \
 	msvcrt/process.h \
 	msvcrt/search.h \
 	msvcrt/stddef.h \
Index: include/msvcrt/string.h
===================================================================
RCS file: /home/wine/wine/include/msvcrt/string.h,v
retrieving revision 1.3
diff -u -r1.3 string.h
--- include/msvcrt/string.h	2001/10/22 18:59:23	1.3
+++ include/msvcrt/string.h	2001/12/05 00:35:02
@@ -28,9 +28,6 @@
 extern "C" {
 #endif
 
-unsigned char* _mbschr(const unsigned char*,unsigned int);
-unsigned char* _mbsncat(unsigned char*,const unsigned char*,MSVCRT(size_t));
-unsigned char* _mbstok(unsigned char*,unsigned char*);
 void*       _memccpy(void*,const void*,int,MSVCRT(size_t));
 int         _memicmp(const void*,const void*,MSVCRT(size_t));
 int         _strcmpi(const char*,const char*);
Index: dlls/msvcrt/mbcs.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/mbcs.c,v
retrieving revision 1.14
diff -u -r1.14 mbcs.c
--- dlls/msvcrt/mbcs.c	2001/11/12 15:47:26	1.14
+++ dlls/msvcrt/mbcs.c	2001/12/05 00:44:48
@@ -11,6 +11,8 @@
 
 #include "msvcrt.h"
 
+#include "msvcrt/mbctype.h"
+#include "msvcrt/mbstring.h"
 #include "msvcrt/stdlib.h"
 #include "msvcrt/string.h"
 #include "msvcrt/wctype.h"
@@ -24,7 +26,7 @@
 /*********************************************************************
  *		__p__mbctype (MSVCRT.@)
  */
-unsigned char *__p__mbctype(void)
+unsigned char* __p__mbctype(void)
 {
   return MSVCRT_mbctype;
 }
@@ -32,7 +34,7 @@
 /*********************************************************************
  *		__p___mb_cur_max(MSVCRT.@)
  */
-int *__p___mb_cur_max(void)
+int* __p___mb_cur_max(void)
 {
   return &MSVCRT___mb_cur_max;
 }
@@ -40,7 +42,7 @@
 /*********************************************************************
  *		_mbsnextc(MSVCRT.@)
  */
-unsigned int _mbsnextc(const unsigned char *str)
+unsigned int _mbsnextc(const unsigned char* str)
 {
   if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*str))
     return *str << 8 | str[1];
@@ -48,9 +50,204 @@
 }
 
 /*********************************************************************
+ *		_mbctolower(MSVCRT.@)
+ */
+unsigned int _mbctolower(unsigned int c)
+{
+    if (MSVCRT_isleadbyte(c))
+    {
+      FIXME("Handle MBC chars\n");
+      return c;
+    }
+    return tolower(c); /* ASCII CP or SB char */
+}
+
+/*********************************************************************
+ *		_mbctoupper(MSVCRT.@)
+ */
+unsigned int _mbctoupper(unsigned int c)
+{
+    if (MSVCRT_isleadbyte(c))
+    {
+      FIXME("Handle MBC chars\n");
+      return c;
+    }
+    return toupper(c); /* ASCII CP or SB char */
+}
+
+/*********************************************************************
+ *		_mbsdec(MSVCRT.@)
+ */
+unsigned char* _mbsdec(const unsigned char* start, const unsigned char* cur)
+{
+  if(MSVCRT___mb_cur_max > 1)
+    return (char *)(_ismbstrail(start,cur-1) ? cur - 2 : cur -1);
+
+  return (char *)cur - 1; /* ASCII CP or SB char */
+}
+
+/*********************************************************************
+ *		_mbsinc(MSVCRT.@)
+ */
+unsigned char* _mbsinc(const unsigned char* str)
+{
+  if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*str))
+    return (unsigned char*)str + 2; /* MB char */
+
+  return (unsigned char*)str + 1; /* ASCII CP or SB char */
+}
+
+/*********************************************************************
+ *		_mbsninc(MSVCRT.@)
+ */
+unsigned char* _mbsninc(const unsigned char* str, MSVCRT_size_t num)
+{
+  if(!str || num < 1)
+    return NULL;
+  if(MSVCRT___mb_cur_max > 1)
+  {
+    while(num--)
+      str = _mbsinc(str);
+    return (unsigned char*)str;
+  }
+  return (unsigned char*)str + num; /* ASCII CP */
+}
+
+/*********************************************************************
+ *		_mbclen(MSVCRT.@)
+ */
+unsigned int _mbclen(const unsigned char* str)
+{
+  return MSVCRT_isleadbyte(*str) ? 2 : 1;
+}
+
+/*********************************************************************
+ *		mblen(MSVCRT.@)
+ */
+int MSVCRT_mblen(const char* str, MSVCRT_size_t size)
+{
+  if (str && *str && size)
+  {
+    if(MSVCRT___mb_cur_max == 1)
+      return 1; /* ASCII CP */
+
+    return !MSVCRT_isleadbyte(*str) ? 1 : (size>1 ? 2 : -1);
+  }
+  return 0;
+}
+
+/*********************************************************************
+ *		_mbslen(MSVCRT.@)
+ */
+MSVCRT_size_t _mbslen(const unsigned char* str)
+{
+  if(MSVCRT___mb_cur_max > 1)
+  {
+    MSVCRT_size_t len = 0;
+    while(*str)
+    {
+      str += MSVCRT_isleadbyte(*str) ? 2 : 1;
+      len++;
+    }
+    return len;
+  }
+  return strlen(str); /* ASCII CP */
+}
+
+/*********************************************************************
+ *		_mbstrlen(MSVCRT.@)
+ */
+MSVCRT_size_t _mbstrlen(const char* str)
+{
+  if(MSVCRT___mb_cur_max > 1)
+  {
+    MSVCRT_size_t len = 0;
+    while(*str)
+    {
+      /* FIXME: According to the documentation we are supposed to test for 
+       * multi-byte character validity. Whatever that means
+       */
+      str += MSVCRT_isleadbyte(*str) ? 2 : 1;
+      len++;
+    }
+    return len;
+  }
+  return strlen(str); /* ASCII CP */
+}
+
+/*********************************************************************
+ *		_mbccpy(MSVCRT.@)
+ */
+void _mbccpy(unsigned char* dest, const unsigned char* src)
+{
+  *dest++ = *src;
+  if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*src))
+    *dest = *++src; /* MB char */
+  else
+    ERR("failure.. is this ok?\n");
+}
+
+/*********************************************************************
+ *		_mbsncpy(MSVCRT.@)
+ */
+unsigned char* _mbsncpy(unsigned char* dst, const unsigned char* src, MSVCRT_size_t n)
+{
+  if(!n)
+    return dst;
+  if(MSVCRT___mb_cur_max > 1)
+  {
+    unsigned char* ret = dst;
+    while (*src && n--)
+    {
+      *dst++ = *src;
+      if (MSVCRT_isleadbyte(*src++))
+          *dst++ = *src++;
+    }
+    while(n--)
+      *dst++ = '\0';
+    return ret;
+  }
+  return strncpy(dst, src, n); /* ASCII CP */
+}
+
+/*********************************************************************
+ *              _mbsnbcpy(MSVCRT.@)
+ */
+unsigned char* _mbsnbcpy(unsigned char* dst, const unsigned char* src, MSVCRT_size_t n)
+{
+  if(!n)
+    return dst;
+  if(MSVCRT___mb_cur_max > 1)
+  {
+    unsigned char* ret = dst;
+    while (*src && (n-- > 1))
+    {
+      *dst++ = *src;
+      if (MSVCRT_isleadbyte(*src++))
+      {
+        *dst++ = *src++;
+        n--;
+      }
+    }
+    if (*src && n && !MSVCRT_isleadbyte(*src))
+    {
+      /* If the last character is a multi-byte character then 
+       * we cannot copy it since we have only one byte left
+       */
+      *dst++ = *src;
+      n--;
+    }
+    while (n--)
+      *dst++ = '\0';
+    return ret;
+  }
+  return strncpy(dst, src, n); /* ASCII CP */
+}
+
+/*********************************************************************
  *		_mbscmp(MSVCRT.@)
  */
-int _mbscmp(const char *str, const char *cmp)
+int _mbscmp(const unsigned char* str, const unsigned char* cmp)
 {
   if(MSVCRT___mb_cur_max > 1)
   {
@@ -72,29 +269,33 @@
 }
 
 /*********************************************************************
- *		_mbscspn(MSVCRT.@)
- */
-int _mbscspn(const char *str, const char *cmp)
-{
-   FIXME("don't handle double character case\n");
-   return strcspn(str, cmp);
-}
-
-/*********************************************************************
  *		_mbsicmp(MSVCRT.@)
  */
-int _mbsicmp(const char *str, const char *cmp)
+int _mbsicmp(const unsigned char* str, const unsigned char* cmp)
 {
-  /* FIXME: No tolower() for mb strings yet */
   if(MSVCRT___mb_cur_max > 1)
-    return _mbscmp(str, cmp);
+  {
+    unsigned int strc, cmpc;
+    do {
+      if(!*str)
+        return *cmp ? -1 : 0;
+      if(!*cmp)
+        return 1;
+      strc = _mbctolower(_mbsnextc(str));
+      cmpc = _mbctolower(_mbsnextc(cmp));
+      if(strc != cmpc)
+        return strc < cmpc ? -1 : 1;
+      str +=(strc > 255) ? 2 : 1;
+      cmp +=(strc > 255) ? 2 : 1; /* equal, use same increment */
+    } while(1);
+  }
   return strcasecmp(str, cmp); /* ASCII CP */
 }
 
 /*********************************************************************
- *		_mbsncmp    (MSVCRT.@)
+ *		_mbsncmp(MSVCRT.@)
  */
-int _mbsncmp(const char *str, const char *cmp, unsigned int len)
+int _mbsncmp(const unsigned char* str, const unsigned char* cmp, MSVCRT_size_t len)
 {
   if(!len)
     return 0;
@@ -104,6 +305,7 @@
     unsigned int strc, cmpc;
     while(len--)
     {
+      int inc;
       if(!*str)
         return *cmp ? -1 : 0;
       if(!*cmp)
@@ -112,8 +314,9 @@
       cmpc = _mbsnextc(cmp);
       if(strc != cmpc)
         return strc < cmpc ? -1 : 1;
-      str +=(strc > 255) ? 2 : 1;
-      cmp +=(strc > 255) ? 2 : 1; /* Equal, use same increment */
+      inc=(strc > 255) ? 2 : 1; /* Equal, use same increment */
+      str += inc;
+      cmp += inc;
     }
     return 0; /* Matched len chars */
   }
@@ -121,76 +324,127 @@
 }
 
 /*********************************************************************
- *                  _mbsnicmp(MSVCRT.@)
- *
- * Compare two multibyte strings case insensitively to 'len' characters.
+ *              _mbsnbcmp(MSVCRT.@)
  */
-int _mbsnicmp(const char *str, const char *cmp, unsigned int len)
+int _mbsnbcmp(const unsigned char* str, const unsigned char* cmp, MSVCRT_size_t len)
 {
-  /* FIXME: No tolower() for mb strings yet */
+  if (!len)
+    return 0;
   if(MSVCRT___mb_cur_max > 1)
-    return _mbsncmp(str, cmp, len);
-  return strncasecmp(str, cmp, len); /* ASCII CP */
-}
-
-/*********************************************************************
- *		_mbsinc(MSVCRT.@)
- */
-char *_mbsinc(const unsigned char *str)
-{
-  if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*str))
-    return (char *)str + 2; /* MB char */
-
-  return (char *)str + 1; /* ASCII CP or SB char */
+  {
+    unsigned int strc, cmpc;
+    while (len)
+    {
+      int clen;
+      if(!*str)
+        return *cmp ? -1 : 0;
+      if(!*cmp)
+        return 1;
+      if (MSVCRT_isleadbyte(*str))
+      {
+        strc=(len>=2)?_mbsnextc(str):0;
+        clen=2;
+      }
+      else
+      {
+        strc=*str;
+        clen=1;
+      }
+      if (MSVCRT_isleadbyte(*cmp))
+        cmpc=(len>=2)?_mbsnextc(cmp):0;
+      else
+        cmpc=*str;
+      if(strc != cmpc)
+        return strc < cmpc ? -1 : 1;
+      len -= clen;
+      str += clen;
+      cmp += clen;
+    }
+    return 0; /* Matched len chars */
+      FIXME("%s %s %d\n",str,cmp,len);
+  }
+  return strncmp(str,cmp,len);
 }
 
 /*********************************************************************
- *		_mbsninc(MSVCRT.@)
+ *		_mbsnicmp(MSVCRT.@)
+ *
+ * Compare two multibyte strings case insensitively to 'len' characters.
  */
-char *_mbsninc(const char *str, unsigned int num)
+int _mbsnicmp(const unsigned char* str, const unsigned char* cmp, MSVCRT_size_t len)
 {
-  if(!str || num < 1)
-    return NULL;
+  /* FIXME: No tolower() for mb strings yet */
   if(MSVCRT___mb_cur_max > 1)
   {
-    while(num--)
-      str = _mbsinc(str);
-    return (char *)str;
+    unsigned int strc, cmpc;
+    while(len--)
+    {
+      if(!*str)
+        return *cmp ? -1 : 0;
+      if(!*cmp)
+        return 1;
+      strc = _mbctolower(_mbsnextc(str));
+      cmpc = _mbctolower(_mbsnextc(cmp));
+      if(strc != cmpc)
+        return strc < cmpc ? -1 : 1;
+      str +=(strc > 255) ? 2 : 1;
+      cmp +=(strc > 255) ? 2 : 1; /* Equal, use same increment */
+    }
+    return 0; /* Matched len chars */
   }
-  return (char *)str + num; /* ASCII CP */
+  return strncasecmp(str, cmp, len); /* ASCII CP */
 }
 
 /*********************************************************************
- *		_mbslen(MSVCRT.@)
+ *		_mbschr(MSVCRT.@)
+ *
+ * Find a multibyte character in a multibyte string.
  */
-int _mbslen(const unsigned char *str)
+unsigned char* _mbschr(const unsigned char* s, unsigned int x)
 {
   if(MSVCRT___mb_cur_max > 1)
   {
-    int len = 0;
-    while(*str)
+    unsigned int c;
+    while (1)
     {
-      str += MSVCRT_isleadbyte(*str) ? 2 : 1;
-      len++;
+      c = _mbsnextc(s);
+      if (c == x)
+        return (unsigned char*)s;
+      if (!c)
+        return NULL;
+      s += c > 255 ? 2 : 1;
     }
-    return len;
   }
-  return strlen(str); /* ASCII CP */
+  return strchr(s, x); /* ASCII CP */
 }
 
 /*********************************************************************
  *		_mbsrchr(MSVCRT.@)
  */
-char *_mbsrchr(const char *s,unsigned int x)
+unsigned char* _mbsrchr(const unsigned char* s, unsigned int x)
 {
-  /* FIXME: handle multibyte strings */
+  if(MSVCRT___mb_cur_max > 1)
+  {
+    unsigned int c;
+    unsigned char* match=NULL;
+    if(!s)
+      return NULL;
+    while (1) {
+      c = _mbsnextc(s);
+      if (c == x)
+        match=(unsigned char*)s;
+      if (!c)
+        return match;
+      s +=(c > 255) ? 2 : 1;
+    }
+  }
   return strrchr(s,x);
 }
 
 /*********************************************************************
  *		mbtowc(MSVCRT.@)
  */
-int MSVCRT_mbtowc(WCHAR *dst, const char *str, unsigned int n)
+int MSVCRT_mbtowc(WCHAR *dst, const char* str, MSVCRT_size_t n)
 {
   if(n <= 0 || !str)
     return 0;
@@ -205,16 +459,6 @@
 }
 
 /*********************************************************************
- *		_mbccpy(MSVCRT.@)
- */
-void _mbccpy(char *dest, const unsigned char *src)
-{
-  *dest++ = *src;
-  if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*src))
-    *dest = *++src; /* MB char */
-}
-
-/*********************************************************************
  *		_mbbtombc(MSVCRT.@)
  */
 unsigned int _mbbtombc(unsigned int c)
@@ -230,14 +474,6 @@
 }
 
 /*********************************************************************
- *		_mbclen(MSVCRT.@)
- */
-unsigned int _mbclen(const unsigned char *str)
-{
-  return MSVCRT_isleadbyte(*str) ? 2 : 1;
-}
-
-/*********************************************************************
  *		_ismbbkana(MSVCRT.@)
  */
 int _ismbbkana(unsigned int c)
@@ -252,6 +488,32 @@
 }
 
 /*********************************************************************
+ *              _ismbcdigit(MSVCRT.@)
+ */
+int _ismbcdigit(unsigned int ch)
+{
+  if (ch <0x100)
+    return isdigit(ch);
+  else
+    {
+      FIXME("Handle MBC chars\n");
+      return 0;
+    }
+}
+
+/*********************************************************************
+ *              _ismbcspace (MSVCRT.@)
+ */
+int _ismbcspace(unsigned int c)
+{
+
+  if (c<0x100)
+    return isspace(c);
+  FIXME("%c\n",c);
+  return 0;
+}
+
+/*********************************************************************
  *		_ismbchira(MSVCRT.@)
  */
 int _ismbchira(unsigned int c)
@@ -303,7 +565,7 @@
 /*********************************************************************
  *		_ismbslead(MSVCRT.@)
  */
-int _ismbslead(const unsigned char *start, const unsigned char *str)
+int _ismbslead(const unsigned char* start, const unsigned char* str)
 {
   /* Lead bytes can also be trail bytes if caller messed up
    * iterating through the string...
@@ -322,29 +584,18 @@
 /*********************************************************************
  *		_ismbstrail(MSVCRT.@)
  */
-int _ismbstrail(const char *start, const unsigned char *str)
+int _ismbstrail(const unsigned char* start, const unsigned char* str)
 {
   /* Must not be a lead, and must be preceeded by one */
   return !_ismbslead(start, str) && MSVCRT_isleadbyte(str[-1]);
 }
 
 /*********************************************************************
- *		_mbsdec(MSVCRT.@)
- */
-char *_mbsdec(const char *start, const char *cur)
-{
-  if(MSVCRT___mb_cur_max > 1)
-    return (char *)(_ismbstrail(start,cur-1) ? cur - 2 : cur -1);
-
-  return (char *)cur - 1; /* ASCII CP or SB char */
-}
-
-/*********************************************************************
  *		_mbsset(MSVCRT.@)
  */
-char *_mbsset(char *str, unsigned int c)
+unsigned char* _mbsset(unsigned char* str, unsigned int c)
 {
-  char *ret = str;
+  unsigned char* ret = str;
 
   if(MSVCRT___mb_cur_max == 1 || c < 256)
     return _strset(str, c); /* ASCII CP or SB char */
@@ -365,9 +616,9 @@
 /*********************************************************************
  *		_mbsnset(MSVCRT.@)
  */
-char *_mbsnset(char *str, unsigned int c, unsigned int len)
+unsigned char* _mbsnset(unsigned char* str, unsigned int c, MSVCRT_size_t len)
 {
-  char *ret = str;
+  unsigned char *ret = str;
 
   if(!len)
     return ret;
@@ -389,117 +640,52 @@
 }
 
 /*********************************************************************
- *		_mbstrlen(MSVCRT.@)
- */
-MSVCRT_size_t _mbstrlen(const char *str)
-{
-  if(MSVCRT___mb_cur_max > 1)
-  {
-    int len = 0;
-    while(*str)
-    {
-      str += MSVCRT_isleadbyte(*str) ? 2 : 1;
-      len++;
-    }
-    return len;
-  }
-  return strlen(str); /* ASCII CP */
-}
-
-/*********************************************************************
- *		_mbsncpy(MSVCRT.@)
- */
-char *_mbsncpy(char *dst, const char *src, unsigned int len)
-{
-  if(!len)
-    return dst;
-  if(MSVCRT___mb_cur_max > 1)
-  {
-    char *ret = dst;
-    while(src[0] && src[1] && len--)
-    {
-      *dst++ = *src++;
-      *dst++ = *src++;
-    }
-    if(len--)
-    {
-      *dst++ = *src++; /* Last char or '\0' */
-      while(len--)
-        *dst++ = '\0';
-    }
-    return ret;
-  }
-  return strncpy(dst, src, len); /* ASCII CP */
-}
-
-/*********************************************************************
- *		_mbschr(MSVCRT.@)
- *
- * Find a multibyte character in a multibyte string.
- */
-unsigned char* _mbschr(const unsigned char* str, unsigned int c)
-{
-  if(MSVCRT___mb_cur_max > 1)
-  {
-    unsigned int next;
-    while((next = _mbsnextc(str)))
-    {
-      if(next == c)
-        return (char *)str;
-      str += next > 255 ? 2 : 1;
-    }
-    return c ? NULL :(char *)str;
-  }
-  return strchr(str, c); /* ASCII CP */
-}
-
-/*********************************************************************
  *		_mbsnccnt(MSVCRT.@)
  * 'c' is for 'character'.
  */
-unsigned int _mbsnccnt(const unsigned char *str, unsigned int len)
+MSVCRT_size_t _mbsnccnt(const unsigned char* str, MSVCRT_size_t len)
 {
-  int ret = 0;
-
+  MSVCRT_size_t ret;
   if(MSVCRT___mb_cur_max > 1)
   {
+    ret=0;
     while(*str && len-- > 0)
     {
       if(MSVCRT_isleadbyte(*str))
       {
-        str++;
+        if (!len)
+          break;
         len--;
+        str++;
       }
-      ret++;
       str++;
+      ret++;
     }
     return ret;
   }
-  return min(strlen(str), len); /* ASCII CP */
+  ret=strlen(str);
+  return min(ret, len); /* ASCII CP */
 }
 
 /*********************************************************************
  *		_mbsnbcnt(MSVCRT.@)
  * 'b' is for byte count.
  */
-unsigned int _mbsnbcnt(const unsigned char *str, unsigned int len)
+MSVCRT_size_t _mbsnbcnt(const unsigned char* str, MSVCRT_size_t len)
 {
-  const unsigned char *xstr = str;
-
+  MSVCRT_size_t ret;
   if(MSVCRT___mb_cur_max > 1)
   {
+    const unsigned char* xstr = str;
     while(*xstr && len-- > 0)
     {
-      if(MSVCRT_isleadbyte(*xstr))
-      {
+      if (MSVCRT_isleadbyte(*xstr++))
         xstr++;
-        len--;
-      }
-      xstr++;
     }
     return xstr-str;
   }
-  return min(strlen(str), len); /* ASCII CP */
+  ret=strlen(str);
+  return min(ret, len); /* ASCII CP */
 }
 
 
@@ -511,16 +697,18 @@
   if(MSVCRT___mb_cur_max > 1)
   {
     char *res = dst;
-    dst += _mbslen(dst);
-    while(*src && len--)
+    while (*dst)
     {
-      *dst = *src;
-      if(MSVCRT_isleadbyte(*src))
-        *++dst = *++src;
-      dst++;
-      src++;
+      if (MSVCRT_isleadbyte(*dst++))
+        dst++;
     }
-    *dst++ = '\0';
+    while (*src && len--)
+    {
+      *dst++ = *src;
+      if(MSVCRT_isleadbyte(*src++))
+        *dst++ = *src++;
+    }
+    *dst = '\0';
     return res;
   }
   return strncat(dst, src, len); /* ASCII CP */
@@ -528,98 +716,65 @@
 
 
 /*********************************************************************
- *              _ismbcdigit(MSVCRT.@)
- */
-int _ismbcdigit( unsigned int ch)
-{
-  if (ch <0x100)
-    return isdigit(ch);
-  else
-    {
-      FIXME("Handle MBC chars\n");
-      return 0;
-    }
-}
-
-
-/*********************************************************************
- *              _mbsnbcmp(MSVCRT.@)
- */
-int _mbsnbcmp( const unsigned char *str,const unsigned char *cmp, MSVCRT_size_t len )
-{
-  if (!len)
-    return 0;
-  if(MSVCRT___mb_cur_max > 1)
-    {
-      FIXME("%s %s %d\n",str,cmp,len);
-      return 0;
-    }
-  return strncmp(str,cmp,len);
-}
-
-
-/*********************************************************************
  *              _mbslwr(MSVCRT.@)
  */
-unsigned char * _mbslwr(  unsigned char *string    )
+unsigned char* _mbslwr(unsigned char* s)
 {
-  unsigned char *p;
-
-  if(MSVCRT___mb_cur_max > 1)
-    {
-      FIXME("%s\n",string);
-      return string;
-    }
-  p = string;
-  while (*p)
-    {
-      *p= tolower(*p);
-      p++;
+  if (!s)
+    return NULL;
+  if (MSVCRT___mb_cur_max > 1)
+  {
+    unsigned int c;
+    unsigned char* p=s;
+    while (*s)
+    {
+      c = _mbctolower(_mbsnextc(s));
+      /* Note that I assume that the size of the character is unchanged */
+      if (c > 255)
+      {
+          *s++=(c>>8);
+          c=c & 0xff;
+      }
+      *s++=c;
     }
-  return string;
+    return p;
+  }
+  return _strlwr(s);
 }
 
 
 /*********************************************************************
  *              _mbsupr(MSVCRT.@)
  */
-unsigned char * _mbsupr( unsigned char *string )
+unsigned char* _mbsupr(unsigned char* s)
 {
-  unsigned char *p;
-
-  if(MSVCRT___mb_cur_max > 1)
-    {
-      FIXME("%s\n",string);
-      return string;
-    }
-  p = string;
-  while (*p)
-    {
-      *p= toupper(*p);
-      p++;
-    }
-  return string;
-}
-
-
-/*********************************************************************
- *              _mbsnbcpy(MSVCRT.@)
- */
-unsigned char * _mbsnbcpy(unsigned char *dest,const unsigned char *src,MSVCRT_size_t n)
-{
-  if(MSVCRT___mb_cur_max > 1)
-    {
-      FIXME("%s %d\n",src,n);
-      return dest;
+  if (!s)
+    return NULL;
+  if (MSVCRT___mb_cur_max > 1)
+  {
+    unsigned int c;
+    unsigned char* p=s;
+    while (*s)
+    {
+      c = _mbctoupper(_mbsnextc(s));
+      /* Note that I assume that the size of the character is unchanged */
+      if (c > 255)
+      {
+          *s++=(c>>8);
+          c=c & 0xff;
+      }
+      *s++=c;
     }
-  return strncpy(dest, src, n);
+    return p;
+  }
+  return _strupr(s);
 }
 
 
 /*********************************************************************
  *              _mbsspn (MSVCRT.@)
  */
-MSVCRT_size_t _mbsspn(const unsigned char *string, const unsigned char *set)
+MSVCRT_size_t _mbsspn(const unsigned char* string, const unsigned char* set)
 {
   const unsigned char *p, *q;
 
@@ -646,26 +801,23 @@
   return p - string;
 }
 
-
 /*********************************************************************
- *              _ismbcspace (MSVCRT.@)
+ *		_mbscspn(MSVCRT.@)
  */
-int _ismbcspace( unsigned int c)
+MSVCRT_size_t _mbscspn(const unsigned char* str, const unsigned char* cmp)
 {
-
-  if (c <0x100)
-    return isspace(c);
-  FIXME("%c\n",c);
-  return 0;
+  if (MSVCRT___mb_cur_max > 1)
+    FIXME("don't handle double character case\n");
+  return strcspn(str, cmp);
 }
 
 /*********************************************************************
  *              _mbsrev (MSVCRT.@)
  */
-char *_mbsrev(char *str)
+unsigned char* _mbsrev(unsigned char* str)
 {
     int i, len = _mbslen(str);
-    char *p, *temp=MSVCRT_malloc(len*2);
+    unsigned char *p, *temp=MSVCRT_malloc(len*2);
 
     if(!temp)
         return str;
@@ -709,9 +861,9 @@
 /*********************************************************************
  *		_mbspbrk (MSVCRT.@)
  */
-const char *_mbspbrk(const char *str, const char *accept)
+unsigned char* _mbspbrk(const unsigned char* str, const unsigned char* accept)
 {
-    const char *p;
+    const unsigned char* p;
 
     while(*str)
     {
@@ -719,7 +871,7 @@
         {
             if (*p == *str)
                 if( !MSVCRT_isleadbyte(*p) || ( *(p+1) == *(str+1) ) )
-                     return str;
+                     return (unsigned char*)str;
         }
         str += (MSVCRT_isleadbyte(*str)?2:1);
     }
Index: dlls/msvcrt/msvcrt.spec
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/msvcrt.spec,v
retrieving revision 1.25
diff -u -r1.25 msvcrt.spec
--- dlls/msvcrt/msvcrt.spec	2001/11/12 15:47:26	1.25
+++ dlls/msvcrt/msvcrt.spec	2001/12/05 00:49:54
@@ -347,9 +347,9 @@
 @ cdecl _mbclen(ptr) _mbclen
 @ stub _mbctohira #(long)
 @ stub _mbctokata #(long)
-@ stub _mbctolower #(long)
+@ cdecl _mbctolower(long) _mbctolower
 @ stub _mbctombb #(long)
-@ stub _mbctoupper #(long)
+@ cdecl _mbctoupper(long) _mbctoupper
 @ stub _mbctype
 @ stub _mbsbtype #(ptr long)
 @ cdecl _mbscat(str str) strcat
@@ -667,7 +667,7 @@
 @ cdecl log10(double) log10
 @ cdecl longjmp(long long) MSVCRT_longjmp
 @ cdecl malloc(long) MSVCRT_malloc
-@ stub mblen #(str long)
+@ cdecl mblen(ptr long) MSVCRT_mblen
 @ forward -noimport mbstowcs ntdll.mbstowcs
 @ cdecl mbtowc(wstr str long) MSVCRT_mbtowc
 @ cdecl memchr(ptr long long) memchr
@@ -683,8 +683,8 @@
 @ cdecl putc(long ptr) MSVCRT_putc
 @ cdecl putchar(long) MSVCRT_putchar
 @ cdecl puts(str) MSVCRT_puts
-@ stub putwc #(long ptr)
-@ stub putwchar #(long)
+@ cdecl putwc(long ptr) MSVCRT_fputwc
+@ cdecl putwchar(long) _fputwchar
 @ cdecl qsort(ptr long long ptr) qsort
 @ stub raise #(long)
 @ cdecl rand() MSVCRT_rand


More information about the wine-patches mailing list