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 / DStrCatList.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  2KB  |  86 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. /*VARARGS*/
  7. const char *
  8. DStrCatList(DStr *const dst, ...)
  9. {
  10.     size_t catLen, allocSize, newLen, curLen, srcLen;
  11.     char *dcp, *cp, *osrc;
  12.     const char *src;
  13.     char *recursive;
  14.     va_list ap;
  15.  
  16.     if (IS_DSTR_CORRUPT(dst))
  17.         return NULL;
  18.  
  19.     osrc = dst->s;
  20.     recursive = NULL;
  21.     catLen = 0;
  22.     va_start(ap, dst);
  23.     src = va_arg(ap, char *);
  24.     while (src != NULL) {
  25.         if (src == osrc) {
  26.             if (recursive == NULL)
  27.                 recursive = strdup(src);
  28.         }
  29.         catLen += strlen(src);
  30.         src = va_arg(ap, char *);
  31.     }
  32.     va_end(ap);
  33.  
  34.     catLen++;         /* copy NUL byte also */;
  35.     curLen = dst->len;
  36.     newLen = catLen + curLen;
  37.     if (newLen > 0x00FFFFFF) {
  38.         if (recursive != NULL)
  39.             free(recursive);
  40.         return NULL;
  41.     }
  42.     if (dst->allocSize < newLen) {
  43.         /* Need to resize buffer before copying. */
  44.         allocSize = (newLen + 16) & 0xFFFFFFF0;
  45.         if (dst->s == NULL) {
  46.             cp = calloc(allocSize, (size_t) 1);
  47.             if (cp == NULL) {
  48.                 if (recursive != NULL)
  49.                     free(recursive);
  50.                 return NULL;
  51.             }
  52.         } else {
  53.             cp = realloc(dst->s, allocSize);
  54.             if (cp == NULL) {
  55.                 if (recursive != NULL)
  56.                     free(recursive);
  57.                 return NULL;
  58.             }
  59.             memset(cp + curLen, 0, allocSize - curLen);
  60.         }
  61.         dst->s = cp;
  62.         dst->allocSize = allocSize;
  63.     } else {
  64.         cp = dst->s;
  65.     }
  66.  
  67.     dcp = cp + curLen;
  68.     va_start(ap, dst);
  69.     src = va_arg(ap, char *);
  70.     while (src != NULL) {
  71.         if (src == osrc)
  72.             src = recursive;
  73.         srcLen = strlen(src);
  74.         memcpy(dcp, src, srcLen);
  75.         dcp += srcLen;
  76.         src = va_arg(ap, char *);
  77.     }
  78.     va_end(ap);
  79.     *dcp = '\0';
  80.  
  81.     dst->len = newLen - 1;
  82.     if (recursive != NULL)
  83.         free(recursive);
  84.     return (cp);
  85. }    /* DStrCatList */
  86.