windows-nt/Source/XPSP1/NT/shell/ext/ratings/common/cpycat.cpp
2020-09-26 16:20:57 +08:00

58 lines
1.5 KiB
C++

#include "npcommon.h"
// strncpyf(dest, src, cb)
//
// Always stores cb bytes to dest. If total characters copied
// ends up less than cb bytes, zero-fills dest.
// If strlen(src) >= cb, dest is NOT null-terminated.
// Returns dest.
LPSTR WINAPI strncpyf(LPSTR lpDest, LPCSTR lpSrc, UINT cbCopy)
{
LPCSTR lpChr = lpSrc;
UINT cbToCopy = 0;
// find ptr past last char to copy
while (*lpChr) {
if (cbToCopy + (IS_LEAD_BYTE(*lpChr) ? 2 : 1) > cbCopy)
break; // copying this char would run over the limit
cbToCopy += IS_LEAD_BYTE(*lpChr) ? 2 : 1;
ADVANCE(lpChr);
}
// copy that many bytes
memcpyf(lpDest, lpSrc, cbToCopy);
memsetf(lpDest + cbToCopy, '\0', cbCopy - cbToCopy);
return lpDest;
}
// strncatf(dest, src, cb)
//
// Concatenates at most cb bytes of src onto the end of dest.
// Unlike strncpyf, does not pad with extra nulls, but does
// guarantee a null-terminated destination.
// Returns dest.
LPSTR WINAPI strncatf(LPSTR lpDest, LPCSTR lpSrc, UINT cbCopy)
{
LPCSTR lpChr = lpSrc;
UINT cbToCopy = 0;
// find ptr past last char to copy
while (*lpChr) {
if (cbToCopy + (IS_LEAD_BYTE(*lpChr) ? 2 : 1) > cbCopy)
break; // copying this char would run over the limit
cbToCopy += IS_LEAD_BYTE(*lpChr) ? 2 : 1;
ADVANCE(lpChr);
}
// copy that many bytes
memcpyf(lpDest, lpSrc, cbToCopy);
lpDest[cbToCopy] = '\0';
return lpDest;
}