Changeset 5661:efd1ca5963ee in roaraudio for libroar/plugincontainer.c


Ignore:
Timestamp:
09/22/12 22:30:52 (12 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

Improved kv API: added roar_keyval_copy()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/plugincontainer.c

    r5504 r5661  
    8787} 
    8888 
    89 static inline void _copy_str(char ** dst, const char * src) { 
    90  for (; *src; src++, (*dst)++) **dst = *src; 
    91  *((*dst)++) = 0; 
    92 } 
    93  
    94 static void * _copy_kv(struct roar_keyval ** copy, struct roar_keyval * src, size_t len) { 
    95  size_t buflen = 0; 
    96  size_t i; 
    97  void * ret; 
    98  char * p; 
    99  struct roar_keyval * c; 
    100  
    101  for (i = 0; i < len; i++) { 
    102   if ( src[i].key != NULL ) 
    103    buflen += roar_mm_strlen(src[i].key) + 1; 
    104   if ( src[i].value != NULL ) 
    105    buflen += roar_mm_strlen(src[i].value) + 1; 
    106  } 
    107  
    108  c   = roar_mm_malloc(len * sizeof(struct roar_keyval)); 
    109  if ( c == NULL ) 
    110   return NULL; 
    111  
    112  memset(c, 0, len * sizeof(struct roar_keyval)); 
    113  
    114  ret = roar_mm_malloc(buflen); 
    115  if ( ret == NULL ) 
    116   return NULL; 
    117  
    118  memset(ret, 0, buflen); 
    119  
    120  p = ret; 
    121  
    122  for (i = 0; i < len; i++) { 
    123   if ( src[i].key == NULL ) { 
    124    c[i].key = NULL; 
    125   } else { 
    126    c[i].key = p; 
    127    _copy_str(&p, src[i].key); 
    128   } 
    129  
    130   if ( src[i].value == NULL ) { 
    131    c[i].value = NULL; 
    132   } else { 
    133    c[i].value = p; 
    134    _copy_str(&p, src[i].value); 
    135   } 
    136  } 
    137  
    138  *copy = c; 
    139  return ret; 
    140 } 
    141  
    14289static struct roar_dl_librarypara * _copy_para(struct roar_dl_librarypara * para, struct roar_plugincontainer * cont) { 
    14390 struct roar_dl_librarypara * ret = NULL; 
     
    153100 if ( para->argc && para->argv != NULL ) { 
    154101  ret->argc       = para->argc; 
    155   ret->args_store = _copy_kv(&(ret->argv), para->argv, para->argc); 
     102  ret->args_store = roar_keyval_copy(&(ret->argv), para->argv, para->argc); 
    156103  if ( ret->args_store == NULL ) { 
    157104   err = roar_error; 
Note: See TracChangeset for help on using the changeset viewer.