| /* |
| * zebra string function |
| * |
| * XXX This version of snprintf does not check bounds! |
| */ |
| |
| /* |
| The implementations of strlcpy and strlcat are copied from rsync (GPL): |
| Copyright (C) Andrew Tridgell 1998 |
| Copyright (C) 2002 by Martin Pool |
| |
| Note that these are not terribly efficient, since they make more than one |
| pass over the argument strings. At some point, they should be optimized. |
| */ |
| |
| |
| #include <zebra.h> |
| |
| #ifndef HAVE_SNPRINTF |
| /* |
| * snprint() is a real basic wrapper around the standard sprintf() |
| * without any bounds checking |
| */ |
| int |
| snprintf(char *str, size_t size, const char *format, ...) |
| { |
| va_list args; |
| |
| va_start (args, format); |
| |
| return vsprintf (str, format, args); |
| } |
| #endif |
| |
| #ifndef HAVE_STRLCPY |
| /** |
| * Like strncpy but does not 0 fill the buffer and always null |
| * terminates. |
| * |
| * @param bufsize is the size of the destination buffer. |
| * |
| * @return index of the terminating byte. |
| **/ |
| size_t |
| strlcpy(char *d, const char *s, size_t bufsize) |
| { |
| size_t len = strlen(s); |
| size_t ret = len; |
| if (bufsize > 0) { |
| if (len >= bufsize) |
| len = bufsize-1; |
| memcpy(d, s, len); |
| d[len] = 0; |
| } |
| return ret; |
| } |
| #endif |
| |
| #ifndef HAVE_STRLCAT |
| /** |
| * Like strncat() but does not 0 fill the buffer and always null |
| * terminates. |
| * |
| * @param bufsize length of the buffer, which should be one more than |
| * the maximum resulting string length. |
| **/ |
| size_t |
| strlcat(char *d, const char *s, size_t bufsize) |
| { |
| size_t len1 = strlen(d); |
| size_t len2 = strlen(s); |
| size_t ret = len1 + len2; |
| |
| if (len1 < bufsize - 1) { |
| if (len2 >= bufsize - len1) |
| len2 = bufsize - len1 - 1; |
| memcpy(d+len1, s, len2); |
| d[len1+len2] = 0; |
| } |
| return ret; |
| } |
| #endif |
| |
| #ifndef HAVE_STRNLEN |
| size_t |
| strnlen(const char *s, size_t maxlen) |
| { |
| const char *p; |
| return (p = (const char *)memchr(s, '\0', maxlen)) ? (size_t)(p-s) : maxlen; |
| } |
| #endif |