ROOTANA
strlcpy.cxx
Go to the documentation of this file.
1 /********************************************************************\
2 
3  Name: strlcpy.c
4  Created by: Stefan Ritt
5  Copyright 2000 + Stefan Ritt
6 
7  Contents: Contains strlcpy and strlcat which are versions of
8  strcpy and strcat, but which avoid buffer overflows
9 
10 
11  This file is part of MIDAS XML Library.
12 
13  MIDAS XML Library is free software: you can redistribute it and/or modify
14  it under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 2 of the License, or
16  (at your option) any later version.
17 
18  MIDAS XML Library is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  GNU General Public License for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with MIDAS XML Library. If not, see <http://www.gnu.org/licenses/>.
25 
26 \********************************************************************/
27 
28 #include <stdio.h>
29 #include <string.h>
30 #include "strlcpy.h"
31 
32 /*
33 * Copy src to string dst of size siz. At most siz-1 characters
34 * will be copied. Always NUL terminates (unless size == 0).
35 * Returns strlen(src); if retval >= siz, truncation occurred.
36 */
37 #ifndef STRLCPY_DEFINED
38 
39 size_t strlcpy(char *dst, const char *src, size_t size)
40 {
41  char *d = dst;
42  const char *s = src;
43  size_t n = size;
44 
45  /* Copy as many bytes as will fit */
46  if (n != 0 && --n != 0) {
47  do {
48  if ((*d++ = *s++) == 0)
49  break;
50  } while (--n != 0);
51  }
52 
53  /* Not enough room in dst, add NUL and traverse rest of src */
54  if (n == 0) {
55  if (size != 0)
56  *d = '\0'; /* NUL-terminate dst */
57  while (*s++);
58  }
59 
60  return (s - src - 1); /* count does not include NUL */
61 }
62 
63 /*-------------------------------------------------------------------*/
64 
65 /*
66 * Appends src to string dst of size siz (unlike strncat, siz is the
67 * full size of dst, not space left). At most siz-1 characters
68 * will be copied. Always NUL terminates (unless size <= strlen(dst)).
69 * Returns strlen(src) + MIN(size, strlen(initial dst)).
70 * If retval >= size, truncation occurred.
71 */
72 size_t strlcat(char *dst, const char *src, size_t size)
73 {
74  char *d = dst;
75  const char *s = src;
76  size_t n = size;
77  size_t dlen;
78 
79  /* Find the end of dst and adjust bytes left but don't go past end */
80  while (n-- != 0 && *d != '\0')
81  d++;
82  dlen = d - dst;
83  n = size - dlen;
84 
85  if (n == 0)
86  return (dlen + strlen(s));
87  while (*s != '\0') {
88  if (n != 1) {
89  *d++ = *s;
90  n--;
91  }
92  s++;
93  }
94  *d = '\0';
95 
96  return (dlen + (s - src)); /* count does not include NUL */
97 }
98 
99 /*-------------------------------------------------------------------*/
100 
101 #endif // STRLCPY_DEFINED
char * dst
Definition: lz4.h:354
size_t strlcat(char *dst, const char *src, size_t size)
Definition: strlcpy.cxx:72
size_t strlcpy(char *dst, const char *src, size_t size)
Definition: strlcpy.cxx:39