Chameleon

Chameleon Commit Details

Date:2014-01-07 08:13:28 (10 years 2 months ago)
Author:Chuck Fry
Commit:2291
Parents: 2290
Message:Use original *BSD source for strlcpy()
Changes:
M/branches/chucko/i386/klibc/strlcpy.c

File differences

branches/chucko/i386/klibc/strlcpy.c
22
33
44
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
523
624
725
8
26
27
28
29
30
31
32
933
10
11
12
13
34
35
36
1437
15
16
17
38
39
40
41
42
43
44
1845
19
20
46
47
48
49
50
51
52
2153
22
23
24
25
26
54
2755
* strlcpy.c
*/
/* Use OpenBSD heritage source -- Chucko 2014-01-06 */
/*-
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <string.h>
#include <klibc/compiler.h>
size_t strlcpy(char *dst, const char *src, size_t size)
/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
size_t
strlcpy(char * __restrict dst, const char * __restrict src, size_t siz)
{
size_t bytes = 0;
char *q = dst;
const char *p = src;
char ch;
char *d = dst;
const char *s = src;
size_t n = siz;
while ((ch = *p++)) {
if (bytes + 1 < size)
*q++ = ch;
/* Copy as many bytes as will fit */
if (n != 0) {
while (--n != 0) {
if ((*d++ = *s++) == '\0')
break;
}
}
bytes++;
}
/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0) {
if (siz != 0)
*d = '\0'; /* NUL-terminate dst */
while (*s++)
;
}
/* If size == 0 there is no space for a final null... */
if (size)
*q = '\0';
return bytes;
return(s - src - 1); /* count does not include NUL */
}

Archive Download the corresponding diff file

Revision: 2291