File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / str.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    1: /*
    2:  * zebra string function
    3:  *
    4:  * XXX This version of snprintf does not check bounds!
    5:  */
    6: 
    7: /*
    8:  The implementations of strlcpy and strlcat are copied from rsync (GPL):
    9:     Copyright (C) Andrew Tridgell 1998
   10:     Copyright (C) 2002 by Martin Pool
   11: 
   12:  Note that these are not terribly efficient, since they make more than one
   13:  pass over the argument strings.  At some point, they should be optimized.
   14:  
   15:  The implementation of strndup is copied from glibc-2.3.5:
   16:     Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
   17: */
   18: 
   19: 
   20: #include <zebra.h>
   21: 
   22: #ifndef HAVE_SNPRINTF
   23: /*
   24:  * snprint() is a real basic wrapper around the standard sprintf()
   25:  * without any bounds checking
   26:  */
   27: int
   28: snprintf(char *str, size_t size, const char *format, ...)
   29: {
   30:   va_list args;
   31: 
   32:   va_start (args, format);
   33: 
   34:   return vsprintf (str, format, args);
   35: }
   36: #endif
   37: 
   38: #ifndef HAVE_STRLCPY
   39: /**
   40:  * Like strncpy but does not 0 fill the buffer and always null 
   41:  * terminates.
   42:  *
   43:  * @param bufsize is the size of the destination buffer.
   44:  *
   45:  * @return index of the terminating byte.
   46:  **/
   47: size_t
   48: strlcpy(char *d, const char *s, size_t bufsize)
   49: {
   50: 	size_t len = strlen(s);
   51: 	size_t ret = len;
   52: 	if (bufsize > 0) {
   53: 		if (len >= bufsize)
   54: 			len = bufsize-1;
   55: 		memcpy(d, s, len);
   56: 		d[len] = 0;
   57: 	}
   58: 	return ret;
   59: }
   60: #endif
   61: 
   62: #ifndef HAVE_STRLCAT
   63: /**
   64:  * Like strncat() but does not 0 fill the buffer and always null 
   65:  * terminates.
   66:  *
   67:  * @param bufsize length of the buffer, which should be one more than
   68:  * the maximum resulting string length.
   69:  **/
   70: size_t
   71: strlcat(char *d, const char *s, size_t bufsize)
   72: {
   73: 	size_t len1 = strlen(d);
   74: 	size_t len2 = strlen(s);
   75: 	size_t ret = len1 + len2;
   76: 
   77: 	if (len1 < bufsize - 1) {
   78: 		if (len2 >= bufsize - len1)
   79: 			len2 = bufsize - len1 - 1;
   80: 		memcpy(d+len1, s, len2);
   81: 		d[len1+len2] = 0;
   82: 	}
   83: 	return ret;
   84: }
   85: #endif
   86: 
   87: #ifndef HAVE_STRNLEN
   88: size_t
   89: strnlen(const char *s, size_t maxlen)
   90: {
   91:   const char *p;
   92:   return (p = (const char *)memchr(s, '\0', maxlen)) ? (size_t)(p-s) : maxlen;
   93: }
   94: #endif
   95: 
   96: #ifndef HAVE_STRNDUP
   97: char *
   98: strndup (const char *s, size_t maxlen)
   99: {
  100:     size_t len = strnlen (s, maxlen);
  101:     char *new = (char *) malloc (len + 1);
  102: 
  103:     if (new == NULL)
  104:       return NULL;
  105: 
  106:     new[len] = '\0';
  107:     return (char *) memcpy (new, s, len);
  108: }
  109: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>