From 7af5b93ce760c8db75a8271df6b538f749457066 Mon Sep 17 00:00:00 2001 From: Richard Venable Date: Wed, 9 Feb 2011 09:12:05 -0600 Subject: [PATCH] Whenever adding ranges to BfoxVerseList, the ranges are guaranteed valid Bible references --- BfoxRef/BfoxVerseList.mm | 16 ++++++---------- BfoxRef/cpp/bfox_range_list.h | 2 +- BfoxRef/cpp/bfox_verse_list.cpp | 25 ++++++++++++++++++++++++- BfoxRef/cpp/bfox_verse_list.h | 4 ++++ 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/BfoxRef/BfoxVerseList.mm b/BfoxRef/BfoxVerseList.mm index 72bf7ff..0060d2b 100644 --- a/BfoxRef/BfoxVerseList.mm +++ b/BfoxRef/BfoxVerseList.mm @@ -47,11 +47,9 @@ - (void)addVerseList:(BfoxVerseList *)verseList { #pragma mark Add verses manually (mainly used by BfoxRefParser) - (void)addVersesFromBook:(BfoxBook)book1 toBook:(BfoxBook)book2 { - Bfox::Range range; - range.first = verse_list->create_first_verse_index(book1, BfoxFirstChapterForFullBook, BfoxFirstVerseForFullChapter); - range.last = verse_list->create_last_verse_index(book2, BfoxLastChapterForFullBook, BfoxLastVerseForFullChapter); - - verse_list->add_range(range, false); + verse_list->add_verse_range(book1, BfoxFirstChapterForFullBook, BfoxFirstVerseForFullChapter, + book2, BfoxLastChapterForFullBook, BfoxLastVerseForFullChapter, + false); } - (void)addVersesForFullBook:(BfoxBook)book { @@ -80,11 +78,9 @@ - (void)addVersesFromChapter:(BfoxChapter)chapter1 verse:(BfoxVerse)verse1 toCha } - (void)addVerseRangeForBook:(BfoxBook)book fromChapter:(BfoxChapter)chapter1 verse:(BfoxVerse)verse1 toChapter:(BfoxChapter)chapter2 verse:(BfoxVerse)verse2 { - Bfox::Range range; - range.first = verse_list->create_first_verse_index(book, chapter1, verse1); - range.last = verse_list->create_last_verse_index(book, chapter2, verse2); - - verse_list->add_range(range, false); + verse_list->add_verse_range(book, chapter1, verse1, + book, chapter2, verse2, + false); } - (Boolean)hasVerses { diff --git a/BfoxRef/cpp/bfox_range_list.h b/BfoxRef/cpp/bfox_range_list.h index 50ac747..0300455 100644 --- a/BfoxRef/cpp/bfox_range_list.h +++ b/BfoxRef/cpp/bfox_range_list.h @@ -24,7 +24,7 @@ namespace Bfox { std::list ranges; virtual RangeList *new_list() { return new RangeList(); }; bool empty() { return ranges.empty(); }; - bool add_range(Range range, bool test_only); + virtual bool add_range(Range range, bool test_only); bool add_range_list(RangeList *new_range_list, bool test_only); std::list cut_at_range_borders(unsigned int range_size, unsigned int range_offset); }; diff --git a/BfoxRef/cpp/bfox_verse_list.cpp b/BfoxRef/cpp/bfox_verse_list.cpp index 6f590de..24a04b9 100644 --- a/BfoxRef/cpp/bfox_verse_list.cpp +++ b/BfoxRef/cpp/bfox_verse_list.cpp @@ -11,6 +11,24 @@ #include "bfox_book_meta.h" #include +bool Bfox::VerseList::add_range(Bfox::Range range, bool test_only = false) { + return this->add_verse_range(BfoxBookForVerseIndex(range.first), BfoxChapterForVerseIndex(range.first), BfoxVerseForVerseIndex(range.first), + BfoxBookForVerseIndex(range.last), BfoxChapterForVerseIndex(range.last), BfoxVerseForVerseIndex(range.last), + test_only); +} + +bool Bfox::VerseList::add_verse_range(BfoxBook book1, BfoxChapter chapter1, BfoxVerse verse1, + BfoxBook book2, BfoxChapter chapter2, BfoxVerse verse2, + bool test_only = false) { + Bfox::Range range; + range.first = this->create_first_verse_index(book1, chapter1, verse1); + range.last = this->create_last_verse_index(book2, chapter2, verse2); + + if (range.first == BfoxVerseIndexNotSet || range.last == BfoxVerseIndexNotSet) return false; + + return Bfox::RangeList::add_range(range, test_only); +} + BfoxVerseIndex Bfox::VerseList::create_first_verse_index(BfoxBook book1, BfoxChapter chapter1, BfoxVerse verse1) { /* * Maximize bible reference before we actually add them to the sequence list @@ -32,7 +50,7 @@ BfoxVerseIndex Bfox::VerseList::create_first_verse_index(BfoxBook book1, BfoxCha } // If the start chapter is greater than the last chapter of the book, this isn't a valid sequence - if (chapter1 > BfoxLastChapterInBook(book1)) { + if (BfoxLastBookInBible < book1 || BfoxLastChapterInBook(book1) < chapter1 || BfoxLastVerseInChapter(book1, chapter1) < verse1) { return BfoxVerseIndexNotSet; } @@ -53,6 +71,11 @@ BfoxVerseIndex Bfox::VerseList::create_last_verse_index(BfoxBook book2, BfoxChap if ((BfoxLastVerseForFullChapter == verse2) && (chapter2 >= BfoxLastChapterInBook(book2))) chapter2 = BfoxLastChapterForFullBook; + // If the start chapter is greater than the last chapter of the book, this isn't a valid sequence + if (BfoxFirstBookInBible > book2 || BfoxFirstChapterInBook > chapter2 || BfoxFirstVerseInChapter > verse2) { + return BfoxVerseIndexNotSet; + } + return BfoxVerseIndexForBCV(book2, chapter2, verse2); } diff --git a/BfoxRef/cpp/bfox_verse_list.h b/BfoxRef/cpp/bfox_verse_list.h index 2262532..74b7ad8 100644 --- a/BfoxRef/cpp/bfox_verse_list.h +++ b/BfoxRef/cpp/bfox_verse_list.h @@ -18,6 +18,10 @@ namespace Bfox { class VerseList : public RangeList { public: virtual RangeList *new_list() { return new VerseList(); }; + virtual bool add_range(Range range, bool test_only); + bool add_verse_range(BfoxBook book1, BfoxChapter chapter1, BfoxVerse verse1, + BfoxBook book2, BfoxChapter chapter2, BfoxVerse verse2, + bool test_only); BfoxVerseIndex create_first_verse_index(BfoxBook book1, BfoxChapter chapter1, BfoxVerse verse1); BfoxVerseIndex create_last_verse_index(BfoxBook book2, BfoxChapter chapter2, BfoxVerse verse2); std::string number_string_for_first_book(const char *separate_chapters_str,