diff options
Diffstat (limited to 'doc/api-documentation/html/rawstr4_8cpp-source.html')
-rw-r--r-- | doc/api-documentation/html/rawstr4_8cpp-source.html | 576 |
1 files changed, 576 insertions, 0 deletions
diff --git a/doc/api-documentation/html/rawstr4_8cpp-source.html b/doc/api-documentation/html/rawstr4_8cpp-source.html new file mode 100644 index 0000000..2626f05 --- /dev/null +++ b/doc/api-documentation/html/rawstr4_8cpp-source.html @@ -0,0 +1,576 @@ +<!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>rawstr4.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>rawstr4.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/******************************************************************************</font> +00002 <font class="comment"> * rawstr.cpp - code for class 'RawStr'- a module that reads raw text</font> +00003 <font class="comment"> * files: ot and nt using indexs ??.bks ??.cps ??.vss</font> +00004 <font class="comment"> * and provides lookup and parsing functions based on</font> +00005 <font class="comment"> * class StrKey</font> +00006 <font class="comment"> */</font> +00007 +00008 <font class="preprocessor">#include <stdio.h></font> +00009 <font class="preprocessor">#include <fcntl.h></font> +00010 <font class="preprocessor">#include <errno.h></font> +00011 +00012 <font class="preprocessor">#ifndef __GNUC__</font> +00013 <font class="preprocessor"></font><font class="preprocessor">#include <io.h></font> +00014 <font class="preprocessor">#else</font> +00015 <font class="preprocessor"></font><font class="preprocessor">#include <unistd.h></font> +00016 <font class="preprocessor">#endif</font> +00017 <font class="preprocessor"></font> +00018 <font class="preprocessor">#include <string.h></font> +00019 <font class="preprocessor">#include <stdlib.h></font> +00020 <font class="preprocessor">#include <utilfuns.h></font> +00021 <font class="preprocessor">#include <rawstr4.h></font> +00022 <font class="preprocessor">#include <sysdata.h></font> +00023 +00024 <font class="comment">/******************************************************************************</font> +00025 <font class="comment"> * RawStr Statics</font> +00026 <font class="comment"> */</font> +00027 +00028 <font class="keywordtype">int</font> RawStr4::instance = 0; +00029 +00030 +00031 <font class="comment">/******************************************************************************</font> +00032 <font class="comment"> * RawStr Constructor - Initializes data for instance of RawStr</font> +00033 <font class="comment"> *</font> +00034 <font class="comment"> * ENT: ipath - path of the directory where data and index files are located.</font> +00035 <font class="comment"> * be sure to include the trailing separator (e.g. '/' or '\')</font> +00036 <font class="comment"> * (e.g. 'modules/texts/rawtext/webster/')</font> +00037 <font class="comment"> */</font> +00038 +00039 RawStr4::RawStr4(<font class="keyword">const</font> <font class="keywordtype">char</font> *ipath, <font class="keywordtype">int</font> fileMode) +00040 { +00041 <font class="keywordtype">char</font> buf[127]; +00042 +00043 nl = <font class="charliteral">'\n'</font>; +00044 lastoff = -1; +00045 path = 0; +00046 stdstr(&path, ipath); +00047 +00048 <font class="preprocessor">#ifndef O_BINARY // O_BINARY is needed in Borland C++ 4.53</font> +00049 <font class="preprocessor"></font><font class="preprocessor">#define O_BINARY 0 // If it hasn't been defined than we probably</font> +00050 <font class="preprocessor"></font><font class="preprocessor">#endif // don't need it.</font> +00051 <font class="preprocessor"></font> +00052 <font class="keywordflow">if</font> (fileMode == -1) { <font class="comment">// try read/write if possible</font> +00053 fileMode = O_RDWR; +00054 } +00055 +00056 sprintf(buf, <font class="stringliteral">"%s.idx"</font>, path); +00057 idxfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>); +00058 +00059 sprintf(buf, <font class="stringliteral">"%s.dat"</font>, path); +00060 datfd = FileMgr::systemFileMgr.open(buf, fileMode|O_BINARY, <font class="keyword">true</font>); +00061 +00062 <font class="keywordflow">if</font> (datfd < 0) { +00063 sprintf(buf, <font class="stringliteral">"Error: %d"</font>, errno); +00064 perror(buf); +00065 } +00066 +00067 instance++; +00068 } +00069 +00070 +00071 <font class="comment">/******************************************************************************</font> +00072 <font class="comment"> * RawStr Destructor - Cleans up instance of RawStr</font> +00073 <font class="comment"> */</font> +00074 +00075 RawStr4::~RawStr4() +00076 { +00077 <font class="keywordflow">if</font> (path) +00078 <font class="keyword">delete</font> [] path; +00079 +00080 --instance; +00081 +00082 FileMgr::systemFileMgr.close(idxfd); +00083 FileMgr::systemFileMgr.close(datfd); +00084 } +00085 +00086 +00087 <font class="comment">/******************************************************************************</font> +00088 <font class="comment"> * RawStr4::getidxbufdat - Gets the index string at the given idx offset</font> +00089 <font class="comment"> * NOTE: buf is allocated and must be freed by</font> +00090 <font class="comment"> * calling function</font> +00091 <font class="comment"> *</font> +00092 <font class="comment"> * ENT: ioffset - offset in dat file to lookup</font> +00093 <font class="comment"> * buf - address of pointer to allocate for storage of string</font> +00094 <font class="comment"> */</font> +00095 +00096 <font class="keywordtype">void</font> RawStr4::getidxbufdat(<font class="keywordtype">long</font> ioffset, <font class="keywordtype">char</font> **buf) +00097 { +00098 <font class="keywordtype">int</font> size; +00099 <font class="keywordtype">char</font> ch; +00100 <font class="keywordflow">if</font> (datfd > 0) { +00101 lseek(datfd->getFd(), ioffset, SEEK_SET); +00102 <font class="keywordflow">for</font> (size = 0; read(datfd->getFd(), &ch, 1) == 1; size++) { +00103 <font class="keywordflow">if</font> ((ch == <font class="charliteral">'\\'</font>) || (ch == 10) || (ch == 13)) +00104 <font class="keywordflow">break</font>; +00105 } +00106 *buf = (*buf) ? (<font class="keywordtype">char</font> *)realloc(*buf, size + 1) : (char *)malloc(size + 1); +00107 <font class="keywordflow">if</font> (size) { +00108 lseek(datfd->getFd(), ioffset, SEEK_SET); +00109 read(datfd->getFd(), *buf, size); +00110 } +00111 (*buf)[size] = 0; +00112 <font class="keywordflow">for</font> (size--; size > 0; size--) +00113 (*buf)[size] = SW_toupper((*buf)[size]); +00114 } +00115 <font class="keywordflow">else</font> { +00116 *buf = (*buf) ? (<font class="keywordtype">char</font> *)realloc(*buf, 1) : (char *)malloc(1); +00117 **buf = 0; +00118 } +00119 } +00120 +00121 +00122 <font class="comment">/******************************************************************************</font> +00123 <font class="comment"> * RawStr4::getidxbuf - Gets the index string at the given idx offset</font> +00124 <font class="comment"> * NOTE: buf is allocated and must be freed by</font> +00125 <font class="comment"> * calling function</font> +00126 <font class="comment"> *</font> +00127 <font class="comment"> * ENT: ioffset - offset in idx file to lookup</font> +00128 <font class="comment"> * buf - address of pointer to allocate for storage of string</font> +00129 <font class="comment"> */</font> +00130 +00131 <font class="keywordtype">void</font> RawStr4::getidxbuf(<font class="keywordtype">long</font> ioffset, <font class="keywordtype">char</font> **buf) +00132 { +00133 <font class="keywordtype">char</font> *trybuf, *targetbuf; +00134 <font class="keywordtype">long</font> offset; +00135 +00136 <font class="keywordflow">if</font> (idxfd > 0) { +00137 lseek(idxfd->getFd(), ioffset, SEEK_SET); +00138 read(idxfd->getFd(), &offset, 4); +00139 +00140 offset = swordtoarch32(offset); +00141 +00142 getidxbufdat(offset, buf); +00143 <font class="keywordflow">for</font> (trybuf = targetbuf = *buf; *trybuf; trybuf++, targetbuf++) { +00144 <font class="comment">/*</font> +00145 <font class="comment"> if (*trybuf == '-') { // ignore '-' because alphabetized silly in file</font> +00146 <font class="comment"> targetbuf--;</font> +00147 <font class="comment"> continue;</font> +00148 <font class="comment"> }</font> +00149 <font class="comment">*/</font> +00150 *targetbuf = SW_toupper(*trybuf); +00151 } +00152 *targetbuf = 0; +00153 trybuf = 0; +00154 } +00155 } +00156 +00157 +00158 <font class="comment">/******************************************************************************</font> +00159 <font class="comment"> * RawStr4::findoffset - Finds the offset of the key string from the indexes</font> +00160 <font class="comment"> *</font> +00161 <font class="comment"> * ENT: key - key string to lookup</font> +00162 <font class="comment"> * start - address to store the starting offset</font> +00163 <font class="comment"> * size - address to store the size of the entry</font> +00164 <font class="comment"> * away - number of entries before of after to jump</font> +00165 <font class="comment"> * (default = 0)</font> +00166 <font class="comment"> *</font> +00167 <font class="comment"> * RET: error status</font> +00168 <font class="comment"> */</font> +00169 +00170 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> RawStr4::findoffset(<font class="keyword">const</font> <font class="keywordtype">char</font> *ikey, <font class="keywordtype">long</font> *start, <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> *size, <font class="keywordtype">long</font> away, <font class="keywordtype">long</font> *idxoff) +00171 { +00172 <font class="keywordtype">char</font> *trybuf, *targetbuf, *key, quitflag = 0; +00173 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> retval = 0; +00174 <font class="keywordtype">long</font> headoff, tailoff, tryoff = 0, maxoff = 0; +00175 +00176 <font class="keywordflow">if</font> (idxfd->getFd() >=0) { +00177 <font class="keywordflow">if</font> (*ikey) { +00178 headoff = 0; +00179 tailoff = maxoff = lseek(idxfd->getFd(), 0, SEEK_END) - 8; +00180 +00181 key = <font class="keyword">new</font> <font class="keywordtype">char</font> [ strlen(ikey) + 1 ]; +00182 strcpy(key, ikey); +00183 +00184 <font class="keywordflow">for</font> (trybuf = targetbuf = key; *trybuf; trybuf++, targetbuf++) { +00185 <font class="comment">/*</font> +00186 <font class="comment"> if (*trybuf == '-') { // ignore '-' because alphabetized silly in file</font> +00187 <font class="comment"> targetbuf--;</font> +00188 <font class="comment"> continue;</font> +00189 <font class="comment"> }</font> +00190 <font class="comment"> */</font> +00191 *targetbuf = SW_toupper(*trybuf); +00192 } +00193 *targetbuf = 0; +00194 trybuf = 0; +00195 +00196 <font class="keywordflow">while</font> (headoff < tailoff) { +00197 tryoff = (lastoff == -1) ? headoff + ((((tailoff / 8) - (headoff / 8))) / 2) * 8 : lastoff; +00198 lastoff = -1; +00199 getidxbuf(tryoff, &trybuf); +00200 +00201 <font class="keywordflow">if</font> (!*trybuf) { <font class="comment">// In case of extra entry at end of idx</font> +00202 tryoff += (tryoff > (maxoff / 2))?-8:8; +00203 retval = -1; +00204 <font class="keywordflow">break</font>; +00205 } +00206 +00207 <font class="keywordflow">if</font> (!strcmp(key, trybuf)) +00208 <font class="keywordflow">break</font>; +00209 +00210 <font class="keywordtype">int</font> diff = strcmp(key, trybuf); +00211 <font class="keywordflow">if</font> (diff < 0) +00212 tailoff = (tryoff == headoff) ? headoff : tryoff; +00213 <font class="keywordflow">else</font> headoff = tryoff; +00214 <font class="keywordflow">if</font> (tailoff == headoff + 8) { +00215 <font class="keywordflow">if</font> (quitflag++) +00216 headoff = tailoff; +00217 } +00218 } +00219 <font class="keywordflow">if</font> (headoff >= tailoff) +00220 tryoff = headoff; +00221 <font class="keywordflow">if</font> (trybuf) +00222 free(trybuf); +00223 <font class="keyword">delete</font> [] key; +00224 } +00225 <font class="keywordflow">else</font> tryoff = 0; +00226 +00227 lseek(idxfd->getFd(), tryoff, SEEK_SET); +00228 +00229 *start = *size = 0; +00230 read(idxfd->getFd(), start, 4); +00231 read(idxfd->getFd(), size, 4); +00232 <font class="keywordflow">if</font> (idxoff) +00233 *idxoff = tryoff; +00234 +00235 *start = swordtoarch32(*start); +00236 *size = swordtoarch32(*size); +00237 +00238 <font class="keywordflow">while</font> (away) { +00239 <font class="keywordtype">long</font> laststart = *start; +00240 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> lastsize = *size; +00241 <font class="keywordtype">long</font> lasttry = tryoff; +00242 tryoff += (away > 0) ? 8 : -8; +00243 +00244 <font class="keywordtype">bool</font> bad = <font class="keyword">false</font>; +00245 <font class="keywordflow">if</font> (((tryoff + (away*8)) < -8) || (tryoff + (away*8) > (maxoff+8))) +00246 bad = <font class="keyword">true</font>; +00247 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (lseek(idxfd->getFd(), tryoff, SEEK_SET) < 0) +00248 bad = <font class="keyword">true</font>; +00249 <font class="keywordflow">if</font> (bad) { +00250 retval = -1; +00251 *start = laststart; +00252 *size = lastsize; +00253 tryoff = lasttry; +00254 <font class="keywordflow">if</font> (idxoff) +00255 *idxoff = tryoff; +00256 <font class="keywordflow">break</font>; +00257 } +00258 read(idxfd->getFd(), start, 4); +00259 read(idxfd->getFd(), size, 4); +00260 <font class="keywordflow">if</font> (idxoff) +00261 *idxoff = tryoff; +00262 +00263 *start = swordtoarch32(*start); +00264 *size = swordtoarch32(*size); +00265 +00266 <font class="keywordflow">if</font> (((laststart != *start) || (lastsize != *size)) && (*start >= 0) && (*size)) +00267 away += (away < 0) ? 1 : -1; +00268 } +00269 +00270 lastoff = tryoff; +00271 } +00272 <font class="keywordflow">else</font> { +00273 *start = 0; +00274 *size = 0; +00275 <font class="keywordflow">if</font> (idxoff) +00276 *idxoff = 0; +00277 retval = -1; +00278 } +00279 <font class="keywordflow">return</font> retval; +00280 } +00281 +00282 +00283 <font class="comment">/******************************************************************************</font> +00284 <font class="comment"> * RawStr4::preptext - Prepares the text before returning it to external</font> +00285 <font class="comment"> * objects</font> +00286 <font class="comment"> *</font> +00287 <font class="comment"> * ENT: buf - buffer where text is stored and where to store the prep'd</font> +00288 <font class="comment"> * text.</font> +00289 <font class="comment"> */</font> +00290 +00291 <font class="keywordtype">void</font> RawStr4::preptext(<font class="keywordtype">char</font> *buf) +00292 { +00293 <font class="keywordtype">char</font> *to, *from, space = 0, cr = 0, realdata = 0, nlcnt = 0; +00294 +00295 <font class="keywordflow">for</font> (to = from = buf; *from; from++) { +00296 <font class="keywordflow">switch</font> (*from) { +00297 <font class="keywordflow">case</font> 10: +00298 <font class="keywordflow">if</font> (!realdata) +00299 <font class="keywordflow">continue</font>; +00300 space = (cr) ? 0 : 1; +00301 cr = 0; +00302 nlcnt++; +00303 <font class="keywordflow">if</font> (nlcnt > 1) { +00304 <font class="comment">// *to++ = nl;</font> +00305 *to++ = nl; +00306 <font class="comment">// nlcnt = 0;</font> +00307 } +00308 <font class="keywordflow">continue</font>; +00309 <font class="keywordflow">case</font> 13: +00310 <font class="keywordflow">if</font> (!realdata) +00311 <font class="keywordflow">continue</font>; +00312 *to++ = nl; +00313 space = 0; +00314 cr = 1; +00315 <font class="keywordflow">continue</font>; +00316 } +00317 realdata = 1; +00318 nlcnt = 0; +00319 <font class="keywordflow">if</font> (space) { +00320 space = 0; +00321 <font class="keywordflow">if</font> (*from != <font class="charliteral">' '</font>) { +00322 *to++ = <font class="charliteral">' '</font>; +00323 from--; +00324 <font class="keywordflow">continue</font>; +00325 } +00326 } +00327 *to++ = *from; +00328 } +00329 *to = 0; +00330 +00331 <font class="keywordflow">while</font> (to > (buf+1)) { <font class="comment">// remove trailing excess</font> +00332 to--; +00333 <font class="keywordflow">if</font> ((*to == 10) || (*to == <font class="charliteral">' '</font>)) +00334 *to = 0; +00335 <font class="keywordflow">else</font> <font class="keywordflow">break</font>; +00336 } +00337 } +00338 +00339 +00340 <font class="comment">/******************************************************************************</font> +00341 <font class="comment"> * RawStr4::gettext - gets text at a given offset</font> +00342 <font class="comment"> *</font> +00343 <font class="comment"> * ENT:</font> +00344 <font class="comment"> * start - starting offset where the text is located in the file</font> +00345 <font class="comment"> * size - size of text entry</font> +00346 <font class="comment"> * buf - buffer to store text</font> +00347 <font class="comment"> *</font> +00348 <font class="comment"> */</font> +00349 +00350 <font class="keywordtype">void</font> RawStr4::gettext(<font class="keywordtype">long</font> istart, <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> isize, <font class="keywordtype">char</font> *idxbuf, <font class="keywordtype">char</font> *buf) +00351 { +00352 <font class="keywordtype">char</font> *ch; +00353 <font class="keywordtype">char</font> *idxbuflocal = 0; +00354 getidxbufdat(istart, &idxbuflocal); +00355 <font class="keywordtype">long</font> start = istart; +00356 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> size = isize; +00357 +00358 <font class="keywordflow">do</font> { +00359 memset(buf, 0, size); +00360 lseek(datfd->getFd(), start, SEEK_SET); +00361 read(datfd->getFd(), buf, (int)(size - 1)); +00362 +00363 <font class="keywordflow">for</font> (ch = buf; *ch; ch++) { <font class="comment">// skip over index string</font> +00364 <font class="keywordflow">if</font> (*ch == 10) { +00365 ch++; +00366 <font class="keywordflow">break</font>; +00367 } +00368 } +00369 memmove(buf, ch, size - (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>)(ch-buf)); +00370 +00371 <font class="comment">// resolve link</font> +00372 <font class="keywordflow">if</font> (!strncmp(buf, <font class="stringliteral">"@LINK"</font>, 5)) { +00373 <font class="keywordflow">for</font> (ch = buf; *ch; ch++) { <font class="comment">// null before nl</font> +00374 <font class="keywordflow">if</font> (*ch == 10) { +00375 *ch = 0; +00376 <font class="keywordflow">break</font>; +00377 } +00378 } +00379 findoffset(buf + 8, &start, &size); +00380 } +00381 <font class="keywordflow">else</font> <font class="keywordflow">break</font>; +00382 } +00383 <font class="keywordflow">while</font> (true); <font class="comment">// while we're resolving links</font> +00384 +00385 <font class="keywordflow">if</font> (idxbuflocal) { +00386 <font class="keywordtype">int</font> localsize = strlen(idxbuflocal); +00387 localsize = (localsize < (size - 1)) ? localsize : (size - 1); +00388 strncpy(idxbuf, idxbuflocal, localsize); +00389 idxbuf[localsize] = 0; +00390 free(idxbuflocal); +00391 } +00392 } +00393 +00394 +00395 <font class="comment">/******************************************************************************</font> +00396 <font class="comment"> * RawLD::settext - Sets text for current offset</font> +00397 <font class="comment"> *</font> +00398 <font class="comment"> * ENT: key - key for this entry</font> +00399 <font class="comment"> * buf - buffer to store</font> +00400 <font class="comment"> * len - length of buffer (0 - null terminated)</font> +00401 <font class="comment"> */</font> +00402 +00403 <font class="keywordtype">void</font> RawStr4::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) +00404 { +00405 +00406 <font class="keywordtype">long</font> start, outstart; +00407 <font class="keywordtype">long</font> idxoff; +00408 <font class="keywordtype">long</font> endoff; +00409 <font class="keywordtype">long</font> shiftSize; +00410 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> size; +00411 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> outsize; +00412 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font> nl[] = {13, 10}; +00413 <font class="keywordtype">char</font> *tmpbuf = 0; +00414 <font class="keywordtype">char</font> *key = 0; +00415 <font class="keywordtype">char</font> *dbKey = 0; +00416 <font class="keywordtype">char</font> *idxBytes = 0; +00417 <font class="keywordtype">char</font> *outbuf = 0; +00418 <font class="keywordtype">char</font> *ch = 0; +00419 +00420 findoffset(ikey, &start, &size, 0, &idxoff); +00421 stdstr(&key, ikey); +00422 <font class="keywordflow">for</font> (ch = key; *ch; ch++) +00423 *ch = SW_toupper(*ch); +00424 ch = 0; +00425 +00426 getidxbufdat(start, &dbKey); +00427 +00428 <font class="keywordflow">if</font> (strcmp(key, dbKey) < 0) { +00429 } +00430 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp(key, dbKey) > 0) { +00431 idxoff += 8; +00432 } <font class="keywordflow">else</font> <font class="keywordflow">if</font> ((!strcmp(key, dbKey)) && (len || strlen(buf) <font class="comment">/*we're not deleting*/</font>)) { <font class="comment">// got absolute entry</font> +00433 <font class="keywordflow">do</font> { +00434 tmpbuf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ size + 2 ]; +00435 memset(tmpbuf, 0, size + 2); +00436 lseek(datfd->getFd(), start, SEEK_SET); +00437 read(datfd->getFd(), tmpbuf, (int)(size - 1)); +00438 +00439 <font class="keywordflow">for</font> (ch = tmpbuf; *ch; ch++) { <font class="comment">// skip over index string</font> +00440 <font class="keywordflow">if</font> (*ch == 10) { +00441 ch++; +00442 <font class="keywordflow">break</font>; +00443 } +00444 } +00445 memmove(tmpbuf, ch, size - (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>)(ch-tmpbuf)); +00446 +00447 <font class="comment">// resolve link</font> +00448 <font class="keywordflow">if</font> (!strncmp(tmpbuf, <font class="stringliteral">"@LINK"</font>, 5) && (len ? len : strlen(buf))) { +00449 <font class="keywordflow">for</font> (ch = tmpbuf; *ch; ch++) { <font class="comment">// null before nl</font> +00450 <font class="keywordflow">if</font> (*ch == 10) { +00451 *ch = 0; +00452 <font class="keywordflow">break</font>; +00453 } +00454 } +00455 findoffset(tmpbuf + 8, &start, &size, 0, &idxoff); +00456 } +00457 <font class="keywordflow">else</font> <font class="keywordflow">break</font>; +00458 } +00459 <font class="keywordflow">while</font> (true); <font class="comment">// while we're resolving links</font> +00460 } +00461 +00462 endoff = lseek(idxfd->getFd(), 0, SEEK_END); +00463 +00464 shiftSize = endoff - idxoff; +00465 +00466 <font class="keywordflow">if</font> (shiftSize > 0) { +00467 idxBytes = <font class="keyword">new</font> <font class="keywordtype">char</font> [ shiftSize ]; +00468 lseek(idxfd->getFd(), idxoff, SEEK_SET); +00469 read(idxfd->getFd(), idxBytes, shiftSize); +00470 } +00471 +00472 outbuf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ (len ? len : strlen(buf)) + strlen(key) + 5 ]; +00473 sprintf(outbuf, <font class="stringliteral">"%s%c%c"</font>, key, 13, 10); +00474 size = strlen(outbuf); +00475 memcpy (outbuf + size, buf, len ? len : strlen(buf)); +00476 size = outsize = size + (len ? len : strlen(buf)); +00477 +00478 start = outstart = lseek(datfd->getFd(), 0, SEEK_END); +00479 +00480 outstart = archtosword32(start); +00481 outsize = archtosword32(size); +00482 +00483 lseek(idxfd->getFd(), idxoff, SEEK_SET); +00484 <font class="keywordflow">if</font> (len ? len : strlen(buf)) { +00485 lseek(datfd->getFd(), start, SEEK_SET); +00486 write(datfd->getFd(), outbuf, (long)size); +00487 +00488 <font class="comment">// add a new line to make data file easier to read in an editor</font> +00489 write(datfd->getFd(), &nl, 2); +00490 +00491 write(idxfd->getFd(), &outstart, 4); +00492 write(idxfd->getFd(), &outsize, 4); +00493 <font class="keywordflow">if</font> (idxBytes) { +00494 write(idxfd->getFd(), idxBytes, shiftSize); +00495 <font class="keyword">delete</font> [] idxBytes; +00496 } +00497 } +00498 <font class="keywordflow">else</font> { <font class="comment">// delete entry</font> +00499 <font class="keywordflow">if</font> (idxBytes) { +00500 write(idxfd->getFd(), idxBytes+8, shiftSize-8); +00501 lseek(idxfd->getFd(), -1, SEEK_CUR); <font class="comment">// last valid byte</font> +00502 FileMgr::systemFileMgr.trunc(idxfd); <font class="comment">// truncate index</font> +00503 <font class="keyword">delete</font> [] idxBytes; +00504 } +00505 } +00506 +00507 <font class="keyword">delete</font> [] key; +00508 <font class="keyword">delete</font> [] outbuf; +00509 free(dbKey); +00510 } +00511 +00512 +00513 <font class="comment">/******************************************************************************</font> +00514 <font class="comment"> * RawLD::linkentry - links one entry to another</font> +00515 <font class="comment"> *</font> +00516 <font class="comment"> * ENT: testmt - testament to find (0 - Bible/module introduction)</font> +00517 <font class="comment"> * destidxoff - dest offset into .vss</font> +00518 <font class="comment"> * srcidxoff - source offset into .vss</font> +00519 <font class="comment"> */</font> +00520 +00521 <font class="keywordtype">void</font> RawStr4::linkentry(<font class="keyword">const</font> <font class="keywordtype">char</font> *destkey, <font class="keyword">const</font> <font class="keywordtype">char</font> *srckey) { +00522 <font class="keywordtype">char</font> *text = <font class="keyword">new</font> <font class="keywordtype">char</font> [ strlen(destkey) + 7 ]; +00523 sprintf(text, <font class="stringliteral">"@LINK %s"</font>, destkey); +00524 settext(srckey, text); +00525 <font class="keyword">delete</font> [] text; +00526 } +00527 +00528 +00529 <font class="comment">/******************************************************************************</font> +00530 <font class="comment"> * RawLD::CreateModule - Creates new module files</font> +00531 <font class="comment"> *</font> +00532 <font class="comment"> * ENT: path - directory to store module files</font> +00533 <font class="comment"> * RET: error status</font> +00534 <font class="comment"> */</font> +00535 +00536 <font class="keywordtype">signed</font> <font class="keywordtype">char</font> RawStr4::createModule(<font class="keyword">const</font> <font class="keywordtype">char</font> *ipath) +00537 { +00538 <font class="keywordtype">char</font> *path = 0; +00539 <font class="keywordtype">char</font> *buf = <font class="keyword">new</font> <font class="keywordtype">char</font> [ strlen (ipath) + 20 ]; +00540 FileDesc *fd, *fd2; +00541 +00542 stdstr(&path, ipath); +00543 +00544 <font class="keywordflow">if</font> ((path[strlen(path)-1] == <font class="charliteral">'/'</font>) || (path[strlen(path)-1] == <font class="charliteral">'\\'</font>)) +00545 path[strlen(path)-1] = 0; +00546 +00547 sprintf(buf, <font class="stringliteral">"%s.dat"</font>, path); +00548 unlink(buf); +00549 fd = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); +00550 fd->getFd(); +00551 FileMgr::systemFileMgr.close(fd); +00552 +00553 sprintf(buf, <font class="stringliteral">"%s.idx"</font>, path); +00554 unlink(buf); +00555 fd2 = FileMgr::systemFileMgr.open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); +00556 fd2->getFd(); +00557 FileMgr::systemFileMgr.close(fd2); +00558 +00559 <font class="keyword">delete</font> [] path; +00560 +00561 <font class="keywordflow">return</font> 0; +00562 } +</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> |