diff options
Diffstat (limited to 'doc/api-documentation/html/rawtext_8cpp-source.html')
-rw-r--r-- | doc/api-documentation/html/rawtext_8cpp-source.html | 644 |
1 files changed, 644 insertions, 0 deletions
diff --git a/doc/api-documentation/html/rawtext_8cpp-source.html b/doc/api-documentation/html/rawtext_8cpp-source.html new file mode 100644 index 0000000..599021e --- /dev/null +++ b/doc/api-documentation/html/rawtext_8cpp-source.html @@ -0,0 +1,644 @@ +<!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>rawtext.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>rawtext.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/******************************************************************************</font> +00002 <font class="comment"> * rawtext.cpp - code for class 'RawText'- a module that reads raw text files:</font> +00003 <font class="comment"> * ot and nt using indexs ??.bks ??.cps ??.vss</font> +00004 <font class="comment"> */</font> +00005 +00006 +00007 <font class="preprocessor">#include <stdio.h></font> +00008 <font class="preprocessor">#include <fcntl.h></font> +00009 +00010 <font class="preprocessor">#ifndef __GNUC__</font> +00011 <font class="preprocessor"></font><font class="preprocessor">#include <io.h></font> +00012 <font class="preprocessor">#else</font> +00013 <font class="preprocessor"></font><font class="preprocessor">#include <unistd.h></font> +00014 <font class="preprocessor">#endif</font> +00015 <font class="preprocessor"></font> +00016 <font class="preprocessor">#include <string.h></font> +00017 <font class="preprocessor">#include <utilfuns.h></font> +00018 <font class="preprocessor">#include <rawverse.h></font> +00019 <font class="preprocessor">#include <rawtext.h></font> +00020 +00021 <font class="preprocessor">#include <map></font> +00022 <font class="preprocessor">#include <list></font> +00023 <font class="preprocessor">#include <algorithm></font> +00024 <font class="preprocessor">#include <regex.h></font> <font class="comment">// GNU</font> +00025 +00026 <font class="preprocessor">#ifndef O_BINARY</font> +00027 <font class="preprocessor"></font><font class="preprocessor">#define O_BINARY 0</font> +00028 <font class="preprocessor"></font><font class="preprocessor">#endif</font> +00029 <font class="preprocessor"></font> +00030 <font class="comment">/******************************************************************************</font> +00031 <font class="comment"> * RawText Constructor - Initializes data for instance of RawText</font> +00032 <font class="comment"> *</font> +00033 <font class="comment"> * ENT: iname - Internal name for module</font> +00034 <font class="comment"> * idesc - Name to display to user for module</font> +00035 <font class="comment"> * idisp - Display object to use for displaying</font> +00036 <font class="comment"> */</font> +00037 +00038 RawText::RawText(<font class="keyword">const</font> <font class="keywordtype">char</font> *ipath, <font class="keyword">const</font> <font class="keywordtype">char</font> *iname, <font class="keyword">const</font> <font class="keywordtype">char</font> *idesc, <a class="code" href="class_s_w_display.html">SWDisplay</a> *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, <font class="keyword">const</font> <font class="keywordtype">char</font>* ilang) +00039 : <a class="code" href="class_s_w_text.html">SWText</a>(iname, idesc, idisp, enc, dir, mark, ilang), +00040 RawVerse(ipath) { +00041 +00042 string fname; +00043 fname = path; +00044 <font class="keywordtype">char</font> ch = fname.c_str()[strlen(fname.c_str())-1]; +00045 <font class="keywordflow">if</font> ((ch != <font class="charliteral">'/'</font>) && (ch != <font class="charliteral">'\\'</font>)) +00046 fname += <font class="stringliteral">"/"</font>; +00047 +00048 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> loop = 0; loop < 2; loop++) { +00049 fastSearch[loop] = 0; +00050 string fastidxname =(fname + ((loop)?<font class="stringliteral">"ntwords.dat"</font>:<font class="stringliteral">"otwords.dat"</font>)); +00051 <font class="keywordflow">if</font> (!access(fastidxname.c_str(), 04)) { +00052 fastidxname = (fname + ((loop)?<font class="stringliteral">"ntwords.idx"</font>:<font class="stringliteral">"otwords.idx"</font>)); +00053 <font class="keywordflow">if</font> (!access(fastidxname.c_str(), 04)) +00054 fastSearch[loop] = <font class="keyword">new</font> RawStr((fname + ((loop)?<font class="stringliteral">"ntwords"</font>:<font class="stringliteral">"otwords"</font>)).c_str()); +00055 } +00056 } +00057 } +00058 +00059 +00060 <font class="comment">/******************************************************************************</font> +00061 <font class="comment"> * RawText Destructor - Cleans up instance of RawText</font> +00062 <font class="comment"> */</font> +00063 +00064 RawText::~RawText() +00065 { +00066 <font class="keywordflow">if</font> (fastSearch[0]) +00067 <font class="keyword">delete</font> fastSearch[0]; +00068 +00069 <font class="keywordflow">if</font> (fastSearch[1]) +00070 <font class="keyword">delete</font> fastSearch[1]; +00071 } +00072 +00073 +00074 <font class="comment">/******************************************************************************</font> +00075 <font class="comment"> * RawText::operator char * - Returns the correct verse when char * cast</font> +00076 <font class="comment"> * is requested</font> +00077 <font class="comment"> *</font> +00078 <font class="comment"> * RET: string buffer with verse</font> +00079 <font class="comment"> */</font> +00080 +00081 <font class="keywordtype">char</font> *RawText::getRawEntry() { +00082 <font class="keywordtype">long</font> start = 0; +00083 <font class="keywordtype">unsigned</font> <font class="keywordtype">short</font> size = 0; +00084 <a class="code" href="class_verse_key.html">VerseKey</a> *key = 0; +00085 +00086 <font class="comment">// see if we have a VerseKey * or decendant</font> +00087 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00088 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00089 <font class="preprocessor">#endif</font> +00090 <font class="preprocessor"></font> key = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, this->key); +00091 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00092 <font class="preprocessor"></font> } +00093 <font class="keywordflow">catch</font> ( ... ) { } +00094 <font class="preprocessor">#endif</font> +00095 <font class="preprocessor"></font> <font class="comment">// if we don't have a VerseKey * decendant, create our own</font> +00096 <font class="keywordflow">if</font> (!key) +00097 key = <font class="keyword">new</font> <a class="code" href="class_verse_key.html">VerseKey</a>(this->key); +00098 +00099 findoffset(key-><a class="code" href="class_verse_key.html#a22">Testament</a>(), key-><a class="code" href="class_verse_key.html#a34">Index</a>(), &start, &size); +00100 entrySize = size; <font class="comment">// support getEntrySize call</font> +00101 +00102 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> newsize = (size + 2) * FILTERPAD; +00103 <font class="keywordflow">if</font> (newsize > entrybufallocsize) { +00104 <font class="keywordflow">if</font> (entrybuf) +00105 <font class="keyword">delete</font> [] entrybuf; +00106 entrybuf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ newsize ]; +00107 entrybufallocsize = newsize; +00108 } +00109 *entrybuf = 0; +00110 +00111 gettext(key-><a class="code" href="class_verse_key.html#a22">Testament</a>(), start, (size + 2), entrybuf); +00112 +00113 rawFilter(entrybuf, size, key); +00114 +00115 <font class="keywordflow">if</font> (!isUnicode()) +00116 preptext(entrybuf); +00117 +00118 <font class="keywordflow">if</font> (this->key != key) <font class="comment">// free our key if we created a VerseKey</font> +00119 <font class="keyword">delete</font> key; +00120 +00121 <font class="keywordflow">return</font> entrybuf; +00122 } +00123 +00124 +00125 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> RawText::createSearchFramework() { +00126 <a class="code" href="class_s_w_key.html">SWKey</a> *savekey = 0; +00127 <a class="code" href="class_s_w_key.html">SWKey</a> *searchkey = 0; +00128 <a class="code" href="class_s_w_key.html">SWKey</a> textkey; +00129 <font class="keywordtype">char</font> *word = 0; +00130 <font class="keywordtype">char</font> *wordBuf = 0; +00131 +00132 <font class="comment">// dictionary holds words associated with a list</font> +00133 <font class="comment">// containing every module position that contains</font> +00134 <font class="comment">// the word. [0] Old Testament; [1] NT</font> +00135 map < string, list<long> > dictionary[2]; +00136 +00137 +00138 <font class="comment">// save key information so as not to disrupt original</font> +00139 <font class="comment">// module position</font> +00140 <font class="keywordflow">if</font> (!key->Persist()) { +00141 savekey = CreateKey(); +00142 *savekey = *key; +00143 } +00144 <font class="keywordflow">else</font> savekey = key; +00145 +00146 searchkey = (key->Persist())?key-><a class="code" href="class_s_w_key.html#a3">clone</a>():0; +00147 <font class="keywordflow">if</font> (searchkey) { +00148 searchkey-><a class="code" href="class_s_w_key.html#a4">Persist</a>(1); +00149 SetKey(*searchkey); +00150 } +00151 +00152 <font class="comment">// position module at the beginning</font> +00153 *<font class="keyword">this</font> = TOP; +00154 +00155 <a class="code" href="class_verse_key.html">VerseKey</a> *lkey = (<a class="code" href="class_verse_key.html">VerseKey</a> *)key; +00156 +00157 <font class="comment">// iterate thru each entry in module</font> +00158 <font class="keywordflow">while</font> (!Error()) { +00159 <font class="keywordtype">long</font> index = lkey-><a class="code" href="class_verse_key.html#a34">Index</a>(); +00160 wordBuf = (<font class="keywordtype">char</font> *)calloc(<font class="keyword">sizeof</font>(<font class="keywordtype">char</font>), strlen(StripText()) + 1); +00161 strcpy(wordBuf, StripText()); +00162 +00163 <font class="comment">// grab each word from the text</font> +00164 word = strtok(wordBuf, <font class="stringliteral">" !.,?;:()-=+/\\|{}[]\"<>"</font>); +00165 <font class="keywordflow">while</font> (word) { +00166 +00167 <font class="comment">// make work upper case</font> +00168 <font class="keywordflow">for</font> (<font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> i = 0; i < strlen(word); i++) +00169 word[i] = SW_toupper(word[i]); +00170 +00171 <font class="comment">// lookup word in dictionary (or make entry in dictionary</font> +00172 <font class="comment">// for this word) and add this module position (index) to</font> +00173 <font class="comment">// the word's associated list of module positions</font> +00174 dictionary[lkey-><a class="code" href="class_verse_key.html#a22">Testament</a>()-1][word].push_back(index); +00175 word = strtok(NULL, <font class="stringliteral">" !.,?;:()-=+/\\|{}[]\"<>"</font>); +00176 } +00177 free(wordBuf); +00178 (*this)++; +00179 } +00180 +00181 <font class="comment">// reposition module back to where it was before we were called</font> +00182 SetKey(*savekey); +00183 +00184 <font class="keywordflow">if</font> (!savekey-><a class="code" href="class_s_w_key.html#a4">Persist</a>()) +00185 <font class="keyword">delete</font> savekey; +00186 +00187 <font class="keywordflow">if</font> (searchkey) +00188 <font class="keyword">delete</font> searchkey; +00189 +00190 +00191 <font class="comment">// --------- Let's output an index from our dictionary -----------</font> +00192 <font class="keywordtype">int</font> datfd; +00193 <font class="keywordtype">int</font> idxfd; +00194 map < string, list<long> >::iterator it; +00195 list<long>::iterator it2; +00196 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> offset, entryoff; +00197 <font class="keywordtype">unsigned</font> <font class="keywordtype">short</font> size; +00198 +00199 string fname; +00200 fname = path; +00201 <font class="keywordtype">char</font> ch = fname.c_str()[strlen(fname.c_str())-1]; +00202 <font class="keywordflow">if</font> ((ch != <font class="charliteral">'/'</font>) && (ch != <font class="charliteral">'\\'</font>)) +00203 fname += <font class="stringliteral">"/"</font>; +00204 +00205 <font class="comment">// for old and new testament do...</font> +00206 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> loop = 0; loop < 2; loop++) { +00207 <font class="keywordflow">if</font> ((datfd = open((fname + ((loop)?<font class="stringliteral">"ntwords.dat"</font>:<font class="stringliteral">"otwords.dat"</font>)).c_str(), O_CREAT|O_WRONLY|O_BINARY, 00644 )) == -1) +00208 <font class="keywordflow">return</font> -1; +00209 <font class="keywordflow">if</font> ((idxfd = open((fname + ((loop)?<font class="stringliteral">"ntwords.idx"</font>:<font class="stringliteral">"otwords.idx"</font>)).c_str(), O_CREAT|O_WRONLY|O_BINARY, 00644 )) == -1) { +00210 close(datfd); +00211 <font class="keywordflow">return</font> -1; +00212 } +00213 +00214 <font class="comment">// iterate thru each word in the dictionary</font> +00215 <font class="keywordflow">for</font> (it = dictionary[loop].begin(); it != dictionary[loop].end(); it++) { +00216 printf(<font class="stringliteral">"%s: "</font>, it->first.c_str()); +00217 +00218 <font class="comment">// get our current offset in our word.dat file and write this as the start</font> +00219 <font class="comment">// of the next entry in our database</font> +00220 offset = lseek(datfd, 0, SEEK_CUR); +00221 write(idxfd, &offset, 4); +00222 +00223 <font class="comment">// write our word out to the word.dat file, delineating with a \n</font> +00224 write(datfd, it->first.c_str(), strlen(it->first.c_str())); +00225 write(datfd, <font class="stringliteral">"\n"</font>, 1); +00226 +00227 <font class="comment">// force our mod position list for this word to be unique (remove</font> +00228 <font class="comment">// duplicates that may exist if the word was found more than once</font> +00229 <font class="comment">// in the verse</font> +00230 it->second.unique(); +00231 +00232 <font class="comment">// iterate thru each mod position for this word and output it to</font> +00233 <font class="comment">// our database</font> +00234 <font class="keywordtype">unsigned</font> <font class="keywordtype">short</font> count = 0; +00235 <font class="keywordflow">for</font> (it2 = it->second.begin(); it2 != it->second.end(); it2++) { +00236 entryoff= *it2; +00237 write(datfd, &entryoff, 4); +00238 count++; +00239 } +00240 +00241 <font class="comment">// now see what our new position is in our word.dat file and</font> +00242 <font class="comment">// determine the size of this database entry</font> +00243 size = lseek(datfd, 0, SEEK_CUR) - offset; +00244 +00245 <font class="comment">// store the size of this database entry</font> +00246 write(idxfd, &size, 2); +00247 printf(<font class="stringliteral">"%d entries (size: %d)\n"</font>, count, size); +00248 } +00249 close(datfd); +00250 close(idxfd); +00251 } +00252 <font class="keywordflow">return</font> 0; +00253 } +00254 +00255 +00256 <font class="comment">/******************************************************************************</font> +00257 <font class="comment"> * SWModule::Search - Searches a module for a string</font> +00258 <font class="comment"> *</font> +00259 <font class="comment"> * ENT: istr - string for which to search</font> +00260 <font class="comment"> * searchType - type of search to perform</font> +00261 <font class="comment"> * >=0 - regex</font> +00262 <font class="comment"> * -1 - phrase</font> +00263 <font class="comment"> * -2 - multiword</font> +00264 <font class="comment"> * flags - options flags for search</font> +00265 <font class="comment"> * justCheckIfSupported - if set, don't search, only tell if this</font> +00266 <font class="comment"> * function supports requested search.</font> +00267 <font class="comment"> *</font> +00268 <font class="comment"> * RET: listkey set to verses that contain istr</font> +00269 <font class="comment"> */</font> +00270 +00271 <a class="code" href="class_list_key.html">ListKey</a> &RawText::Search(<font class="keyword">const</font> <font class="keywordtype">char</font> *istr, <font class="keywordtype">int</font> searchType, <font class="keywordtype">int</font> flags, <a class="code" href="class_s_w_key.html">SWKey</a> *scope, <font class="keywordtype">bool</font> *justCheckIfSupported, <font class="keywordtype">void</font> (*percent)(<font class="keywordtype">char</font>, <font class="keywordtype">void</font> *), <font class="keywordtype">void</font> *percentUserData) +00272 { +00273 listkey.ClearList(); +00274 +00275 <font class="keywordflow">if</font> ((fastSearch[0]) && (fastSearch[1])) { +00276 +00277 <font class="keywordflow">switch</font> (searchType) { +00278 <font class="keywordflow">case</font> -2: { +00279 +00280 <font class="keywordflow">if</font> ((flags & REG_ICASE) != REG_ICASE) <font class="comment">// if haven't chosen to</font> +00281 <font class="comment">// ignore case</font> +00282 <font class="keywordflow">break</font>; <font class="comment">// can't handle fast case sensitive searches</font> +00283 +00284 <font class="comment">// test to see if our scope for this search is bounded by a</font> +00285 <font class="comment">// VerseKey</font> +00286 <a class="code" href="class_verse_key.html">VerseKey</a> *testKeyType = 0; +00287 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00288 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00289 <font class="preprocessor">#endif</font> +00290 <font class="preprocessor"></font> testKeyType = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, ((scope)?scope:key)); +00291 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00292 <font class="preprocessor"></font> } +00293 <font class="keywordflow">catch</font> ( ... ) {} +00294 <font class="preprocessor">#endif</font> +00295 <font class="preprocessor"></font> <font class="comment">// if we don't have a VerseKey * decendant we can't handle</font> +00296 <font class="comment">// because of scope.</font> +00297 <font class="comment">// In the future, add bool SWKey::isValid(const char *tryString);</font> +00298 <font class="keywordflow">if</font> (!testKeyType) +00299 <font class="keywordflow">break</font>; +00300 +00301 +00302 <font class="comment">// check if we just want to see if search is supported.</font> +00303 <font class="comment">// If we've gotten this far, then it is supported.</font> +00304 <font class="keywordflow">if</font> (justCheckIfSupported) { +00305 *justCheckIfSupported = <font class="keyword">true</font>; +00306 <font class="keywordflow">return</font> listkey; +00307 } +00308 +00309 <a class="code" href="class_s_w_key.html">SWKey</a> saveKey = *testKeyType; <font class="comment">// save current place</font> +00310 +00311 <font class="keywordtype">char</font> error = 0; +00312 <font class="keywordtype">char</font> **words = 0; +00313 <font class="keywordtype">char</font> *wordBuf = 0; +00314 <font class="keywordtype">int</font> wordCount = 0; +00315 <font class="keywordtype">long</font> start; +00316 <font class="keywordtype">unsigned</font> <font class="keywordtype">short</font> size; +00317 <font class="keywordtype">char</font> *idxbuf = 0; +00318 <font class="keywordtype">char</font> *datbuf = 0; +00319 list <long> indexes; +00320 list <long> indexes2; +00321 <a class="code" href="class_verse_key.html">VerseKey</a> vk; +00322 vk = TOP; +00323 +00324 (*percent)(10, percentUserData); +00325 +00326 <font class="comment">// toupper our copy of search string</font> +00327 stdstr(&wordBuf, istr); +00328 <font class="keywordflow">for</font> (<font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> i = 0; i < strlen(wordBuf); i++) +00329 wordBuf[i] = SW_toupper(wordBuf[i]); +00330 +00331 <font class="comment">// get list of individual words</font> +00332 words = (<font class="keywordtype">char</font> **)calloc(<font class="keyword">sizeof</font>(<font class="keywordtype">char</font> *), 10); +00333 <font class="keywordtype">int</font> allocWords = 10; +00334 words[wordCount] = strtok(wordBuf, <font class="stringliteral">" "</font>); +00335 <font class="keywordflow">while</font> (words[wordCount]) { +00336 wordCount++; +00337 <font class="keywordflow">if</font> (wordCount == allocWords) { +00338 allocWords+=10; +00339 words = (<font class="keywordtype">char</font> **)realloc(words, <font class="keyword">sizeof</font>(<font class="keywordtype">char</font> *)*allocWords); +00340 } +00341 words[wordCount] = strtok(NULL, <font class="stringliteral">" "</font>); +00342 } +00343 +00344 (*percent)(20, percentUserData); +00345 +00346 <font class="comment">// clear our result set</font> +00347 indexes.erase(indexes.begin(), indexes.end()); +00348 +00349 <font class="comment">// search both old and new testament indexes</font> +00350 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> j = 0; j < 2; j++) { +00351 <font class="comment">// iterate thru each word the user passed to us.</font> +00352 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> i = 0; i < wordCount; i++) { +00353 +00354 <font class="comment">// clear this word's result set</font> +00355 indexes2.erase(indexes2.begin(), indexes2.end()); +00356 error = 0; +00357 +00358 <font class="comment">// iterate thru every word in the database that starts</font> +00359 <font class="comment">// with our search word</font> +00360 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> away = 0; !error; away++) { +00361 idxbuf = 0; +00362 +00363 <font class="comment">// find our word in the database and jump ahead _away_</font> +00364 error = fastSearch[j]->findoffset(words[i], &start, &size, away); +00365 +00366 <font class="comment">// get the word from the database</font> +00367 fastSearch[j]->getidxbufdat(start, &idxbuf); +00368 +00369 <font class="comment">// check to see if it starts with our target word</font> +00370 <font class="keywordflow">if</font> (strlen(idxbuf) > strlen(words[i])) +00371 idxbuf[strlen(words[i])] = 0; +00372 <font class="comment">// else words[i][strlen(idxbuf)] = 0;</font> +00373 <font class="keywordflow">if</font> (!strcmp(idxbuf, words[i])) { +00374 +00375 <font class="comment">// get data for this word from database</font> +00376 free(idxbuf); +00377 idxbuf = (<font class="keywordtype">char</font> *)calloc(size+2, 1); +00378 datbuf = (<font class="keywordtype">char</font> *)calloc(size+2, 1); +00379 fastSearch[j]->gettext(start, size + 2, idxbuf, datbuf); +00380 +00381 <font class="comment">// we know that the data consists of sizof(long)</font> +00382 <font class="comment">// records each a valid module position that constains</font> +00383 <font class="comment">// this word</font> +00384 <font class="comment">//</font> +00385 <font class="comment">// iterate thru each of these module positions</font> +00386 <font class="keywordtype">long</font> *keyindex = (<font class="keywordtype">long</font> *)datbuf; +00387 <font class="keywordflow">while</font> (keyindex < (<font class="keywordtype">long</font> *)(datbuf + size - (strlen(idxbuf) + 1))) { +00388 <font class="keywordflow">if</font> (i) { <font class="comment">// if we're not on our first word</font> +00389 +00390 <font class="comment">// check to see if this word is already in the result set.</font> +00391 <font class="comment">// This is our AND functionality</font> +00392 <font class="keywordflow">if</font> (find(indexes.begin(), indexes.end(), *keyindex) != indexes.end()) +00393 <font class="comment">// add to new result set</font> +00394 indexes2.push_back(*keyindex); +00395 } +00396 <font class="keywordflow">else</font> indexes2.push_back(*keyindex); +00397 keyindex++; +00398 } +00399 free(datbuf); +00400 } +00401 <font class="keywordflow">else</font> error = 1; <font class="comment">// no more matches</font> +00402 free(idxbuf); +00403 } +00404 +00405 <font class="comment">// make new result set final result set</font> +00406 indexes = indexes2; +00407 +00408 percent((<font class="keywordtype">char</font>)(20 + (<font class="keywordtype">float</font>)((j*wordCount)+i)/(wordCount * 2) * 78), percentUserData); +00409 } +00410 +00411 <font class="comment">// indexes contains our good verses, lets return them in a listkey</font> +00412 indexes.sort(); +00413 +00414 <font class="comment">// iterate thru each good module position that meets the search</font> +00415 <font class="keywordflow">for</font> (list <long>::iterator it = indexes.begin(); it != indexes.end(); it++) { +00416 +00417 <font class="comment">// set a temporary verse key to this module position</font> +00418 vk.<a class="code" href="class_verse_key.html#a22">Testament</a>(j+1); +00419 vk.<a class="code" href="class_s_w_key.html#a6">Error</a>(); +00420 vk.<a class="code" href="class_verse_key.html#a34">Index</a>(*it); +00421 +00422 <font class="comment">// check scope</font> +00423 <font class="comment">// Try to set our scope key to this verse key</font> +00424 <font class="keywordflow">if</font> (scope) { +00425 *testKeyType = vk; +00426 +00427 <font class="comment">// check to see if it set ok and if so, add to our return list</font> +00428 <font class="keywordflow">if</font> (*testKeyType == vk) +00429 listkey << (<font class="keyword">const</font> <font class="keywordtype">char</font> *) vk; +00430 } +00431 <font class="keywordflow">else</font> listkey << (<font class="keyword">const</font> <font class="keywordtype">char</font>*) vk; +00432 } +00433 } +00434 (*percent)(98, percentUserData); +00435 +00436 free(words); +00437 free(wordBuf); +00438 +00439 *testKeyType = saveKey; <font class="comment">// set current place back to original</font> +00440 +00441 listkey = TOP; +00442 (*percent)(100, percentUserData); +00443 <font class="keywordflow">return</font> listkey; +00444 } +00445 +00446 <font class="keywordflow">default</font>: +00447 <font class="keywordflow">break</font>; +00448 } +00449 } +00450 +00451 <font class="comment">// check if we just want to see if search is supported</font> +00452 <font class="keywordflow">if</font> (justCheckIfSupported) { +00453 *justCheckIfSupported = <font class="keyword">false</font>; +00454 <font class="keywordflow">return</font> listkey; +00455 } +00456 +00457 <font class="comment">// if we don't support this search, fall back to base class</font> +00458 <font class="keywordflow">return</font> <a class="code" href="class_s_w_module.html#a22">SWModule::Search</a>(istr, searchType, flags, scope, justCheckIfSupported, percent, percentUserData); +00459 } +00460 +00461 <font class="preprocessor">#ifdef _MSC_VER</font> +00462 <font class="preprocessor"></font><a class="code" href="class_s_w_module.html">SWModule</a> &RawText::operator =(SW_POSITION p) { +00463 <font class="preprocessor">#else</font> +00464 <font class="preprocessor"></font>RawText &RawText::operator =(SW_POSITION p) { +00465 <font class="preprocessor">#endif</font> +00466 <font class="preprocessor"></font> <a class="code" href="class_s_w_module.html#a40">SWModule::operator =</a>(p); +00467 <font class="keywordflow">return</font> *<font class="keyword">this</font>; +00468 } +00469 +00470 <a class="code" href="class_s_w_module.html">SWModule</a> &RawText::setentry(<font class="keyword">const</font> <font class="keywordtype">char</font> *inbuf, <font class="keywordtype">long</font> len) { +00471 <a class="code" href="class_verse_key.html">VerseKey</a> *key = 0; +00472 <font class="comment">// see if we have a VerseKey * or decendant</font> +00473 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00474 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00475 <font class="preprocessor">#endif</font> +00476 <font class="preprocessor"></font> key = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, this->key); +00477 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00478 <font class="preprocessor"></font> } +00479 <font class="keywordflow">catch</font> ( ... ) {} +00480 <font class="preprocessor">#endif</font> +00481 <font class="preprocessor"></font> <font class="comment">// if we don't have a VerseKey * decendant, create our own</font> +00482 <font class="keywordflow">if</font> (!key) +00483 key = <font class="keyword">new</font> <a class="code" href="class_verse_key.html">VerseKey</a>(this->key); +00484 +00485 settext(key-><a class="code" href="class_verse_key.html#a22">Testament</a>(), key-><a class="code" href="class_verse_key.html#a34">Index</a>(), inbuf, len); +00486 +00487 <font class="keywordflow">if</font> (this->key != key) <font class="comment">// free our key if we created a VerseKey</font> +00488 <font class="keyword">delete</font> key; +00489 +00490 <font class="keywordflow">return</font> *<font class="keyword">this</font>; +00491 } +00492 +00493 <a class="code" href="class_s_w_module.html">SWModule</a> &RawText::operator <<(<font class="keyword">const</font> <font class="keywordtype">char</font> *inbuf) { +00494 <font class="keywordflow">return</font> setentry(inbuf, 0); +00495 } +00496 +00497 +00498 <a class="code" href="class_s_w_module.html">SWModule</a> &RawText::operator <<(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> *inkey) { +00499 <a class="code" href="class_verse_key.html">VerseKey</a> *destkey = 0; +00500 <font class="keyword">const</font> <a class="code" href="class_verse_key.html">VerseKey</a> *srckey = 0; +00501 <font class="comment">// see if we have a VerseKey * or decendant</font> +00502 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00503 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00504 <font class="preprocessor">#endif</font> +00505 <font class="preprocessor"></font> destkey = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, this->key); +00506 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00507 <font class="preprocessor"></font> } +00508 <font class="keywordflow">catch</font> ( ... ) {} +00509 <font class="preprocessor">#endif</font> +00510 <font class="preprocessor"></font> <font class="comment">// if we don't have a VerseKey * decendant, create our own</font> +00511 <font class="keywordflow">if</font> (!destkey) +00512 destkey = <font class="keyword">new</font> <a class="code" href="class_verse_key.html">VerseKey</a>(this->key); +00513 +00514 <font class="comment">// see if we have a VerseKey * or decendant</font> +00515 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00516 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00517 <font class="preprocessor">#endif</font> +00518 <font class="preprocessor"></font> srckey = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, inkey); +00519 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00520 <font class="preprocessor"></font> } +00521 <font class="keywordflow">catch</font> ( ... ) {} +00522 <font class="preprocessor">#endif</font> +00523 <font class="preprocessor"></font> <font class="comment">// if we don't have a VerseKey * decendant, create our own</font> +00524 <font class="keywordflow">if</font> (!srckey) +00525 srckey = <font class="keyword">new</font> <a class="code" href="class_verse_key.html">VerseKey</a>(inkey); +00526 +00527 linkentry(destkey-><a class="code" href="class_verse_key.html#a22">Testament</a>(), destkey-><a class="code" href="class_verse_key.html#a34">Index</a>(), srckey-><a class="code" href="class_verse_key.html#a34">Index</a>()); +00528 +00529 <font class="keywordflow">if</font> (this->key != destkey) <font class="comment">// free our key if we created a VerseKey</font> +00530 <font class="keyword">delete</font> destkey; +00531 +00532 <font class="keywordflow">if</font> (inkey != srckey) <font class="comment">// free our key if we created a VerseKey</font> +00533 <font class="keyword">delete</font> srckey; +00534 +00535 <font class="keywordflow">return</font> *<font class="keyword">this</font>; +00536 } +00537 +00538 +00539 <font class="comment">/******************************************************************************</font> +00540 <font class="comment"> * RawText::deleteEntry - deletes this entry</font> +00541 <font class="comment"> *</font> +00542 <font class="comment"> * RET: *this</font> +00543 <font class="comment"> */</font> +00544 +00545 <font class="keywordtype">void</font> RawText::deleteEntry() { +00546 +00547 <a class="code" href="class_verse_key.html">VerseKey</a> *key = 0; +00548 +00549 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00550 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00551 <font class="preprocessor">#endif</font> +00552 <font class="preprocessor"></font> key = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, this->key); +00553 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00554 <font class="preprocessor"></font> } +00555 <font class="keywordflow">catch</font> ( ... ) {} +00556 <font class="preprocessor">#endif</font> +00557 <font class="preprocessor"></font> <font class="keywordflow">if</font> (!key) +00558 key = <font class="keyword">new</font> <a class="code" href="class_verse_key.html">VerseKey</a>(this->key); +00559 +00560 settext(key-><a class="code" href="class_verse_key.html#a22">Testament</a>(), key-><a class="code" href="class_verse_key.html#a34">Index</a>(), <font class="stringliteral">""</font>); +00561 +00562 <font class="keywordflow">if</font> (key != this->key) +00563 <font class="keyword">delete</font> key; +00564 } +00565 +00566 <font class="comment">/******************************************************************************</font> +00567 <font class="comment"> * RawText::operator += - Increments module key a number of entries</font> +00568 <font class="comment"> *</font> +00569 <font class="comment"> * ENT: increment - Number of entries to jump forward</font> +00570 <font class="comment"> *</font> +00571 <font class="comment"> * RET: *this</font> +00572 <font class="comment"> */</font> +00573 +00574 <a class="code" href="class_s_w_module.html">SWModule</a> &RawText::operator +=(<font class="keywordtype">int</font> increment) +00575 { +00576 <font class="keywordtype">long</font> start; +00577 <font class="keywordtype">unsigned</font> <font class="keywordtype">short</font> size; +00578 <a class="code" href="class_verse_key.html">VerseKey</a> *tmpkey = 0; +00579 +00580 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00581 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00582 <font class="preprocessor">#endif</font> +00583 <font class="preprocessor"></font> tmpkey = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, key); +00584 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00585 <font class="preprocessor"></font> } +00586 <font class="keywordflow">catch</font> ( ... ) {} +00587 <font class="preprocessor">#endif</font> +00588 <font class="preprocessor"></font> <font class="keywordflow">if</font> (!tmpkey) +00589 tmpkey = <font class="keyword">new</font> <a class="code" href="class_verse_key.html">VerseKey</a>(key); +00590 +00591 findoffset(tmpkey-><a class="code" href="class_verse_key.html#a22">Testament</a>(), tmpkey-><a class="code" href="class_verse_key.html#a34">Index</a>(), &start, &size); +00592 +00593 <a class="code" href="class_s_w_key.html">SWKey</a> lastgood = *tmpkey; +00594 <font class="keywordflow">while</font> (increment) { +00595 <font class="keywordtype">long</font> laststart = start; +00596 <font class="keywordtype">unsigned</font> <font class="keywordtype">short</font> lastsize = size; +00597 <a class="code" href="class_s_w_key.html">SWKey</a> lasttry = *tmpkey; +00598 (increment > 0) ? (*key)++ : (*key)--; +00599 <font class="keywordflow">if</font> (tmpkey != key) +00600 <font class="keyword">delete</font> tmpkey; +00601 tmpkey = 0; +00602 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00603 <font class="preprocessor"></font> <font class="keywordflow">try</font> { +00604 <font class="preprocessor">#endif</font> +00605 <font class="preprocessor"></font> tmpkey = SWDYNAMIC_CAST(<a class="code" href="class_verse_key.html">VerseKey</a>, key); +00606 <font class="preprocessor">#ifndef _WIN32_WCE</font> +00607 <font class="preprocessor"></font> } +00608 <font class="keywordflow">catch</font> ( ... ) {} +00609 <font class="preprocessor">#endif</font> +00610 <font class="preprocessor"></font> <font class="keywordflow">if</font> (!tmpkey) +00611 tmpkey = <font class="keyword">new</font> <a class="code" href="class_verse_key.html">VerseKey</a>(key); +00612 +00613 <font class="keywordflow">if</font> ((error = key->Error())) { +00614 *key = lastgood; +00615 <font class="keywordflow">break</font>; +00616 } +00617 <font class="keywordtype">long</font> index = tmpkey-><a class="code" href="class_s_w_key.html#a17">Index</a>(); +00618 findoffset(tmpkey->Testament(), index, &start, &size); +00619 <font class="keywordflow">if</font> ((((laststart != start) || (lastsize != size))||(!skipConsecutiveLinks)) && (start >= 0) && (size)) { +00620 increment += (increment < 0) ? 1 : -1; +00621 lastgood = *tmpkey; +00622 } +00623 } +00624 error = (error) ? KEYERR_OUTOFBOUNDS : 0; +00625 +00626 <font class="keywordflow">if</font> (tmpkey != key) +00627 <font class="keyword">delete</font> tmpkey; +00628 +00629 <font class="keywordflow">return</font> *<font class="keyword">this</font>; +00630 } +</pre></div><hr><address align="right"><small>Generated on Thu Jun 20 22:13:00 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> |