From 6fd2388d71eb64ade70106a14617a46ee3366bfc Mon Sep 17 00:00:00 2001 From: Thomas White Date: Fri, 24 Jan 2020 14:58:01 +0100 Subject: Get rid of narrative_add_*, use narrative_insert_* instead --- libstorycode/narrative.c | 62 +++++++++++++++++++----------------------------- libstorycode/narrative.h | 16 ++++++------- libstorycode/storycode.y | 14 +++++------ 3 files changed, 38 insertions(+), 54 deletions(-) diff --git a/libstorycode/narrative.c b/libstorycode/narrative.c index 6bedd30..ffd7dab 100644 --- a/libstorycode/narrative.c +++ b/libstorycode/narrative.c @@ -114,7 +114,7 @@ void narrative_add_empty_item(Narrative *n) return; } - narrative_add_text(n, runs, 1); + narrative_insert_text(n, n->n_items, runs, 1); } @@ -248,7 +248,6 @@ static struct narrative_item *add_item(Narrative *n) if ( new_items == NULL ) return NULL; n->items = new_items; item = &n->items[n->n_items++]; - init_item(item); return item; } @@ -256,21 +255,23 @@ static struct narrative_item *add_item(Narrative *n) /* New item will have index 'pos' */ static struct narrative_item *insert_item(Narrative *n, int pos) { + int at_end = (pos == n->n_items); add_item(n); - memmove(&n->items[pos+1], &n->items[pos], - (n->n_items-pos-1)*sizeof(struct narrative_item)); + if ( !at_end ) { + memmove(&n->items[pos+1], &n->items[pos], + (n->n_items-pos-1)*sizeof(struct narrative_item)); + } init_item(&n->items[pos]); return &n->items[pos]; } /* The new text item takes ownership of the array of runs */ -extern void add_text_item(Narrative *n, struct text_run *runs, int n_runs, - enum narrative_item_type type) +static void insert_text_item(Narrative *n, int pos, struct text_run *runs, int n_runs, + enum narrative_item_type type) { - struct narrative_item *item; + struct narrative_item *item = insert_item(n, pos); - item = add_item(n); if ( item == NULL ) return; item->type = type; @@ -284,69 +285,54 @@ extern void add_text_item(Narrative *n, struct text_run *runs, int n_runs, } -void narrative_add_text(Narrative *n, struct text_run *runs, int n_runs) +void narrative_insert_text(Narrative *n, int pos, struct text_run *runs, int n_runs) { - add_text_item(n, runs, n_runs, NARRATIVE_ITEM_TEXT); + insert_text_item(n, pos, runs, n_runs, NARRATIVE_ITEM_TEXT); } -void narrative_add_prestitle(Narrative *n, struct text_run *runs, int n_runs) +void narrative_insert_prestitle(Narrative *n, int pos, struct text_run *runs, int n_runs) { - add_text_item(n, runs, n_runs, NARRATIVE_ITEM_PRESTITLE); + insert_text_item(n, pos, runs, n_runs, NARRATIVE_ITEM_PRESTITLE); } -void narrative_add_bp(Narrative *n, struct text_run *runs, int n_runs) +void narrative_insert_bp(Narrative *n, int pos, struct text_run *runs, int n_runs) { - add_text_item(n, runs, n_runs, NARRATIVE_ITEM_BP); + insert_text_item(n, pos, runs, n_runs, NARRATIVE_ITEM_BP); } -void narrative_add_segstart(Narrative *n, struct text_run *runs, int n_runs) +void narrative_insert_segstart(Narrative *n, int pos, struct text_run *runs, int n_runs) { - add_text_item(n, runs, n_runs, NARRATIVE_ITEM_SEGSTART); + insert_text_item(n, pos, runs, n_runs, NARRATIVE_ITEM_SEGSTART); } -void narrative_add_segend(Narrative *n) +void narrative_insert_segend(Narrative *n, int pos) { - struct narrative_item * item = add_item(n); + struct narrative_item *item = insert_item(n, pos); if ( item == NULL ) return; item->type = NARRATIVE_ITEM_SEGEND; } -void narrative_add_slide(Narrative *n, Slide *slide) -{ - struct narrative_item *item; - - item = add_item(n); - if ( item == NULL ) return; - - item->type = NARRATIVE_ITEM_SLIDE; - item->slide = slide; - item->slide_thumbnail = NULL; - update_timing(item); -} - - -void narrative_add_eop(Narrative *n) +void narrative_insert_eop(Narrative *n, int pos) { - struct narrative_item *item; - - item = add_item(n); + struct narrative_item *item = insert_item(n, pos); if ( item == NULL ) return; - item->type = NARRATIVE_ITEM_EOP; } -void narrative_insert_slide(Narrative *n, Slide *slide, int pos) +void narrative_insert_slide(Narrative *n, int pos, Slide *slide) { struct narrative_item *item = insert_item(n, pos); + if ( item == NULL ) return; item->type = NARRATIVE_ITEM_SLIDE; item->slide = slide; item->slide_thumbnail = NULL; + update_timing(item); } diff --git a/libstorycode/narrative.h b/libstorycode/narrative.h index 6881829..fba69d2 100644 --- a/libstorycode/narrative.h +++ b/libstorycode/narrative.h @@ -53,16 +53,14 @@ extern int narrative_get_unsaved(Narrative *n); extern int narrative_item_is_text(Narrative *n, int item); -extern void narrative_add_text(Narrative *n, struct text_run *runs, int n_runs); +extern void narrative_insert_text(Narrative *n, int pos, struct text_run *runs, int n_runs); +extern void narrative_insert_bp(Narrative *n, int pos, struct text_run *runs, int n_runs); +extern void narrative_insert_segstart(Narrative *n, int pos, struct text_run *runs, int n_runs); +extern void narrative_insert_prestitle(Narrative *n, int pos, struct text_run *runs, int n_runs); +extern void narrative_insert_segend(Narrative *n, int pos); +extern void narrative_insert_slide(Narrative *n, int pos, Slide *slide); +extern void narrative_insert_eop(Narrative *n, int pos); -extern void narrative_add_bp(Narrative *n, struct text_run *runs, int n_runs); -extern void narrative_add_segstart(Narrative *n, struct text_run *runs, int n_runs); -extern void narrative_add_prestitle(Narrative *n, struct text_run *runs, int n_runs); -extern void narrative_add_segend(Narrative *n); - -extern void narrative_add_slide(Narrative *n, Slide *slide); -extern void narrative_add_eop(Narrative *n); -extern void narrative_insert_slide(Narrative *n, Slide *slide, int pos); extern void narrative_delete_block(Narrative *n, int i1, size_t o1, int i2, size_t o2); extern void narrative_split_item(Narrative *n, int i1, size_t o1); diff --git a/libstorycode/storycode.y b/libstorycode/storycode.y index 6bb0e85..999abbe 100644 --- a/libstorycode/storycode.y +++ b/libstorycode/storycode.y @@ -324,13 +324,13 @@ narrative: ; narrative_el: - PRESTITLE TEXT_START text_line { narrative_add_prestitle(n, $3.runs, $3.n_runs); } -| BP TEXT_START text_line { narrative_add_bp(n, $3.runs, $3.n_runs); } -| SEG_START TEXT_START text_line { narrative_add_segstart(n, $3.runs, $3.n_runs); } -| SEG_END { narrative_add_segend(n); } -| TEXT_START text_line { narrative_add_text(n, $2.runs, $2.n_runs); } -| slide { narrative_add_slide(n, $1); } -| EOP { narrative_add_eop(n); } + PRESTITLE TEXT_START text_line { narrative_insert_prestitle(n, n->n_items, $3.runs, $3.n_runs); } +| BP TEXT_START text_line { narrative_insert_bp(n, n->n_items, $3.runs, $3.n_runs); } +| SEG_START TEXT_START text_line { narrative_insert_segstart(n, n->n_items, $3.runs, $3.n_runs); } +| SEG_END { narrative_insert_segend(n, n->n_items); } +| TEXT_START text_line { narrative_insert_text(n, n->n_items, $2.runs, $2.n_runs); } +| slide { narrative_insert_slide(n, n->n_items, $1); } +| EOP { narrative_insert_eop(n, n->n_items); } ; text_line: { $$.n_runs = 0; -- cgit v1.2.3