summaryrefslogtreecommitdiff
path: root/include/versekey.h
diff options
context:
space:
mode:
authorRoberto C. Sanchez <roberto@connexer.com>2014-03-29 10:53:33 -0400
committerRoberto C. Sanchez <roberto@connexer.com>2014-03-29 10:53:33 -0400
commit8d3fc864d094eeadc721f8e93436b37a5fab173e (patch)
tree05e201c67dca55b4ccdf90ad479a25d95e3b1e63 /include/versekey.h
Imported Upstream version 1.5.3
Diffstat (limited to 'include/versekey.h')
-rw-r--r--include/versekey.h400
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