diff --git a/src/mxml.c b/src/mxml.c index fa06d649..2fe480d7 100755 --- a/src/mxml.c +++ b/src/mxml.c @@ -6,6 +6,9 @@ Contents: Midas XML Library $Log$ + Revision 1.6 2005/03/21 16:02:08 ritt + Added code for strlcpy/cat ifndef STRLCPY_DEFINED + Revision 1.5 2005/03/21 07:37:22 ritt Changed file mode @@ -60,9 +63,77 @@ typedef int BOOL; /*------------------------------------------------------------------*/ -/* should come from midas.c, elogd.c etc. */ +#ifdef STRLCPY_DEFINED + extern size_t strlcpy(char *dst, const char *src, size_t size); -extern size_t strlcat(char *dst, const char *src, size_t size); +extern size_t strlcat(char *dst, const char *src, size_t size) + +#else + +/* + * 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. + */ +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 */ +} + +/* + * 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. + */ +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 // STRLCPY_DEFINED /*------------------------------------------------------------------*/