diff options
Diffstat (limited to 'include/versekey.h')
-rw-r--r-- | include/versekey.h | 444 |
1 files changed, 444 insertions, 0 deletions
diff --git a/include/versekey.h b/include/versekey.h new file mode 100644 index 0000000..42127bf --- /dev/null +++ b/include/versekey.h @@ -0,0 +1,444 @@ +/****************************************************************************** + * versekey.h - code for class 'versekey'- a standard Biblical verse key + * + * $Id: versekey.h 2169 2008-05-18 02:50:53Z scribe $ + * + * Copyright 1998 CrossWire Bible Society (http://www.crosswire.org) + * CrossWire Bible Society + * P. O. Box 2528 + * Tempe, AZ 85280-2528 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + */ + + +#ifndef VERSEKEY_H +#define VERSEKEY_H + +#include <swkey.h> +#include <swmacs.h> +#include <listkey.h> + +#include <defs.h> + +SWORD_NAMESPACE_START + +#define POS_MAXVERSE ((char)3) +#define POS_MAXCHAPTER ((char)4) +#define POS_MAXBOOK ((char)5) + +#define MAXVERSE SW_POSITION(POS_MAXVERSE) +#define MAXCHAPTER SW_POSITION(POS_MAXCHAPTER) +#define MAXBOOK SW_POSITION(POS_MAXBOOK) + + +struct sbook +{ + /**Name of book + */ + const char *name; + + /**Preferred Abbreviation + */ + const char *prefAbbrev; + + /**Maximum chapters in book + */ + unsigned char chapmax; + /** Array[chapmax] of maximum verses in chapters + */ + int *versemax; +}; + +struct abbrev +{ + const char *ab; + int book; +}; + + +class SWLocale; + +/** + * Class VerseKey + * The SWKey implementation used for verse based modules like Bibles or commentaries. + */ +class SWDLLEXPORT VerseKey : public SWKey { + + class LocaleCache { + public: + char *name; + unsigned int abbrevsCnt; + SWLocale *locale; + LocaleCache() { + name = 0; + abbrevsCnt = 0; + locale = 0; + } + virtual ~LocaleCache() { + if (name) + delete[]name; + } + }; + + static SWClass classdef; + + static long *offsets[2][2]; + static int offsize[2][2]; + /** number of instantiated VerseKey objects or derivitives + */ + static int instance; + static struct sbook otbooks[]; + static struct sbook ntbooks[]; + static const char *osisotbooks[]; + static const char *osisntbooks[]; + static const char **osisbooks[]; +#if 1 + static long otbks[]; + static long otcps[]; + static long ntbks[]; + static long ntcps[]; +#endif + static int vm[]; + static LocaleCache localeCache; + ListKey internalListKey; + + const struct abbrev *abbrevs; + char *locale; + int abbrevsCnt; + + /** The Testament: 0 - Old; 1 - New + */ + signed char testament; + mutable signed char book; + mutable signed int chapter; + mutable signed int verse; + + /** flag for auto normalization + */ + char autonorm; + + /** flag for headings on/off + */ + char headings; + + int getBookAbbrev(const char *abbr); + void initBounds() const; + + /** initialize and allocate books array + */ + void initstatics(); + + /** initializes this VerseKey() + */ + void init(); + + /** Binary search to find the index closest, but less + * than the given value. + * + * @param array long * to array to search + * @param size number of elements in the array + * @param value value to find + * @return the index into the array that is less than but closest to value + */ + int findindex(long *array, int size, long value); + + mutable VerseKey *lowerBound, *upperBound; + + +protected: + + /** Refresh keytext based on testament|book|chapter|verse + * default auto normalization to true + * default display headings option is false + */ + void freshtext() const; + /** Parse a character array into testament|book|chapter|verse + * + */ + virtual char parse(bool checkNormalize = true); +public: +#if 0 + static long otbks[]; + static long otcps[]; + static long ntbks[]; + static long ntcps[]; +#endif + static const char builtin_BMAX[2]; + static struct sbook *builtin_books[2]; + static const struct abbrev builtin_abbrevs[]; + const char *BMAX; + struct sbook **books; + + /** + * VerseKey Constructor - initializes Instance of VerseKey + * + * @param ikey text key (will take various forms of 'BOOK CH:VS'. + * See parse() for more detailed information) + */ + VerseKey(const char *ikey = 0); + + /** + * VerseKey Constructor - initializes instance of VerseKey + * + * @param ikey base key (will take various forms of 'BOOK CH:VS'. + * See parse() for more detailed information) + */ + VerseKey(const SWKey *ikey); + + /** VerseKey Constructor - initializes instance of VerseKey + * with boundariess - see also LowerBound() + * and UpperBound() + * @param min the lower boundary of the new VerseKey + * @param max the upper boundary of the new VerseKey + */ + VerseKey(const char *min, const char *max); + + /** VerseKey Copy Constructor - will create a new VerseKey + * based on an existing SWKey + * + * @param k the VerseKey to copy from + */ + VerseKey(const SWKey &k); + + /** VerseKey Copy Constructor - will create a new VerseKey + * based on an existing one + * + * @param k the VerseKey to copy from + */ + VerseKey(const VerseKey &k); + + /** VerseKey Destructor + * Cleans up an instance of VerseKey + */ + virtual ~VerseKey(); + + /** sets the lower boundary for this VerseKey + * and returns the new boundary + * + * @param lb the new lower boundary for this VerseKey + * @return the lower boundary the key was set to + */ + VerseKey &LowerBound(const char *lb); + + /** sets the upper boundary for this VerseKey + * and returns the new boundary + * @param ub the new upper boundary for this VerseKey + * @return the upper boundary the key was set to + */ + VerseKey &UpperBound(const char *ub); + + /** gets the lower boundary of this VerseKey + * @return the lower boundary of this VerseKey + */ + VerseKey &LowerBound() const; + + /** gets the upper boundary of this VerseKey + * @return the upper boundary of this VerseKey + */ + VerseKey &UpperBound() const; + + /** clears the boundaries of this VerseKey + */ + void ClearBounds(); + + /** Creates a new SWKey based on the current VerseKey + * see also the Copy Constructor + */ + virtual SWKey *clone() const; + + /** refreshes keytext before returning if cast to + * a (char *) is requested + */ + virtual const char *getText() const; + virtual const char *getShortText() const; + virtual void setText(const char *ikey, bool checkNormalize) { SWKey::setText(ikey); parse(checkNormalize); } + virtual void setText(const char *ikey) { SWKey::setText(ikey); parse(); } + virtual void copyFrom(const SWKey &ikey); + + /** Equates this VerseKey to another VerseKey + */ + virtual void copyFrom(const VerseKey &ikey); + + /** Positions this key + * + * @param newpos Position to set to. + * @return *this + */ + virtual void setPosition(SW_POSITION newpos); + + /** Decrements key a number of verses + * + * @param steps Number of verses to jump backward + * @return *this + */ + virtual void decrement(int steps); + + /** Increments key a number of verses + * + * @param steps Number of verses to jump forward + * @return *this + */ + virtual void increment(int steps); + virtual bool isTraversable() const { return true; } + + virtual const char *getBookName() const; + virtual const char *getBookAbbrev() const; + /** Gets testament + * + * @return value of testament + */ + virtual char Testament() const; + + /** Gets book + * + * @return value of book + */ + virtual char Book() const; + + /** Gets chapter + * + * @return value of chapter + */ + virtual int Chapter() const; + + /** Gets verse + * + * @return value of verse + */ + virtual int Verse() const; + + /** Sets/gets testament + * + * @param itestament value which to set testament + * [MAXPOS(char)] - only get + * @return if unchanged -> value of testament, + * if changed -> previous value of testament + */ + virtual char Testament(char itestament); + + /** Sets/gets book + * + * @param ibook value which to set book + * [MAXPOS(char)] - only get + * @return if unchanged -> value of book, + * if changed -> previous value of book + */ + virtual char Book(char ibook); + + /** Sets/gets chapter + * + * @param ichapter value which to set chapter + * [MAXPOS(int)] - only get + * @return if unchanged -> value of chapter, + * if changed -> previous value of chapter + */ + virtual int Chapter(int ichapter); + + /** Sets/gets verse + * + * @param iverse value which to set verse + * [MAXPOS(int)] - only get + * @return if unchanged -> value of verse, + * if changed -> previous value of verse + */ + virtual int Verse(int iverse); + + /** checks limits and normalizes if necessary (e.g. + * Matthew 29:47 = Mark 2:2). If last verse is + * exceeded, key is set to last Book CH:VS + * + * @return *this + */ + virtual void Normalize(char autocheck = 0); + + /** Sets/gets flag that tells VerseKey to + * automatically normalize itself when modified + * + * @param iautonorm value which to set autonorm + * [MAXPOS(char)] - only get + * @return if unchanged -> value of autonorm, + * if changed -> previous value of autonorm + */ + virtual char AutoNormalize(char iautonorm = MAXPOS(char)); + + /** Sets/gets flag that tells VerseKey to include + * chapter/book/testament/module headings + * + * @param iheadings value which to set headings + * [MAXPOS(char)] - only get + * @return if unchanged -> value of headings, + * if changed -> previous value of headings + */ + virtual char Headings(char iheadings = MAXPOS(char)); + + virtual long NewIndex() const; + + /** Gets index based upon current verse + * + * @return offset + */ + virtual long Index() const; + + /** Sets index based upon current verse + * + * @param iindex value to set index to + * @return offset + */ + virtual long Index(long iindex); + + virtual const char *getOSISRef() const; + static const int getOSISBookNum(const char *bookab); + + /** Tries to parse a string and convert it into an OSIS reference + * @param inRef reference string to try to parse + * @param defaultKey @see ParseVerseList(..., defaultKey, ...) + */ + static const char *convertToOSIS(const char *inRef, const SWKey *defaultKey); + + virtual ListKey ParseVerseList(const char *buf, const char *defaultKey = 0, bool expandRange = false); + virtual const char *getRangeText() const; + /** Compares another SWKey object + * + * @param ikey key to compare with this one + * @return >0 if this VerseKey is greater than compare SWKey, + * <0 if this VerseKey is smaller than compare SWKey, + * 0 if the keys are the same + */ + virtual int compare(const SWKey & ikey); + + /** Compares another VerseKey object + * + * @param ikey key to compare with this one + * @return >0 if this VerseKey is greater than compare VerseKey, + * <0 if this VerseKey is smaller than compare VerseKey, + * 0 if the keys are the same + */ + virtual int _compare(const VerseKey & ikey); + + virtual void setBookAbbrevs(const struct abbrev *bookAbbrevs, unsigned int size = 0 /* default determine size */ ); + virtual void setBooks(const char *iBMAX, struct sbook **ibooks); + virtual void setLocale(const char *name); + virtual const char *getLocale() const { return locale; } + + + + // OPERATORS -------------------------------------------------------------------- + + + SWKEY_OPERATORS + + virtual SWKey & operator =(const VerseKey & ikey) { copyFrom(ikey); return *this; } +}; + +SWORD_NAMESPACE_END + +#endif //VERSEKEY_H |