xref: /reactos/sdk/lib/ucrt/mbstring/mbccpy_s_l.cpp (revision fe11f7a2)
1 /***
2 *mbccpy_s_l.c - Copy one character  to another (MBCS)
3 *
4 *       Copyright (c) Microsoft Corporation. All rights reserved.
5 *
6 *Purpose:
7 *       Copy one MBCS character to another (1 or 2 bytes)
8 *
9 *******************************************************************************/
10 
11 #include <corecrt_internal_mbstring.h>
12 #include <corecrt_internal_securecrt.h>
13 #include <locale.h>
14 
15 #pragma warning(disable:__WARNING_POTENTIAL_BUFFER_OVERFLOW_NULLTERMINATED) // 26018
16 
17 errno_t __cdecl _mbccpy_s_l(unsigned char *_Dst, size_t _SizeInBytes, int *_PCopied, const unsigned char *_Src, _LOCALE_ARG_DECL)
18 {
19     /* validation section */
20     _ASSIGN_IF_NOT_NULL(_PCopied, 0);
21     _VALIDATE_STRING(_Dst, _SizeInBytes);
22     if (_Src == nullptr)
23     {
24         *_Dst = '\0';
25         _RETURN_EINVAL;
26     }
27 
28     _LOCALE_UPDATE;
29 
30     /* copy */
31     if (_ISMBBLEAD(*_Src))
32     {
33         if (_Src[1] == '\0')
34         {
35             /* the source string contained a lead byte followed by the null terminator:
36                we copy only the null terminator and return EILSEQ to indicate the
37                malformed char */
38             *_Dst = '\0';
39             _ASSIGN_IF_NOT_NULL(_PCopied, 1);
40             _RETURN_MBCS_ERROR;
41         }
42         if (_SizeInBytes < 2)
43         {
44             *_Dst = '\0';
45             _RETURN_BUFFER_TOO_SMALL(_Dst, _SizeInBytes);
46         }
47         *_Dst++ = *_Src++;
48         *_Dst = *_Src;
49         _ASSIGN_IF_NOT_NULL(_PCopied, 2);
50     }
51     else
52     {
53         *_Dst = *_Src;
54         _ASSIGN_IF_NOT_NULL(_PCopied, 1);
55     }
56 
57     _RETURN_NO_ERROR;
58 }
59