aboutsummaryrefslogtreecommitdiff
path: root/libstorycode/narrative.c
diff options
context:
space:
mode:
Diffstat (limited to 'libstorycode/narrative.c')
-rw-r--r--libstorycode/narrative.c62
1 files changed, 24 insertions, 38 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);
}