LLVM  13.0.0git
regstrlcpy.c
Go to the documentation of this file.
1 /*
2  * This code is derived from OpenBSD's libc, original license follows:
3  *
4  * Copyright (c) 1998 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 <sys/types.h>
20 #include <string.h>
21 
22 #include "regex_impl.h"
23 /*
24  * Copy src to string dst of size siz. At most siz-1 characters
25  * will be copied. Always NUL terminates (unless siz == 0).
26  * Returns strlen(src); if retval >= siz, truncation occurred.
27  */
28 size_t
29 llvm_strlcpy(char *dst, const char *src, size_t siz)
30 {
31  char *d = dst;
32  const char *s = src;
33  size_t n = siz;
34 
35  /* Copy as many bytes as will fit */
36  if (n != 0) {
37  while (--n != 0) {
38  if ((*d++ = *s++) == '\0')
39  break;
40  }
41  }
42 
43  /* Not enough room in dst, add NUL and traverse rest of src */
44  if (n == 0) {
45  if (siz != 0)
46  *d = '\0'; /* NUL-terminate dst */
47  while (*s++)
48  ;
49  }
50 
51  return(s - src - 1); /* count does not include NUL */
52 }
regex_impl.h
llvm_strlcpy
size_t llvm_strlcpy(char *dst, const char *src, size_t siz)
Definition: regstrlcpy.c:29
s
multiplies can be turned into SHL s
Definition: README.txt:370
d
the resulting code requires compare and branches when and if the revised code is with conditional branches instead of More there is a byte word extend before each where there should be only and the condition codes are not remembered when the same two values are compared twice More LSR enhancements i8 and i32 load store addressing modes are identical int int int d
Definition: README.txt:418
n
The same transformation can work with an even modulo with the addition of a and shrink the compare RHS by the same amount Unless the target supports that transformation probably isn t worthwhile The transformation can also easily be made to work with non zero equality for n
Definition: README.txt:685