|
1 |
| -/* |
2 |
| - * COPYRIGHT: See COPYING in the top level directory |
3 |
| - * PROJECT: ReactOS system libraries |
4 |
| - * FILE: lib/sdk/crt/string/strxfrm.c |
5 |
| - * PURPOSE: Unknown |
6 |
| - * PROGRAMER: Unknown |
7 |
| - * UPDATE HISTORY: |
8 |
| - * 25/11/05: Added license header |
9 |
| - */ |
10 |
| - |
11 | 1 | #include <precomp.h>
|
12 | 2 |
|
13 |
| -#if 1 |
14 |
| -/* |
15 |
| - * @implemented |
16 |
| - */ |
17 |
| -size_t strxfrm( char *dest, const char *src, size_t n ) |
18 |
| -{ |
19 |
| - strncpy(dest, src, n); |
20 |
| - return strnlen(src, n); |
21 |
| -} |
22 |
| -#else |
23 |
| -size_t strxfrm( char *dest, const char *src, size_t n ) |
| 3 | +#include <locale.h> |
| 4 | +#include <internal/wine/msvcrt.h> |
| 5 | + |
| 6 | +size_t CDECL _strxfrm_l( char *dest, const char *src, |
| 7 | + size_t len, _locale_t locale ) |
24 | 8 | {
|
25 |
| - int ret = LCMapStringA(LOCALE_USER_DEFAULT,LCMAP_LOWERCASE, |
26 |
| - src, strlen(src), dest, strlen(dest)); |
| 9 | + MSVCRT_pthreadlocinfo locinfo; |
| 10 | + int ret; |
| 11 | + |
| 12 | + if(!MSVCRT_CHECK_PMT(src)) return INT_MAX; |
| 13 | + if(!MSVCRT_CHECK_PMT(dest || !len)) return INT_MAX; |
| 14 | + |
| 15 | + if(len > INT_MAX) { |
| 16 | + FIXME("len > INT_MAX not supported\n"); |
| 17 | + len = INT_MAX; |
| 18 | + } |
27 | 19 |
|
28 |
| - if ( ret == 0 ) |
29 |
| - return -1; |
30 |
| - return ret; |
| 20 | + if(!locale) |
| 21 | + locinfo = get_locinfo(); |
| 22 | + else |
| 23 | + locinfo = ((MSVCRT__locale_t)locale)->locinfo; |
31 | 24 |
|
| 25 | + if(!locinfo->lc_handle[MSVCRT_LC_COLLATE]) { |
| 26 | + strncpy(dest, src, len); |
| 27 | + return strlen(src); |
| 28 | + } |
| 29 | + |
| 30 | + ret = LCMapStringA(locinfo->lc_handle[MSVCRT_LC_COLLATE], |
| 31 | + LCMAP_SORTKEY, src, -1, NULL, 0); |
| 32 | + if(!ret) { |
| 33 | + if(len) dest[0] = 0; |
| 34 | + *_errno() = EILSEQ; |
| 35 | + return INT_MAX; |
| 36 | + } |
| 37 | + if(!len) return ret-1; |
| 38 | + |
| 39 | + if(ret > len) { |
| 40 | + dest[0] = 0; |
| 41 | + *_errno() = ERANGE; |
| 42 | + return ret-1; |
| 43 | + } |
| 44 | + |
| 45 | + return LCMapStringA(locinfo->lc_handle[MSVCRT_LC_COLLATE], |
| 46 | + LCMAP_SORTKEY, src, -1, dest, len) - 1; |
| 47 | +} |
| 48 | + |
| 49 | +/********************************************************************* |
| 50 | + * strxfrm (MSVCRT.@) |
| 51 | + */ |
| 52 | +size_t CDECL strxfrm( char *dest, const char *src, size_t len ) |
| 53 | +{ |
| 54 | + return _strxfrm_l(dest, src, len, NULL); |
32 | 55 | }
|
33 |
| -#endif |
|
0 commit comments