Changeset 5661:efd1ca5963ee in roaraudio for libroar


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()

Location:
libroar
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libroar/keyval.c

    r5650 r5661  
    163163} 
    164164 
     165static inline void _copy_str(char ** dst, const char * src) { 
     166 for (; *src; src++, (*dst)++) **dst = *src; 
     167 *((*dst)++) = 0; 
     168} 
     169 
     170void * roar_keyval_copy(struct roar_keyval ** copy, const struct roar_keyval * src, ssize_t len) { 
     171 size_t buflen = 0; 
     172 ssize_t i; 
     173 void * ret; 
     174 char * p; 
     175 struct roar_keyval * c; 
     176 
     177 // TODO: optimize this. 
     178 if ( len == -1 ) { 
     179  len = 0; 
     180  for (i = 0; src[i].key != NULL || src[i].value != NULL; i++) 
     181   len++; 
     182 } 
     183 
     184 for (i = 0; i < len; i++) { 
     185  if ( src[i].key != NULL ) 
     186   buflen += roar_mm_strlen(src[i].key) + 1; 
     187  if ( src[i].value != NULL ) 
     188   buflen += roar_mm_strlen(src[i].value) + 1; 
     189 } 
     190 
     191 c   = roar_mm_malloc(len * sizeof(struct roar_keyval)); 
     192 if ( c == NULL ) 
     193  return NULL; 
     194 
     195 memset(c, 0, len * sizeof(struct roar_keyval)); 
     196 
     197 ret = roar_mm_malloc(buflen); 
     198 if ( ret == NULL ) 
     199  return NULL; 
     200 
     201 memset(ret, 0, buflen); 
     202 
     203 p = ret; 
     204 
     205 for (i = 0; i < len; i++) { 
     206  if ( src[i].key == NULL ) { 
     207   c[i].key = NULL; 
     208  } else { 
     209   c[i].key = p; 
     210   _copy_str(&p, src[i].key); 
     211  } 
     212 
     213  if ( src[i].value == NULL ) { 
     214   c[i].value = NULL; 
     215  } else { 
     216   c[i].value = p; 
     217   _copy_str(&p, src[i].value); 
     218  } 
     219 } 
     220 
     221 *copy = c; 
     222 return ret; 
     223} 
     224 
    165225//ll 
  • 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.