| 571 | } |
| 572 | |
| 573 | void json_tok_remove(jsmntok_t **tokens, |
| 574 | jsmntok_t *obj_or_array, const jsmntok_t *tok, size_t num) |
| 575 | { |
| 576 | const jsmntok_t *src = tok; |
| 577 | const jsmntok_t *end = json_next(*tokens); |
| 578 | jsmntok_t *dest = *tokens + (tok - *tokens); |
| 579 | int remove_count; |
| 580 | |
| 581 | assert(*tokens); |
| 582 | assert(obj_or_array->type == JSMN_ARRAY |
| 583 | || obj_or_array->type == JSMN_OBJECT); |
| 584 | /* obj_or_array must be inside tokens, and tok must be inside |
| 585 | * obj_or_array */ |
| 586 | assert(obj_or_array >= *tokens |
| 587 | && obj_or_array < *tokens + tal_count(*tokens)); |
| 588 | assert(tok >= obj_or_array |
| 589 | && tok < *tokens + tal_count(*tokens)); |
| 590 | |
| 591 | for (int i = 0; i < num; i++) |
| 592 | src = json_next(src); |
| 593 | |
| 594 | /* Don't give us a num which goes over end of obj_or_array. */ |
| 595 | assert(src <= json_next(obj_or_array)); |
| 596 | |
| 597 | remove_count = src - tok; |
| 598 | |
| 599 | memmove(dest, src, sizeof(jsmntok_t) * (end - src)); |
| 600 | |
| 601 | /* Subtract first: this ptr may move after tal_resize! */ |
| 602 | obj_or_array->size -= num; |
| 603 | tal_resize(tokens, tal_count(*tokens) - remove_count); |
| 604 | } |