diff options
author | Roberto C. Sanchez <roberto@connexer.com> | 2014-03-29 10:53:33 -0400 |
---|---|---|
committer | Roberto C. Sanchez <roberto@connexer.com> | 2014-03-29 10:53:33 -0400 |
commit | 8d3fc864d094eeadc721f8e93436b37a5fab173e (patch) | |
tree | 05e201c67dca55b4ccdf90ad479a25d95e3b1e63 /include/versekey.h |
Imported Upstream version 1.5.3
Diffstat (limited to 'include/versekey.h')
-rw-r--r-- | include/versekey.h | 400 |
1 files changed, 400 insertions, 0 deletions
diff --git a/include/versekey.h b/include/versekey.h new file mode 100644 index 0000000..1d554d3 --- /dev/null +++ b/include/versekey.h @@ -0,0 +1,400 @@ +/****************************************************************************** + * versekey.h - code for class 'versekey'- a standard Biblical verse key + * + * $Id: versekey.h,v 1.24 2002/03/22 05:26:34 scribe Exp $ + * + * 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 <ctype.h> + +#include <defs.h> + +#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 long otbks[]; + static long otcps[]; + static long ntbks[]; + static long ntcps[]; + 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(); + /** 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(); + /** 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; + +public: + 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 @ref #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 @ref #parse for more detailed information) + */ + VerseKey(const SWKey * ikey); + + /** VerseKey Constructor - initializes instance of VerseKey + * with boundariess - see also @ref #LowerBound + * and @ref #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 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 lb 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) { 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 p position + * @return *this + */ + virtual void setPosition(SW_POSITION); + + /** Decrements key a number of verses + * + * @param decrement Number of verses to jump backward + * @return *this + */ + virtual void decrement(int step); + + /** Increments key a number of verses + * + * @param increment Number of verses to jump forward + * @return *this + */ + virtual void increment(int step); + virtual char Traversable() { return 1; } + + 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 ListKey ParseVerseList(const char *buf, const char *defaultKey = "Genesis 1:1", bool expandRange = false); + /** 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; } + + SWKEY_OPERATORS + + virtual SWKey & operator = (const VerseKey & ikey) { copyFrom(ikey); return *this; } +}; + + +#endif |