File:  [gforth] / gforth / libltdl / lt__strl.c
Revision 1.1: download - view: text, annotated - select for diffs
Sat Apr 19 19:28:51 2008 UTC (15 years, 11 months ago) by anton
Branches: MAIN
CVS tags: v0-7-0, HEAD
added libltdl (no integration yet)

    1: /* lt__strl.c -- size-bounded string copying and concatenation
    2: 
    3:    Copyright (C) 2004 Free Software Foundation, Inc.
    4:    Written by Bob Friesenhahn, 2004
    5: 
    6:    NOTE: The canonical source of this file is maintained with the
    7:    GNU Libtool package.  Report bugs to bug-libtool@gnu.org.
    8: 
    9: GNU Libltdl is free software; you can redistribute it and/or
   10: modify it under the terms of the GNU Lesser General Public
   11: License as published by the Free Software Foundation; either
   12: version 2 of the License, or (at your option) any later version.
   13: 
   14: As a special exception to the GNU Lesser General Public License,
   15: if you distribute this file as part of a program or library that
   16: is built using GNU Libtool, you may include this file under the
   17: same distribution terms that you use for the rest of that program.
   18: 
   19: GNU Libltdl is distributed in the hope that it will be useful,
   20: but WITHOUT ANY WARRANTY; without even the implied warranty of
   21: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   22: GNU Lesser General Public License for more details.
   23: 
   24: You should have received a copy of the GNU Lesser General Public
   25: License along with GNU Libltdl; see the file COPYING.LIB.  If not, a
   26: copy can be downloaded from  http://www.gnu.org/licenses/lgpl.html,
   27: or obtained by writing to the Free Software Foundation, Inc.,
   28: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
   29: */
   30: 
   31: #include <assert.h>
   32: #include <string.h>
   33: 
   34: #include "lt__strl.h"
   35: 
   36: /*
   37:  lt_strlcat appends the NULL-terminated string src to the end of dst.
   38:  It will append at most dstsize - strlen(dst) - 1 bytes,
   39:  NULL-terminating the result. The total length of the string which
   40:  would have been created given sufficient buffer size (may be longer
   41:  than dstsize) is returned.  This function substitutes for strlcat()
   42:  which is available under NetBSD, FreeBSD and Solaris 9.
   43: 
   44:  Buffer overflow can be checked as follows:
   45: 
   46:    if (lt_strlcat(dst, src, dstsize) >= dstsize)
   47:      return -1;
   48: */
   49: #if !defined(HAVE_STRLCAT)
   50: size_t
   51: lt_strlcat(char *dst, const char *src, const size_t dstsize)
   52: {
   53:   size_t length;
   54:   char *p;
   55:   const char *q;
   56: 
   57:   assert(dst != NULL);
   58:   assert(src != (const char *) NULL);
   59:   assert(dstsize >= 1);
   60: 
   61:   length=strlen(dst);
   62: 
   63:   /*
   64:     Copy remaining characters from src while constraining length to
   65:     size - 1.
   66:   */
   67:   for ( p = dst + length, q = src;
   68:         (*q != 0) && (length < dstsize - 1) ;
   69:         length++, p++, q++ )
   70:     *p = *q;
   71: 
   72:   dst[length]='\0';
   73: 
   74:   /*
   75:     Add remaining length of src to length.
   76:   */
   77:   while (*q++)
   78:     length++;
   79: 
   80:   return length;
   81: }
   82: #endif /* !defined(HAVE_STRLCAT) */
   83: 
   84: /*
   85:   lt_strlcpy copies up to dstsize - 1 characters from the NULL-terminated
   86:   string src to dst, NULL-terminating the result. The total length of
   87:   the string which would have been created given sufficient buffer
   88:   size (may be longer than dstsize) is returned. This function
   89:   substitutes for strlcpy() which is available under OpenBSD, FreeBSD
   90:   and Solaris 9.
   91: 
   92:   Buffer overflow can be checked as  follows:
   93: 
   94:     if (lt_strlcpy(dst, src, dstsize) >= dstsize)
   95:       return -1;
   96: */
   97: #if !defined(HAVE_STRLCPY)
   98: size_t
   99: lt_strlcpy(char *dst, const char *src, const size_t dstsize)
  100: {
  101:   size_t length=0;
  102:   char *p;
  103:   const char *q;
  104: 
  105:   assert(dst != NULL);
  106:   assert(src != (const char *) NULL);
  107:   assert(dstsize >= 1);
  108: 
  109:   /*
  110:     Copy src to dst within bounds of size-1.
  111:   */
  112:   for ( p=dst, q=src, length=0 ;
  113:         (*q != 0) && (length < dstsize-1) ;
  114:         length++, p++, q++ )
  115:     *p = *q;
  116: 
  117:   dst[length]='\0';
  118: 
  119:   /*
  120:     Add remaining length of src to length.
  121:   */
  122:   while (*q++)
  123:     length++;
  124: 
  125:   return length;
  126: }
  127: #endif /* !defined(HAVE_STRLCPY) */

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