<!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>