ReactOS 0.4.16-dev-1946-g52006dd
mbsncat.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/sdk/crt/mbstring/mbsncat.c
5 * PURPOSE: Concatenate two multi byte string to maximum of n characters or bytes
6 * PROGRAMER: Ariadne
7 * UPDATE HISTORY:
8 * 12/04/99: Created
9 * 11/10/2025 Somewhat synced with Wine 10.0 by Doug Lyons
10 */
11
12#include <precomp.h>
13#include <mbstring.h>
14#include <string.h>
15
16static inline unsigned char* u_strncat( unsigned char* dst, const unsigned char* src, size_t len )
17{
18 return (unsigned char*)strncat( (char*)dst, (const char*)src, len);
19}
20
21size_t _mbclen2(const unsigned int s);
22unsigned char *_mbset (unsigned char *string, int c);
23
24/*
25 * @implemented
26 */
27unsigned char *_mbsncat (unsigned char *dst, const unsigned char *src, size_t n)
28{
30
31 if (!n)
32 return dst;
33
34 if (!dst || !src) ERR("Bad Parameter\n");
35
36 if (mbcinfo->ismbcodepage)
37 {
38 unsigned char *res = dst;
39 while (*dst)
40 {
41 if (_ismbblead(*dst++))
42 dst++;
43 }
44 while (*src && n--)
45 {
46 *dst++ = *src;
47 if (_ismbblead(*src++))
48 *dst++ = *src++;
49 }
50 *dst = '\0';
51 return res;
52 }
53 return u_strncat(dst, src, n); /* ASCII CP */
54}
55
56/*
57 * @implemented
58 */
59unsigned char * _mbsnbcat(unsigned char *dst, const unsigned char *src, size_t n)
60{
62 unsigned char *s;
63
64 /* replace TRACE with ERR for debug output */
65 TRACE("Src %s\n", wine_dbgstr_an((const char*)src, n));
66
67 if (!dst || !src) ERR("Bad Parameter\n");
68
69 if (!src && !dst && !n && !MSVCRT_CHECK_PMT(dst && src))
70 return NULL;
71
72 if (mbcinfo->ismbcodepage)
73 {
74 unsigned char *res = dst;
75 while (*dst)
76 {
77 if (_ismbblead(*dst++))
78 {
79 if (*dst)
80 {
81 dst++;
82 }
83 else
84 {
85 /* as per msdn overwrite the lead byte in front of '\0' */
86 dst--;
87 break;
88 }
89 }
90 }
91 while (*src && n--) *dst++ = *src++;
92 *dst = '\0';
93 return res;
94 }
95 s = u_strncat(dst, src, n); /* ASCII CP */
96 /* replace TRACE with ERR for debug output */
97 TRACE("Dst %s\n", wine_dbgstr_an((const char*)dst, _mbslen(dst)));
98 return s;
99}
#define _mbsnbcat
#define _mbsncat
#define ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
const char * wine_dbgstr_an(const char *str, int n)
Definition: compat.c:313
GLdouble s
Definition: gl.h:2039
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
const GLubyte * c
Definition: glext.h:8905
GLenum GLenum dst
Definition: glext.h:6340
GLenum GLsizei len
Definition: glext.h:6722
_Check_return_ _CRTIMP size_t __cdecl _mbslen(_In_z_ const unsigned char *_Str)
size_t _mbclen2(const unsigned int s)
Definition: mbclen.c:23
unsigned char * _mbset(unsigned char *string, int c)
Definition: mbsupr.c:31
static unsigned char * u_strncat(unsigned char *dst, const unsigned char *src, size_t len)
Definition: mbsncat.c:16
#define MSVCRT_CHECK_PMT(x)
Definition: mbstowcs_s.c:26
MSVCRT_pthreadmbcinfo get_mbcinfo(void)
Definition: locale.c:366
int __cdecl _ismbblead(unsigned int)
Definition: ismblead.c:20
_In_opt_ _Locale strncat
Definition: string.h:263
#define TRACE(s)
Definition: solgame.cpp:4