diff options
Diffstat (limited to 'doc/api-documentation/html/versekey_8cpp-source.html')
-rw-r--r-- | doc/api-documentation/html/versekey_8cpp-source.html | 1464 |
1 files changed, 1464 insertions, 0 deletions
diff --git a/doc/api-documentation/html/versekey_8cpp-source.html b/doc/api-documentation/html/versekey_8cpp-source.html new file mode 100644 index 0000000..7a5266b --- /dev/null +++ b/doc/api-documentation/html/versekey_8cpp-source.html @@ -0,0 +1,1464 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<title>versekey.cpp Source File</title> +<link href="doxygen.css" rel="stylesheet" type="text/css"> +</head><body> +<!-- Generated by Doxygen 1.2.15 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </center> +<hr><h1>versekey.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/******************************************************************************</font> +00002 <font class="comment"> * VerseKey.cpp - code for class 'VerseKey'- a standard Biblical verse key</font> +00003 <font class="comment"> */</font> +00004 +00005 <font class="preprocessor">#include <swmacs.h></font> +00006 <font class="preprocessor">#include <utilfuns.h></font> +00007 <font class="preprocessor">#include <string.h></font> +00008 <font class="preprocessor">#include <stdio.h></font> +00009 <font class="preprocessor">#include <fcntl.h></font> +00010 <font class="preprocessor">#include <stdlib.h></font> +00011 +00012 <font class="preprocessor">#ifndef __GNUC__</font> +00013 <font class="preprocessor"></font><font class="preprocessor">#include <io.h></font> +00014 <font class="preprocessor">#else</font> +00015 <font class="preprocessor"></font><font class="preprocessor">#include <unistd.h></font> +00016 <font class="preprocessor">#endif</font> +00017 <font class="preprocessor"></font> +00018 <font class="preprocessor">#include <utilstr.h></font> +00019 <font class="preprocessor">#include <swkey.h></font> +00020 <font class="preprocessor">#include <swlog.h></font> +00021 <font class="preprocessor">#include <versekey.h></font> +00022 <font class="preprocessor">#include <localemgr.h></font> +00023 <font class="keyword">extern</font> <font class="stringliteral">"C"</font> { +00024 <font class="preprocessor">#include <roman.h></font> +00025 } +00026 +00027 +00028 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font> *classes[] = {<font class="stringliteral">"VerseKey"</font>, <font class="stringliteral">"SWKey"</font>, <font class="stringliteral">"SWObject"</font>, 0}; +00029 <a class="code" href="class_s_w_class.html">SWClass</a> VerseKey::classdef(classes); +00030 +00031 <font class="comment">/******************************************************************************</font> +00032 <font class="comment"> * Initialize static members of VerseKey</font> +00033 <font class="comment"> */</font> +00034 +00035 <font class="preprocessor">#include <canon.h></font> <font class="comment">// Initialize static members of canonical books structure</font> +00036 +00037 <font class="keyword">struct </font>sbook *VerseKey::builtin_books[2] = {0,0}; +00038 <font class="keyword">const</font> <font class="keywordtype">char</font> VerseKey::builtin_BMAX[2] = {39, 27}; +00039 <font class="keywordtype">long</font> *VerseKey::offsets[2][2] = {{VerseKey::otbks, VerseKey::otcps}, {VerseKey::ntbks, VerseKey::ntcps}}; +<a name="l00040"></a><a class="code" href="class_verse_key.html#r3">00040</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#r3">VerseKey::instance</a> = 0; +00041 VerseKey::LocaleCache VerseKey::localeCache; +00042 +00043 +00044 <font class="comment">/******************************************************************************</font> +00045 <font class="comment"> * VerseKey::init - initializes instance of VerseKey</font> +00046 <font class="comment"> */</font> +00047 +<a name="l00048"></a><a class="code" href="class_verse_key.html#c3">00048</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#c3">VerseKey::init</a>() { +00049 myclass = &classdef; +00050 <font class="keywordflow">if</font> (!<a class="code" href="class_verse_key.html#r3">instance</a>) +00051 <a class="code" href="class_verse_key.html#c2">initstatics</a>(); +00052 +00053 <a class="code" href="class_verse_key.html#r3">instance</a>++; +00054 <a class="code" href="class_verse_key.html#o8">autonorm</a> = 1; <font class="comment">// default auto normalization to true</font> +00055 <a class="code" href="class_verse_key.html#o9">headings</a> = 0; <font class="comment">// default display headings option is false</font> +00056 upperBound = 0; +00057 lowerBound = 0; +00058 <a class="code" href="class_verse_key.html#o4">testament</a> = 0; +00059 book = 0; +00060 chapter = 0; +00061 verse = 0; +00062 locale = 0; +00063 +00064 setLocale(<a class="code" href="class_locale_mgr.html#p0">LocaleMgr::systemLocaleMgr</a>.getDefaultLocaleName()); +00065 } +00066 +00067 <font class="comment">/******************************************************************************</font> +00068 <font class="comment"> * VerseKey Constructor - initializes instance of VerseKey</font> +00069 <font class="comment"> *</font> +00070 <font class="comment"> * ENT: ikey - base key (will take various forms of 'BOOK CH:VS'. See</font> +00071 <font class="comment"> * VerseKey::parse for more detailed information)</font> +00072 <font class="comment"> */</font> +00073 +<a name="l00074"></a><a class="code" href="class_verse_key.html#a1">00074</a> <a class="code" href="class_verse_key.html#a0">VerseKey::VerseKey</a>(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> *ikey) : <a class="code" href="class_s_w_key.html">SWKey</a>(*ikey) +00075 { +00076 <a class="code" href="class_verse_key.html#c3">init</a>(); +00077 <font class="keywordflow">if</font> (ikey) +00078 <a class="code" href="class_verse_key.html#c5">parse</a>(); +00079 } +00080 +00081 +00082 <font class="comment">/******************************************************************************</font> +00083 <font class="comment"> * VerseKey Constructor - initializes instance of VerseKey</font> +00084 <font class="comment"> *</font> +00085 <font class="comment"> * ENT: ikey - text key (will take various forms of 'BOOK CH:VS'. See</font> +00086 <font class="comment"> * VerseKey::parse for more detailed information)</font> +00087 <font class="comment"> */</font> +00088 +<a name="l00089"></a><a class="code" href="class_verse_key.html#a0">00089</a> <a class="code" href="class_verse_key.html#a0">VerseKey::VerseKey</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *ikey) : <a class="code" href="class_s_w_key.html">SWKey</a>(ikey) +00090 { +00091 <a class="code" href="class_verse_key.html#c3">init</a>(); +00092 <font class="keywordflow">if</font> (ikey) +00093 <a class="code" href="class_verse_key.html#c5">parse</a>(); +00094 } +00095 +00096 +00097 <a class="code" href="class_verse_key.html#a0">VerseKey::VerseKey</a>(VerseKey <font class="keyword">const</font> &k) : <a class="code" href="class_s_w_key.html">SWKey</a>(k) +00098 { +00099 <a class="code" href="class_verse_key.html#c3">init</a>(); +00100 <a class="code" href="class_verse_key.html#o8">autonorm</a> = k.autonorm; +00101 <a class="code" href="class_verse_key.html#o9">headings</a> = k.headings; +00102 <a class="code" href="class_verse_key.html#o4">testament</a> = k.Testament(); +00103 book = k.Book(); +00104 chapter = k.Chapter(); +00105 verse = k.Verse(); +00106 <a class="code" href="class_verse_key.html#a7">LowerBound</a>(k.LowerBound()); +00107 <a class="code" href="class_verse_key.html#a8">UpperBound</a>(k.UpperBound()); +00108 } +00109 +00110 +<a name="l00111"></a><a class="code" href="class_verse_key.html#a2">00111</a> <a class="code" href="class_verse_key.html#a0">VerseKey::VerseKey</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *min, <font class="keyword">const</font> <font class="keywordtype">char</font> *max) : <a class="code" href="class_s_w_key.html">SWKey</a>() +00112 { +00113 <a class="code" href="class_verse_key.html#c3">init</a>(); +00114 <a class="code" href="class_verse_key.html#a7">LowerBound</a>(min); +00115 <a class="code" href="class_verse_key.html#a8">UpperBound</a>(max); +00116 <a class="code" href="class_verse_key.html#a16">setPosition</a>(TOP); +00117 } +00118 +00119 +<a name="l00120"></a><a class="code" href="class_verse_key.html#a10">00120</a> <a class="code" href="class_s_w_key.html">SWKey</a> *<a class="code" href="class_verse_key.html#a10">VerseKey::clone</a>()<font class="keyword"> const</font> +00121 <font class="keyword"></font>{ +00122 <font class="keywordflow">return</font> <font class="keyword">new</font> <a class="code" href="class_verse_key.html#a0">VerseKey</a>(*<font class="keyword">this</font>); +00123 } +00124 +00125 +00126 <font class="comment">/******************************************************************************</font> +00127 <font class="comment"> * VerseKey Destructor - cleans up instance of VerseKey</font> +00128 <font class="comment"> *</font> +00129 <font class="comment"> * ENT: ikey - text key</font> +00130 <font class="comment"> */</font> +00131 +<a name="l00132"></a><a class="code" href="class_verse_key.html#a4">00132</a> <a class="code" href="class_verse_key.html#a4">VerseKey::~VerseKey</a>() { +00133 <font class="keywordflow">if</font> (upperBound) +00134 <font class="keyword">delete</font> upperBound; +00135 <font class="keywordflow">if</font> (lowerBound) +00136 <font class="keyword">delete</font> lowerBound; +00137 <font class="keywordflow">if</font> (locale) +00138 <font class="keyword">delete</font> [] locale; +00139 +00140 --<a class="code" href="class_verse_key.html#r3">instance</a>; +00141 } +00142 +00143 +00144 <font class="keywordtype">void</font> VerseKey::setLocale(<font class="keyword">const</font> <font class="keywordtype">char</font> *name) { +00145 <font class="keywordtype">char</font> *BMAX; +00146 <font class="keyword">struct </font>sbook **books; +00147 <font class="keywordtype">bool</font> useCache = <font class="keyword">false</font>; +00148 +00149 <font class="keywordflow">if</font> (localeCache.name) +00150 useCache = (!strcmp(localeCache.name, name)); +00151 +00152 <font class="keywordflow">if</font> (!useCache) { <font class="comment">// if we're setting params for a new locale</font> +00153 stdstr(&(localeCache.name), name); +00154 localeCache.abbrevsCnt = 0; +00155 } +00156 +00157 <a class="code" href="class_s_w_locale.html">SWLocale</a> *locale = (useCache) ? localeCache.locale : <a class="code" href="class_locale_mgr.html#p0">LocaleMgr::systemLocaleMgr</a>.<a class="code" href="class_locale_mgr.html#a2">getLocale</a>(name); +00158 localeCache.locale = locale; +00159 +00160 <font class="keywordflow">if</font> (locale) { +00161 locale-><a class="code" href="class_s_w_locale.html#a7">getBooks</a>(&BMAX, &books); +00162 setBooks(BMAX, books); +00163 setBookAbbrevs(locale-><a class="code" href="class_s_w_locale.html#a6">getBookAbbrevs</a>(), localeCache.abbrevsCnt); +00164 localeCache.abbrevsCnt = abbrevsCnt; +00165 } +00166 <font class="keywordflow">else</font> { +00167 setBooks(builtin_BMAX, builtin_books); +00168 setBookAbbrevs(builtin_abbrevs, localeCache.abbrevsCnt); +00169 localeCache.abbrevsCnt = abbrevsCnt; +00170 } +00171 stdstr(&(this->locale), localeCache.name); +00172 } +00173 +00174 +00175 <font class="keywordtype">void</font> VerseKey::setBooks(<font class="keyword">const</font> <font class="keywordtype">char</font> *iBMAX, <font class="keyword">struct</font> sbook **ibooks) { +00176 BMAX = iBMAX; +00177 books = ibooks; +00178 } +00179 +00180 +00181 <font class="keywordtype">void</font> VerseKey::setBookAbbrevs(<font class="keyword">const</font> <font class="keyword">struct</font> abbrev *bookAbbrevs, <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> size) { +00182 abbrevs = bookAbbrevs; +00183 <font class="keywordflow">if</font> (!size) { +00184 <font class="keywordflow">for</font> (abbrevsCnt = 1; *abbrevs[abbrevsCnt].ab; abbrevsCnt++) { +00185 <font class="comment">/*</font> +00186 <font class="comment"> if (strcmp(abbrevs[abbrevsCnt-1].ab, abbrevs[abbrevsCnt].ab) > 0) {</font> +00187 <font class="comment"> fprintf(stderr, "ERROR: book abbreviation (canon.h or locale) misordered at entry: %s\n", abbrevs[abbrevsCnt].ab);</font> +00188 <font class="comment"> exit(-1);</font> +00189 <font class="comment"> }</font> +00190 <font class="comment"> */</font> +00191 } +00192 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> t = 0; t < 2; t++) { +00193 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> i = 0; i < BMAX[t]; i++) { +00194 <font class="keywordtype">int</font> bn = getBookAbbrev(books[t][i].name); +00195 <font class="keywordflow">if</font> ((bn-1)%39 != i) { +00196 SWLog::systemlog->LogError(<font class="stringliteral">"Book: %s does not have a matching toupper abbrevs entry! book number returned was: %d"</font>, books[t][i].name, bn); +00197 } +00198 } +00199 } +00200 } +00201 <font class="keywordflow">else</font> abbrevsCnt = size; +00202 } +00203 +00204 +00205 <font class="comment">/******************************************************************************</font> +00206 <font class="comment"> * VerseKey::initstatics - initializes statics. Performed only when first</font> +00207 <font class="comment"> * instance on VerseKey (or descendent) is created.</font> +00208 <font class="comment"> */</font> +00209 +<a name="l00210"></a><a class="code" href="class_verse_key.html#c2">00210</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#c2">VerseKey::initstatics</a>() { +00211 <font class="keywordtype">int</font> l1, l2, chaptmp = 0; +00212 +00213 builtin_books[0] = otbooks; +00214 builtin_books[1] = ntbooks; +00215 +00216 <font class="keywordflow">for</font> (l1 = 0; l1 < 2; l1++) { +00217 <font class="keywordflow">for</font> (l2 = 0; l2 < builtin_BMAX[l1]; l2++) { +00218 builtin_books[l1][l2].versemax = &vm[chaptmp]; +00219 chaptmp += builtin_books[l1][l2].chapmax; +00220 } +00221 } +00222 } +00223 +00224 +00225 <font class="comment">/******************************************************************************</font> +00226 <font class="comment"> * VerseKey::parse - parses keytext into testament|book|chapter|verse</font> +00227 <font class="comment"> *</font> +00228 <font class="comment"> * RET: error status</font> +00229 <font class="comment"> */</font> +00230 +<a name="l00231"></a><a class="code" href="class_verse_key.html#c5">00231</a> <font class="keywordtype">char</font> <a class="code" href="class_verse_key.html#c5">VerseKey::parse</a>() +00232 { +00233 +00234 +00235 <a class="code" href="class_verse_key.html#o4">testament</a> = 1; +00236 book = 1; +00237 chapter = 1; +00238 verse = 1; +00239 +00240 error = 0; +00241 +00242 <font class="keywordflow">if</font> (keytext) { +00243 <a class="code" href="class_list_key.html">ListKey</a> tmpListKey = VerseKey::ParseVerseList(keytext); +00244 <font class="keywordflow">if</font> (tmpListKey.<a class="code" href="class_list_key.html#a5">Count</a>()) { +00245 <a class="code" href="class_s_w_key.html#a7">SWKey::setText</a>((<font class="keyword">const</font> <font class="keywordtype">char</font> *)tmpListKey); +00246 <font class="keywordflow">for</font> (<a class="code" href="class_verse_key.html#o4">testament</a> = 1; <a class="code" href="class_verse_key.html#o4">testament</a> < 3; <a class="code" href="class_verse_key.html#o4">testament</a>++) { +00247 <font class="keywordflow">for</font> (book = 1; book <= BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]; book++) { +00248 <font class="keywordflow">if</font> (!strncmp(keytext, books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].name, strlen(books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].name))) +00249 <font class="keywordflow">break</font>; +00250 } +00251 <font class="keywordflow">if</font> (book <= BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]) +00252 <font class="keywordflow">break</font>; +00253 } +00254 +00255 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> < 3) { +00256 sscanf(&keytext[strlen(books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].name)], <font class="stringliteral">"%d:%d"</font>, &chapter, &verse); +00257 } +00258 <font class="keywordflow">else</font> error = 1; +00259 } +00260 } +00261 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +00262 <a class="code" href="class_verse_key.html#c4">freshtext</a>(); +00263 +00264 <font class="keywordflow">return</font> error; +00265 } +00266 +00267 +00268 <font class="comment">/******************************************************************************</font> +00269 <font class="comment"> * VerseKey::freshtext - refreshes keytext based on</font> +00270 <font class="comment"> * testament|book|chapter|verse</font> +00271 <font class="comment"> */</font> +00272 +<a name="l00273"></a><a class="code" href="class_verse_key.html#c4">00273</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#c4">VerseKey::freshtext</a>()<font class="keyword"> const</font> +00274 <font class="keyword"></font>{ +00275 <font class="keywordtype">char</font> buf[2024]; +00276 <font class="keywordtype">int</font> realtest = <a class="code" href="class_verse_key.html#o4">testament</a>; +00277 <font class="keywordtype">int</font> realbook = book; +00278 +00279 <font class="keywordflow">if</font> (book < 1) { +00280 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> < 1) +00281 sprintf(buf, <font class="stringliteral">"[ Module Heading ]"</font>); +00282 <font class="keywordflow">else</font> sprintf(buf, <font class="stringliteral">"[ Testament %d Heading ]"</font>, (<font class="keywordtype">int</font>)<a class="code" href="class_verse_key.html#o4">testament</a>); +00283 } +00284 <font class="keywordflow">else</font> { +00285 <font class="keywordflow">if</font> (realbook > BMAX[realtest-1]) { +00286 realbook -= BMAX[realtest-1]; +00287 <font class="keywordflow">if</font> (realtest < 2) +00288 realtest++; +00289 <font class="keywordflow">if</font> (realbook > BMAX[realtest-1]) +00290 realbook = BMAX[realtest-1]; +00291 } +00292 sprintf(buf, <font class="stringliteral">"%s %d:%d"</font>, books[realtest-1][realbook-1].name, chapter, verse); +00293 } +00294 +00295 stdstr((<font class="keywordtype">char</font> **)&keytext, buf); +00296 } +00297 +00298 +00299 +00300 <font class="comment">/******************************************************************************</font> +00301 <font class="comment"> * VerseKey::getBookAbbrev - Attempts to find a book abbreviation for a buffer</font> +00302 <font class="comment"> *</font> +00303 <font class="comment"> * ENT: abbr - key for which to search;</font> +00304 <font class="comment"> * RET: book number or < 0 = not valid</font> +00305 <font class="comment"> */</font> +00306 +00307 <font class="keywordtype">int</font> VerseKey::getBookAbbrev(<font class="keyword">const</font> <font class="keywordtype">char</font> *iabbr) +00308 { +00309 <font class="keywordtype">int</font> loop, diff, abLen, min, max, target, retVal = -1; +00310 +00311 <font class="keywordtype">char</font> *abbr = 0; +00312 +00313 stdstr(&abbr, iabbr); +00314 strstrip(abbr); +00315 abLen = strlen(abbr); +00316 <font class="keywordflow">for</font> (loop = 0; loop < abLen; loop++) +00317 abbr[loop] = SW_toupper(abbr[loop]); +00318 +00319 <font class="keywordflow">if</font> (abLen) { +00320 min = 0; +00321 <font class="comment">// max = abbrevsCnt - 1;</font> +00322 max = abbrevsCnt; +00323 <font class="keywordflow">while</font>(1) { +00324 target = min + ((max - min) / 2); +00325 diff = strncmp(abbr, abbrevs[target].ab, abLen); +00326 <font class="keywordflow">if</font> ((!diff)||(target >= max)||(target <= min)) +00327 <font class="keywordflow">break</font>; +00328 <font class="keywordflow">if</font> (diff > 0) +00329 min = target; +00330 <font class="keywordflow">else</font> max = target; +00331 } +00332 <font class="keywordflow">for</font> (; target > 0; target--) { +00333 <font class="keywordflow">if</font> (strncmp(abbr, abbrevs[target-1].ab, abLen)) +00334 <font class="keywordflow">break</font>; +00335 } +00336 +00337 retVal = (!diff) ? abbrevs[target].book : -1; +00338 } +00339 <font class="keyword">delete</font> [] abbr; +00340 <font class="keywordflow">return</font> retVal; +00341 } +00342 +00343 <font class="comment">/******************************************************************************</font> +00344 <font class="comment"> * VerseKey::ParseVerseList - Attempts to parse a buffer into separate</font> +00345 <font class="comment"> * verse entries returned in a ListKey</font> +00346 <font class="comment"> *</font> +00347 <font class="comment"> * ENT: buf - buffer to parse;</font> +00348 <font class="comment"> * defaultKey - if verse, chap, book, or testament is left off,</font> +00349 <font class="comment"> * pull info from this key (ie. Gen 2:3; 4:5;</font> +00350 <font class="comment"> * Gen would be used when parsing the 4:5 section)</font> +00351 <font class="comment"> * expandRange - whether or not to expand eg. John 1:10-12 or just</font> +00352 <font class="comment"> * save John 1:10</font> +00353 <font class="comment"> *</font> +00354 <font class="comment"> * RET: ListKey reference filled with verse entries contained in buf</font> +00355 <font class="comment"> *</font> +00356 <font class="comment"> * COMMENT: This code works but wreaks. Rewrite to make more maintainable.</font> +00357 <font class="comment"> */</font> +00358 +00359 <a class="code" href="class_list_key.html">ListKey</a> VerseKey::ParseVerseList(<font class="keyword">const</font> <font class="keywordtype">char</font> *buf, <font class="keyword">const</font> <font class="keywordtype">char</font> *defaultKey, <font class="keywordtype">bool</font> expandRange) { +00360 <a class="code" href="class_s_w_key.html">SWKey</a> textkey; +00361 +00362 <font class="keywordtype">char</font> book[255]; +00363 <font class="keywordtype">char</font> number[255]; +00364 <font class="keywordtype">int</font> tobook = 0; +00365 <font class="keywordtype">int</font> tonumber = 0; +00366 <font class="keywordtype">int</font> chap = -1, verse = -1; +00367 <font class="keywordtype">int</font> bookno = 0; +00368 VerseKey curkey, lBound; +00369 curkey.<a class="code" href="class_verse_key.html#a42">setLocale</a>(getLocale()); +00370 lBound.<a class="code" href="class_verse_key.html#a42">setLocale</a>(getLocale()); +00371 <font class="keywordtype">int</font> loop; +00372 <font class="keywordtype">char</font> comma = 0; +00373 <font class="keywordtype">char</font> dash = 0; +00374 <font class="keyword">const</font> <font class="keywordtype">char</font> *orig = buf; +00375 <a class="code" href="class_list_key.html">ListKey</a> tmpListKey; +00376 <a class="code" href="class_list_key.html">ListKey</a> internalListKey; +00377 <a class="code" href="class_s_w_key.html">SWKey</a> tmpDefaultKey = defaultKey; +00378 <font class="keywordtype">char</font> lastPartial = 0; +00379 +00380 curkey.<a class="code" href="class_verse_key.html#a31">AutoNormalize</a>(0); +00381 tmpListKey << tmpDefaultKey; +00382 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00383 +00384 <font class="keywordflow">while</font> (*buf) { +00385 <font class="keywordflow">switch</font> (*buf) { +00386 <font class="keywordflow">case</font> <font class="charliteral">':'</font>: +00387 number[tonumber] = 0; +00388 tonumber = 0; +00389 <font class="keywordflow">if</font> (*number) +00390 chap = atoi(number); +00391 *number = 0; +00392 <font class="keywordflow">break</font>; +00393 +00394 <font class="keywordflow">case</font> <font class="charliteral">'-'</font>: +00395 <font class="keywordflow">case</font> <font class="charliteral">','</font>: <font class="comment">// on number new verse</font> +00396 <font class="keywordflow">case</font> <font class="charliteral">';'</font>: <font class="comment">// on number new chapter</font> +00397 number[tonumber] = 0; +00398 tonumber = 0; +00399 <font class="keywordflow">if</font> (*number) { +00400 <font class="keywordflow">if</font> (chap >= 0) +00401 verse = atoi(number); +00402 <font class="keywordflow">else</font> chap = atoi(number); +00403 } +00404 *number = 0; +00405 book[tobook] = 0; +00406 tobook = 0; +00407 bookno = -1; +00408 <font class="keywordflow">if</font> (*book) { +00409 <font class="keywordflow">for</font> (loop = strlen(book) - 1; loop+1; loop--) { +00410 <font class="keywordflow">if</font> ((isdigit(book[loop])) || (book[loop] == <font class="charliteral">' '</font>)) { +00411 book[loop] = 0; +00412 <font class="keywordflow">continue</font>; +00413 } +00414 <font class="keywordflow">else</font> { +00415 <font class="keywordflow">if</font> ((SW_toupper(book[loop])==<font class="charliteral">'F'</font>)&&(loop)) { +00416 <font class="keywordflow">if</font> ((isdigit(book[loop-1])) || (book[loop-1] == <font class="charliteral">' '</font>) || (SW_toupper(book[loop-1]) == <font class="charliteral">'F'</font>)) { +00417 book[loop] = 0; +00418 <font class="keywordflow">continue</font>; +00419 } +00420 } +00421 } +00422 <font class="keywordflow">break</font>; +00423 } +00424 +00425 <font class="keywordflow">for</font> (loop = strlen(book) - 1; loop+1; loop--) { +00426 <font class="keywordflow">if</font> (book[loop] == <font class="charliteral">' '</font>) { +00427 <font class="keywordflow">if</font> (isroman(&book[loop+1])) { +00428 <font class="keywordflow">if</font> (verse == -1) { +00429 verse = chap; +00430 chap = from_rom(&book[loop+1]); +00431 book[loop] = 0; +00432 } +00433 } +00434 <font class="keywordflow">break</font>; +00435 } +00436 } +00437 +00438 <font class="keywordflow">if</font> ((!stricmp(book, <font class="stringliteral">"V"</font>)) || (!stricmp(book, <font class="stringliteral">"VER"</font>))) { <font class="comment">// Verse abbrev</font> +00439 <font class="keywordflow">if</font> (verse == -1) { +00440 verse = chap; +00441 chap = <a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).Chapter(); +00442 *book = 0; +00443 } +00444 } +00445 bookno = getBookAbbrev(book); +00446 } +00447 <font class="keywordflow">if</font> (((bookno > -1) || (!*book)) && ((*book) || (chap >= 0) || (verse >= 0))) { +00448 <font class="keywordtype">char</font> partial = 0; +00449 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(1); +00450 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(1); +00451 curkey.<a class="code" href="class_verse_key.html#a23">Book</a>(1); +00452 +00453 <font class="keywordflow">if</font> (bookno < 0) { +00454 curkey.<a class="code" href="class_verse_key.html#a22">Testament</a>(<a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).<a class="code" href="class_verse_key.html#a22">Testament</a>()); +00455 curkey.<a class="code" href="class_verse_key.html#a23">Book</a>(<a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).<a class="code" href="class_verse_key.html#a23">Book</a>()); +00456 } +00457 <font class="keywordflow">else</font> { +00458 curkey.<a class="code" href="class_verse_key.html#a22">Testament</a>(1); +00459 curkey.<a class="code" href="class_verse_key.html#a23">Book</a>(bookno); +00460 } +00461 +00462 <font class="keywordflow">if</font> (((comma)||((verse < 0)&&(bookno < 0)))&&(!lastPartial)) { +00463 <font class="comment">// if (comma) {</font> +00464 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(<a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).<a class="code" href="class_verse_key.html#a24">Chapter</a>()); +00465 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(chap); <font class="comment">// chap because this is the first number captured</font> +00466 } +00467 <font class="keywordflow">else</font> { +00468 <font class="keywordflow">if</font> (chap >= 0) { +00469 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(chap); +00470 } +00471 <font class="keywordflow">else</font> { +00472 partial++; +00473 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(1); +00474 } +00475 <font class="keywordflow">if</font> (verse >= 0) { +00476 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(verse); +00477 } +00478 <font class="keywordflow">else</font> { +00479 partial++; +00480 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(1); +00481 } +00482 } +00483 +00484 <font class="keywordflow">if</font> ((*buf == <font class="charliteral">'-'</font>) && (expandRange)) { <font class="comment">// if this is a dash save lowerBound and wait for upper</font> +00485 VerseKey newElement; +00486 newElement.<a class="code" href="class_verse_key.html#a5">LowerBound</a>(curkey); +00487 newElement.<a class="code" href="class_verse_key.html#a16">setPosition</a>(TOP); +00488 tmpListKey << newElement; +00489 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00490 } +00491 <font class="keywordflow">else</font> { +00492 <font class="keywordflow">if</font> (!dash) { <font class="comment">// if last separator was not a dash just add</font> +00493 <font class="keywordflow">if</font> (expandRange && partial) { +00494 VerseKey newElement; +00495 newElement.<a class="code" href="class_verse_key.html#a5">LowerBound</a>(curkey); +00496 <font class="keywordflow">if</font> (partial > 1) +00497 curkey.<a class="code" href="class_verse_key.html#a16">setPosition</a>(MAXCHAPTER); +00498 <font class="keywordflow">if</font> (partial > 0) +00499 curkey = MAXVERSE; +00500 newElement.<a class="code" href="class_verse_key.html#a6">UpperBound</a>(curkey); +00501 newElement = TOP; +00502 tmpListKey << newElement; +00503 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00504 } +00505 <font class="keywordflow">else</font> { +00506 tmpListKey << (<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> &)(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a>)(<font class="keyword">const</font> <font class="keywordtype">char</font> *)curkey; +00507 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00508 } +00509 } +00510 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (expandRange) { +00511 VerseKey *newElement = SWDYNAMIC_CAST(VerseKey, tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()); +00512 <font class="keywordflow">if</font> (newElement) { +00513 <font class="keywordflow">if</font> (partial > 1) +00514 curkey = MAXCHAPTER; +00515 <font class="keywordflow">if</font> (partial > 0) +00516 curkey = MAXVERSE; +00517 newElement-><a class="code" href="class_verse_key.html#a6">UpperBound</a>(curkey); +00518 *newElement = TOP; +00519 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00520 } +00521 } +00522 } +00523 lastPartial = partial; +00524 } +00525 *book = 0; +00526 chap = -1; +00527 verse = -1; +00528 <font class="keywordflow">if</font> (*buf == <font class="charliteral">','</font>) +00529 comma = 1; +00530 <font class="keywordflow">else</font> comma = 0; +00531 <font class="keywordflow">if</font> (*buf == <font class="charliteral">'-'</font>) +00532 dash = 1; +00533 <font class="keywordflow">else</font> dash = 0; +00534 <font class="keywordflow">break</font>; +00535 <font class="keywordflow">case</font> 10: <font class="comment">// ignore these</font> +00536 <font class="keywordflow">case</font> 13: +00537 <font class="keywordflow">break</font>; +00538 <font class="keywordflow">case</font> <font class="charliteral">'.'</font>: +00539 <font class="keywordflow">if</font> (buf > orig) <font class="comment">// ignore (break) if preceeding char is not a digit</font> +00540 <font class="keywordflow">if</font> (!isdigit(*(buf-1))) +00541 <font class="keywordflow">break</font>; +00542 +00543 <font class="keywordflow">default</font>: +00544 <font class="keywordflow">if</font> (isdigit(*buf)) { +00545 number[tonumber++] = *buf; +00546 } +00547 <font class="keywordflow">else</font> { +00548 <font class="keywordflow">switch</font> (*buf) { +00549 <font class="keywordflow">case</font> <font class="charliteral">' '</font>: <font class="comment">// ignore these and don't reset number</font> +00550 <font class="keywordflow">case</font> <font class="charliteral">'f'</font>: +00551 <font class="keywordflow">case</font> <font class="charliteral">'F'</font>: +00552 <font class="keywordflow">break</font>; +00553 <font class="keywordflow">default</font>: +00554 number[tonumber] = 0; +00555 tonumber = 0; +00556 <font class="keywordflow">break</font>; +00557 } +00558 } +00559 <font class="keywordflow">if</font> (chap == -1) +00560 book[tobook++] = SW_toupper(*buf); +00561 } +00562 buf++; +00563 } +00564 number[tonumber] = 0; +00565 tonumber = 0; +00566 <font class="keywordflow">if</font> (*number) { +00567 <font class="keywordflow">if</font> (chap >= 0) +00568 verse = atoi(number); +00569 <font class="keywordflow">else</font> chap = atoi(number); +00570 } +00571 *number = 0; +00572 book[tobook] = 0; +00573 tobook = 0; +00574 <font class="keywordflow">if</font> (*book) { +00575 <font class="keywordflow">for</font> (loop = strlen(book) - 1; loop+1; loop--) { +00576 <font class="keywordflow">if</font> ((isdigit(book[loop])) || (book[loop] == <font class="charliteral">' '</font>)) { +00577 book[loop] = 0; +00578 <font class="keywordflow">continue</font>; +00579 } +00580 <font class="keywordflow">else</font> { +00581 <font class="keywordflow">if</font> ((SW_toupper(book[loop])==<font class="charliteral">'F'</font>)&&(loop)) { +00582 <font class="keywordflow">if</font> ((isdigit(book[loop-1])) || (book[loop-1] == <font class="charliteral">' '</font>) || (SW_toupper(book[loop-1]) == <font class="charliteral">'F'</font>)) { +00583 book[loop] = 0; +00584 <font class="keywordflow">continue</font>; +00585 } +00586 } +00587 } +00588 <font class="keywordflow">break</font>; +00589 } +00590 +00591 <font class="keywordflow">for</font> (loop = strlen(book) - 1; loop+1; loop--) { +00592 <font class="keywordflow">if</font> (book[loop] == <font class="charliteral">' '</font>) { +00593 <font class="keywordflow">if</font> (isroman(&book[loop+1])) { +00594 <font class="keywordflow">if</font> (verse == -1) { +00595 verse = chap; +00596 chap = from_rom(&book[loop+1]); +00597 book[loop] = 0; +00598 } +00599 } +00600 <font class="keywordflow">break</font>; +00601 } +00602 } +00603 +00604 <font class="keywordflow">if</font> ((!stricmp(book, <font class="stringliteral">"V"</font>)) || (!stricmp(book, <font class="stringliteral">"VER"</font>))) { <font class="comment">// Verse abbrev.</font> +00605 <font class="keywordflow">if</font> (verse == -1) { +00606 verse = chap; +00607 chap = <a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).Chapter(); +00608 *book = 0; +00609 } +00610 } +00611 +00612 bookno = getBookAbbrev(book); +00613 } +00614 <font class="keywordflow">if</font> (((bookno > -1) || (!*book)) && ((*book) || (chap >= 0) || (verse >= 0))) { +00615 <font class="keywordtype">char</font> partial = 0; +00616 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(1); +00617 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(1); +00618 curkey.<a class="code" href="class_verse_key.html#a23">Book</a>(1); +00619 +00620 <font class="keywordflow">if</font> (bookno < 0) { +00621 curkey.<a class="code" href="class_verse_key.html#a22">Testament</a>(<a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).<a class="code" href="class_verse_key.html#a22">Testament</a>()); +00622 curkey.<a class="code" href="class_verse_key.html#a23">Book</a>(<a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).<a class="code" href="class_verse_key.html#a23">Book</a>()); +00623 } +00624 <font class="keywordflow">else</font> { +00625 curkey.<a class="code" href="class_verse_key.html#a22">Testament</a>(1); +00626 curkey.<a class="code" href="class_verse_key.html#a23">Book</a>(bookno); +00627 } +00628 +00629 <font class="keywordflow">if</font> (((comma)||((verse < 0)&&(bookno < 0)))&&(!lastPartial)) { +00630 <font class="comment">// if (comma) {</font> +00631 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(<a class="code" href="class_verse_key.html#a0">VerseKey</a>(tmpListKey).<a class="code" href="class_verse_key.html#a24">Chapter</a>()); +00632 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(chap); <font class="comment">// chap because this is the first number captured</font> +00633 } +00634 <font class="keywordflow">else</font> { +00635 <font class="keywordflow">if</font> (chap >= 0) { +00636 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(chap); +00637 } +00638 <font class="keywordflow">else</font> { +00639 partial++; +00640 curkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>(1); +00641 } +00642 <font class="keywordflow">if</font> (verse >= 0) { +00643 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(verse); +00644 } +00645 <font class="keywordflow">else</font> { +00646 partial++; +00647 curkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(1); +00648 } +00649 } +00650 +00651 <font class="keywordflow">if</font> ((*buf == <font class="charliteral">'-'</font>) && (expandRange)) { <font class="comment">// if this is a dash save lowerBound and wait for upper</font> +00652 VerseKey newElement; +00653 newElement.<a class="code" href="class_verse_key.html#a5">LowerBound</a>(curkey); +00654 newElement = TOP; +00655 tmpListKey << newElement; +00656 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00657 } +00658 <font class="keywordflow">else</font> { +00659 <font class="keywordflow">if</font> (!dash) { <font class="comment">// if last separator was not a dash just add</font> +00660 <font class="keywordflow">if</font> (expandRange && partial) { +00661 VerseKey newElement; +00662 newElement.<a class="code" href="class_verse_key.html#a5">LowerBound</a>(curkey); +00663 <font class="keywordflow">if</font> (partial > 1) +00664 curkey = MAXCHAPTER; +00665 <font class="keywordflow">if</font> (partial > 0) +00666 curkey = MAXVERSE; +00667 newElement.<a class="code" href="class_verse_key.html#a6">UpperBound</a>(curkey); +00668 newElement = TOP; +00669 tmpListKey << newElement; +00670 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00671 } +00672 <font class="keywordflow">else</font> { +00673 tmpListKey << (<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> &)(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a>)(<font class="keyword">const</font> <font class="keywordtype">char</font> *)curkey; +00674 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00675 } +00676 } +00677 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (expandRange) { +00678 VerseKey *newElement = SWDYNAMIC_CAST(VerseKey, tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()); +00679 <font class="keywordflow">if</font> (newElement) { +00680 <font class="keywordflow">if</font> (partial > 1) +00681 curkey = MAXCHAPTER; +00682 <font class="keywordflow">if</font> (partial > 0) +00683 curkey = MAXVERSE; +00684 newElement-><a class="code" href="class_verse_key.html#a6">UpperBound</a>(curkey); +00685 *newElement = TOP; +00686 tmpListKey.<a class="code" href="class_list_key.html#a8">GetElement</a>()-><a class="code" href="class_s_w_key.html#m0">userData</a> = (<font class="keywordtype">void</font> *)buf; +00687 } +00688 } +00689 } +00690 } +00691 *book = 0; +00692 tmpListKey = TOP; +00693 tmpListKey.<a class="code" href="class_list_key.html#a6">Remove</a>(); <font class="comment">// remove defaultKey</font> +00694 internalListKey = tmpListKey; +00695 internalListKey = TOP; <font class="comment">// Align internalListKey to first element before passing back;</font> +00696 +00697 <font class="keywordflow">return</font> internalListKey; +00698 } +00699 +00700 +00701 <font class="comment">/******************************************************************************</font> +00702 <font class="comment"> * VerseKey::LowerBound - sets / gets the lower boundary for this key</font> +00703 <font class="comment"> */</font> +00704 +<a name="l00705"></a><a class="code" href="class_verse_key.html#a5">00705</a> VerseKey &<a class="code" href="class_verse_key.html#a7">VerseKey::LowerBound</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *lb) +00706 { +00707 <font class="keywordflow">if</font> (!lowerBound) +00708 initBounds(); +00709 +00710 (*lowerBound) = lb; +00711 lowerBound-><a class="code" href="class_verse_key.html#a30">Normalize</a>(); +00712 +00713 <font class="keywordflow">return</font> (*lowerBound); +00714 } +00715 +00716 +00717 <font class="comment">/******************************************************************************</font> +00718 <font class="comment"> * VerseKey::UpperBound - sets / gets the upper boundary for this key</font> +00719 <font class="comment"> */</font> +00720 +<a name="l00721"></a><a class="code" href="class_verse_key.html#a6">00721</a> VerseKey &<a class="code" href="class_verse_key.html#a8">VerseKey::UpperBound</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *ub) +00722 { +00723 <font class="keywordflow">if</font> (!upperBound) +00724 initBounds(); +00725 +00726 <font class="comment">// need to set upperbound parsing to resolve to max verse/chap if not specified</font> +00727 (*upperBound) = ub; +00728 <font class="keywordflow">if</font> (*upperBound < *lowerBound) +00729 *upperBound = *lowerBound; +00730 upperBound-><a class="code" href="class_verse_key.html#a30">Normalize</a>(); +00731 +00732 <font class="comment">// until we have a proper method to resolve max verse/chap use this kludge</font> +00733 <font class="keywordtype">int</font> len = strlen(ub); +00734 <font class="keywordtype">bool</font> alpha = <font class="keyword">false</font>; +00735 <font class="keywordtype">bool</font> versespec = <font class="keyword">false</font>; +00736 <font class="keywordtype">bool</font> chapspec = <font class="keyword">false</font>; +00737 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> i = 0; i < len; i++) { +00738 <font class="keywordflow">if</font> (isalpha(ub[i])) +00739 alpha = <font class="keyword">true</font>; +00740 <font class="keywordflow">if</font> (ub[i] == <font class="charliteral">':'</font>) <font class="comment">// if we have a : we assume verse spec</font> +00741 versespec = <font class="keyword">true</font>; +00742 <font class="keywordflow">if</font> ((isdigit(ub[i])) && (alpha)) <font class="comment">// if digit after alpha assume chap spec</font> +00743 chapspec = <font class="keyword">true</font>; +00744 } +00745 <font class="keywordflow">if</font> (!chapspec) +00746 *upperBound = MAXCHAPTER; +00747 <font class="keywordflow">if</font> (!versespec) +00748 *upperBound = MAXVERSE; +00749 +00750 +00751 <font class="comment">// -- end kludge</font> +00752 +00753 <font class="keywordflow">return</font> (*upperBound); +00754 } +00755 +00756 +00757 <font class="comment">/******************************************************************************</font> +00758 <font class="comment"> * VerseKey::LowerBound - sets / gets the lower boundary for this key</font> +00759 <font class="comment"> */</font> +00760 +<a name="l00761"></a><a class="code" href="class_verse_key.html#a7">00761</a> VerseKey &<a class="code" href="class_verse_key.html#a7">VerseKey::LowerBound</a>()<font class="keyword"> const</font> +00762 <font class="keyword"></font>{ +00763 <font class="keywordflow">if</font> (!lowerBound) +00764 initBounds(); +00765 +00766 <font class="keywordflow">return</font> (*lowerBound); +00767 } +00768 +00769 +00770 <font class="comment">/******************************************************************************</font> +00771 <font class="comment"> * VerseKey::UpperBound - sets / gets the upper boundary for this key</font> +00772 <font class="comment"> */</font> +00773 +<a name="l00774"></a><a class="code" href="class_verse_key.html#a8">00774</a> VerseKey &<a class="code" href="class_verse_key.html#a8">VerseKey::UpperBound</a>()<font class="keyword"> const</font> +00775 <font class="keyword"></font>{ +00776 <font class="keywordflow">if</font> (!upperBound) +00777 initBounds(); +00778 +00779 <font class="keywordflow">return</font> (*upperBound); +00780 } +00781 +00782 +00783 <font class="comment">/******************************************************************************</font> +00784 <font class="comment"> * VerseKey::ClearBounds - clears bounds for this VerseKey</font> +00785 <font class="comment"> */</font> +00786 +<a name="l00787"></a><a class="code" href="class_verse_key.html#a9">00787</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#a9">VerseKey::ClearBounds</a>() +00788 { +00789 initBounds(); +00790 } +00791 +00792 +00793 <font class="keywordtype">void</font> VerseKey::initBounds()<font class="keyword"> const</font> +00794 <font class="keyword"></font>{ +00795 <font class="keywordflow">if</font> (!upperBound) { +00796 upperBound = <font class="keyword">new</font> <a class="code" href="class_verse_key.html#a0">VerseKey</a>(); +00797 upperBound-><a class="code" href="class_verse_key.html#a31">AutoNormalize</a>(0); +00798 upperBound-><a class="code" href="class_verse_key.html#a32">Headings</a>(1); +00799 } +00800 <font class="keywordflow">if</font> (!lowerBound) { +00801 lowerBound = <font class="keyword">new</font> <a class="code" href="class_verse_key.html#a0">VerseKey</a>(); +00802 lowerBound-><a class="code" href="class_verse_key.html#a31">AutoNormalize</a>(0); +00803 lowerBound-><a class="code" href="class_verse_key.html#a32">Headings</a>(1); +00804 } +00805 +00806 lowerBound-><a class="code" href="class_verse_key.html#a22">Testament</a>(0); +00807 lowerBound-><a class="code" href="class_verse_key.html#a23">Book</a>(0); +00808 lowerBound-><a class="code" href="class_verse_key.html#a24">Chapter</a>(0); +00809 lowerBound-><a class="code" href="class_verse_key.html#a25">Verse</a>(0); +00810 +00811 upperBound-><a class="code" href="class_verse_key.html#a22">Testament</a>(2); +00812 upperBound-><a class="code" href="class_verse_key.html#a23">Book</a>(BMAX[1]); +00813 upperBound-><a class="code" href="class_verse_key.html#a24">Chapter</a>(books[1][BMAX[1]-1].chapmax); +00814 upperBound-><a class="code" href="class_verse_key.html#a25">Verse</a>(books[1][BMAX[1]-1].versemax[upperBound-><a class="code" href="class_verse_key.html#a24">Chapter</a>()-1]); +00815 } +00816 +00817 +00818 <font class="comment">/******************************************************************************</font> +00819 <font class="comment"> * VerseKey::copyFrom - Equates this VerseKey to another VerseKey</font> +00820 <font class="comment"> */</font> +00821 +<a name="l00822"></a><a class="code" href="class_verse_key.html#a15">00822</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#a14">VerseKey::copyFrom</a>(<font class="keyword">const</font> VerseKey &ikey) { +00823 <a class="code" href="class_s_w_key.html#a8">SWKey::copyFrom</a>(ikey); +00824 +00825 <a class="code" href="class_verse_key.html#c5">parse</a>(); +00826 } +00827 +00828 +00829 <font class="comment">/******************************************************************************</font> +00830 <font class="comment"> * VerseKey::copyFrom - Equates this VerseKey to another SWKey</font> +00831 <font class="comment"> */</font> +00832 +<a name="l00833"></a><a class="code" href="class_verse_key.html#a14">00833</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#a14">VerseKey::copyFrom</a>(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> &ikey) { +00834 <a class="code" href="class_s_w_key.html#a8">SWKey::copyFrom</a>(ikey); +00835 +00836 <a class="code" href="class_verse_key.html#c5">parse</a>(); +00837 } +00838 +00839 +00840 <font class="comment">/******************************************************************************</font> +00841 <font class="comment"> * VerseKey::getText - refreshes keytext before returning if cast to</font> +00842 <font class="comment"> * a (char *) is requested</font> +00843 <font class="comment"> */</font> +00844 +<a name="l00845"></a><a class="code" href="class_verse_key.html#a11">00845</a> <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="class_verse_key.html#a11">VerseKey::getText</a>()<font class="keyword"> const </font>{ +00846 <a class="code" href="class_verse_key.html#c4">freshtext</a>(); +00847 <font class="keywordflow">return</font> keytext; +00848 } +00849 +00850 +00851 <font class="keyword">const</font> <font class="keywordtype">char</font> *VerseKey::getShortText()<font class="keyword"> const </font>{ +00852 <font class="keyword">static</font> <font class="keywordtype">char</font> *stext = 0; +00853 <font class="keywordtype">char</font> buf[2047]; +00854 <a class="code" href="class_verse_key.html#c4">freshtext</a>(); +00855 <font class="keywordflow">if</font> (book < 1) { +00856 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> < 1) +00857 sprintf(buf, <font class="stringliteral">"[ Module Heading ]"</font>); +00858 <font class="keywordflow">else</font> sprintf(buf, <font class="stringliteral">"[ Testament %d Heading ]"</font>, (<font class="keywordtype">int</font>)<a class="code" href="class_verse_key.html#o4">testament</a>); +00859 } +00860 <font class="keywordflow">else</font> { +00861 sprintf(buf, <font class="stringliteral">"%s %d:%d"</font>, books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].prefAbbrev, chapter, verse); +00862 } +00863 stdstr(&stext, buf); +00864 <font class="keywordflow">return</font> stext; +00865 } +00866 +00867 +00868 <font class="keyword">const</font> <font class="keywordtype">char</font> *VerseKey::getBookName()<font class="keyword"> const </font>{ +00869 <font class="keywordflow">return</font> books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].name; +00870 } +00871 +00872 +00873 <font class="keyword">const</font> <font class="keywordtype">char</font> *VerseKey::getBookAbbrev()<font class="keyword"> const </font>{ +00874 <font class="keywordflow">return</font> books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].prefAbbrev; +00875 } +00876 <font class="comment">/******************************************************************************</font> +00877 <font class="comment"> * VerseKey::setPosition(SW_POSITION) - Positions this key</font> +00878 <font class="comment"> *</font> +00879 <font class="comment"> * ENT: p - position</font> +00880 <font class="comment"> *</font> +00881 <font class="comment"> * RET: *this</font> +00882 <font class="comment"> */</font> +00883 +<a name="l00884"></a><a class="code" href="class_verse_key.html#a16">00884</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#a16">VerseKey::setPosition</a>(SW_POSITION p) { +00885 <font class="keywordflow">switch</font> (p) { +00886 <font class="keywordflow">case</font> POS_TOP: +00887 <a class="code" href="class_verse_key.html#o4">testament</a> = <a class="code" href="class_verse_key.html#a7">LowerBound</a>().<a class="code" href="class_verse_key.html#a22">Testament</a>(); +00888 book = <a class="code" href="class_verse_key.html#a7">LowerBound</a>().<a class="code" href="class_verse_key.html#a23">Book</a>(); +00889 chapter = <a class="code" href="class_verse_key.html#a7">LowerBound</a>().<a class="code" href="class_verse_key.html#a24">Chapter</a>(); +00890 verse = <a class="code" href="class_verse_key.html#a7">LowerBound</a>().<a class="code" href="class_verse_key.html#a25">Verse</a>(); +00891 <font class="keywordflow">break</font>; +00892 <font class="keywordflow">case</font> POS_BOTTOM: +00893 <a class="code" href="class_verse_key.html#o4">testament</a> = <a class="code" href="class_verse_key.html#a8">UpperBound</a>().<a class="code" href="class_verse_key.html#a22">Testament</a>(); +00894 book = <a class="code" href="class_verse_key.html#a8">UpperBound</a>().<a class="code" href="class_verse_key.html#a23">Book</a>(); +00895 chapter = <a class="code" href="class_verse_key.html#a8">UpperBound</a>().<a class="code" href="class_verse_key.html#a24">Chapter</a>(); +00896 verse = <a class="code" href="class_verse_key.html#a8">UpperBound</a>().<a class="code" href="class_verse_key.html#a25">Verse</a>(); +00897 <font class="keywordflow">break</font>; +00898 <font class="keywordflow">case</font> POS_MAXVERSE: +00899 <a class="code" href="class_verse_key.html#a30">Normalize</a>(); +00900 verse = books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].versemax[chapter-1]; +00901 <font class="keywordflow">break</font>; +00902 <font class="keywordflow">case</font> POS_MAXCHAPTER: +00903 verse = 1; +00904 <a class="code" href="class_verse_key.html#a30">Normalize</a>(); +00905 chapter = books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].chapmax; +00906 <font class="keywordflow">break</font>; +00907 } +00908 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +00909 <a class="code" href="class_s_w_key.html#a6">Error</a>(); <font class="comment">// clear error from normalize</font> +00910 } +00911 +00912 +00913 <font class="comment">/******************************************************************************</font> +00914 <font class="comment"> * VerseKey::increment - Increments key a number of verses</font> +00915 <font class="comment"> *</font> +00916 <font class="comment"> * ENT: step - Number of verses to jump forward</font> +00917 <font class="comment"> *</font> +00918 <font class="comment"> * RET: *this</font> +00919 <font class="comment"> */</font> +00920 +<a name="l00921"></a><a class="code" href="class_verse_key.html#a18">00921</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#a18">VerseKey::increment</a>(<font class="keywordtype">int</font> step) { +00922 <font class="keywordtype">char</font> ierror = 0; +00923 <a class="code" href="class_verse_key.html#a34">Index</a>(<a class="code" href="class_verse_key.html#a34">Index</a>() + step); +00924 <font class="keywordflow">while</font> ((!verse) && (!<a class="code" href="class_verse_key.html#o9">headings</a>) && (!ierror)) { +00925 <a class="code" href="class_verse_key.html#a34">Index</a>(<a class="code" href="class_verse_key.html#a34">Index</a>() + 1); +00926 ierror = <a class="code" href="class_s_w_key.html#a6">Error</a>(); +00927 } +00928 +00929 error = (ierror) ? ierror : error; +00930 } +00931 +00932 +00933 <font class="comment">/******************************************************************************</font> +00934 <font class="comment"> * VerseKey::decrement - Decrements key a number of verses</font> +00935 <font class="comment"> *</font> +00936 <font class="comment"> * ENT: step - Number of verses to jump backward</font> +00937 <font class="comment"> *</font> +00938 <font class="comment"> * RET: *this</font> +00939 <font class="comment"> */</font> +00940 +<a name="l00941"></a><a class="code" href="class_verse_key.html#a17">00941</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#a17">VerseKey::decrement</a>(<font class="keywordtype">int</font> step) { +00942 <font class="keywordtype">char</font> ierror = 0; +00943 +00944 <a class="code" href="class_verse_key.html#a34">Index</a>(<a class="code" href="class_verse_key.html#a34">Index</a>() - step); +00945 <font class="keywordflow">while</font> ((!verse) && (!<a class="code" href="class_verse_key.html#o9">headings</a>) && (!ierror)) { +00946 <a class="code" href="class_verse_key.html#a34">Index</a>(<a class="code" href="class_verse_key.html#a34">Index</a>() - 1); +00947 ierror = <a class="code" href="class_s_w_key.html#a6">Error</a>(); +00948 } +00949 <font class="keywordflow">if</font> ((ierror) && (!<a class="code" href="class_verse_key.html#o9">headings</a>)) +00950 (*this)++; +00951 +00952 error = (ierror) ? ierror : error; +00953 } +00954 +00955 +00956 <font class="comment">/******************************************************************************</font> +00957 <font class="comment"> * VerseKey::Normalize - checks limits and normalizes if necessary (e.g.</font> +00958 <font class="comment"> * Matthew 29:47 = Mark 2:2). If last verse is</font> +00959 <font class="comment"> * exceeded, key is set to last Book CH:VS</font> +00960 <font class="comment"> * RET: *this</font> +00961 <font class="comment"> */</font> +00962 +<a name="l00963"></a><a class="code" href="class_verse_key.html#a30">00963</a> <font class="keywordtype">void</font> <a class="code" href="class_verse_key.html#a30">VerseKey::Normalize</a>(<font class="keywordtype">char</font> autocheck) +00964 { +00965 error = 0; +00966 +00967 <font class="keywordflow">if</font> ((autocheck) && (!<a class="code" href="class_verse_key.html#o8">autonorm</a>)) <font class="comment">// only normalize if we were explicitely called or if autonorm is turned on</font> +00968 <font class="keywordflow">return</font>; +00969 +00970 <font class="keywordflow">if</font> ((headings) && (!verse)) <font class="comment">// this is cheeze and temporary until deciding what actions should be taken.</font> +00971 <font class="keywordflow">return</font>; <font class="comment">// so headings should only be turned on when positioning with Index() or incrementors</font> +00972 +00973 <font class="keywordflow">while</font> ((testament < 3) && (testament > 0)) { +00974 +00975 <font class="keywordflow">if</font> (book > BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]) { +00976 book -= BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]; +00977 <a class="code" href="class_verse_key.html#o4">testament</a>++; +00978 <font class="keywordflow">continue</font>; +00979 } +00980 +00981 <font class="keywordflow">if</font> (book < 1) { +00982 <font class="keywordflow">if</font> (--<a class="code" href="class_verse_key.html#o4">testament</a> > 0) { +00983 book += BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]; +00984 } +00985 <font class="keywordflow">continue</font>; +00986 } +00987 +00988 <font class="keywordflow">if</font> (chapter > books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].chapmax) { +00989 chapter -= books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].chapmax; +00990 book++; +00991 <font class="keywordflow">continue</font>; +00992 } +00993 +00994 <font class="keywordflow">if</font> (chapter < 1) { +00995 <font class="keywordflow">if</font> (--book > 0) { +00996 chapter += books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].chapmax; +00997 } +00998 <font class="keywordflow">else</font> { +00999 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> > 1) { +01000 chapter += books[0][BMAX[0]-1].chapmax; +01001 } +01002 } +01003 <font class="keywordflow">continue</font>; +01004 } +01005 +01006 <font class="keywordflow">if</font> (verse > books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].versemax[chapter-1]) { <font class="comment">// -1 because e.g chapter 1 of Matthew is books[1][0].versemax[0]</font> +01007 verse -= books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].versemax[chapter++ - 1]; +01008 <font class="keywordflow">continue</font>; +01009 } +01010 +01011 <font class="keywordflow">if</font> (verse < 1) { +01012 <font class="keywordflow">if</font> (--chapter > 0) { +01013 verse += books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].versemax[chapter-1]; +01014 } +01015 <font class="keywordflow">else</font> { +01016 <font class="keywordflow">if</font> (book > 1) { +01017 verse += books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-2].versemax[books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-2].chapmax-1]; +01018 } +01019 <font class="keywordflow">else</font> { +01020 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> > 1) { +01021 verse += books[0][BMAX[0]-1].versemax[books[0][BMAX[0]-1].chapmax-1]; +01022 } +01023 } +01024 } +01025 <font class="keywordflow">continue</font>; +01026 } +01027 +01028 <font class="keywordflow">break</font>; <font class="comment">// If we've made it this far (all failure checks continue) we're ok</font> +01029 } +01030 +01031 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> > 2) { +01032 <a class="code" href="class_verse_key.html#o4">testament</a> = 2; +01033 book = BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]; +01034 chapter = books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].chapmax; +01035 verse = books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].versemax[chapter-1]; +01036 error = KEYERR_OUTOFBOUNDS; +01037 } +01038 +01039 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> < 1) { +01040 error = ((!<a class="code" href="class_verse_key.html#o9">headings</a>) || (<a class="code" href="class_verse_key.html#o4">testament</a> < 0) || (book < 0)) ? KEYERR_OUTOFBOUNDS : 0; +01041 <a class="code" href="class_verse_key.html#o4">testament</a> = ((headings) ? 0 : 1); +01042 book = ((headings) ? 0 : 1); +01043 chapter = ((headings) ? 0 : 1); +01044 verse = ((headings) ? 0 : 1); +01045 } +01046 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#a39">_compare</a>(<a class="code" href="class_verse_key.html#a8">UpperBound</a>()) > 0) { +01047 *<font class="keyword">this</font> = <a class="code" href="class_verse_key.html#a8">UpperBound</a>(); +01048 error = KEYERR_OUTOFBOUNDS; +01049 } +01050 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#a39">_compare</a>(<a class="code" href="class_verse_key.html#a7">LowerBound</a>()) < 0) { +01051 *<font class="keyword">this</font> = <a class="code" href="class_verse_key.html#a7">LowerBound</a>(); +01052 error = KEYERR_OUTOFBOUNDS; +01053 } +01054 } +01055 +01056 +01057 <font class="comment">/******************************************************************************</font> +01058 <font class="comment"> * VerseKey::Testament - Gets testament</font> +01059 <font class="comment"> *</font> +01060 <font class="comment"> * RET: value of testament</font> +01061 <font class="comment"> */</font> +01062 +<a name="l01063"></a><a class="code" href="class_verse_key.html#a22">01063</a> <font class="keywordtype">char</font> <a class="code" href="class_verse_key.html#a22">VerseKey::Testament</a>()<font class="keyword"> const</font> +01064 <font class="keyword"></font>{ +01065 <font class="keywordflow">return</font> <a class="code" href="class_verse_key.html#o4">testament</a>; +01066 } +01067 +01068 +01069 <font class="comment">/******************************************************************************</font> +01070 <font class="comment"> * VerseKey::Book - Gets book</font> +01071 <font class="comment"> *</font> +01072 <font class="comment"> * RET: value of book</font> +01073 <font class="comment"> */</font> +01074 +<a name="l01075"></a><a class="code" href="class_verse_key.html#a23">01075</a> <font class="keywordtype">char</font> <a class="code" href="class_verse_key.html#a23">VerseKey::Book</a>()<font class="keyword"> const</font> +01076 <font class="keyword"></font>{ +01077 <font class="keywordflow">return</font> book; +01078 } +01079 +01080 +01081 <font class="comment">/******************************************************************************</font> +01082 <font class="comment"> * VerseKey::Chapter - Gets chapter</font> +01083 <font class="comment"> *</font> +01084 <font class="comment"> * RET: value of chapter</font> +01085 <font class="comment"> */</font> +01086 +<a name="l01087"></a><a class="code" href="class_verse_key.html#a24">01087</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#a24">VerseKey::Chapter</a>()<font class="keyword"> const</font> +01088 <font class="keyword"></font>{ +01089 <font class="keywordflow">return</font> chapter; +01090 } +01091 +01092 +01093 <font class="comment">/******************************************************************************</font> +01094 <font class="comment"> * VerseKey::Verse - Gets verse</font> +01095 <font class="comment"> *</font> +01096 <font class="comment"> * RET: value of verse</font> +01097 <font class="comment"> */</font> +01098 +<a name="l01099"></a><a class="code" href="class_verse_key.html#a25">01099</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#a25">VerseKey::Verse</a>()<font class="keyword"> const</font> +01100 <font class="keyword"></font>{ +01101 <font class="keywordflow">return</font> verse; +01102 } +01103 +01104 +01105 <font class="comment">/******************************************************************************</font> +01106 <font class="comment"> * VerseKey::Testament - Sets/gets testament</font> +01107 <font class="comment"> *</font> +01108 <font class="comment"> * ENT: itestament - value which to set testament</font> +01109 <font class="comment"> * [MAXPOS(char)] - only get</font> +01110 <font class="comment"> *</font> +01111 <font class="comment"> * RET: if unchanged -> value of testament</font> +01112 <font class="comment"> * if changed -> previous value of testament</font> +01113 <font class="comment"> */</font> +01114 +<a name="l01115"></a><a class="code" href="class_verse_key.html#a26">01115</a> <font class="keywordtype">char</font> <a class="code" href="class_verse_key.html#a22">VerseKey::Testament</a>(<font class="keywordtype">char</font> itestament) +01116 { +01117 <font class="keywordtype">char</font> retval = <a class="code" href="class_verse_key.html#o4">testament</a>; +01118 +01119 <font class="keywordflow">if</font> (itestament != MAXPOS(<font class="keywordtype">char</font>)) { +01120 <a class="code" href="class_verse_key.html#o4">testament</a> = itestament; +01121 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +01122 } +01123 <font class="keywordflow">return</font> retval; +01124 } +01125 +01126 +01127 <font class="comment">/******************************************************************************</font> +01128 <font class="comment"> * VerseKey::Book - Sets/gets book</font> +01129 <font class="comment"> *</font> +01130 <font class="comment"> * ENT: ibook - value which to set book</font> +01131 <font class="comment"> * [MAXPOS(char)] - only get</font> +01132 <font class="comment"> *</font> +01133 <font class="comment"> * RET: if unchanged -> value of book</font> +01134 <font class="comment"> * if changed -> previous value of book</font> +01135 <font class="comment"> */</font> +01136 +<a name="l01137"></a><a class="code" href="class_verse_key.html#a27">01137</a> <font class="keywordtype">char</font> <a class="code" href="class_verse_key.html#a23">VerseKey::Book</a>(<font class="keywordtype">char</font> ibook) +01138 { +01139 <font class="keywordtype">char</font> retval = book; +01140 +01141 <a class="code" href="class_verse_key.html#a24">Chapter</a>(1); +01142 book = ibook; +01143 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +01144 +01145 <font class="keywordflow">return</font> retval; +01146 } +01147 +01148 +01149 <font class="comment">/******************************************************************************</font> +01150 <font class="comment"> * VerseKey::Chapter - Sets/gets chapter</font> +01151 <font class="comment"> *</font> +01152 <font class="comment"> * ENT: ichapter - value which to set chapter</font> +01153 <font class="comment"> * [MAXPOS(int)] - only get</font> +01154 <font class="comment"> *</font> +01155 <font class="comment"> * RET: if unchanged -> value of chapter</font> +01156 <font class="comment"> * if changed -> previous value of chapter</font> +01157 <font class="comment"> */</font> +01158 +<a name="l01159"></a><a class="code" href="class_verse_key.html#a28">01159</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#a24">VerseKey::Chapter</a>(<font class="keywordtype">int</font> ichapter) +01160 { +01161 <font class="keywordtype">int</font> retval = chapter; +01162 +01163 <a class="code" href="class_verse_key.html#a25">Verse</a>(1); +01164 chapter = ichapter; +01165 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +01166 +01167 <font class="keywordflow">return</font> retval; +01168 } +01169 +01170 +01171 <font class="comment">/******************************************************************************</font> +01172 <font class="comment"> * VerseKey::Verse - Sets/gets verse</font> +01173 <font class="comment"> *</font> +01174 <font class="comment"> * ENT: iverse - value which to set verse</font> +01175 <font class="comment"> * [MAXPOS(int)] - only get</font> +01176 <font class="comment"> *</font> +01177 <font class="comment"> * RET: if unchanged -> value of verse</font> +01178 <font class="comment"> * if changed -> previous value of verse</font> +01179 <font class="comment"> */</font> +01180 +<a name="l01181"></a><a class="code" href="class_verse_key.html#a29">01181</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#a25">VerseKey::Verse</a>(<font class="keywordtype">int</font> iverse) +01182 { +01183 <font class="keywordtype">int</font> retval = verse; +01184 +01185 verse = iverse; +01186 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +01187 +01188 <font class="keywordflow">return</font> retval; +01189 } +01190 +01191 +01192 <font class="comment">/******************************************************************************</font> +01193 <font class="comment"> * VerseKey::AutoNormalize - Sets/gets flag that tells VerseKey to auto-</font> +01194 <font class="comment"> * matically normalize itself when modified</font> +01195 <font class="comment"> *</font> +01196 <font class="comment"> * ENT: iautonorm - value which to set autonorm</font> +01197 <font class="comment"> * [MAXPOS(char)] - only get</font> +01198 <font class="comment"> *</font> +01199 <font class="comment"> * RET: if unchanged -> value of autonorm</font> +01200 <font class="comment"> * if changed -> previous value of autonorm</font> +01201 <font class="comment"> */</font> +01202 +<a name="l01203"></a><a class="code" href="class_verse_key.html#a31">01203</a> <font class="keywordtype">char</font> <a class="code" href="class_verse_key.html#a31">VerseKey::AutoNormalize</a>(<font class="keywordtype">char</font> iautonorm) +01204 { +01205 <font class="keywordtype">char</font> retval = <a class="code" href="class_verse_key.html#o8">autonorm</a>; +01206 +01207 <font class="keywordflow">if</font> (iautonorm != MAXPOS(<font class="keywordtype">char</font>)) { +01208 <a class="code" href="class_verse_key.html#o8">autonorm</a> = iautonorm; +01209 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +01210 } +01211 <font class="keywordflow">return</font> retval; +01212 } +01213 +01214 +01215 <font class="comment">/******************************************************************************</font> +01216 <font class="comment"> * VerseKey::Headings - Sets/gets flag that tells VerseKey to include</font> +01217 <font class="comment"> * chap/book/testmnt/module headings</font> +01218 <font class="comment"> *</font> +01219 <font class="comment"> * ENT: iheadings - value which to set headings</font> +01220 <font class="comment"> * [MAXPOS(char)] - only get</font> +01221 <font class="comment"> *</font> +01222 <font class="comment"> * RET: if unchanged -> value of headings</font> +01223 <font class="comment"> * if changed -> previous value of headings</font> +01224 <font class="comment"> */</font> +01225 +<a name="l01226"></a><a class="code" href="class_verse_key.html#a32">01226</a> <font class="keywordtype">char</font> <a class="code" href="class_verse_key.html#a32">VerseKey::Headings</a>(<font class="keywordtype">char</font> iheadings) +01227 { +01228 <font class="keywordtype">char</font> retval = <a class="code" href="class_verse_key.html#o9">headings</a>; +01229 +01230 <font class="keywordflow">if</font> (iheadings != MAXPOS(<font class="keywordtype">char</font>)) { +01231 <a class="code" href="class_verse_key.html#o9">headings</a> = iheadings; +01232 <a class="code" href="class_verse_key.html#a30">Normalize</a>(1); +01233 } +01234 <font class="keywordflow">return</font> retval; +01235 } +01236 +01237 +01238 <font class="comment">/******************************************************************************</font> +01239 <font class="comment"> * VerseKey::findindex - binary search to find the index closest, but less</font> +01240 <font class="comment"> * than the given value.</font> +01241 <font class="comment"> *</font> +01242 <font class="comment"> * ENT: array - long * to array to search</font> +01243 <font class="comment"> * size - number of elements in the array</font> +01244 <font class="comment"> * value - value to find</font> +01245 <font class="comment"> *</font> +01246 <font class="comment"> * RET: the index into the array that is less than but closest to value</font> +01247 <font class="comment"> */</font> +01248 +<a name="l01249"></a><a class="code" href="class_verse_key.html#c6">01249</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#c6">VerseKey::findindex</a>(<font class="keywordtype">long</font> *array, <font class="keywordtype">int</font> size, <font class="keywordtype">long</font> value) +01250 { +01251 <font class="keywordtype">int</font> lbound, ubound, tval; +01252 +01253 lbound = 0; +01254 ubound = size - 1; +01255 <font class="keywordflow">while</font> ((ubound - lbound) > 1) { +01256 tval = lbound + (ubound-lbound)/2; +01257 <font class="keywordflow">if</font> (array[tval] <= value) +01258 lbound = tval; +01259 <font class="keywordflow">else</font> ubound = tval; +01260 } +01261 <font class="keywordflow">return</font> (array[ubound] <= value) ? ubound : lbound; +01262 } +01263 +01264 +01265 <font class="comment">/******************************************************************************</font> +01266 <font class="comment"> * VerseKey::Index - Gets index based upon current verse</font> +01267 <font class="comment"> *</font> +01268 <font class="comment"> * RET: offset</font> +01269 <font class="comment"> */</font> +01270 +<a name="l01271"></a><a class="code" href="class_verse_key.html#a34">01271</a> <font class="keywordtype">long</font> <a class="code" href="class_verse_key.html#a34">VerseKey::Index</a>()<font class="keyword"> const</font> +01272 <font class="keyword"></font>{ +01273 <font class="keywordtype">long</font> offset; +01274 +01275 <font class="keywordflow">if</font> (!<a class="code" href="class_verse_key.html#o4">testament</a>) { <font class="comment">// if we want module heading</font> +01276 offset = 0; +01277 verse = 0; +01278 } +01279 <font class="keywordflow">else</font> { +01280 <font class="keywordflow">if</font> (!book) +01281 chapter = 0; +01282 <font class="keywordflow">if</font> (!chapter) +01283 verse = 0; +01284 +01285 offset = offsets[<a class="code" href="class_verse_key.html#o4">testament</a>-1][0][book]; +01286 offset = offsets[<a class="code" href="class_verse_key.html#o4">testament</a>-1][1][(int)offset + chapter]; +01287 <font class="keywordflow">if</font> (!(offset|verse)) <font class="comment">// if we have a testament but nothing else.</font> +01288 offset = 1; +01289 } +01290 <font class="keywordflow">return</font> (offset + verse); +01291 } +01292 +01293 +01294 <font class="comment">/******************************************************************************</font> +01295 <font class="comment"> * VerseKey::Index - Gets index based upon current verse</font> +01296 <font class="comment"> *</font> +01297 <font class="comment"> * RET: offset</font> +01298 <font class="comment"> */</font> +01299 +01300 <font class="keywordtype">long</font> VerseKey::NewIndex()<font class="keyword"> const</font> +01301 <font class="keyword"></font>{ +01302 <font class="keyword">static</font> <font class="keywordtype">long</font> otMaxIndex = 32300 - 8245; <font class="comment">// total positions - new testament positions</font> +01303 <font class="comment">// static long otMaxIndex = offsets[0][1][(int)offsets[0][0][BMAX[0]] + books[0][BMAX[0]].chapmax];</font> +01304 <font class="keywordflow">return</font> ((<a class="code" href="class_verse_key.html#o4">testament</a>-1) * otMaxIndex) + <a class="code" href="class_verse_key.html#a34">Index</a>(); +01305 } +01306 +01307 +01308 <font class="comment">/******************************************************************************</font> +01309 <font class="comment"> * VerseKey::Index - Sets index based upon current verse</font> +01310 <font class="comment"> *</font> +01311 <font class="comment"> * ENT: iindex - value to set index to</font> +01312 <font class="comment"> *</font> +01313 <font class="comment"> * RET: offset</font> +01314 <font class="comment"> */</font> +01315 +<a name="l01316"></a><a class="code" href="class_verse_key.html#a35">01316</a> <font class="keywordtype">long</font> <a class="code" href="class_verse_key.html#a34">VerseKey::Index</a>(<font class="keywordtype">long</font> iindex) +01317 { +01318 <font class="keywordtype">long</font> offset; +01319 +01320 <font class="comment">// This is the dirty stuff --------------------------------------------</font> +01321 +01322 <font class="keywordflow">if</font> (!<a class="code" href="class_verse_key.html#o4">testament</a>) +01323 <a class="code" href="class_verse_key.html#o4">testament</a> = 1; +01324 +01325 <font class="keywordflow">if</font> (iindex < 1) { <font class="comment">// if (-) or module heading</font> +01326 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> < 2) { +01327 <font class="keywordflow">if</font> (iindex < 0) { +01328 <a class="code" href="class_verse_key.html#o4">testament</a> = 0; <font class="comment">// previously we changed 0 -> 1</font> +01329 error = KEYERR_OUTOFBOUNDS; +01330 } +01331 <font class="keywordflow">else</font> <a class="code" href="class_verse_key.html#o4">testament</a> = 0; <font class="comment">// we want module heading</font> +01332 } +01333 <font class="keywordflow">else</font> { +01334 <a class="code" href="class_verse_key.html#o4">testament</a>--; +01335 iindex = (offsets[<a class="code" href="class_verse_key.html#o4">testament</a>-1][1][offsize[<a class="code" href="class_verse_key.html#o4">testament</a>-1][1]-1] + books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]-1].versemax[books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][BMAX[<a class="code" href="class_verse_key.html#o4">testament</a>-1]-1].chapmax-1]) + iindex; <font class="comment">// What a doozy! ((offset of last chapter + number of verses in the last chapter) + iindex)</font> +01336 } +01337 } +01338 +01339 <font class="comment">// --------------------------------------------------------------------</font> +01340 +01341 +01342 <font class="keywordflow">if</font> (testament) { +01343 <font class="keywordflow">if</font> ((!error) && (iindex)) { +01344 offset = <a class="code" href="class_verse_key.html#c6">findindex</a>(offsets[<a class="code" href="class_verse_key.html#o4">testament</a>-1][1], offsize[<a class="code" href="class_verse_key.html#o4">testament</a>-1][1], iindex); +01345 verse = iindex - offsets[<a class="code" href="class_verse_key.html#o4">testament</a>-1][1][offset]; +01346 book = <a class="code" href="class_verse_key.html#c6">findindex</a>(offsets[<a class="code" href="class_verse_key.html#o4">testament</a>-1][0], offsize[<a class="code" href="class_verse_key.html#o4">testament</a>-1][0], offset); +01347 chapter = offset - offsets[<a class="code" href="class_verse_key.html#o4">testament</a>-1][0][VerseKey::book]; +01348 verse = (chapter) ? verse : 0; <font class="comment">// funny check. if we are index=1 (testmt header) all gets set to 0 exept verse. Don't know why. Fix if you figure out. Think its in the offsets table.</font> +01349 <font class="keywordflow">if</font> (verse) { <font class="comment">// only check if -1 won't give negative</font> +01350 <font class="keywordflow">if</font> (verse > books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].versemax[chapter-1]) { +01351 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#o4">testament</a> > 1) { +01352 verse = books[<a class="code" href="class_verse_key.html#o4">testament</a>-1][book-1].versemax[chapter-1]; +01353 error = KEYERR_OUTOFBOUNDS; +01354 } +01355 <font class="keywordflow">else</font> { +01356 <a class="code" href="class_verse_key.html#o4">testament</a>++; +01357 <a class="code" href="class_verse_key.html#a34">Index</a>(verse - books[<a class="code" href="class_verse_key.html#o4">testament</a>-2][book-1].versemax[chapter-1]); +01358 } +01359 } +01360 } +01361 } +01362 } +01363 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#a39">_compare</a>(<a class="code" href="class_verse_key.html#a8">UpperBound</a>()) > 0) { +01364 *<font class="keyword">this</font> = <a class="code" href="class_verse_key.html#a8">UpperBound</a>(); +01365 error = KEYERR_OUTOFBOUNDS; +01366 } +01367 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#a39">_compare</a>(<a class="code" href="class_verse_key.html#a7">LowerBound</a>()) < 0) { +01368 *<font class="keyword">this</font> = <a class="code" href="class_verse_key.html#a7">LowerBound</a>(); +01369 error = KEYERR_OUTOFBOUNDS; +01370 } +01371 <font class="keywordflow">return</font> <a class="code" href="class_verse_key.html#a34">Index</a>(); +01372 } +01373 +01374 +01375 <font class="comment">/******************************************************************************</font> +01376 <font class="comment"> * VerseKey::compare - Compares another SWKey object</font> +01377 <font class="comment"> *</font> +01378 <font class="comment"> * ENT: ikey - key to compare with this one</font> +01379 <font class="comment"> *</font> +01380 <font class="comment"> * RET: >0 if this versekey is greater than compare versekey</font> +01381 <font class="comment"> * <0 <</font> +01382 <font class="comment"> * 0 =</font> +01383 <font class="comment"> */</font> +01384 +<a name="l01385"></a><a class="code" href="class_verse_key.html#a38">01385</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#a38">VerseKey::compare</a>(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> &ikey) +01386 { +01387 VerseKey ivkey = (<font class="keyword">const</font> <font class="keywordtype">char</font> *)ikey; +01388 <font class="keywordflow">return</font> <a class="code" href="class_verse_key.html#a39">_compare</a>(ivkey); +01389 } +01390 +01391 +01392 <font class="comment">/******************************************************************************</font> +01393 <font class="comment"> * VerseKey::_compare - Compares another VerseKey object</font> +01394 <font class="comment"> *</font> +01395 <font class="comment"> * ENT: ikey - key to compare with this one</font> +01396 <font class="comment"> *</font> +01397 <font class="comment"> * RET: >0 if this versekey is greater than compare versekey</font> +01398 <font class="comment"> * <0 <</font> +01399 <font class="comment"> * 0 =</font> +01400 <font class="comment"> */</font> +01401 +<a name="l01402"></a><a class="code" href="class_verse_key.html#a39">01402</a> <font class="keywordtype">int</font> <a class="code" href="class_verse_key.html#a39">VerseKey::_compare</a>(<font class="keyword">const</font> VerseKey &ivkey) +01403 { +01404 <font class="keywordtype">long</font> keyval1 = 0; +01405 <font class="keywordtype">long</font> keyval2 = 0; +01406 +01407 keyval1 += <a class="code" href="class_verse_key.html#a22">Testament</a>() * 1000000000; +01408 keyval2 += ivkey.<a class="code" href="class_verse_key.html#a22">Testament</a>() * 1000000000; +01409 keyval1 += <a class="code" href="class_verse_key.html#a23">Book</a>() * 1000000; +01410 keyval2 += ivkey.<a class="code" href="class_verse_key.html#a23">Book</a>() * 1000000; +01411 keyval1 += <a class="code" href="class_verse_key.html#a24">Chapter</a>() * 1000; +01412 keyval2 += ivkey.<a class="code" href="class_verse_key.html#a24">Chapter</a>() * 1000; +01413 keyval1 += <a class="code" href="class_verse_key.html#a25">Verse</a>(); +01414 keyval2 += ivkey.<a class="code" href="class_verse_key.html#a25">Verse</a>(); +01415 keyval1 -= keyval2; +01416 keyval1 = (keyval1) ? ((keyval1 > 0) ? 1 : -1) <font class="comment">/*keyval1/labs(keyval1)*/</font>:0; <font class="comment">// -1 | 0 | 1</font> +01417 <font class="keywordflow">return</font> keyval1; +01418 } +01419 +01420 +01421 <font class="keyword">const</font> <font class="keywordtype">char</font> *VerseKey::getOSISRef()<font class="keyword"> const </font>{ +01422 <font class="keyword">static</font> <font class="keywordtype">char</font> buf[5][254]; +01423 <font class="keyword">static</font> <font class="keywordtype">char</font> loop = 0; +01424 +01425 <font class="keywordflow">if</font> (loop > 4) +01426 loop = 0; +01427 +01428 <font class="keyword">static</font> <font class="keywordtype">char</font> *osisotbooks[] = { +01429 <font class="stringliteral">"Gen"</font>,<font class="stringliteral">"Exod"</font>,<font class="stringliteral">"Lev"</font>,<font class="stringliteral">"Num"</font>,<font class="stringliteral">"Deut"</font>,<font class="stringliteral">"Josh"</font>,<font class="stringliteral">"Judg"</font>,<font class="stringliteral">"Ruth"</font>,<font class="stringliteral">"_1Sam"</font>,<font class="stringliteral">"_2Sam"</font>, +01430 <font class="stringliteral">"_1Kgs"</font>,<font class="stringliteral">"_2Kgs"</font>,<font class="stringliteral">"_1Chr"</font>,<font class="stringliteral">"_2Chr"</font>,<font class="stringliteral">"Ezra"</font>,<font class="stringliteral">"Neh"</font>,<font class="stringliteral">"Esth"</font>,<font class="stringliteral">"Job"</font>,<font class="stringliteral">"Ps"</font>, +01431 <font class="stringliteral">"Prov"</font>, <font class="comment">// added this. Was not in OSIS spec</font> +01432 <font class="stringliteral">"Eccl"</font>, +01433 <font class="stringliteral">"Song"</font>,<font class="stringliteral">"Isa"</font>,<font class="stringliteral">"Jer"</font>,<font class="stringliteral">"Lam"</font>,<font class="stringliteral">"Ezek"</font>,<font class="stringliteral">"Dan"</font>,<font class="stringliteral">"Hos"</font>,<font class="stringliteral">"Joel"</font>,<font class="stringliteral">"Amos"</font>,<font class="stringliteral">"Obad"</font>, +01434 <font class="stringliteral">"Jonah"</font>,<font class="stringliteral">"Mic"</font>,<font class="stringliteral">"Nah"</font>,<font class="stringliteral">"Hab"</font>,<font class="stringliteral">"Zeph"</font>,<font class="stringliteral">"Hag"</font>,<font class="stringliteral">"Zech"</font>,<font class="stringliteral">"Mal"</font>,<font class="stringliteral">"Bar"</font>,<font class="stringliteral">"PrAzar"</font>, +01435 <font class="stringliteral">"Bel"</font>,<font class="stringliteral">"Sus"</font>,<font class="stringliteral">"_1Esd"</font>,<font class="stringliteral">"_2Esd"</font>,<font class="stringliteral">"AddEsth"</font>,<font class="stringliteral">"EpJer"</font>,<font class="stringliteral">"Jdt"</font>,<font class="stringliteral">"_1Macc"</font>,<font class="stringliteral">"_2Macc"</font>,<font class="stringliteral">"_3Macc"</font>, +01436 <font class="stringliteral">"_4Macc"</font>,<font class="stringliteral">"PrMan"</font>,<font class="stringliteral">"Ps151"</font>,<font class="stringliteral">"Sir"</font>,<font class="stringliteral">"Tob"</font>,<font class="stringliteral">"Wis"</font>}; +01437 <font class="keyword">static</font> <font class="keywordtype">char</font> *osisntbooks[] = { +01438 <font class="stringliteral">"Matt"</font>,<font class="stringliteral">"Mark"</font>,<font class="stringliteral">"Luke"</font>,<font class="stringliteral">"John"</font>,<font class="stringliteral">"Acts"</font>,<font class="stringliteral">"Rom"</font>,<font class="stringliteral">"_1Cor"</font>,<font class="stringliteral">"_2Cor"</font>,<font class="stringliteral">"Gal"</font>,<font class="stringliteral">"Eph"</font>, +01439 <font class="stringliteral">"Phil"</font>,<font class="stringliteral">"Col"</font>,<font class="stringliteral">"_1Thess"</font>,<font class="stringliteral">"_2Thess"</font>,<font class="stringliteral">"_1Tim"</font>,<font class="stringliteral">"_2Tim"</font>,<font class="stringliteral">"Titus"</font>,<font class="stringliteral">"Phlm"</font>,<font class="stringliteral">"Heb"</font>,<font class="stringliteral">"Jas"</font>, +01440 <font class="stringliteral">"_1Pet"</font>,<font class="stringliteral">"_2Pet"</font>,<font class="stringliteral">"_1John"</font>,<font class="stringliteral">"_2John"</font>,<font class="stringliteral">"_3John"</font>,<font class="stringliteral">"Jude"</font>,<font class="stringliteral">"Rev"</font>}; +01441 <font class="keyword">static</font> <font class="keywordtype">char</font> **osisbooks[] = { osisotbooks, osisntbooks }; +01442 <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#a25">Verse</a>()) +01443 sprintf(buf[loop], <font class="stringliteral">"%s.%d.%d"</font>, osisbooks[<a class="code" href="class_verse_key.html#a22">Testament</a>()-1][<a class="code" href="class_verse_key.html#a23">Book</a>()-1], (<font class="keywordtype">int</font>)<a class="code" href="class_verse_key.html#a24">Chapter</a>(), (<font class="keywordtype">int</font>)<a class="code" href="class_verse_key.html#a25">Verse</a>()); +01444 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#a24">Chapter</a>()) +01445 sprintf(buf[loop], <font class="stringliteral">"%s.%d"</font>, osisbooks[<a class="code" href="class_verse_key.html#a22">Testament</a>()-1][<a class="code" href="class_verse_key.html#a23">Book</a>()-1], (<font class="keywordtype">int</font>)<a class="code" href="class_verse_key.html#a24">Chapter</a>()); +01446 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="class_verse_key.html#a23">Book</a>()) +01447 sprintf(buf[loop], <font class="stringliteral">"%s"</font>, osisbooks[<a class="code" href="class_verse_key.html#a22">Testament</a>()-1][<a class="code" href="class_verse_key.html#a23">Book</a>()-1]); +01448 <font class="keywordflow">else</font> sprintf(buf[loop], <font class="stringliteral">""</font>); +01449 <font class="keywordflow">return</font> buf[loop++]; +01450 } +</pre></div><hr><address align="right"><small>Generated on Thu Jun 20 22:13:01 2002 for The Sword Project by +<a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border=0 +width=110 height=53></a>1.2.15 </small></address> +</body> +</html> |