home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / libncftp / older_versions / libncftp-3.1.5-src.tar.gz / libncftp-3.1.5-src.tar / libncftp-3.1.5 / Strn / Dynsrecpy.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  3KB  |  114 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. /* Based on Dynscpy, but not the same! */
  7.  
  8. /* Use Dynscpy when you want to manage free'ing the created pointer
  9.  * yourself; Dynsrecpy will try to free an existing pointer if needed
  10.  * before creating the new string, but you have to be sure to be sure
  11.  * initialize the pointer to NULL the first time you use it..
  12.  *
  13.  * Example:
  14.  *
  15.  * {
  16.  *     char *p;                            -* p contains garbage *-
  17.  *     Dynscpy(&p, "foo", "bar", 0);       -* no need to initialize p *-
  18.  *     free(p);                            -* must free p to avoid leak *-
  19.  *     Dynscpy(&p, "hello", "world", 0);   -* p can now be reused *-
  20.  *     free(p);                            -* must free p to avoid leak *-
  21.  *     Dynscpy(&p, "test", "123", 0);      -* p can now be reused *-
  22.  *     free(p);                            -* free p when finished *-
  23.  * }
  24.  *
  25.  * {
  26.  *     char *p;
  27.  *     p = NULL;  -* Must init p to NULL, else free() will get garbage *-
  28.  *     Dynsrecpy(&p, "foo", "bar", 0);     -* on this call to Dynsrecpy *-
  29.  *     Dynsrecpy(&p, "hello", "world", 0); -* p will be freed *-
  30.  *     Dynsrecpy(&p, "test", "123", 0);    -* p will be freed *-
  31.  *     free(p);                            -* free p when finished *-
  32.  * }
  33.  *
  34.  * You can also do stuff like this:
  35.  *
  36.  *     p = NULL;
  37.  *     Dynsrecpy(&p, "cruel", 0);
  38.  *     Dynsrecpy(&p, "hello, ", p, " world!", 0);
  39.  *     -* p now contains "hello, cruel world!" *-
  40.  */
  41.  
  42.  
  43. /*VARARGS*/
  44. char *
  45. Dynsrecpy(char **dst, ...)
  46. {
  47.     va_list ap;
  48.     const char *src;
  49.     char *newdst, *dcp;
  50.     size_t catLen, srcLen;
  51.     int recursive;
  52.     if (dst == (char **) 0)
  53.         return NULL;
  54.  
  55.     recursive = 0;
  56.     catLen = 0;
  57.     va_start(ap, dst);
  58.     src = va_arg(ap, char *);
  59.     while (src != NULL) {
  60.         if (src == *dst) {
  61.             recursive = 1;
  62.         }
  63.         catLen += strlen(src);
  64.         src = va_arg(ap, char *);
  65.     }
  66.     va_end(ap);
  67.  
  68.     if (recursive == 0) {
  69.         if (*dst == NULL) {
  70.             newdst = malloc(catLen + 2);
  71.         } else if ((catLen + 2) > (strlen(*dst) + 1)) {
  72.             newdst = realloc(*dst, catLen + 2);
  73.         } else {
  74.             /* Don't need to make it bigger */
  75.             newdst = *dst;
  76.         }
  77.         if (newdst == NULL)
  78.             return NULL;
  79.  
  80.         dcp = newdst;
  81.         va_start(ap, dst);
  82.         src = va_arg(ap, char *);
  83.         while (src != NULL) {
  84.             srcLen = strlen(src);
  85.             memcpy(dcp, src, srcLen);
  86.             dcp += srcLen;
  87.             src = va_arg(ap, char *);
  88.         }
  89.         va_end(ap);
  90.         *dcp = '\0';
  91.     } else {
  92.         newdst = malloc(catLen + 2);
  93.         if (newdst == NULL)
  94.             return NULL;
  95.  
  96.         dcp = newdst;
  97.         va_start(ap, dst);
  98.         src = va_arg(ap, char *);
  99.         while (src != NULL) {
  100.             srcLen = strlen(src);
  101.             memcpy(dcp, src, srcLen);
  102.             dcp += srcLen;
  103.             src = va_arg(ap, char *);
  104.         }
  105.         va_end(ap);
  106.         *dcp = '\0';
  107.  
  108.         if (*dst != NULL)
  109.             free(*dst);
  110.     }
  111.     *dst = newdst;
  112.     return (newdst);
  113. }    /* Dynsrecpy */
  114.