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