1198090Srdivacky/*
2198090Srdivacky * This code is derived from OpenBSD's libc, original license follows:
3198090Srdivacky *
4198090Srdivacky * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
5198090Srdivacky *
6198090Srdivacky * Permission to use, copy, modify, and distribute this software for any
7198090Srdivacky * purpose with or without fee is hereby granted, provided that the above
8198090Srdivacky * copyright notice and this permission notice appear in all copies.
9198090Srdivacky *
10198090Srdivacky * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11198090Srdivacky * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12198090Srdivacky * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13198090Srdivacky * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14198090Srdivacky * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15198090Srdivacky * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16198090Srdivacky * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17198090Srdivacky */
18198090Srdivacky
19198090Srdivacky#include <sys/types.h>
20198090Srdivacky#include <string.h>
21198090Srdivacky
22198090Srdivacky#include "regex_impl.h"
23198090Srdivacky/*
24198090Srdivacky * Copy src to string dst of size siz.  At most siz-1 characters
25198090Srdivacky * will be copied.  Always NUL terminates (unless siz == 0).
26198090Srdivacky * Returns strlen(src); if retval >= siz, truncation occurred.
27198090Srdivacky */
28198090Srdivackysize_t
29198090Srdivackyllvm_strlcpy(char *dst, const char *src, size_t siz)
30198090Srdivacky{
31198090Srdivacky	char *d = dst;
32198090Srdivacky	const char *s = src;
33198090Srdivacky	size_t n = siz;
34198090Srdivacky
35198090Srdivacky	/* Copy as many bytes as will fit */
36198090Srdivacky	if (n != 0) {
37198090Srdivacky		while (--n != 0) {
38198090Srdivacky			if ((*d++ = *s++) == '\0')
39198090Srdivacky				break;
40198090Srdivacky		}
41198090Srdivacky	}
42198090Srdivacky
43198090Srdivacky	/* Not enough room in dst, add NUL and traverse rest of src */
44198090Srdivacky	if (n == 0) {
45198090Srdivacky		if (siz != 0)
46198090Srdivacky			*d = '\0';		/* NUL-terminate dst */
47198090Srdivacky		while (*s++)
48198090Srdivacky			;
49198090Srdivacky	}
50198090Srdivacky
51198090Srdivacky	return(s - src - 1);	/* count does not include NUL */
52198090Srdivacky}
53