diff options
author | Thomas White <taw@bitwiz.me.uk> | 2019-05-04 10:02:08 +0200 |
---|---|---|
committer | Thomas White <taw@bitwiz.me.uk> | 2019-05-04 10:02:08 +0200 |
commit | 5f5f92adf1626ae1b67d19f0b16c5ea8b5920512 (patch) | |
tree | 75892d4d5921574ed006973c9a5059774ae6620c | |
parent | fcf60a1d85095955b634614fed57e90949032696 (diff) |
Fix deletion logic
-rw-r--r-- | libstorycode/narrative.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/libstorycode/narrative.c b/libstorycode/narrative.c index 7256651..1e7753d 100644 --- a/libstorycode/narrative.c +++ b/libstorycode/narrative.c @@ -303,11 +303,13 @@ void narrative_delete_block(Narrative *n, int i1, size_t o1, int i2, size_t o2) int i; int n_del = 0; int merge = 1; + int middle; /* This is where the "middle deletion" will begin */ /* Starting item */ if ( n->items[i1].type == NARRATIVE_ITEM_SLIDE ) { delete_item(n, i1); - i1--; + if ( i1 == i2 ) return; /* only one slide to delete */ + middle = i1; /* ... which is now the item just after the slide */ i2--; merge = 0; } else { @@ -318,14 +320,15 @@ void narrative_delete_block(Narrative *n, int i1, size_t o1, int i2, size_t o2) return; /* easy case */ } else { n->items[i1].text[o1] = '\0'; + middle = i1+1; } } /* Middle items */ - for ( i=i1+1; i<i2; i++ ) { + for ( i=middle; i<i2; i++ ) { /* Deleting the item moves all the subsequent items up, so the * index to be deleted doesn't change. */ - delete_item(n, i1+1); + delete_item(n, middle); n_del++; } i2 -= n_del; @@ -333,21 +336,22 @@ void narrative_delete_block(Narrative *n, int i1, size_t o1, int i2, size_t o2) /* Last item */ if ( n->items[i2].type == NARRATIVE_ITEM_SLIDE ) { delete_item(n, i2); - merge = 0; - } else { - memmove(&n->items[i2].text[0], - &n->items[i2].text[o2], - strlen(&n->items[i2].text[o2])+1); + return; } + /* We end with a text item */ + memmove(&n->items[i2].text[0], + &n->items[i2].text[o2], + strlen(&n->items[i2].text[o2])+1); + /* If the start and end points are in different paragraphs, and both * of them are text (any kind), merge them. Note that at this point, - * we know that i1 and i2 are different because otherwise we would've - * returned earlier ("easy case"). */ - assert(i1 != i2); + * we know that i1 and i2 are different because otherwise we + * would've returned earlier ("easy case"). */ if ( merge ) { char *new_text; size_t len = strlen(n->items[i1].text); + assert(i1 != i2); len += strlen(n->items[i2].text); new_text = malloc(len+1); if ( new_text == NULL ) return; |