Changeset 5661:efd1ca5963ee in roaraudio for libroar/keyval.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/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 
Note: See TracChangeset for help on using the changeset viewer.