diff options
author | Stef Walter <stef@memberwebs.com> | 2004-07-19 17:49:09 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2004-07-19 17:49:09 +0000 |
commit | 086da0b54d7f5711733febdb27507a5400767be6 (patch) | |
tree | a8cbf97d4d71ae9803cfb16e29d5d9732e878aa6 /common/compat.c | |
parent | 0d8273a6e327e1e9a2bdddcea1e1b19bcb544247 (diff) |
Miscellaneous fixes (lost track).
Diffstat (limited to 'common/compat.c')
-rw-r--r-- | common/compat.c | 99 |
1 files changed, 82 insertions, 17 deletions
diff --git a/common/compat.c b/common/compat.c index 54fd760..d3730e0 100644 --- a/common/compat.c +++ b/common/compat.c @@ -34,8 +34,37 @@ * CONTRIBUTORS * Nate Nielsen <nielsen@memberwebs.com> * + * + * PORTIONS FROM OPENBSD: ------------------------------------------------- + * + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + #include "usuals.h" #include "compat.h" @@ -81,34 +110,70 @@ char* strupr(char* s) #ifndef HAVE_STRLCPY -#ifndef HAVE_STRNCPY -#error neither strncpy or strlcpy found -#endif - -void strlcpy(char* dest, const char* src, size_t count) +size_t strlcpy(char* dst, const char* src, size_t siz) { - if(count > 0) - { - strncpy(dest, src, count); - dest[count - 1] = 0; + char* d = dst; + const char* s = src; + size_t n = siz; + + /* 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(siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return s - src - 1; /* count does not include NUL */ } + #endif #ifndef HAVE_STRLCAT -#ifndef HAVE_STRNCAT -#error neither strncat or strlcat found -#endif - -void strlcat(char* dest, const char* src, size_t count) +size_t strlcat(char* dst, const char* src, size_t siz) { - if(count > 0) + char* d = dst; + const char* s = src; + size_t n = siz; + 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 = siz - dlen; + + if(n == 0) + return dlen + strlen(s); + while(*s != '\0') + { + if(n != 1) { - strncat(dest, src, count); - dest[count - 1] = 0; + *d++ = *s; + n--; } + + s++; + } + + *d = '\0'; + + return dlen + (s - src); /* count does not include NUL */ } + #endif |