Reactos
1/***
2*mbsnbcpy.c - Copy one string to another, n bytes only (MBCS)
3*
4* Copyright (c) Microsoft Corporation. All rights reserved.
5*
6*Purpose:
7* Copy one string to another, n bytes only (MBCS)
8*
9*******************************************************************************/
10#ifndef _MBCS
11 #error This file should only be compiled with _MBCS defined
12#endif
13
14#include <corecrt_internal_mbstring.h>
15#include <locale.h>
16#include <string.h>
17
18#pragma warning(disable:__WARNING_POTENTIAL_BUFFER_OVERFLOW_NULLTERMINATED) // 26018
19
20/***
21* _mbsnbcpy - Copy one string to another, n bytes only (MBCS)
22*
23*Purpose:
24* Copies exactly cnt bytes from src to dst. If strlen(src) < cnt, the
25* remaining character are padded with null bytes. If strlen >= cnt, no
26* terminating null byte is added. 2-byte MBCS characters are handled
27* correctly.
28*
29*Entry:
30* unsigned char *dst = destination for copy
31* unsigned char *src = source for copy
32* int cnt = number of bytes to copy
33*
34*Exit:
35* returns dst = destination of copy
36*
37*Exceptions:
38* Input parameters are validated. Refer to the validation section of the function.
39*
40*******************************************************************************/
41
42#pragma warning(suppress:6101) // Returning uninitialized memory '*dst'. A successful path through the function does not set the named _Out_ parameter.
43unsigned char * __cdecl _mbsnbcpy_l(
44 unsigned char *dst,
45 const unsigned char *src,
46 size_t cnt,
47 _locale_t plocinfo
48 )
49{
50
51 unsigned char *start = dst;
52 _LocaleUpdate _loc_update(plocinfo);
53
54 /* validation section */
55 _VALIDATE_RETURN(dst != nullptr || cnt == 0, EINVAL, nullptr);
56 _VALIDATE_RETURN(src != nullptr || cnt == 0, EINVAL, nullptr);
57
58 _BEGIN_SECURE_CRT_DEPRECATION_DISABLE
59 if (_loc_update.GetLocaleT()->mbcinfo->ismbcodepage == 0)
60#pragma warning(suppress:__WARNING_BANNED_API_USAGE)
61 return (unsigned char *)strncpy((char *)dst, (const char *)src, cnt);
62 _END_SECURE_CRT_DEPRECATION_DISABLE
63
64 while (cnt) {
65
66 cnt--;
67 if ( _ismbblead_l(*src, _loc_update.GetLocaleT()) ) {
68 *dst++ = *src++;
69 if (!cnt) {
70 dst[-1] = '\0';
71 break;
72 }
73 cnt--;
74 if ((*dst++ = *src++) == '\0') {
75 dst[-2] = '\0';
76 break;
77 }
78 }
79
80 else
81 if ((*dst++ = *src++) == '\0')
82 break;
83
84 }
85
86 /* pad with nulls as needed */
87
88 while (cnt--)
89 *dst++ = '\0';
90
91#pragma warning(suppress:__WARNING_POSTCONDITION_NULLTERMINATION_VIOLATION) // 26036
92 return start;
93}
94unsigned char * (__cdecl _mbsnbcpy)(
95 unsigned char *dst,
96 const unsigned char *src,
97 size_t cnt
98 )
99{
100 _BEGIN_SECURE_CRT_DEPRECATION_DISABLE
101 return _mbsnbcpy_l(dst, src, cnt, nullptr);
102 _END_SECURE_CRT_DEPRECATION_DISABLE
103}