Reactos
at master 103 lines 3.1 kB view raw
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}