#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; }