1 #include <sys/types.h>
2 #include <string.h>
3 #include "Strn.h"
4
5 /*
6 * Copy src to dst, truncating or null-padding to always copy n-1 bytes.
7 *
8 * This routine differs from strncpy in that it returns a pointer to the end
9 * of the buffer, instead of strncat which returns a pointer to the start.
10 */
11 char *
Strnpcpy(char * const dst,const char * const src,size_t n)12 Strnpcpy(char *const dst, const char *const src, size_t n)
13 {
14 register char *d;
15 register const char *s;
16 register char c;
17 char *ret;
18 register size_t i;
19
20 d = dst;
21 if (n != 0) {
22 s = src;
23 /* If they specified a maximum of n characters, use n - 1 chars to
24 * hold the copy, and the last character in the array as a NUL.
25 * This is the difference between the regular strncpy routine.
26 * strncpy doesn't guarantee that your new string will have a
27 * NUL terminator, but this routine does.
28 */
29 for (i=1; i<n; i++) {
30 c = *s++;
31 if (c == '\0') {
32 ret = d; /* Return ptr to end byte. */
33 *d++ = c;
34 #if (STRNP_ZERO_PAD == 1)
35 /* Pad with zeros. */
36 for (; i<n; i++)
37 *d++ = 0;
38 #endif /* STRNP_ZERO_PAD */
39 return ret;
40 }
41 *d++ = c;
42 }
43 /* If we get here, then we have a full string, with n - 1 characters,
44 * so now we NUL terminate it and go home.
45 */
46 *d = '\0';
47 return (d); /* Return ptr to end byte. */
48 } else {
49 *d = 0;
50 }
51 return (d); /* Return ptr to end byte. */
52 } /* Strnpcpy */
53
54 /* eof Strn.c */
55