Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
#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; }
|