home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / libncftp / libncftp-3.2.5-src.zip / libncftp-3.2.5 / Strn / DStrCpyList.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  2KB  |  84 lines

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