Changeset 5661:efd1ca5963ee in roaraudio for libroar/keyval.c
- Timestamp:
- 09/22/12 22:30:52 (12 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/keyval.c
r5650 r5661 163 163 } 164 164 165 static inline void _copy_str(char ** dst, const char * src) { 166 for (; *src; src++, (*dst)++) **dst = *src; 167 *((*dst)++) = 0; 168 } 169 170 void * 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 165 225 //ll
Note: See TracChangeset
for help on using the changeset viewer.