home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / ncftp / older_versions / ncftp-3.2.2-src.tar.bz2 / ncftp-3.2.2-src.tar / ncftp-3.2.2 / Strn / DStrCat.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  911b  |  44 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. const char *
  7. DStrCat(DStr *const dst, const char *const src)
  8. {
  9.     size_t srcLen, allocSize, newLen, curLen;
  10.     char *cp;
  11.  
  12.     if (IS_DSTR_CORRUPT(dst))
  13.         return NULL;
  14.  
  15.     srcLen = strlen(src) + 1 /* copy NUL byte also */;
  16.     curLen = dst->len;
  17.     newLen = srcLen + curLen;
  18.     if (newLen > 0x00FFFFFF)
  19.         return NULL;
  20.     if (dst->allocSize < newLen) {
  21.         /* Need to resize buffer before copying. */
  22.         allocSize = (newLen + 16) & 0xFFFFFFF0;
  23.         if (dst->s == NULL) {
  24.             cp = calloc(allocSize, (size_t) 1);
  25.             if (cp == NULL)
  26.                 return NULL;
  27.         } else {
  28.             cp = realloc(dst->s, allocSize);
  29.             if (cp == NULL)
  30.                 return NULL;
  31.             memset(cp + curLen, 0, allocSize - curLen);
  32.         }
  33.         dst->s = cp;
  34.         dst->allocSize = allocSize;
  35.     } else {
  36.         cp = dst->s;
  37.     }
  38.  
  39.     memcpy(cp + curLen, src, --srcLen);
  40.     dst->len = newLen - 1;
  41.     cp[newLen - 1] = '\0';
  42.     return (cp);
  43. }    /* DStrCat */
  44.