Rev 197 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
195 | f9daq | 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 3 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 |