<!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>treekeyidx.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>treekeyidx.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/******************************************************************************</font>
00002 <font class="comment"> * versekey.h - code for class 'versekey'- a standard Biblical verse key</font>
00003 <font class="comment"> *</font>
00004 <font class="comment"> * $Id: treekeyidx_8cpp-source.html,v 1.3 2002/06/20 20:23:10 mgruner Exp $</font>
00005 <font class="comment"> *</font>
00006 <font class="comment"> * Copyright 1998 CrossWire Bible Society (http://www.crosswire.org)</font>
00007 <font class="comment"> * CrossWire Bible Society</font>
00008 <font class="comment"> * P. O. Box 2528</font>
00009 <font class="comment"> * Tempe, AZ 85280-2528</font>
00010 <font class="comment"> *</font>
00011 <font class="comment"> * This program is free software; you can redistribute it and/or modify it</font>
00012 <font class="comment"> * under the terms of the GNU General Public License as published by the</font>
00013 <font class="comment"> * Free Software Foundation version 2.</font>
00014 <font class="comment"> *</font>
00015 <font class="comment"> * This program is distributed in the hope that it will be useful, but</font>
00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font>
00018 <font class="comment"> * General Public License for more details.</font>
00019 <font class="comment"> *</font>
00020 <font class="comment"> */</font>
00021
00022
00023 <font class="preprocessor">#include <treekeyidx.h></font>
00024 <font class="preprocessor">#include <fcntl.h></font>
00025 <font class="preprocessor">#include <stdio.h></font>
00026 <font class="preprocessor">#include <errno.h></font>
00027 <font class="preprocessor">#include <string></font>
00028
00029 <font class="preprocessor">#ifndef __GNUC__</font>
00030 <font class="preprocessor"></font><font class="preprocessor">#include <io.h></font>
00031 <font class="preprocessor">#else</font>
00032 <font class="preprocessor"></font><font class="preprocessor">#include <unistd.h></font>
00033 <font class="preprocessor">#endif</font>
00034 <font class="preprocessor"></font>
00035 <font class="keyword">using</font> <font class="keyword">namespace </font>std;
00036 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font> nl = <font class="charliteral">'\n'</font>;
00037 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font> *classes[] = {<font class="stringliteral">"TreeKeyIdx"</font>, <font class="stringliteral">"TreeKey"</font>, <font class="stringliteral">"SWKey"</font>, <font class="stringliteral">"SWObject"</font>, 0};
00038 <a class="code" href="class_s_w_class.html">SWClass</a> TreeKeyIdx::classdef(classes);
00039
00040
00041 TreeKeyIdx::TreeKeyIdx(<font class="keyword">const</font> <a class="code" href="class_tree_key_idx.html">TreeKeyIdx</a> &ikey) : currentNode() {
00042 init();
00043 path = 0;
00044 idxfd = 0;
00045 datfd = 0;
00046 <a class="code" href="class_s_w_key.html#a8">copyFrom</a>(ikey);
00047 }
00048
00049 TreeKeyIdx::TreeKeyIdx(<font class="keyword">const</font> <font class="keywordtype">char</font> *idxPath, <font class="keywordtype">int</font> fileMode) : currentNode() {
00050 <font class="keywordtype">char</font> buf[127];
00051
00052 init();
00053 path = 0;
00054 stdstr(&path, idxPath);
00055
00056 <font class="preprocessor">#ifndef O_BINARY // O_BINARY is needed in Borland C++ 4.53</font>
00057 <font class="preprocessor"></font><font class="preprocessor">#define O_BINARY 0 // If it hasn't been defined than we probably</font>
00058 <font class="preprocessor"></font><font class="preprocessor">#endif // don't need it.</font>
00059 <font class="preprocessor"></font>
00060 <font class="keywordflow">if</font> (fileMode == -1) { <font class="comment">// try read/write if possible</font>
00061 fileMode = O_RDWR;
00062 }
00063
00064 sprintf(buf, <font class="stringliteral">"%s.idx"</font>, path);
00065 idxfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>);
00066 sprintf(buf, <font class="stringliteral">"%s.dat"</font>, path);
00067 datfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>);
00068
00069 <font class="keywordflow">if</font> (datfd <= 0) {
00070 sprintf(buf, <font class="stringliteral">"Error: %d"</font>, errno);
00071 perror(buf);
00072 error = errno;
00073 }
00074 <font class="keywordflow">else</font> {
00075 root();
00076 }
00077 }
00078
00079
00080 <font class="keywordtype">void</font> TreeKeyIdx::init() {
00081 myclass = &classdef;
00082 }
00083
00084
00085 TreeKeyIdx::~TreeKeyIdx () {
00086 <font class="keywordflow">if</font> (path)
00087 <font class="keyword">delete</font> [] path;
00088
00089 FileMgr::systemFileMgr.close(idxfd);
00090 FileMgr::systemFileMgr.close(datfd);
00091 }
00092
00093
00094 <font class="keyword">const</font> <font class="keywordtype">char</font> *TreeKeyIdx::getLocalName() {
00095 <font class="keywordflow">return</font> currentNode.name;
00096 }
00097
00098
00099 <font class="keyword">const</font> <font class="keywordtype">char</font> *TreeKeyIdx::getUserData(<font class="keywordtype">int</font> *size) {
00100 <font class="keywordflow">if</font> (size)
00101 *size = (int)currentNode.dsize;
00102 <font class="keywordflow">return</font> currentNode.userData;
00103 }
00104
00105
00106 <font class="keywordtype">void</font> TreeKeyIdx::setUserData(<font class="keyword">const</font> <font class="keywordtype">char</font> *userData, <font class="keywordtype">int</font> size) {
00107 <font class="keywordflow">if</font> (currentNode.userData)
00108 <font class="keyword">delete</font> currentNode.userData;
00109
00110 <font class="keywordflow">if</font> (!size)
00111 size = strlen(userData) + 1;
00112
00113 currentNode.userData = <font class="keyword">new</font> <font class="keywordtype">char</font> [ size ];
00114 memcpy(currentNode.userData, userData, size);
00115 currentNode.dsize = size;
00116 }
00117
00118 <font class="keyword">const</font> <font class="keywordtype">char</font> *TreeKeyIdx::setLocalName(<font class="keyword">const</font> <font class="keywordtype">char</font> *newName) {
00119 stdstr(&(currentNode.name), newName);
00120 <font class="keywordflow">return</font> currentNode.name;
00121 }
00122
00123
00124 <font class="keywordtype">void</font> TreeKeyIdx::save() {
00125 saveTreeNode(&currentNode);
00126 }
00127
00128
00129 <font class="keyword">const</font> <font class="keywordtype">char</font> *TreeKeyIdx::getFullName()<font class="keyword"> const </font>{
00130 TreeNode parent;
00131 <font class="keyword">static</font> string fullPath;
00132 fullPath = currentNode.name;
00133 parent.parent = currentNode.parent;
00134 <font class="keywordflow">while</font> (parent.parent > -1) {
00135 getTreeNodeFromIdxOffset(parent.parent, &parent);
00136 fullPath = ((string)parent.name) + (string) <font class="stringliteral">"/"</font> + fullPath;
00137 }
00138 <font class="keywordflow">return</font> fullPath.c_str();
00139 }
00140
00141
00142 <font class="keywordtype">void</font> TreeKeyIdx::root() {
00143 error = getTreeNodeFromIdxOffset(0, &currentNode);
00144 }
00145
00146
00147 <font class="keywordtype">bool</font> TreeKeyIdx::parent() {
00148 <font class="keywordflow">if</font> (currentNode.parent > -1) {
00149 error = getTreeNodeFromIdxOffset(currentNode.parent, &currentNode);
00150 <font class="keywordflow">return</font> <font class="keyword">true</font>;
00151 }
00152 <font class="keywordflow">return</font> <font class="keyword">false</font>;
00153 }
00154
00155
00156 <font class="keywordtype">bool</font> TreeKeyIdx::firstChild() {
00157 <font class="keywordflow">if</font> (currentNode.firstChild > -1) {
00158 error = getTreeNodeFromIdxOffset(currentNode.firstChild, &currentNode);
00159 <font class="keywordflow">return</font> <font class="keyword">true</font>;
00160 }
00161 <font class="keywordflow">return</font> <font class="keyword">false</font>;
00162 }
00163
00164
00165 <font class="keywordtype">bool</font> TreeKeyIdx::nextSibling() {
00166 <font class="keywordflow">if</font> (currentNode.next > -1) {
00167 error = getTreeNodeFromIdxOffset(currentNode.next, &currentNode);
00168 <font class="keywordflow">return</font> <font class="keyword">true</font>;
00169 }
00170 <font class="keywordflow">return</font> <font class="keyword">false</font>;
00171 }
00172
00173
00174 <font class="keywordtype">bool</font> TreeKeyIdx::previousSibling() {
00175 TreeNode iterator;
00176 __u32 target = currentNode.offset;
00177 <font class="keywordflow">if</font> (currentNode.parent > -1) {
00178 getTreeNodeFromIdxOffset(currentNode.parent, &iterator);
00179 getTreeNodeFromIdxOffset(iterator.firstChild, &iterator);
00180 <font class="keywordflow">if</font> (iterator.offset != target) {
00181 <font class="keywordflow">while</font> ((iterator.next != target) && (iterator.next > -1))
00182 getTreeNodeFromIdxOffset(iterator.next, &iterator);
00183 <font class="keywordflow">if</font> (iterator.next > -1) {
00184 error = getTreeNodeFromIdxOffset(iterator.offset, &currentNode);
00185 <font class="keywordflow">return</font> <font class="keyword">true</font>;
00186 }
00187 }
00188 }
00189 <font class="keywordflow">return</font> <font class="keyword">false</font>;
00190 }
00191
00192
00193 <font class="keywordtype">bool</font> TreeKeyIdx::hasChildren() {
00194 <font class="keywordflow">return</font> (currentNode.firstChild > -1);
00195 }
00196
00197
00198 <font class="keywordtype">void</font> TreeKeyIdx::append() {
00199 TreeNode lastSib;
00200 <font class="keywordflow">if</font> (currentNode.offset) {
00201 getTreeNodeFromIdxOffset(currentNode.offset, &lastSib);
00202 <font class="keywordflow">while</font> (lastSib.next > -1) {
00203 getTreeNodeFromIdxOffset(lastSib.next, &lastSib);
00204 }
00205 __u32 idxOffset = lseek(idxfd->getFd(), 0, SEEK_END);
00206 lastSib.next = idxOffset;
00207 saveTreeNodeOffsets(&lastSib);
00208 __u32 parent = currentNode.parent;
00209 currentNode.clear();
00210 currentNode.offset = idxOffset;
00211 currentNode.parent = parent;
00212 }
00213 }
00214
00215
00216 <font class="keywordtype">void</font> TreeKeyIdx::appendChild() {
00217 <font class="keywordflow">if</font> (firstChild()) {
00218 append();
00219 }
00220 <font class="keywordflow">else</font> {
00221 __u32 idxOffset = lseek(idxfd->getFd(), 0, SEEK_END);
00222 currentNode.firstChild = idxOffset;
00223 saveTreeNodeOffsets(&currentNode);
00224 __u32 parent = currentNode.offset;
00225 currentNode.clear();
00226 currentNode.offset = idxOffset;
00227 currentNode.parent = parent;
00228 }
00229 }
00230
00231
00232 <font class="keywordtype">void</font> TreeKeyIdx::insertBefore() {
00233 }
00234
00235
00236 <font class="keywordtype">void</font> TreeKeyIdx::remove() {
00237 }
00238
00239
00240 <font class="comment">/******************************************************************************</font>
00241 <font class="comment"> * TreeKeyIdx::Create - Creates new key idx/dat files</font>
00242 <font class="comment"> *</font>
00243 <font class="comment"> * ENT: path - directory to store module files</font>
00244 <font class="comment"> * RET: error status</font>
00245 <font class="comment"> */</font>
00246
00247 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> TreeKeyIdx::create(<font class="keyword">const</font> <font class="keywordtype">char</font> *ipath) {
00248 <font class="keywordtype">char</font> *path = 0;
00249 <font class="keywordtype">char</font> *buf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ strlen (ipath) + 20 ];
00250 FileDesc *fd, *fd2;
00251
00252 stdstr(&path, ipath);
00253
00254 <font class="keywordflow">if</font> ((path[strlen(path)-1] == <font class="charliteral">'/'</font>) || (path[strlen(path)-1] == <font class="charliteral">'\\'</font>))
00255 path[strlen(path)-1] = 0;
00256
00257 sprintf(buf, <font class="stringliteral">"%s.dat"</font>, path);
00258 unlink(buf);
00259 fd = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
00260 fd->getFd();
00261 FileMgr::systemFileMgr.close(fd);
00262
00263 sprintf(buf, <font class="stringliteral">"%s.idx"</font>, path);
00264 unlink(buf);
00265 fd2 = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
00266 fd2->getFd();
00267 FileMgr::systemFileMgr.close(fd2);
00268
00269 <a class="code" href="class_tree_key_idx.html">TreeKeyIdx</a> newTree(path);
00270 TreeKeyIdx::TreeNode root;
00271 stdstr(&(root.name), <font class="stringliteral">""</font>);
00272 newTree.<a class="code" href="class_tree_key_idx.html#c2">saveTreeNode</a>(&root);
00273
00274 <font class="keyword">delete</font> [] path;
00275
00276 <font class="keywordflow">return</font> 0;
00277 }
00278
00279
00280 <font class="comment">/******************************************************************************</font>
00281 <font class="comment"> * zStr::getidxbufdat - Gets the index string at the given dat offset</font>
00282 <font class="comment"> * NOTE: buf is calloc'd, or if not null, realloc'd and must</font>
00283 <font class="comment"> * be free'd by calling function</font>
00284 <font class="comment"> *</font>
00285 <font class="comment"> * ENT: ioffset - offset in dat file to lookup</font>
00286 <font class="comment"> * node - address of pointer to allocate for storage of string</font>
00287 <font class="comment"> */</font>
00288
00289 <font class="keywordtype">void</font> TreeKeyIdx::getTreeNodeFromDatOffset(<font class="keywordtype">long</font> ioffset, TreeNode *node)<font class="keyword"> const </font>{
00290 <font class="keywordtype">char</font> ch;
00291 __s32 tmp;
00292 __u16 tmp2;
00293
00294 <font class="keywordflow">if</font> (datfd > 0) {
00295
00296 lseek(datfd->getFd(), ioffset, SEEK_SET);
00297
00298 read(datfd->getFd(), &tmp, 4);
00299 node->parent = swordtoarch32(tmp);
00300
00301 read(datfd->getFd(), &tmp, 4);
00302 node->next = swordtoarch32(tmp);
00303
00304 read(datfd->getFd(), &tmp, 4);
00305 node->firstChild = swordtoarch32(tmp);
00306
00307 string name;
00308 <font class="keywordflow">do</font> {
00309 read(datfd->getFd(), &ch, 1);
00310 name += ch;
00311 } <font class="keywordflow">while</font> (ch);
00312
00313 stdstr(&(node->name), name.c_str());
00314
00315 read(datfd->getFd(), &tmp2, 2);
00316 node->dsize = swordtoarch16(tmp2);
00317
00318 <font class="keywordflow">if</font> (node->dsize) {
00319 <font class="keywordflow">if</font> (node->userData)
00320 <font class="keyword">delete</font> [] node->userData;
00321 node->userData = <font class="keyword">new</font> <font class="keywordtype">char</font> [node->dsize];
00322 read(datfd->getFd(), node->userData, node->dsize);
00323 }
00324 }
00325 }
00326
00327
00328 <font class="comment">/******************************************************************************</font>
00329 <font class="comment"> * zStr::getidxbuf - Gets the index string at the given idx offset</font>
00330 <font class="comment"> * NOTE: buf is calloc'd, or if not null, realloc'd</font>
00331 <font class="comment"> * and must be freed by calling function</font>
00332 <font class="comment"> *</font>
00333 <font class="comment"> * ENT: ioffset - offset in idx file to lookup</font>
00334 <font class="comment"> * buf - address of pointer to allocate for storage of string</font>
00335 <font class="comment"> */</font>
00336
00337 <font class="keywordtype">char</font> TreeKeyIdx::getTreeNodeFromIdxOffset(<font class="keywordtype">long</font> ioffset, TreeNode *node)<font class="keyword"> const </font>{
00338 __u32 offset;
00339 <font class="keywordtype">char</font> error = 0;
00340
00341 <font class="keywordflow">if</font> (ioffset < 0) {
00342 ioffset = 0;
00343 error = KEYERR_OUTOFBOUNDS;
00344 }
00345
00346 node->offset = ioffset;
00347 <font class="keywordflow">if</font> (idxfd > 0) {
00348 lseek(idxfd->getFd(), ioffset, SEEK_SET);
00349 <font class="keywordflow">if</font> (read(idxfd->getFd(), &offset, 4) == 4) {
00350 offset = swordtoarch32(offset);
00351 getTreeNodeFromDatOffset(offset, node);
00352 }
00353 <font class="keywordflow">else</font> {
00354 lseek(idxfd->getFd(), -4, SEEK_END);
00355 <font class="keywordflow">if</font> (read(idxfd->getFd(), &offset, 4) == 4) {
00356 offset = swordtoarch32(offset);
00357 getTreeNodeFromDatOffset(offset, node);
00358 }
00359 error = KEYERR_OUTOFBOUNDS;
00360 }
00361 }
00362 <font class="keywordflow">return</font> error;
00363 }
00364
00365
00366 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> TreeKeyIdx::getOffset()<font class="keyword"> const </font>{
00367 <font class="keywordflow">return</font> currentNode.offset;
00368 }
00369
00370 <font class="keywordtype">void</font> TreeKeyIdx::setOffset(<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> offset) {
00371 error = getTreeNodeFromIdxOffset(offset, &currentNode);
00372 }
00373
00374
00375 <font class="keywordtype">void</font> TreeKeyIdx::saveTreeNodeOffsets(TreeNode *node) {
00376 <font class="keywordtype">long</font> datOffset = 0;
00377 __s32 tmp;
00378
00379 <font class="keywordflow">if</font> (idxfd > 0) {
00380 lseek(idxfd->getFd(), node->offset, SEEK_SET);
00381 <font class="keywordflow">if</font> (read(idxfd->getFd(), &tmp, 4) != 4) {
00382 datOffset = lseek(datfd->getFd(), 0, SEEK_END);
00383 tmp = archtosword32(datOffset);
00384 write(idxfd->getFd(), &tmp, 4);
00385 }
00386 <font class="keywordflow">else</font> {
00387 datOffset = swordtoarch32(tmp);
00388 lseek(datfd->getFd(), datOffset, SEEK_SET);
00389 }
00390
00391 tmp = archtosword32(node->parent);
00392 write(datfd->getFd(), &tmp, 4);
00393
00394 tmp = archtosword32(node->next);
00395 write(datfd->getFd(), &tmp, 4);
00396
00397 tmp = archtosword32(node->firstChild);
00398 write(datfd->getFd(), &tmp, 4);
00399 }
00400 }
00401
00402
00403 <font class="keywordtype">void</font> <a class="code" href="class_tree_key_idx.html#a20">TreeKeyIdx::copyFrom</a>(<font class="keyword">const</font> <a class="code" href="class_tree_key_idx.html">TreeKeyIdx</a> &ikey) {
00404
00405 <a class="code" href="class_s_w_key.html#a8">SWKey::copyFrom</a>(ikey);
00406
00407 currentNode.offset = ikey.<a class="code" href="class_tree_key_idx.html#o0">currentNode</a>.offset;
00408 currentNode.parent = ikey.<a class="code" href="class_tree_key_idx.html#o0">currentNode</a>.parent;
00409 currentNode.next = ikey.<a class="code" href="class_tree_key_idx.html#o0">currentNode</a>.next;
00410 currentNode.firstChild = ikey.<a class="code" href="class_tree_key_idx.html#o0">currentNode</a>.firstChild;
00411 stdstr(&(currentNode.name), ikey.<a class="code" href="class_tree_key_idx.html#o0">currentNode</a>.name);
00412 currentNode.dsize = ikey.<a class="code" href="class_tree_key_idx.html#o0">currentNode</a>.dsize;
00413
00414 <font class="keywordflow">if</font> (currentNode.userData)
00415 <font class="keyword">delete</font> [] currentNode.userData;
00416 <font class="keywordflow">if</font> (currentNode.dsize) {
00417 currentNode.userData = <font class="keyword">new</font> <font class="keywordtype">char</font> [ currentNode.dsize ];
00418 memcpy(currentNode.userData, ikey.<a class="code" href="class_tree_key_idx.html#o0">currentNode</a>.userData, currentNode.dsize);
00419 }
00420 <font class="keywordflow">else</font> currentNode.userData = 0;
00421
00422 <font class="keywordtype">bool</font> newFiles = <font class="keyword">true</font>;
00423
00424 <font class="keywordflow">if</font> (path && ikey.<a class="code" href="class_tree_key_idx.html#o1">path</a>)
00425 newFiles = strcmp(path, ikey.<a class="code" href="class_tree_key_idx.html#o1">path</a>);
00426
00427 <font class="keywordflow">if</font> (newFiles) {
00428 stdstr(&path, ikey.<a class="code" href="class_tree_key_idx.html#o1">path</a>);
00429
00430 <font class="keywordflow">if</font> (idxfd) {
00431 FileMgr::systemFileMgr.close(idxfd);
00432 FileMgr::systemFileMgr.close(datfd);
00433 }
00434 idxfd = FileMgr::systemFileMgr.open(ikey.<a class="code" href="class_tree_key_idx.html#o2">idxfd</a>->path, ikey.<a class="code" href="class_tree_key_idx.html#o2">idxfd</a>->mode, ikey.<a class="code" href="class_tree_key_idx.html#o2">idxfd</a>->perms);
00435 datfd = FileMgr::systemFileMgr.open(ikey.<a class="code" href="class_tree_key_idx.html#o3">datfd</a>->path, ikey.<a class="code" href="class_tree_key_idx.html#o3">datfd</a>->mode, ikey.<a class="code" href="class_tree_key_idx.html#o3">datfd</a>->perms);
00436 }
00437 }
00438
00439
00440 <font class="keywordtype">void</font> TreeKeyIdx::saveTreeNode(TreeNode *node) {
00441 <font class="keywordtype">long</font> datOffset = 0;
00442 __s32 tmp;
00443 <font class="keywordflow">if</font> (idxfd > 0) {
00444
00445 lseek(idxfd->getFd(), node->offset, SEEK_SET);
00446 datOffset = lseek(datfd->getFd(), 0, SEEK_END);
00447 tmp = archtosword32(datOffset);
00448 write(idxfd->getFd(), &tmp, 4);
00449
00450 saveTreeNodeOffsets(node);
00451
00452 write(datfd->getFd(), node->name, strlen(node->name));
00453 <font class="keywordtype">char</font> null = 0;
00454 write(datfd->getFd(), &null, 1);
00455
00456 __u16 tmp2 = archtosword16(node->dsize);
00457 write(datfd->getFd(), &tmp2, 2);
00458
00459 <font class="keywordflow">if</font> (node->dsize) {
00460 write(datfd->getFd(), node->userData, node->dsize);
00461 }
00462 }
00463 }
00464
00465
<a name="l00466"></a><a class="code" href="class_tree_key_idx.html#a24">00466</a> <font class="keywordtype">void</font> <a class="code" href="class_tree_key_idx.html#a24">TreeKeyIdx::setText</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *ikey) {
00467 <font class="keywordtype">char</font> *buf = 0;
00468 stdstr(&buf, ikey);
00469 <font class="keywordtype">char</font> *leaf = strtok(buf, <font class="stringliteral">"/"</font>);
00470 root();
00471 <font class="keywordflow">while</font> ((leaf) && (!<a class="code" href="class_s_w_key.html#a6">Error</a>())) {
00472 <font class="keywordtype">bool</font> ok, inChild = <font class="keyword">false</font>;
00473 <font class="keywordflow">for</font> (ok = firstChild(); ok; ok = nextSibling()) {
00474 inChild = <font class="keyword">true</font>;
00475 <font class="keywordflow">if</font> (!stricmp(leaf, getLocalName()))
00476 <font class="keywordflow">break</font>;
00477 }
00478 leaf = strtok(0, <font class="stringliteral">"/"</font>);
00479 <font class="keywordflow">if</font> (!ok) {
00480 <font class="keywordflow">if</font> (inChild) { <font class="comment">// if we didn't find a matching child node, default to first child</font>
00481 parent();
00482 firstChild();
00483 }
00484 <font class="keywordflow">if</font> (leaf)
00485 error = KEYERR_OUTOFBOUNDS;
00486 <font class="keywordflow">break</font>;
00487 }
00488 }
00489 <font class="keyword">delete</font> [] buf;
00490 }
00491
00492
00493
<a name="l00494"></a><a class="code" href="class_tree_key_idx.html#a20">00494</a> <font class="keywordtype">void</font> <a class="code" href="class_tree_key_idx.html#a20">TreeKeyIdx::copyFrom</a>(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> &ikey) {
00495 <a class="code" href="class_s_w_key.html#a8">SWKey::copyFrom</a>(ikey);
00496 }
00497
00498 <font class="keywordtype">void</font> TreeKeyIdx::setPosition(SW_POSITION p) {
00499 <font class="keywordflow">switch</font> (p) {
00500 <font class="keywordflow">case</font> POS_TOP:
00501 root();
00502 <font class="keywordflow">break</font>;
00503 <font class="keywordflow">case</font> POS_BOTTOM:
00504 error = getTreeNodeFromIdxOffset(lseek(idxfd->getFd(), -4, SEEK_END), &currentNode);
00505 <font class="keywordflow">break</font>;
00506 }
00507 <a class="code" href="class_s_w_key.html#a6">Error</a>(); <font class="comment">// clear error from normalize</font>
00508 }
00509
<a name="l00510"></a><a class="code" href="class_tree_key_idx.html#a26">00510</a> <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="class_tree_key_idx.html#a26">TreeKeyIdx::getText</a>()<font class="keyword"> const </font>{
00511 <font class="keywordflow">return</font> getFullName();
00512 }
00513
00514
00515 <font class="keywordtype">int</font> TreeKeyIdx::_compare (<font class="keyword">const</font> <a class="code" href="class_tree_key_idx.html">TreeKeyIdx</a> & ikey) {
00516 <font class="keywordflow">return</font> (getOffset() - ikey.<a class="code" href="class_tree_key_idx.html#a23">getOffset</a>());
00517 }
00518
00519
<a name="l00520"></a><a class="code" href="class_tree_key_idx.html#a28">00520</a> <font class="keywordtype">int</font> <a class="code" href="class_tree_key_idx.html#a28">TreeKeyIdx::compare</a>(<font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> &ikey) {
00521 <a class="code" href="class_tree_key_idx.html">TreeKeyIdx</a> *treeKey = SWDYNAMIC_CAST(<a class="code" href="class_tree_key_idx.html">TreeKeyIdx</a>, (&ikey));
00522 <font class="keywordflow">if</font> (treeKey)
00523 <font class="keywordflow">return</font> _compare(*treeKey);
00524 <font class="keywordflow">return</font> <a class="code" href="class_s_w_key.html#a11">SWKey::compare</a>(ikey);
00525 }
00526
00527
<a name="l00528"></a><a class="code" href="class_tree_key_idx.html#a29">00528</a> <font class="keywordtype">void</font> <a class="code" href="class_tree_key_idx.html#a29">TreeKeyIdx::decrement</a>(<font class="keywordtype">int</font> steps) {
00529 error = getTreeNodeFromIdxOffset(currentNode.offset - (4*steps), &currentNode);
00530 }
00531
<a name="l00532"></a><a class="code" href="class_tree_key_idx.html#a30">00532</a> <font class="keywordtype">void</font> <a class="code" href="class_tree_key_idx.html#a30">TreeKeyIdx::increment</a>(<font class="keywordtype">int</font> steps) {
00533 error = getTreeNodeFromIdxOffset(currentNode.offset + (4*steps), &currentNode);
00534
00535 <font class="comment">/*</font>
00536 <font class="comment"> // assert positive</font>
00537 <font class="comment"> if (steps < 0) {</font>
00538 <font class="comment"> decrement(steps * -1);</font>
00539 <font class="comment"> return;</font>
00540 <font class="comment"> }</font>
00541 <font class="comment"></font>
00542 <font class="comment"> while (steps > 0) {</font>
00543 <font class="comment"> if (!firstChild()) {</font>
00544 <font class="comment"> if (!nextSibbling() {</font>
00545 <font class="comment"> error = KEYERR_OUTOFBOUNDS;</font>
00546 <font class="comment"> return;</font>
00547 <font class="comment"> }</font>
00548 <font class="comment"> }</font>
00549 <font class="comment"> steps--;</font>
00550 <font class="comment"> }</font>
00551 <font class="comment">*/</font>
00552 }
00553
00554
00555
00556 TreeKeyIdx::TreeNode::TreeNode() {
00557
00558 name = 0;
00559 stdstr(&name, <font class="stringliteral">""</font>);
00560 userData = 0;
00561
00562 clear();
00563 }
00564
00565
00566 <font class="keywordtype">void</font> TreeKeyIdx::TreeNode::clear() {
00567 offset = 0;
00568 parent = -1;
00569 next = -1;
00570 firstChild = -1;
00571 dsize = 0;
00572
00573 <font class="keywordflow">if</font> (name)
00574 <font class="keyword">delete</font> [] name;
00575 name = 0;
00576 stdstr(&name, <font class="stringliteral">""</font>);
00577
00578 <font class="keywordflow">if</font> (userData)
00579 <font class="keyword">delete</font> [] userData;
00580 userData = 0;
00581 }
00582
00583
00584 TreeKeyIdx::TreeNode::~TreeNode() {
00585 <font class="keywordflow">if</font> (name)
00586 <font class="keyword">delete</font> [] name;
00587
00588 <font class="keywordflow">if</font> (userData)
00589 <font class="keyword">delete</font> [] userData;
00590 }
</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>