diff options
| -rw-r--r-- | xs.h | 12 |
1 files changed, 7 insertions, 5 deletions
| @@ -365,19 +365,21 @@ xs_val *xs_expand(xs_val *data, int offset, int size) | |||
| 365 | /* opens a hole in data */ | 365 | /* opens a hole in data */ |
| 366 | { | 366 | { |
| 367 | int sz = xs_size(data); | 367 | int sz = xs_size(data); |
| 368 | int n; | ||
| 369 | |||
| 370 | sz += size; | ||
| 368 | 371 | ||
| 369 | /* open room */ | 372 | /* open room */ |
| 370 | if (sz == 0 || _xs_blk_size(sz) != _xs_blk_size(sz + size)) | 373 | data = xs_realloc(data, _xs_blk_size(sz)); |
| 371 | data = xs_realloc(data, _xs_blk_size(sz + size)); | ||
| 372 | 374 | ||
| 373 | /* move up the rest of the data */ | 375 | /* move up the rest of the data */ |
| 374 | if (data != NULL) | 376 | for (n = sz - 1; n >= offset + size; n--) |
| 375 | memmove(data + offset + size, data + offset, sz - offset); | 377 | data[n] = data[n - size]; |
| 376 | 378 | ||
| 377 | if (xs_type(data) == XSTYPE_LIST || | 379 | if (xs_type(data) == XSTYPE_LIST || |
| 378 | xs_type(data) == XSTYPE_DICT || | 380 | xs_type(data) == XSTYPE_DICT || |
| 379 | xs_type(data) == XSTYPE_DATA) | 381 | xs_type(data) == XSTYPE_DATA) |
| 380 | _xs_put_24b(data + 1, sz + size); | 382 | _xs_put_24b(data + 1, sz); |
| 381 | 383 | ||
| 382 | return data; | 384 | return data; |
| 383 | } | 385 | } |