/src/strlcpy.c
C | 106 lines | 49 code | 14 blank | 43 comment | 23 complexity | a3016b0aa23f66e90aafe465e9d3779d MD5 | raw file
- /********************************************************************\
- Name: strlcpy.c
- Created by: Stefan Ritt
- Copyright 2000 + Stefan Ritt
- Contents: Contains strlcpy and strlcat which are versions of
- strcpy and strcat, but which avoid buffer overflows
-
- This file is part of MIDAS XML Library.
- MIDAS XML Library is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- MIDAS XML Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with MIDAS XML Library. If not, see <http://www.gnu.org/licenses/>.
-
- \********************************************************************/
- #include <stdio.h>
- #include <string.h>
- #include "strlcpy.h"
- /*
- * Copy src to string dst of size siz. At most siz-1 characters
- * will be copied. Always NUL terminates (unless size == 0).
- * Returns strlen(src); if retval >= siz, truncation occurred.
- */
- #ifndef STRLCPY_DEFINED
- #ifndef strlcpy
- size_t strlcpy(char *dst, const char *src, size_t size)
- {
- char *d = dst;
- const char *s = src;
- size_t n = size;
- /* Copy as many bytes as will fit */
- if (n != 0 && --n != 0) {
- do {
- if ((*d++ = *s++) == 0)
- break;
- } while (--n != 0);
- }
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (size != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++);
- }
- return (s - src - 1); /* count does not include NUL */
- }
- #endif
- /*-------------------------------------------------------------------*/
- /*
- * Appends src to string dst of size siz (unlike strncat, siz is the
- * full size of dst, not space left). At most siz-1 characters
- * will be copied. Always NUL terminates (unless size <= strlen(dst)).
- * Returns strlen(src) + MIN(size, strlen(initial dst)).
- * If retval >= size, truncation occurred.
- */
- #ifndef strlcat
- size_t strlcat(char *dst, const char *src, size_t size)
- {
- char *d = dst;
- const char *s = src;
- size_t n = size;
- size_t dlen;
- /* Find the end of dst and adjust bytes left but don't go past end */
- while (n-- != 0 && *d != '\0')
- d++;
- dlen = d - dst;
- n = size - dlen;
- if (n == 0)
- return (dlen + strlen(s));
- while (*s != '\0') {
- if (n != 1) {
- *d++ = *s;
- n--;
- }
- s++;
- }
- *d = '\0';
- return (dlen + (s - src)); /* count does not include NUL */
- }
- /*-------------------------------------------------------------------*/
- #endif
- #endif // STRLCPY_DEFINED