[ros-diffs] [cfinck] 34557: - Remove 2 wrong versions of wctomb and 2 wrong versions of wcstombs - Implement new versions of wctomb and wcstombs, which consider the language set by setlocale() and work according to all behaviours I could find when testing under WinXP SP2. This was tested with an own test suite (which I can commit as well if anyone is interested) - Do a real conversion to MultiByte characters using wctomb in fputwc and vfwprintf. (verified under WinXP SP2) - Set 'MSVCRT___lc_codepage' and 'MSVCRT___lc_collate_cp' to 1252 by default ("C" locale) and not the current active codepage (which might not work with i.e. Eastern codepages) - Add a new check for 'MultiByteCount < 0' to WideCharToMultiByte (also verified under WinXP SP2) - Change MB_LEN_MAX back to 2, the value 5 only applies to newer CRT's (msvcrt only handles single-byte and double-byte characters) - Don't compile the Wine-imported 'wcscpy_s', it isn't available in msvcrt

cfinck at svn.reactos.org cfinck at svn.reactos.org
Wed Jul 16 23:40:09 CEST 2008


Author: cfinck
Date: Wed Jul 16 16:40:09 2008
New Revision: 34557

URL: http://svn.reactos.org/svn/reactos?rev=34557&view=rev
Log:
- Remove 2 wrong versions of wctomb and 2 wrong versions of wcstombs
- Implement new versions of wctomb and wcstombs, which consider the language set by setlocale() and work according to all behaviours I could find when testing under WinXP SP2.
  This was tested with an own test suite (which I can commit as well if anyone is interested)
- Do a real conversion to MultiByte characters using wctomb in fputwc and vfwprintf. (verified under WinXP SP2)
- Set 'MSVCRT___lc_codepage' and 'MSVCRT___lc_collate_cp' to 1252 by default ("C" locale) and not the current active codepage (which might not work with i.e. Eastern codepages)
- Add a new check for 'MultiByteCount < 0' to WideCharToMultiByte (also verified under WinXP SP2)
- Change MB_LEN_MAX back to 2, the value 5 only applies to newer CRT's (msvcrt only handles single-byte and double-byte characters)
- Don't compile the Wine-imported 'wcscpy_s', it isn't available in msvcrt

Removed:
    trunk/reactos/lib/sdk/crt/string/wcstom.c
    trunk/reactos/lib/sdk/crt/string/wcstomb.c
    trunk/reactos/lib/sdk/crt/string/wcstombs.c
    trunk/reactos/lib/sdk/crt/string/wctomb.c
Modified:
    trunk/reactos/dll/win32/kernel32/misc/nls.c
    trunk/reactos/include/crt/limits.h
    trunk/reactos/lib/sdk/crt/crt.rbuild
    trunk/reactos/lib/sdk/crt/include/internal/mbstring.h
    trunk/reactos/lib/sdk/crt/locale/locale.c
    trunk/reactos/lib/sdk/crt/stdio/file.c
    trunk/reactos/lib/sdk/crt/string/wcs.c

Modified: trunk/reactos/dll/win32/kernel32/misc/nls.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/nls.c?rev=34557&r1=34556&r2=34557&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/nls.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/nls.c [iso-8859-1] Wed Jul 16 16:40:09 2008
@@ -1295,7 +1295,8 @@
    /* Check the parameters. */
    if (WideCharString == NULL ||
        (MultiByteString == NULL && MultiByteCount > 0) ||
-       (PVOID)WideCharString == (PVOID)MultiByteString)
+       (PVOID)WideCharString == (PVOID)MultiByteString ||
+       MultiByteCount < 0)
    {
       SetLastError(ERROR_INVALID_PARAMETER);
       return 0;

Modified: trunk/reactos/include/crt/limits.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/crt/limits.h?rev=34557&r1=34556&r2=34557&view=diff
==============================================================================
--- trunk/reactos/include/crt/limits.h [iso-8859-1] (original)
+++ trunk/reactos/include/crt/limits.h [iso-8859-1] Wed Jul 16 16:40:09 2008
@@ -34,7 +34,7 @@
  * Characteristics of the char data type.
  */
 #define CHAR_BIT	8
-#define MB_LEN_MAX	5
+#define MB_LEN_MAX	2
 
 #define SCHAR_MIN	(-128)
 #define SCHAR_MAX	127

Modified: trunk/reactos/lib/sdk/crt/crt.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/crt.rbuild?rev=34557&r1=34556&r2=34557&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/crt.rbuild [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/crt.rbuild [iso-8859-1] Wed Jul 16 16:40:09 2008
@@ -355,9 +355,7 @@
 		<file>strxfrm.c</file>
 		<file>wcs.c</file>
 		<file>wcstol.c</file>
-		<file>wcstombs.c</file>
 		<file>wcstoul.c</file>
-		<file>wctomb.c</file>
 		<file>wsplitp.c</file>
 		<file>wtoi.c</file>
 		<file>wtoi64.c</file>

Modified: trunk/reactos/lib/sdk/crt/include/internal/mbstring.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/include/internal/mbstring.h?rev=34557&r1=34556&r2=34557&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/include/internal/mbstring.h [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/include/internal/mbstring.h [iso-8859-1] Wed Jul 16 16:40:09 2008
@@ -37,7 +37,10 @@
 #define LT (_MLEAD  | _MTRAIL)
 #define PT (_MPUNCT | _MTRAIL)
 
+#define MAX_LOCALE_LENGTH 256
 extern unsigned char _mbctype[257];
+extern int MSVCRT___lc_codepage;
+extern char MSVCRT_current_lc_all[MAX_LOCALE_LENGTH];
 
 #if defined (_MSC_VER)
 

Modified: trunk/reactos/lib/sdk/crt/locale/locale.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/locale/locale.c?rev=34557&r1=34556&r2=34557&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/locale/locale.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/locale/locale.c [iso-8859-1] Wed Jul 16 16:40:09 2008
@@ -26,7 +26,6 @@
  * string to produce lc_all.
  */
 #define MAX_ELEM_LEN 64 /* Max length of country/language/CP string */
-#define MAX_LOCALE_LENGTH 256
 
 unsigned char MSVCRT_mbctype[257];
 static int g_mbcp_is_multibyte = 0;
@@ -388,8 +387,8 @@
   {
     MSVCRT_current_lc_all[0] = 'C';
     MSVCRT_current_lc_all[1] = '\0';
-    MSVCRT___lc_codepage = GetACP();
-    MSVCRT___lc_collate_cp = GetACP();
+    MSVCRT___lc_codepage = 1252;
+    MSVCRT___lc_collate_cp = 1252;
 
     switch (category) {
     case MSVCRT_LC_ALL:

Modified: trunk/reactos/lib/sdk/crt/stdio/file.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/stdio/file.c?rev=34557&r1=34556&r2=34557&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/stdio/file.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/stdio/file.c [iso-8859-1] Wed Jul 16 16:40:09 2008
@@ -2475,23 +2475,28 @@
  */
 wint_t CDECL fputwc(wint_t wc, FILE* file)
 {
-  if (file->_flag & _IOBINARY)
-  {
-    wchar_t mwc = wc;
-
-    if (fwrite( &mwc, sizeof(mwc), 1, file) != 1)
-      return WEOF;
-  }
-  else
-  {
-    /* Convert the character to ANSI */
-    char c = (unsigned char)wc;
-
-    if (fwrite( &c, sizeof(c), 1, file) != 1)
-      return WEOF;
-  }
-
-  return wc;
+    if (file->_flag & _IOBINARY)
+    {
+        if (fwrite(&wc, sizeof(wc), 1, file) != 1)
+            return WEOF;
+    }
+    else
+    {
+        /* Convert to multibyte in text mode */
+        char mbc[MB_LEN_MAX];
+        int mb_return;
+
+        mb_return = wctomb(mbc, wc);
+
+        if(mb_return == -1)
+            return WEOF;
+
+        /* Output all characters */
+        if (fwrite(mbc, mb_return, 1, file) != 1)
+            return WEOF;
+    }
+
+    return wc;
 }
 
 /*********************************************************************
@@ -3121,7 +3126,6 @@
 int CDECL vfwprintf(FILE* file, const wchar_t *format, va_list valist)
 {
   wchar_t buf[2048], *mem = buf;
-  char mbbuf[2048], *mbmem = mbbuf;
   int written, resize = sizeof(buf) / sizeof(wchar_t), retval;
   /* See vfprintf comments */
   while ((written = _vsnwprintf(mem, resize, format, valist)) == -1 ||
@@ -3137,17 +3141,22 @@
   /* Check if outputting to a text-file */
   if (fdesc[file->_file].wxflag & WX_TEXT)
   {
-      /* Convert to multibyte then */
-      written = wcstombs(NULL, mem, 0);
-
-      if (written >= sizeof(mbbuf) && (written != (int)-1))
-          mbmem = malloc(written + 1);
-
-      wcstombs(mbmem, mem, written);
-      retval = fwrite(mbmem, 1, written, file);
-
-      if (mbmem != mbbuf)
-        free(mbmem);
+      /* Convert each character and stop at the first invalid character. Behavior verified by tests under WinXP SP2 */
+      char chMultiByte[MB_LEN_MAX];
+      int nReturn;
+
+      retval = 0;
+
+      while(*mem)
+      {
+          nReturn = wctomb(chMultiByte, *mem);
+
+          if(nReturn == -1)
+              break;
+
+          retval += fwrite(chMultiByte, 1, nReturn, file);
+          mem++;
+      }
   }
   else
   {

Modified: trunk/reactos/lib/sdk/crt/string/wcs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/wcs.c?rev=34557&r1=34556&r2=34557&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/wcs.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/wcs.c [iso-8859-1] Wed Jul 16 16:40:09 2008
@@ -40,12 +40,6 @@
 
 //WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
 
-// HACK for LIBCNT
-#ifndef debugstr_w
-#define debugstr_w
-#endif
-
-
 #undef sprintf
 #undef wsprintf
 #undef snprintf
@@ -77,6 +71,7 @@
   return strcmpiW( str1, str2 );
 }
 #endif
+
 /*********************************************************************
  *		_wcsnset (MSVCRT.@)
  */
@@ -102,6 +97,7 @@
   }
   return ret;
 }
+
 #ifndef _LIBCNT_
 /*********************************************************************
  *		_wcsset (MSVCRT.@)
@@ -854,6 +850,7 @@
     return _vsnwprintf( str, INT_MAX, format, args );
 }
 #endif
+
 /*********************************************************************
  *		wcscoll (MSVCRT.@)
  */
@@ -876,6 +873,7 @@
   }
   return NULL;
 }
+
 #ifndef _LIBCNT_
 /*********************************************************************
  *		wcstok  (MSVCRT.@)
@@ -896,17 +894,131 @@
     data->wcstok_next = str;
     return ret;
 }
+
+/*********************************************************************
+ *		wctomb (MSVCRT.@)
+ */
+INT CDECL wctomb(char *mbchar, wchar_t wchar)
+{
+    BOOL bUsedDefaultChar;
+    char chMultiByte[MB_LEN_MAX];
+    int nBytes;
+
+    /* At least one parameter needs to be given, the length of a null character cannot be queried (verified by tests under WinXP SP2) */
+    if(!mbchar && !wchar)
+        return 0;
+
+    /* Use WideCharToMultiByte for doing the conversion using the codepage currently set with setlocale() */
+    nBytes = WideCharToMultiByte(MSVCRT___lc_codepage, 0, &wchar, 1, chMultiByte, MB_LEN_MAX, NULL, &bUsedDefaultChar);
+
+    /* Only copy the character if an 'mbchar' pointer was given.
+
+       The "C" locale is emulated with codepage 1252 here. This codepage has a default character "?", but the "C" locale doesn't have one.
+       Therefore don't copy the character in this case. */
+    if(mbchar && !(MSVCRT_current_lc_all[0] == 'C' && !MSVCRT_current_lc_all[1] && bUsedDefaultChar))
+        memcpy(mbchar, chMultiByte, nBytes);
+
+    /* If the default character was used, set errno to EILSEQ and return -1. */
+    if(bUsedDefaultChar)
+    {
+        __set_errno(EILSEQ);
+        return -1;
+    }
+
+    /* Otherwise return the number of bytes this character occupies. */
+    return nBytes;
+}
+
+size_t CDECL wcstombs(char *mbstr, const wchar_t *wcstr, size_t count)
+{
+    BOOL bUsedDefaultChar;
+    char* p = mbstr;
+    int nResult;
+
+    /* Does the caller query for output buffer size? */
+    if(!mbstr)
+    {
+        int nLength;
+
+        /* If we currently use the "C" locale, the length of the input string is returned (verified by tests under WinXP SP2) */
+        if(MSVCRT_current_lc_all[0] == 'C' && !MSVCRT_current_lc_all[1])
+            return wcslen(wcstr);
+
+        /* Otherwise check the length each character needs and build a final return value out of this */
+        count = wcslen(wcstr);
+        nLength = 0;
+
+        while((int)(--count) >= 0 && *wcstr)
+        {
+            /* Get the length of this character */
+            nResult = wctomb(NULL, *wcstr++);
+
+            /* If this character is not convertible in the current locale, the end result will be -1 */
+            if(nResult == -1)
+                return -1;
+
+            nLength += nResult;
+        }
+
+        /* Return the final length */
+        return nLength;
+    }
+
+    /* Convert the string then */
+    bUsedDefaultChar = FALSE;
+
+    for(;;)
+    {
+        char chMultiByte[MB_LEN_MAX];
+        UINT uLength;
+
+        /* Are we at the terminating null character? */
+        if(!*wcstr)
+        {
+            /* Set the null character, but don't increment the pointer as the returned length never includes the terminating null character */
+            *p = 0;
+            break;
+        }
+
+        /* Convert this character into the temporary chMultiByte variable */
+        ZeroMemory(chMultiByte, MB_LEN_MAX);
+        nResult = wctomb(chMultiByte, *wcstr++);
+
+        /* Check if this was an invalid character */
+        if(nResult == -1)
+            bUsedDefaultChar = TRUE;
+
+        /* If we got no character, stop the conversion process here */
+        if(!chMultiByte[0])
+            break;
+
+        /* Determine whether this is a double-byte or a single-byte character */
+        if(chMultiByte[1])
+            uLength = 2;
+        else
+            uLength = 1;
+
+        /* Decrease 'count' by the character length and check if the buffer can still hold the full character */
+        count -= uLength;
+
+        if((int)count < 0)
+            break;
+
+        /* It can, so copy it and move the pointer forward */
+        memcpy(p, chMultiByte, uLength);
+        p += uLength;
+    }
+
+    if(bUsedDefaultChar)
+        return -1;
+
+    /* Return the length in bytes of the copied characters (without the terminating null character) */
+    return p - mbstr;
+}
 #endif
+
 #ifndef __REACTOS__
 /*********************************************************************
- *		wctomb (MSVCRT.@)
- */
-INT CDECL wctomb( char *dst, wchar_t ch )
-{
-  return WideCharToMultiByte( CP_ACP, 0, &ch, 1, dst, 6, NULL, NULL );
-}
-
-/*********************************************************************
  *		iswalnum (MSVCRT.@)
  */
 INT CDECL iswalnum( wchar_t wc )
@@ -993,8 +1105,7 @@
 {
     return isxdigitW( wc );
 }
-#endif
-#ifndef _LIBCNT_
+
 /*********************************************************************
  *		wcscpy_s (MSVCRT.@)
  */

Removed: trunk/reactos/lib/sdk/crt/string/wcstom.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/wcstom.c?rev=34556&view=auto
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/wcstom.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/wcstom.c (removed)
@@ -1,39 +1,0 @@
-/*
- * COPYRIGHT:   See COPYING in the top level directory
- * PROJECT:     ReactOS system libraries
- * FILE:        lib/msvcrt/mbstring/wcstom.c
- * PURPOSE:
- * PROGRAMER:   
- * UPDATE HISTORY:
- *              05/30/08: Samuel Serapion adapted  from PROJECT C Library
- *
- */
-
-#include <precomp.h>
-#include <mbctype.h>
-
-/*
- * @implemented
- */
-size_t wcstombs (char *string, const wchar_t *widechar, size_t count)
-{
-    int n, bytes;
-    int cnt = 0;
-
-    for (n = 0; n < count; n++) {
-
-	if ((bytes = wctomb (string, *widechar)) < 0)
-	    return -1;
-
-	if (*string == 0)
-	    return cnt;
-
-	widechar++;
-	string += bytes;
-	cnt += bytes;
-    }
-
-    return cnt;
-}
-
-

Removed: trunk/reactos/lib/sdk/crt/string/wcstomb.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/wcstomb.c?rev=34556&view=auto
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/wcstomb.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/wcstomb.c (removed)
@@ -1,114 +1,0 @@
-/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#include <precomp.h>
-#include <wchar.h>
-
-#ifndef EILSEQ
-#define EILSEQ EINVAL
-#endif
-
-static const wchar_t encoding_mask[] =
-{
-  (wchar_t)~0x7ff, (wchar_t)~0xffff, (wchar_t)~0x1fffff, (wchar_t)~0x3ffffff
-};
-
-static const unsigned char encoding_byte[] =
-{
-  0xc0, 0xe0, 0xf0, 0xf8, 0xfc
-};
-
-/* The state is for this UTF8 encoding not used.  */
-//static mbstate_t internal;
-
-
-//extern mbstate_t __no_r_state;  /* Defined in mbtowc.c.  */
-
-size_t
-__wcrtomb (char *s, wchar_t wc);
-
-/*
- * Convert WCHAR into its multibyte character representation,
- * putting this in S and returning its length.
- *
- * Attention: this function should NEVER be intentionally used.
- * The interface is completely stupid.  The state is shared between
- * all conversion functions.  You should use instead the restartable
- * version `wcrtomb'.
- *
- * @implemented
- */
-int
-wctomb (char *s, wchar_t wchar)
-{
-  /* If S is NULL the function has to return null or not null
-     depending on the encoding having a state depending encoding or
-     not.  This is nonsense because any multibyte encoding has a
-     state.  The ISO C amendment 1 corrects this while introducing the
-     restartable functions.  We simply say here all encodings have a
-     state.  */
-  if (s == NULL)
-    return 1;
-
-  return __wcrtomb (s, wchar);
-}
-
-
-size_t
-__wcrtomb (char *s, wchar_t wc)
-{
-  char fake[1];
-  size_t written = 0;
-
-
-
-  if (s == NULL)
-    {
-      s = fake;
-      wc = L'\0';
-    }
-
-  if (wc < 0x80)
-    {
-      /* It's a one byte sequence.  */
-      if (s != NULL)
-        *s = (char) wc;
-      return 1;
-    }
-
-  for (written = 2; written < 6; ++written)
-    if ((wc & encoding_mask[written - 2]) == 0)
-      break;
-
-  if (s != NULL)
-    {
-      size_t cnt = written;
-      s[0] = encoding_byte[cnt - 2];
-
-      --cnt;
-      do
-        {
-          s[cnt] = 0x80 | (wc & 0x3f);
-          wc >>= 6;
-        }
-      while (--cnt > 0);
-      s[0] |= wc;
-    }
-
-  return written;
-}

Removed: trunk/reactos/lib/sdk/crt/string/wcstombs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/wcstombs.c?rev=34556&view=auto
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/wcstombs.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/wcstombs.c (removed)
@@ -1,157 +1,0 @@
-/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#include <precomp.h>
-#include <wchar.h>
-
-#ifndef EILSEQ
-#define EILSEQ EINVAL
-#endif
-
-
-static const wchar_t encoding_mask[] =
-{
-  (~0x7ff&WCHAR_MAX), (~0xffff&WCHAR_MAX), (~0x1fffff&WCHAR_MAX), (~0x3ffffff&WCHAR_MAX)
-};
-
-static const unsigned char encoding_byte[] =
-{
-  0xc0, 0xe0, 0xf0, 0xf8, 0xfc
-};
-
-/* We don't need the state really because we don't have shift states
-   to maintain between calls to this function.  */
-
-static mbstate_t mbstate_internal;
-
-
-mbstate_t __no_r_state;  /* Now defined in wcstombs.c.  */
-//extern mbstate_t __no_r_state;  /* Defined in mbtowc.c.  */
-
-size_t
-__wcsrtombs (char *dst, const wchar_t **src, size_t len, mbstate_t *ps);
-
-/*
- * Convert the `wchar_t' string in PWCS to a multibyte character string
- * in S, writing no more than N characters.  Return the number of bytes
- * written, or (size_t) -1 if an invalid `wchar_t' was found.
- *
- * Attention: this function should NEVER be intentionally used.
- * The interface is completely stupid.  The state is shared between
- * all conversion functions.  You should use instead the restartable
- * version `wcsrtombs'.
- *
- * @implemented
- */
-size_t
-wcstombs (char *s, const wchar_t *pwcs, size_t n)
-{
-  mbstate_t save_shift = __no_r_state;
-  size_t written;
-
-  written = __wcsrtombs (s, &pwcs, n, &__no_r_state);
-
-  /* Restore the old shift state.  */
-  __no_r_state = save_shift;
-
-  /* Return how many we wrote (or maybe an error).  */
-  return written;
-}
-
-size_t
-__wcsrtombs (char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
-{
-  size_t written = 0;
-  const wchar_t *run = *src;
-
-  if (ps == NULL)
-    ps = &mbstate_internal;
-
-  if (dst == NULL)
-    /* The LEN parameter has to be ignored if we don't actually write
-       anything.  */
-    len = ~0;
-
-  while (written < len)
-    {
-      wchar_t wc = *run++;
-
-#if 0
-      if (wc < 0 || wc > WCHAR_MAX)
-        {
-          /* This is no correct ISO 10646 character.  */
-          __set_errno (EILSEQ);
-          return (size_t) -1;
-        }
-#endif
-
-      if (wc == L'\0')
-        {
-          /* Found the end.  */
-          if (dst != NULL)
-            *dst = '\0';
-          *src = NULL;
-          return written;
-        }
-      else if (wc < 0x80)
-        {
-          /* It's an one byte sequence.  */
-          if (dst != NULL)
-            *dst++ = (char) wc;
-          ++written;
-        }
-      else
-        {
-          size_t step;
-
-          for (step = 2; step < 6; ++step)
-            if ((wc & encoding_mask[step - 2]) == 0)
-              break;
-
-          if (written + step >= len)
-            /* Too long.  */
-            break;
-
-          if (dst != NULL)
-            {
-              size_t cnt = step;
-
-              dst[0] = encoding_byte[cnt - 2];
-
-              --cnt;
-              do
-                {
-                  dst[cnt] = 0x80 | (wc & 0x3f);
-                  wc >>= 6;
-                }
-              while (--cnt > 0);
-              dst[0] |= wc;
-
-              dst += step;
-            }
-
-          written += step;
-        }
-    }
-
-  /* Store position of first unprocessed word.  */
-  *src = run;
-
-  return written;
-}
-//weak_alias (__wcsrtombs, wcsrtombs)

Removed: trunk/reactos/lib/sdk/crt/string/wctomb.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/wctomb.c?rev=34556&view=auto
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/wctomb.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/wctomb.c (removed)
@@ -1,47 +1,0 @@
-/*
- * COPYRIGHT:   See COPYING in the top level directory
- * PROJECT:     ReactOS system libraries
- * FILE:        lib/sdk/crt/mbstring/wctomb.c
- * PURPOSE:
- * PROGRAMER:   
- * UPDATE HISTORY:
- *              05/30/08: Samuel Serapion adapted from PROJECT C Library
- *
- */
-
-#include <precomp.h>
-#include <mbstring.h>
-
-/*
- * @implemented
- */
-int wctomb (char *string, wchar_t widechar)
-{
-    int c1, c2;
-
-    if (string == 0)
-	return 0;
-
-    if (widechar & 0xff00) {
-
-	c1 = (widechar >> 8) & 0xff;
-	c2 = (widechar & 0xff);
-
-	if (_ismbblead (c1) == 0 || _ismbbtrail (c2) == 0)
-	    return -1;
-
-	*string++ = (char) c1;
-	*string   = (char) c2;
-
-	return 2;
-
-    }
-    else {
-
-	*string = (char) widechar & 0xff;
-
-	return 1;
-
-    }
-}
-



More information about the Ros-diffs mailing list