aboutsummaryrefslogtreecommitdiffstats
path: root/doc/api-documentation/html/zstr_8cpp-source.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/api-documentation/html/zstr_8cpp-source.html')
-rw-r--r--doc/api-documentation/html/zstr_8cpp-source.html719
1 files changed, 719 insertions, 0 deletions
diff --git a/doc/api-documentation/html/zstr_8cpp-source.html b/doc/api-documentation/html/zstr_8cpp-source.html
new file mode 100644
index 0000000..6366986
--- /dev/null
+++ b/doc/api-documentation/html/zstr_8cpp-source.html
@@ -0,0 +1,719 @@
+<!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>zstr.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> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </center>
+<hr><h1>zstr.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/******************************************************************************</font>
+00002 <font class="comment"> * zstr.cpp - code for class 'zStr'- a module that reads compressed text</font>
+00003 <font class="comment"> * files and provides lookup and parsing functions based on</font>
+00004 <font class="comment"> * class StrKey</font>
+00005 <font class="comment"> */</font>
+00006
+00007 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
+00008 <font class="preprocessor">#include &lt;fcntl.h&gt;</font>
+00009 <font class="preprocessor">#include &lt;errno.h&gt;</font>
+00010
+00011 <font class="preprocessor">#ifndef __GNUC__</font>
+00012 <font class="preprocessor"></font><font class="preprocessor">#include &lt;io.h&gt;</font>
+00013 <font class="preprocessor">#else</font>
+00014 <font class="preprocessor"></font><font class="preprocessor">#include &lt;unistd.h&gt;</font>
+00015 <font class="preprocessor">#endif</font>
+00016 <font class="preprocessor"></font>
+00017 <font class="preprocessor">#include &lt;string.h&gt;</font>
+00018 <font class="preprocessor">#include &lt;stdlib.h&gt;</font>
+00019 <font class="preprocessor">#include &lt;utilfuns.h&gt;</font>
+00020 <font class="preprocessor">#include &lt;zstr.h&gt;</font>
+00021 <font class="preprocessor">#include &lt;swcomprs.h&gt;</font>
+00022
+00023 <font class="preprocessor">#include &lt;sysdata.h&gt;</font>
+00024 <font class="preprocessor">#include &lt;entriesblk.h&gt;</font>
+00025
+00026 <font class="comment">/******************************************************************************</font>
+00027 <font class="comment"> * zStr Statics</font>
+00028 <font class="comment"> */</font>
+00029
+00030 <font class="keywordtype">int</font> zStr::instance = 0;
+00031 <font class="keyword">const</font> <font class="keywordtype">int</font> zStr::IDXENTRYSIZE = 8;
+00032 <font class="keyword">const</font> <font class="keywordtype">int</font> zStr::ZDXENTRYSIZE = 8;
+00033
+00034
+00035 <font class="comment">/******************************************************************************</font>
+00036 <font class="comment"> * zStr Constructor - Initializes data for instance of zStr</font>
+00037 <font class="comment"> *</font>
+00038 <font class="comment"> * ENT: ipath - path of the directory where data and index files are located.</font>
+00039 <font class="comment"> */</font>
+00040
+00041 zStr::zStr(<font class="keyword">const</font> <font class="keywordtype">char</font> *ipath, <font class="keywordtype">int</font> fileMode, <font class="keywordtype">long</font> blockCount, SWCompress *icomp) {
+00042 <font class="keywordtype">char</font> buf[127];
+00043
+00044 nl = <font class="charliteral">'\n'</font>;
+00045 lastoff = -1;
+00046 path = 0;
+00047 stdstr(&amp;path, ipath);
+00048
+00049 compressor = (icomp) ? icomp : <font class="keyword">new</font> SWCompress();
+00050 this-&gt;blockCount = blockCount;
+00051 <font class="preprocessor">#ifndef O_BINARY // O_BINARY is needed in Borland C++ 4.53</font>
+00052 <font class="preprocessor"></font><font class="preprocessor">#define O_BINARY 0 // If it hasn't been defined than we probably</font>
+00053 <font class="preprocessor"></font><font class="preprocessor">#endif // don't need it.</font>
+00054 <font class="preprocessor"></font>
+00055 <font class="keywordflow">if</font> (fileMode == -1) { <font class="comment">// try read/write if possible</font>
+00056 fileMode = O_RDWR;
+00057 }
+00058
+00059 sprintf(buf, <font class="stringliteral">"%s.idx"</font>, path);
+00060 idxfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>);
+00061
+00062 sprintf(buf, <font class="stringliteral">"%s.dat"</font>, path);
+00063 datfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>);
+00064
+00065 sprintf(buf, <font class="stringliteral">"%s.zdx"</font>, path);
+00066 zdxfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>);
+00067
+00068 sprintf(buf, <font class="stringliteral">"%s.zdt"</font>, path);
+00069 zdtfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>);
+00070
+00071 <font class="keywordflow">if</font> (datfd &lt;= 0) {
+00072 sprintf(buf, <font class="stringliteral">"Error: %d"</font>, errno);
+00073 perror(buf);
+00074 }
+00075
+00076 cacheBlock = 0;
+00077 cacheBlockIndex = -1;
+00078 cacheDirty = <font class="keyword">false</font>;
+00079
+00080 <a class="code" href="class_verse_key.html#r3">instance</a>++;
+00081 }
+00082
+00083
+00084 <font class="comment">/******************************************************************************</font>
+00085 <font class="comment"> * zStr Destructor - Cleans up instance of zStr</font>
+00086 <font class="comment"> */</font>
+00087
+00088 zStr::~zStr() {
+00089
+00090 flushCache();
+00091
+00092 <font class="keywordflow">if</font> (path)
+00093 <font class="keyword">delete</font> [] path;
+00094
+00095 --<a class="code" href="class_verse_key.html#r3">instance</a>;
+00096
+00097 FileMgr::systemFileMgr.close(idxfd);
+00098 FileMgr::systemFileMgr.close(datfd);
+00099 FileMgr::systemFileMgr.close(zdxfd);
+00100 FileMgr::systemFileMgr.close(zdtfd);
+00101
+00102
+00103 <font class="keywordflow">if</font> (compressor)
+00104 <font class="keyword">delete</font> compressor;
+00105
+00106 }
+00107
+00108
+00109 <font class="comment">/******************************************************************************</font>
+00110 <font class="comment"> * zStr::getidxbufdat - Gets the index string at the given dat offset</font>
+00111 <font class="comment"> * NOTE: buf is calloc'd, or if not null, realloc'd and must</font>
+00112 <font class="comment"> * be free'd by calling function</font>
+00113 <font class="comment"> *</font>
+00114 <font class="comment"> * ENT: ioffset - offset in dat file to lookup</font>
+00115 <font class="comment"> * buf - address of pointer to allocate for storage of string</font>
+00116 <font class="comment"> */</font>
+00117
+00118 <font class="keywordtype">void</font> zStr::getKeyFromDatOffset(<font class="keywordtype">long</font> ioffset, <font class="keywordtype">char</font> **buf) {
+00119 <font class="keywordtype">int</font> size;
+00120 <font class="keywordtype">char</font> ch;
+00121 <font class="keywordflow">if</font> (datfd &gt; 0) {
+00122 lseek(datfd-&gt;getFd(), ioffset, SEEK_SET);
+00123 <font class="keywordflow">for</font> (size = 0; read(datfd-&gt;getFd(), &amp;ch, 1) == 1; size++) {
+00124 <font class="keywordflow">if</font> ((ch == <font class="charliteral">'\\'</font>) || (ch == 10) || (ch == 13))
+00125 <font class="keywordflow">break</font>;
+00126 }
+00127 *buf = (*buf) ? (<font class="keywordtype">char</font> *)realloc(*buf, size + 1) : (char *)malloc(size + 1);
+00128 <font class="keywordflow">if</font> (size) {
+00129 lseek(datfd-&gt;getFd(), ioffset, SEEK_SET);
+00130 read(datfd-&gt;getFd(), *buf, size);
+00131 }
+00132 (*buf)[size] = 0;
+00133 <font class="keywordflow">for</font> (size--; size &gt; 0; size--)
+00134 (*buf)[size] = SW_toupper((*buf)[size]);
+00135 }
+00136 <font class="keywordflow">else</font> {
+00137 *buf = (*buf) ? (<font class="keywordtype">char</font> *)realloc(*buf, 1) : (char *)malloc(1);
+00138 **buf = 0;
+00139 }
+00140 }
+00141
+00142
+00143 <font class="comment">/******************************************************************************</font>
+00144 <font class="comment"> * zStr::getidxbuf - Gets the index string at the given idx offset</font>
+00145 <font class="comment"> * NOTE: buf is calloc'd, or if not null, realloc'd</font>
+00146 <font class="comment"> * and must be freed by calling function</font>
+00147 <font class="comment"> *</font>
+00148 <font class="comment"> * ENT: ioffset - offset in idx file to lookup</font>
+00149 <font class="comment"> * buf - address of pointer to allocate for storage of string</font>
+00150 <font class="comment"> */</font>
+00151
+00152 <font class="keywordtype">void</font> zStr::getKeyFromIdxOffset(<font class="keywordtype">long</font> ioffset, <font class="keywordtype">char</font> **buf) {
+00153 __u32 offset;
+00154
+00155 <font class="keywordflow">if</font> (idxfd &gt; 0) {
+00156 lseek(idxfd-&gt;getFd(), ioffset, SEEK_SET);
+00157 read(idxfd-&gt;getFd(), &amp;offset, <font class="keyword">sizeof</font>(__u32));
+00158 offset = swordtoarch32(offset);
+00159 getKeyFromDatOffset(offset, buf);
+00160 }
+00161 }
+00162
+00163
+00164 <font class="comment">/******************************************************************************</font>
+00165 <font class="comment"> * zStr::findoffset - Finds the offset of the key string from the indexes</font>
+00166 <font class="comment"> *</font>
+00167 <font class="comment"> * ENT: key - key string to lookup</font>
+00168 <font class="comment"> * offset - address to store the starting offset</font>
+00169 <font class="comment"> * size - address to store the size of the entry</font>
+00170 <font class="comment"> * away - number of entries before of after to jump</font>
+00171 <font class="comment"> * (default = 0)</font>
+00172 <font class="comment"> *</font>
+00173 <font class="comment"> * RET: error status</font>
+00174 <font class="comment"> */</font>
+00175
+00176 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> zStr::findKeyIndex(<font class="keyword">const</font> <font class="keywordtype">char</font> *ikey, <font class="keywordtype">long</font> *idxoff, <font class="keywordtype">long</font> away) {
+00177 <font class="keywordtype">char</font> *trybuf = 0, *key = 0, quitflag = 0;
+00178 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> retval = 0;
+00179 __s32 headoff, tailoff, tryoff = 0, maxoff = 0;
+00180 __u32 start, size;
+00181
+00182 <font class="keywordflow">if</font> (idxfd-&gt;getFd() &gt;= 0) {
+00183 tailoff = maxoff = lseek(idxfd-&gt;getFd(), 0, SEEK_END) - IDXENTRYSIZE;
+00184 <font class="keywordflow">if</font> (*ikey) {
+00185 headoff = 0;
+00186 stdstr(&amp;key, ikey);
+00187 toupperstr(key);
+00188
+00189 <font class="keywordflow">while</font> (headoff &lt; tailoff) {
+00190 tryoff = (lastoff == -1) ? headoff + (((((tailoff / IDXENTRYSIZE) - (headoff / IDXENTRYSIZE))) / 2) * IDXENTRYSIZE) : lastoff;
+00191 lastoff = -1;
+00192
+00193 getKeyFromIdxOffset(tryoff, &amp;trybuf);
+00194
+00195 <font class="keywordflow">if</font> (!*trybuf &amp;&amp; tryoff) { <font class="comment">// In case of extra entry at end of idx (not first entry)</font>
+00196 tryoff += (tryoff &gt; (maxoff / 2))?-IDXENTRYSIZE:IDXENTRYSIZE;
+00197 retval = -1;
+00198 <font class="keywordflow">break</font>;
+00199 }
+00200
+00201 <font class="keywordtype">int</font> diff = strcmp(key, trybuf);
+00202 <font class="keywordflow">if</font> (!diff)
+00203 <font class="keywordflow">break</font>;
+00204
+00205 <font class="keywordflow">if</font> (diff &lt; 0)
+00206 tailoff = (tryoff == headoff) ? headoff : tryoff;
+00207 <font class="keywordflow">else</font> headoff = tryoff;
+00208 <font class="keywordflow">if</font> (tailoff == headoff + IDXENTRYSIZE) {
+00209 <font class="keywordflow">if</font> (quitflag++)
+00210 headoff = tailoff;
+00211 }
+00212 }
+00213 <font class="keywordflow">if</font> (headoff &gt;= tailoff)
+00214 tryoff = headoff;
+00215 <font class="keywordflow">if</font> (trybuf)
+00216 free(trybuf);
+00217 <font class="keyword">delete</font> [] key;
+00218 }
+00219 <font class="keywordflow">else</font> { tryoff = 0; }
+00220
+00221 lseek(idxfd-&gt;getFd(), tryoff, SEEK_SET);
+00222
+00223 start = size = 0;
+00224 retval = (read(idxfd-&gt;getFd(), &amp;start, <font class="keyword">sizeof</font>(__u32))==<font class="keyword">sizeof</font>(__u32)) ? retval : -1;
+00225 retval = (read(idxfd-&gt;getFd(), &amp;size, <font class="keyword">sizeof</font>(__u32))==<font class="keyword">sizeof</font>(__u32)) ? retval : -1;
+00226 start = swordtoarch32(start);
+00227 size = swordtoarch32(size);
+00228
+00229 <font class="keywordflow">if</font> (idxoff)
+00230 *idxoff = tryoff;
+00231
+00232 <font class="keywordflow">while</font> (away) {
+00233 __u32 laststart = start;
+00234 __u32 lastsize = size;
+00235 __s32 lasttry = tryoff;
+00236 tryoff += (away &gt; 0) ? IDXENTRYSIZE : -IDXENTRYSIZE;
+00237
+00238 <font class="keywordtype">bool</font> bad = <font class="keyword">false</font>;
+00239 <font class="keywordflow">if</font> (((long)(tryoff + (away*IDXENTRYSIZE)) &lt; -IDXENTRYSIZE) || (tryoff + (away*IDXENTRYSIZE) &gt; (maxoff+IDXENTRYSIZE)))
+00240 bad = <font class="keyword">true</font>;
+00241 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (lseek(idxfd-&gt;getFd(), tryoff, SEEK_SET) &lt; 0)
+00242 bad = <font class="keyword">true</font>;
+00243 <font class="keywordflow">if</font> (bad) {
+00244 retval = -1;
+00245 start = laststart;
+00246 size = lastsize;
+00247 tryoff = lasttry;
+00248 <font class="keywordflow">if</font> (idxoff)
+00249 *idxoff = tryoff;
+00250 <font class="keywordflow">break</font>;
+00251 }
+00252 read(idxfd-&gt;getFd(), &amp;start, <font class="keyword">sizeof</font>(__u32));
+00253 read(idxfd-&gt;getFd(), &amp;size, <font class="keyword">sizeof</font>(__u32));
+00254 start = swordtoarch32(start);
+00255 size = swordtoarch32(size);
+00256
+00257 <font class="keywordflow">if</font> (idxoff)
+00258 *idxoff = tryoff;
+00259
+00260
+00261 <font class="keywordflow">if</font> (((laststart != start) || (lastsize != size)) &amp;&amp; (start &gt;= 0) &amp;&amp; (size))
+00262 away += (away &lt; 0) ? 1 : -1;
+00263 }
+00264
+00265 lastoff = tryoff;
+00266 }
+00267 <font class="keywordflow">else</font> {
+00268 <font class="keywordflow">if</font> (idxoff)
+00269 *idxoff = 0;
+00270 retval = -1;
+00271 }
+00272 <font class="keywordflow">return</font> retval;
+00273 }
+00274
+00275
+00276 <font class="comment">/******************************************************************************</font>
+00277 <font class="comment"> * zStr::preptext - Prepares the text before returning it to external</font>
+00278 <font class="comment"> * objects</font>
+00279 <font class="comment"> *</font>
+00280 <font class="comment"> * ENT: buf - buffer where text is stored and where to store the prep'd</font>
+00281 <font class="comment"> * text.</font>
+00282 <font class="comment"> */</font>
+00283
+00284 <font class="keywordtype">void</font> zStr::prepText(<font class="keywordtype">char</font> *buf) {
+00285 <font class="keywordtype">char</font> *to, *from, space = 0, cr = 0, realdata = 0, nlcnt = 0;
+00286
+00287 <font class="keywordflow">for</font> (to = from = buf; *from; from++) {
+00288 <font class="keywordflow">switch</font> (*from) {
+00289 <font class="keywordflow">case</font> 10:
+00290 <font class="keywordflow">if</font> (!realdata)
+00291 <font class="keywordflow">continue</font>;
+00292 space = (cr) ? 0 : 1;
+00293 cr = 0;
+00294 nlcnt++;
+00295 <font class="keywordflow">if</font> (nlcnt &gt; 1) {
+00296 <font class="comment">// *to++ = nl;</font>
+00297 *to++ = nl;
+00298 <font class="comment">// nlcnt = 0;</font>
+00299 }
+00300 <font class="keywordflow">continue</font>;
+00301 <font class="keywordflow">case</font> 13:
+00302 <font class="keywordflow">if</font> (!realdata)
+00303 <font class="keywordflow">continue</font>;
+00304 *to++ = nl;
+00305 space = 0;
+00306 cr = 1;
+00307 <font class="keywordflow">continue</font>;
+00308 }
+00309 realdata = 1;
+00310 nlcnt = 0;
+00311 <font class="keywordflow">if</font> (space) {
+00312 space = 0;
+00313 <font class="keywordflow">if</font> (*from != <font class="charliteral">' '</font>) {
+00314 *to++ = <font class="charliteral">' '</font>;
+00315 from--;
+00316 <font class="keywordflow">continue</font>;
+00317 }
+00318 }
+00319 *to++ = *from;
+00320 }
+00321 *to = 0;
+00322
+00323 <font class="keywordflow">while</font> (to &gt; (buf+1)) { <font class="comment">// remove trailing excess</font>
+00324 to--;
+00325 <font class="keywordflow">if</font> ((*to == 10) || (*to == <font class="charliteral">' '</font>))
+00326 *to = 0;
+00327 <font class="keywordflow">else</font> <font class="keywordflow">break</font>;
+00328 }
+00329 }
+00330
+00331
+00332 <font class="comment">/******************************************************************************</font>
+00333 <font class="comment"> * zStr::gettext - gets text at a given offset</font>
+00334 <font class="comment"> *</font>
+00335 <font class="comment"> * ENT:</font>
+00336 <font class="comment"> * offset - idxoffset where the key is located.</font>
+00337 <font class="comment"> * buf - buffer to store text</font>
+00338 <font class="comment"> * idxbuf - buffer to store index key</font>
+00339 <font class="comment"> * NOTE: buffer will be alloc'd / realloc'd and </font>
+00340 <font class="comment"> * should be free'd by the client</font>
+00341 <font class="comment"> *</font>
+00342 <font class="comment"> */</font>
+00343
+00344 <font class="keywordtype">void</font> zStr::getText(<font class="keywordtype">long</font> offset, <font class="keywordtype">char</font> **idxbuf, <font class="keywordtype">char</font> **buf) {
+00345 <font class="keywordtype">char</font> *ch;
+00346 <font class="keywordtype">char</font> *idxbuflocal = 0;
+00347 getKeyFromIdxOffset(offset, &amp;idxbuflocal);
+00348 __u32 start;
+00349 __u32 size;
+00350
+00351 <font class="keywordflow">do</font> {
+00352 lseek(idxfd-&gt;getFd(), offset, SEEK_SET);
+00353 read(idxfd-&gt;getFd(), &amp;start, <font class="keyword">sizeof</font>(__u32));
+00354 read(idxfd-&gt;getFd(), &amp;size, <font class="keyword">sizeof</font>(__u32));
+00355 start = swordtoarch32(start);
+00356 size = swordtoarch32(size);
+00357
+00358 *buf = (*buf) ? (<font class="keywordtype">char</font> *)realloc(*buf, size + 1) : (char *)malloc(size + 1);
+00359 *idxbuf = (*idxbuf) ? (<font class="keywordtype">char</font> *)realloc(*idxbuf, size + 1) : (char *)malloc(size + 1);
+00360 memset(*buf, 0, size + 1);
+00361 memset(*idxbuf, 0, size + 1);
+00362 lseek(datfd-&gt;getFd(), start, SEEK_SET);
+00363 read(datfd-&gt;getFd(), *buf, (int)(size));
+00364
+00365 <font class="keywordflow">for</font> (ch = *buf; *ch; ch++) { <font class="comment">// skip over index string</font>
+00366 <font class="keywordflow">if</font> (*ch == 10) {
+00367 ch++;
+00368 <font class="keywordflow">break</font>;
+00369 }
+00370 }
+00371 memmove(*buf, ch, size - (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>)(ch-*buf));
+00372
+00373 <font class="comment">// resolve link</font>
+00374 <font class="keywordflow">if</font> (!strncmp(*buf, <font class="stringliteral">"@LINK"</font>, 5)) {
+00375 <font class="keywordflow">for</font> (ch = *buf; *ch; ch++) { <font class="comment">// null before nl</font>
+00376 <font class="keywordflow">if</font> (*ch == 10) {
+00377 *ch = 0;
+00378 <font class="keywordflow">break</font>;
+00379 }
+00380 }
+00381 findKeyIndex(*buf + IDXENTRYSIZE, &amp;offset);
+00382 }
+00383 <font class="keywordflow">else</font> <font class="keywordflow">break</font>;
+00384 }
+00385 <font class="keywordflow">while</font> (true); <font class="comment">// while we're resolving links</font>
+00386
+00387 <font class="keywordflow">if</font> (idxbuflocal) {
+00388 __u32 localsize = strlen(idxbuflocal);
+00389 localsize = (localsize &lt; (size - 1)) ? localsize : (size - 1);
+00390 strncpy(*idxbuf, idxbuflocal, localsize);
+00391 (*idxbuf)[localsize] = 0;
+00392 free(idxbuflocal);
+00393 }
+00394 __u32 block = 0;
+00395 __u32 entry = 0;
+00396 memmove(&amp;block, *buf, <font class="keyword">sizeof</font>(__u32));
+00397 memmove(&amp;entry, *buf + <font class="keyword">sizeof</font>(__u32), <font class="keyword">sizeof</font>(__u32));
+00398 block = swordtoarch32(block);
+00399 entry = swordtoarch32(entry);
+00400 getCompressedText(block, entry, buf);
+00401 }
+00402
+00403
+00404 <font class="comment">/******************************************************************************</font>
+00405 <font class="comment"> * zStr::getCompressedText - Get text entry from a compressed index / zdata</font>
+00406 <font class="comment"> * file.</font>
+00407 <font class="comment"> */</font>
+00408
+00409 <font class="keywordtype">void</font> zStr::getCompressedText(<font class="keywordtype">long</font> block, <font class="keywordtype">long</font> entry, <font class="keywordtype">char</font> **buf) {
+00410
+00411 __u32 size = 0;
+00412
+00413 <font class="keywordflow">if</font> (cacheBlockIndex != block) {
+00414 __u32 start = 0;
+00415
+00416 lseek(zdxfd-&gt;getFd(), block * ZDXENTRYSIZE, SEEK_SET);
+00417 read(zdxfd-&gt;getFd(), &amp;start, <font class="keyword">sizeof</font>(__u32));
+00418 read(zdxfd-&gt;getFd(), &amp;size, <font class="keyword">sizeof</font>(__u32));
+00419 start = swordtoarch32(start);
+00420 size = swordtoarch32(size);
+00421
+00422 *buf = (*buf) ? (<font class="keywordtype">char</font> *)realloc(*buf, size + 1) : (char *)malloc(size + 1);
+00423
+00424 lseek(zdtfd-&gt;getFd(), start, SEEK_SET);
+00425 read(zdtfd-&gt;getFd(), *buf, size);
+00426
+00427 flushCache();
+00428
+00429 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> len = size;
+00430 compressor-&gt;zBuf(&amp;len, *buf);
+00431 <font class="keywordtype">char</font> * rawBuf = compressor-&gt;Buf(0, &amp;len);
+00432 cacheBlock = <font class="keyword">new</font> EntriesBlock(rawBuf, len);
+00433 cacheBlockIndex = block;
+00434 }
+00435 size = cacheBlock-&gt;getEntrySize(entry);
+00436 *buf = (*buf) ? (<font class="keywordtype">char</font> *)realloc(*buf, size + 1) : (char *)malloc(size + 1);
+00437 strcpy(*buf, cacheBlock-&gt;getEntry(entry));
+00438 }
+00439
+00440
+00441 <font class="comment">/******************************************************************************</font>
+00442 <font class="comment"> * zLD::settext - Sets text for current offset</font>
+00443 <font class="comment"> *</font>
+00444 <font class="comment"> * ENT: key - key for this entry</font>
+00445 <font class="comment"> * buf - buffer to store</font>
+00446 <font class="comment"> * len - length of buffer (0 - null terminated)</font>
+00447 <font class="comment"> */</font>
+00448
+00449 <font class="keywordtype">void</font> zStr::setText(<font class="keyword">const</font> <font class="keywordtype">char</font> *ikey, <font class="keyword">const</font> <font class="keywordtype">char</font> *buf, <font class="keywordtype">long</font> len) {
+00450
+00451 __u32 start, outstart;
+00452 __u32 size, outsize;
+00453 __s32 endoff;
+00454 <font class="keywordtype">long</font> idxoff = 0;
+00455 __s32 shiftSize;
+00456 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font> nl[] = {13, 10};
+00457 <font class="keywordtype">char</font> *tmpbuf = 0;
+00458 <font class="keywordtype">char</font> *key = 0;
+00459 <font class="keywordtype">char</font> *dbKey = 0;
+00460 <font class="keywordtype">char</font> *idxBytes = 0;
+00461 <font class="keywordtype">char</font> *outbuf = 0;
+00462 <font class="keywordtype">char</font> *ch = 0;
+00463
+00464 stdstr(&amp;key, ikey);
+00465 toupperstr(key);
+00466
+00467 <font class="keywordtype">char</font> notFound = findKeyIndex(ikey, &amp;idxoff, 0);
+00468 <font class="keywordflow">if</font> (!notFound) {
+00469 getKeyFromIdxOffset(idxoff, &amp;dbKey);
+00470 <font class="keywordtype">int</font> diff = strcmp(key, dbKey);
+00471 <font class="keywordflow">if</font> (diff &lt; 0) {
+00472 }
+00473 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (diff &gt; 0) {
+00474 idxoff += IDXENTRYSIZE;
+00475 }
+00476 <font class="keywordflow">else</font> <font class="keywordflow">if</font> ((!diff) &amp;&amp; (len || strlen(buf) <font class="comment">/*we're not deleting*/</font>)) { <font class="comment">// got absolute entry</font>
+00477 <font class="keywordflow">do</font> {
+00478 lseek(idxfd-&gt;getFd(), idxoff, SEEK_SET);
+00479 read(idxfd-&gt;getFd(), &amp;start, <font class="keyword">sizeof</font>(__u32));
+00480 read(idxfd-&gt;getFd(), &amp;size, <font class="keyword">sizeof</font>(__u32));
+00481 start = swordtoarch32(start);
+00482 size = swordtoarch32(size);
+00483
+00484 tmpbuf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ size + 2 ];
+00485 memset(tmpbuf, 0, size + 2);
+00486 lseek(datfd-&gt;getFd(), start, SEEK_SET);
+00487 read(datfd-&gt;getFd(), tmpbuf, size);
+00488
+00489 <font class="keywordflow">for</font> (ch = tmpbuf; *ch; ch++) { <font class="comment">// skip over index string</font>
+00490 <font class="keywordflow">if</font> (*ch == 10) {
+00491 ch++;
+00492 <font class="keywordflow">break</font>;
+00493 }
+00494 }
+00495 memmove(tmpbuf, ch, size - (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>)(ch-tmpbuf));
+00496
+00497 <font class="comment">// resolve link</font>
+00498 <font class="keywordflow">if</font> (!strncmp(tmpbuf, <font class="stringliteral">"@LINK"</font>, 5) &amp;&amp; (len ? len : strlen(buf))) {
+00499 <font class="keywordflow">for</font> (ch = tmpbuf; *ch; ch++) { <font class="comment">// null before nl</font>
+00500 <font class="keywordflow">if</font> (*ch == 10) {
+00501 *ch = 0;
+00502 <font class="keywordflow">break</font>;
+00503 }
+00504 }
+00505 findKeyIndex(tmpbuf + IDXENTRYSIZE, &amp;idxoff);
+00506 <font class="keyword">delete</font> [] tmpbuf;
+00507 }
+00508 <font class="keywordflow">else</font> <font class="keywordflow">break</font>;
+00509 }
+00510 <font class="keywordflow">while</font> (true); <font class="comment">// while we're resolving links</font>
+00511 }
+00512 }
+00513
+00514 endoff = lseek(idxfd-&gt;getFd(), 0, SEEK_END);
+00515
+00516 shiftSize = endoff - idxoff;
+00517
+00518 <font class="keywordflow">if</font> (shiftSize &gt; 0) {
+00519 idxBytes = <font class="keyword">new</font> <font class="keywordtype">char</font> [ shiftSize ];
+00520 lseek(idxfd-&gt;getFd(), idxoff, SEEK_SET);
+00521 read(idxfd-&gt;getFd(), idxBytes, shiftSize);
+00522 }
+00523
+00524 outbuf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ (len ? len : strlen(buf)) + strlen(key) + 5 ];
+00525 sprintf(outbuf, <font class="stringliteral">"%s%c%c"</font>, key, 13, 10);
+00526 size = strlen(outbuf);
+00527 <font class="keywordflow">if</font> (len ? len : strlen(buf)) { <font class="comment">// NOT a link</font>
+00528 <font class="keywordflow">if</font> (!cacheBlock) {
+00529 flushCache();
+00530 cacheBlock = <font class="keyword">new</font> EntriesBlock();
+00531 cacheBlockIndex = (lseek(zdxfd-&gt;getFd(), 0, SEEK_END) / ZDXENTRYSIZE);
+00532 }
+00533 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (cacheBlock-&gt;getCount() &gt;= blockCount) {
+00534 flushCache();
+00535 cacheBlock = <font class="keyword">new</font> EntriesBlock();
+00536 cacheBlockIndex = (lseek(zdxfd-&gt;getFd(), 0, SEEK_END) / ZDXENTRYSIZE);
+00537 }
+00538 __u32 entry = cacheBlock-&gt;addEntry(buf);
+00539 cacheDirty = <font class="keyword">true</font>;
+00540 outstart = archtosword32(cacheBlockIndex);
+00541 outsize = archtosword32(entry);
+00542 memcpy (outbuf + size, &amp;outstart, <font class="keyword">sizeof</font>(__u32));
+00543 memcpy (outbuf + size + <font class="keyword">sizeof</font>(__u32), &amp;outsize, <font class="keyword">sizeof</font>(__u32));
+00544 size += (<font class="keyword">sizeof</font>(__u32) * 2);
+00545 }
+00546 <font class="keywordflow">else</font> { <font class="comment">// link</font>
+00547 memcpy(outbuf + size, buf, len ? len : strlen(buf));
+00548 size += (len ? len : strlen(buf));
+00549 }
+00550
+00551 start = lseek(datfd-&gt;getFd(), 0, SEEK_END);
+00552
+00553 outstart = archtosword32(start);
+00554 outsize = archtosword32(size);
+00555
+00556 lseek(idxfd-&gt;getFd(), idxoff, SEEK_SET);
+00557 <font class="keywordflow">if</font> (len ? len : strlen(buf)) {
+00558 lseek(datfd-&gt;getFd(), start, SEEK_SET);
+00559 write(datfd-&gt;getFd(), outbuf, size);
+00560
+00561 <font class="comment">// add a new line to make data file easier to read in an editor</font>
+00562 write(datfd-&gt;getFd(), &amp;nl, 2);
+00563
+00564 write(idxfd-&gt;getFd(), &amp;outstart, <font class="keyword">sizeof</font>(__u32));
+00565 write(idxfd-&gt;getFd(), &amp;outsize, <font class="keyword">sizeof</font>(__u32));
+00566 <font class="keywordflow">if</font> (idxBytes) {
+00567 write(idxfd-&gt;getFd(), idxBytes, shiftSize);
+00568 }
+00569 }
+00570 <font class="keywordflow">else</font> { <font class="comment">// delete entry</font>
+00571 <font class="keywordflow">if</font> (idxBytes) {
+00572 write(idxfd-&gt;getFd(), idxBytes+IDXENTRYSIZE, shiftSize-IDXENTRYSIZE);
+00573 lseek(idxfd-&gt;getFd(), -1, SEEK_CUR); <font class="comment">// last valid byte</font>
+00574 FileMgr::systemFileMgr.trunc(idxfd); <font class="comment">// truncate index</font>
+00575 }
+00576 }
+00577
+00578 <font class="keywordflow">if</font> (idxBytes)
+00579 <font class="keyword">delete</font> [] idxBytes;
+00580 <font class="keyword">delete</font> [] key;
+00581 <font class="keyword">delete</font> [] outbuf;
+00582 free(dbKey);
+00583 }
+00584
+00585
+00586 <font class="comment">/******************************************************************************</font>
+00587 <font class="comment"> * zLD::linkentry - links one entry to another</font>
+00588 <font class="comment"> *</font>
+00589 <font class="comment"> * ENT: testmt - testament to find (0 - Bible/module introduction)</font>
+00590 <font class="comment"> * destidxoff - dest offset into .vss</font>
+00591 <font class="comment"> * srcidxoff - source offset into .vss</font>
+00592 <font class="comment"> */</font>
+00593
+00594 <font class="keywordtype">void</font> zStr::linkEntry(<font class="keyword">const</font> <font class="keywordtype">char</font> *destkey, <font class="keyword">const</font> <font class="keywordtype">char</font> *srckey) {
+00595 <font class="keywordtype">char</font> *text = <font class="keyword">new</font> <font class="keywordtype">char</font> [ strlen(destkey) + 7 ];
+00596 sprintf(text, <font class="stringliteral">"@LINK %s"</font>, destkey);
+00597 <a class="code" href="class_verse_key.html#a13">setText</a>(srckey, text);
+00598 <font class="keyword">delete</font> [] text;
+00599 }
+00600
+00601
+00602 <font class="keywordtype">void</font> zStr::flushCache() {
+00603 <font class="keywordflow">if</font> (cacheBlock) {
+00604 <font class="keywordflow">if</font> (cacheDirty) {
+00605 __u32 start = 0;
+00606 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> size = 0;
+00607 __u32 outstart = 0, outsize = 0;
+00608
+00609 <font class="keyword">const</font> <font class="keywordtype">char</font> *rawBuf = cacheBlock-&gt;getRawData(&amp;size);
+00610 compressor-&gt;Buf(rawBuf, &amp;size);
+00611 compressor-&gt;zBuf(&amp;size);
+00612
+00613 <font class="keywordtype">long</font> zdxSize = lseek(zdxfd-&gt;getFd(), 0, SEEK_END);
+00614 <font class="keywordtype">long</font> zdtSize = lseek(zdtfd-&gt;getFd(), 0, SEEK_END);
+00615
+00616 <font class="keywordflow">if</font> ((cacheBlockIndex * ZDXENTRYSIZE) &gt; (zdxSize - ZDXENTRYSIZE)) { <font class="comment">// New Block</font>
+00617 start = zdtSize;
+00618 }
+00619 <font class="keywordflow">else</font> {
+00620 lseek(zdxfd-&gt;getFd(), cacheBlockIndex * ZDXENTRYSIZE, SEEK_SET);
+00621 read(zdxfd-&gt;getFd(), &amp;start, <font class="keyword">sizeof</font>(__u32));
+00622 read(zdxfd-&gt;getFd(), &amp;outsize, <font class="keyword">sizeof</font>(__u32));
+00623 start = swordtoarch32(start);
+00624 outsize = swordtoarch32(outsize);
+00625 <font class="keywordflow">if</font> (start + outsize &gt;= zdtSize) { <font class="comment">// last entry, just overwrite</font>
+00626 <font class="comment">// start is already set</font>
+00627 }
+00628 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (size &lt; outsize) { <font class="comment">// middle entry, but smaller, that's fine and let's preserve bigger size</font>
+00629 size = outsize;
+00630 }
+00631 <font class="keywordflow">else</font> { <font class="comment">// middle and bigger-- we have serious problems, for now let's put it at the end = lots of wasted space</font>
+00632 start = zdtSize;
+00633 }
+00634 }
+00635
+00636
+00637
+00638 outstart = archtosword32(start);
+00639 outsize = archtosword32((__u32)size);
+00640
+00641 lseek(zdxfd-&gt;getFd(), cacheBlockIndex * ZDXENTRYSIZE, SEEK_SET);
+00642 lseek(zdtfd-&gt;getFd(), start, SEEK_SET);
+00643 rawBuf = compressor-&gt;zBuf(&amp;size);
+00644 write(zdtfd-&gt;getFd(), rawBuf, size);
+00645
+00646 <font class="comment">// add a new line to make data file easier to read in an editor</font>
+00647 write(zdtfd-&gt;getFd(), &amp;nl, 2);
+00648
+00649 write(zdxfd-&gt;getFd(), &amp;outstart, <font class="keyword">sizeof</font>(__u32));
+00650 write(zdxfd-&gt;getFd(), &amp;outsize, <font class="keyword">sizeof</font>(__u32));
+00651
+00652 <font class="keyword">delete</font> cacheBlock;
+00653 }
+00654 }
+00655 cacheBlockIndex = -1;
+00656 cacheBlock = 0;
+00657 cacheDirty = <font class="keyword">false</font>;
+00658 }
+00659
+00660
+00661 <font class="comment">/******************************************************************************</font>
+00662 <font class="comment"> * zLD::CreateModule - Creates new module files</font>
+00663 <font class="comment"> *</font>
+00664 <font class="comment"> * ENT: path - directory to store module files</font>
+00665 <font class="comment"> * RET: error status</font>
+00666 <font class="comment"> */</font>
+00667
+00668 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> zStr::createModule(<font class="keyword">const</font> <font class="keywordtype">char</font> *ipath) {
+00669 <font class="keywordtype">char</font> *path = 0;
+00670 <font class="keywordtype">char</font> *buf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ strlen (ipath) + 20 ];
+00671 FileDesc *fd, *fd2;
+00672
+00673 stdstr(&amp;path, ipath);
+00674
+00675 <font class="keywordflow">if</font> ((path[strlen(path)-1] == <font class="charliteral">'/'</font>) || (path[strlen(path)-1] == <font class="charliteral">'\\'</font>))
+00676 path[strlen(path)-1] = 0;
+00677
+00678 sprintf(buf, <font class="stringliteral">"%s.dat"</font>, path);
+00679 unlink(buf);
+00680 fd = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
+00681 fd-&gt;getFd();
+00682 FileMgr::systemFileMgr.close(fd);
+00683
+00684 sprintf(buf, <font class="stringliteral">"%s.idx"</font>, path);
+00685 unlink(buf);
+00686 fd2 = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
+00687 fd2-&gt;getFd();
+00688 FileMgr::systemFileMgr.close(fd2);
+00689
+00690 sprintf(buf, <font class="stringliteral">"%s.zdt"</font>, path);
+00691 unlink(buf);
+00692 fd2 = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
+00693 fd2-&gt;getFd();
+00694 FileMgr::systemFileMgr.close(fd2);
+00695
+00696 sprintf(buf, <font class="stringliteral">"%s.zdx"</font>, path);
+00697 unlink(buf);
+00698 fd2 = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
+00699 fd2-&gt;getFd();
+00700 FileMgr::systemFileMgr.close(fd2);
+00701
+00702 <font class="keyword">delete</font> [] path;
+00703
+00704 <font class="keywordflow">return</font> 0;
+00705 }
+</pre></div><hr><address align="right"><small>Generated on Thu Jun 20 22:13:01 2002 for The Sword Project by
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border=0
+width=110 height=53></a>1.2.15 </small></address>
+</body>
+</html>