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 / Dynscat.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  1KB  |  69 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. /*VARARGS*/
  7. char *
  8. Dynscat(char **dst, ...)
  9. {
  10.     va_list ap;
  11.     const char *src;
  12.     char *newdst, *dcp;
  13.     size_t curLen, catLen, srcLen;
  14.     int recursive = 0;
  15.  
  16.     if (dst == (char **) 0)
  17.         return NULL;
  18.  
  19.     catLen = 0;
  20.     va_start(ap, dst);
  21.     src = va_arg(ap, char *);
  22.     while (src != NULL) {
  23.         if (src == *dst)
  24.             recursive = 1;
  25.         catLen += strlen(src);
  26.         src = va_arg(ap, char *);
  27.     }
  28.     va_end(ap);
  29.  
  30.     if (recursive != 0) {
  31.         /* Don't allow this:
  32.          *
  33.          *   Dynscat(&p, "foo", p, "bar", 0);
  34.          *
  35.          */
  36.         if (*dst != NULL)
  37.             free(*dst);
  38.         *dst = NULL;
  39.         return NULL;
  40.     }
  41.  
  42.     if ((*dst == NULL) || (**dst == '\0'))
  43.         curLen = 0;
  44.     else
  45.         curLen = strlen(*dst);
  46.  
  47.     if (*dst == NULL)
  48.         newdst = malloc(curLen + catLen + 2);
  49.     else
  50.         newdst = realloc(*dst, curLen + catLen + 2);
  51.     if (newdst == NULL)
  52.         return NULL;
  53.  
  54.     dcp = newdst + curLen;
  55.     va_start(ap, dst);
  56.     src = va_arg(ap, char *);
  57.     while (src != NULL) {
  58.         srcLen = strlen(src);
  59.         memcpy(dcp, src, srcLen);
  60.         dcp += srcLen;
  61.         src = va_arg(ap, char *);
  62.     }
  63.     va_end(ap);
  64.     *dcp = '\0';
  65.  
  66.     *dst = newdst;
  67.     return (newdst);
  68. }    /* Dynscat */
  69.