Changeset 2088

Show
Ignore:
Timestamp:
06/03/09 15:30:45 (15 months ago)
Author:
drobilla
Message:

Single-pass slv2_strjoin.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/slv2/src/util.c

    r2000 r2088  
    2929slv2_strjoin(const char* first, ...) 
    3030{ 
    31         /* FIXME: This is, in fact, as stupid as it looks */ 
     31        size_t  len    = strlen(first); 
     32        char*   result = malloc(len + 1); 
    3233 
    33         size_t  len    = strlen(first); 
    34         char*   result = NULL; 
     34        memcpy(result, first, len); 
     35 
    3536        va_list args; 
    36  
    3737        va_start(args, first); 
    3838        while (1) { 
     
    4040                if (s == NULL) 
    4141                        break; 
    42                 len += strlen(s); 
     42 
     43                const size_t this_len = strlen(s); 
     44                result = realloc(result, len + this_len + 1); 
     45                memcpy(result + len, s, this_len); 
     46                len += this_len; 
    4347        } 
    4448        va_end(args); 
    4549 
    46         result = malloc(len + 1); 
    47         if (!result) 
    48                 return NULL; 
    49  
    50         strcpy(result, first); 
    51         va_start(args, first); 
    52         while (1) { 
    53                 const char* const s = va_arg(args, const char *); 
    54                 if (s == NULL) 
    55                         break; 
    56                 strcat(result, s); 
    57         } 
    58         va_end(args); 
     50        result[len] = '\0'; 
    5951 
    6052        return result;