errno_t __cdecl _mbscpy_s_l(unsigned char *_Dst, size_t _SizeInBytes, const unsigned char *_Src, _LOCALE_ARG_DECL) { unsigned char *p; size_t available; BOOL fIsLeadPrefix; /* validation section */ _VALIDATE_STRING(_Dst, _SizeInBytes); _VALIDATE_POINTER_RESET_STRING(_Src, _Dst, _SizeInBytes); _LOCALE_UPDATE; if (_LOCALE_SHORTCUT_TEST) { return strcpy_s((char *)_Dst, _SizeInBytes, (const char *)_Src); } p = _Dst; available = _SizeInBytes; while ((*p++ = *_Src++) != 0 && --available > 0) { } /* * If we ran out of destination bytes then we did so before copying null. * Only exception to that is if last mbc was invalid (leadbyte+null), which * is treated as null. In that case clear the copied lead byte and return ok. */ if (available == 0) { if (*_Src == 0) { _ISMBBLEADPREFIX(fIsLeadPrefix,_Dst,p-1); if (fIsLeadPrefix) { p[-1] = 0; _RETURN_MBCS_ERROR; } } _RESET_STRING(_Dst, _SizeInBytes); _RETURN_BUFFER_TOO_SMALL(_Dst, _SizeInBytes); } /* * Otherwise we have space left in the dst buffer and stopped copying because * we saw a null in the src. If null is part of invalid MBC (lead byte + null) * then clear the lead byte also. */ _ISMBBLEADPREFIX(fIsLeadPrefix, _Dst, p-2); if (fIsLeadPrefix && (p - 2) >= _Dst) { p[-2] = 0; available++; _FILL_STRING(_Dst, _SizeInBytes, _SizeInBytes - available + 1); _RETURN_MBCS_ERROR; } _FILL_STRING(_Dst, _SizeInBytes, _SizeInBytes - available + 1); _RETURN_NO_ERROR; }
static errno_t __cdecl _wcslwr_s_l_stat ( wchar_t * wsrc, size_t sizeInWords, _locale_t plocinfo ) { wchar_t *p; /* traverses string for C locale conversion */ wchar_t *wdst; /* wide version of string in alternate case */ int dstsize; /* size in wide chars of wdst string buffer (include null) */ errno_t e = 0; size_t stringlen; /* validation section */ _VALIDATE_RETURN_ERRCODE(wsrc != NULL, EINVAL); stringlen = wcsnlen(wsrc, sizeInWords); if (stringlen >= sizeInWords) { _RESET_STRING(wsrc, sizeInWords); _RETURN_DEST_NOT_NULL_TERMINATED(wsrc, sizeInWords); } _FILL_STRING(wsrc, sizeInWords, stringlen + 1); if ( plocinfo->locinfo->locale_name[LC_CTYPE] == NULL) { for ( p = wsrc ; *p ; p++ ) { if ( (*p >= (wchar_t)L'A') && (*p <= (wchar_t)L'Z') ) { *p -= L'A' - L'a'; } } return 0; } /* C locale */ /* Inquire size of wdst string */ if ( (dstsize = __crtLCMapStringW( plocinfo->locinfo->locale_name[LC_CTYPE], LCMAP_LOWERCASE, wsrc, -1, NULL, 0 )) == 0 ) { errno = EILSEQ; return errno; } if (sizeInWords < (size_t)dstsize) { _RESET_STRING(wsrc, sizeInWords); _RETURN_BUFFER_TOO_SMALL(wsrc, sizeInWords); } /* Allocate space for wdst */ wdst = (wchar_t *)_calloca(dstsize, sizeof(wchar_t)); if (wdst == NULL) { errno = ENOMEM; return errno; } /* Map wrc string to wide-character wdst string in alternate case */ if (__crtLCMapStringW( plocinfo->locinfo->locale_name[LC_CTYPE], LCMAP_LOWERCASE, wsrc, -1, wdst, dstsize ) != 0) { /* Copy wdst string to user string */ e = wcscpy_s(wsrc, sizeInWords, wdst); } else { e = errno = EILSEQ; } _freea(wdst); return e; }