Skip to content

Commit a9a1a8f

Browse files
committed
[CRT] sync strxfrm.c to wine-1.9.16
svn path=/trunk/; revision=72633
1 parent 77685fe commit a9a1a8f

File tree

2 files changed

+50
-27
lines changed

2 files changed

+50
-27
lines changed

reactos/media/doc/README.WINE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ msvcrt -
297297
reactos/sdk/lib/crt/string/strtok.c # Synced to WineStaging-1.9.16
298298
reactos/sdk/lib/crt/string/strtok_s.c # Synced to WineStaging-1.9.16
299299
reactos/sdk/lib/crt/string/strtoul.c # Synced to WineStaging-1.9.9
300+
reactos/sdk/lib/crt/string/strxfrm.c # Synced to Wine-1.9.16
300301
reactos/sdk/lib/crt/string/wcs.c # Synced at 20080611
301302
reactos/sdk/lib/crt/string/wctype.c # Synced at WineStaging-1.9.16
302303
reactos/sdk/lib/crt/wine/heap.c # Synced at 20080529

reactos/sdk/lib/crt/string/strxfrm.c

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,55 @@
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-
111
#include <precomp.h>
122

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 )
248
{
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+
}
2719

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;
3124

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);
3255
}
33-
#endif

0 commit comments

Comments
 (0)