From: Carl Worth Date: Tue, 17 Apr 2007 17:57:51 +0000 (-0700) Subject: Wait until category is complete before adding items to bins X-Git-Url: https://git.cworth.org/git?p=mnemon;a=commitdiff_plain;h=c456eaba63d93aa02a184e4ead0c85fed3827bee;ds=sidebyside Wait until category is complete before adding items to bins Otherwise the category will keep reallocing the items array which means the pointers to each item won't be stable so we must not save them into bins. --- diff --git a/mnemon.c b/mnemon.c index 101ace8..039f0ca 100644 --- a/mnemon.c +++ b/mnemon.c @@ -361,23 +361,6 @@ mnemon_get_bin (mnemon_t *mnemon, return bin; } -static void -mnemon_add_item (mnemon_t *mnemon, - category_t *category, - int count, - const char *challenge, - const char *response) -{ - item_t *item; - bin_t *bin; - - item = category_add_item (category, count, challenge, response); - - bin = mnemon_get_bin (mnemon, count); - - bin_add_item (bin, item); -} - static void chomp (char *s) { @@ -399,6 +382,7 @@ mnemon_load_category (mnemon_t *mnemon, int line_count = 0; char *path; category_t *category; + int i; path = xmalloc (strlen (mnemon->dir_name) + 1 + strlen (name) + 1); sprintf (path, "%s/%s", mnemon->dir_name, name); @@ -448,7 +432,7 @@ mnemon_load_category (mnemon_t *mnemon, chomp (line); response = line; - mnemon_add_item (mnemon, category, count, challenge, response); + category_add_item (category, count, challenge, response); free (challenge); } @@ -457,6 +441,20 @@ mnemon_load_category (mnemon_t *mnemon, free (line); fclose (file); free (path); + + /* Resize category items to fit exactly. */ + category->items_size = category->num_items; + category->items = xrealloc (category->items, category->items_size * sizeof (item_t)); + + /* Now that the category is completely loaded, with stable + * pointers to every item, we can add each item to its appropriate + * bin. */ + for (i = 0; i < category->num_items; i++) { + item_t *item = &category->items[i]; + bin_t *bin = mnemon_get_bin (mnemon, item->count); + + bin_add_item (bin, item); + } } static void