Ruby
3.5.0dev (2025-01-10 revision 5fab31b15e32622c4b71d1d347a41937e9f9c212)
missing
strlcat.c
1
/* $OpenBSD: strlcat.c,v 1.15 2015/03/02 21:41:08 millert Exp $ */
2
3
/*
4
* Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
5
*
6
* Permission to use, copy, modify, and distribute this software for any
7
* purpose with or without fee is hereby granted, provided that the above
8
* copyright notice and this permission notice appear in all copies.
9
*
10
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
*/
18
19
#include "ruby/missing.h"
20
#include <sys/types.h>
21
#include <string.h>
22
23
/*
24
* Appends src to string dst of size dsize (unlike strncat, dsize is the
25
* full size of dst, not space left). At most dsize-1 characters
26
* will be copied. Always NUL terminates (unless dsize <= strlen(dst)).
27
* Returns strlen(src) + MIN(dsize, strlen(initial dst)).
28
* If retval >= dsize, truncation occurred.
29
*/
30
size_t
31
strlcat(
char
*dst,
const
char
*src,
size_t
dsize)
32
{
33
const
char
*odst = dst;
34
const
char
*osrc = src;
35
size_t
n = dsize;
36
size_t
dlen;
37
38
/* Find the end of dst and adjust bytes left but don't go past end. */
39
while
(n-- != 0 && *dst !=
'\0'
)
40
dst++;
41
dlen = dst - odst;
42
n = dsize - dlen;
43
44
if
(n-- == 0)
45
return
(dlen + strlen(src));
46
while
(*src !=
'\0'
) {
47
if
(n != 0) {
48
*dst++ = *src;
49
n--;
50
}
51
src++;
52
}
53
*dst =
'\0'
;
54
55
return
(dlen + (src - osrc));
/* count does not include NUL */
56
}
Generated by
1.9.8