diff options
Diffstat (limited to 'src/modules/lexdict/rawld4/rawld4.cpp')
-rw-r--r-- | src/modules/lexdict/rawld4/rawld4.cpp | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/src/modules/lexdict/rawld4/rawld4.cpp b/src/modules/lexdict/rawld4/rawld4.cpp new file mode 100644 index 0000000..0fd1058 --- /dev/null +++ b/src/modules/lexdict/rawld4/rawld4.cpp @@ -0,0 +1,192 @@ +/****************************************************************************** + * rawld.cpp - code for class 'RawLD'- a module that reads raw lexicon and + * dictionary files: *.dat *.idx + */ + + +#include <ctype.h> +#include <stdio.h> +#include <fcntl.h> + +#include <filemgr.h> +#include <utilstr.h> +#include <rawstr4.h> +#include <rawld4.h> + +SWORD_NAMESPACE_START + + /****************************************************************************** + * RawLD Constructor - Initializes data for instance of RawLD + * + * ENT: ipath - path and filename of files (no extension) + * iname - Internal name for module + * idesc - Name to display to user for module + * idisp - Display object to use for displaying + */ + +RawLD4::RawLD4(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang) : RawStr4(ipath), SWLD(iname, idesc, idisp, enc, dir, mark, ilang) +{ +} + + +/****************************************************************************** + * RawLD Destructor - Cleans up instance of RawLD + */ + +RawLD4::~RawLD4() +{ +} + + +bool RawLD4::isWritable() { + return ((idxfd->getFd() > 0) && ((idxfd->mode & FileMgr::RDWR) == FileMgr::RDWR)); +} + + +/****************************************************************************** + * RawLD4::strongsPad - Pads a key if (it-1) is 100% digits to 5 places + * allows for final to be alpha, e.g. '123B' + * + * ENT: buf - buffer to check and pad + */ + +void RawLD4::strongsPad(char *buf) +{ + char *check; + int size = 0; + int len = strlen(buf); + char subLet = 0; + bool bang = false; + if ((len < 8) && (len > 0)) { + for (check = buf; *(check+1); check++) { + if (!isdigit(*check)) + break; + else size++; + } + + if (size && ((size == (len-1)) || (size == (len-2)))) { + if (*check == '!') { + bang = true; + check++; + } + if (isalpha(*check)) { + subLet = toupper(*check); + *(check-(bang?1:0)) = 0; + } + sprintf(buf, "%.5d", atoi(buf)); + if (subLet) { + check = buf+(strlen(buf)); + if (bang) { + *check++ = '!'; + } + *check++ = subLet; + *check = 0; + } + } + } +} + + +/****************************************************************************** + * RawLD4::getEntry - Looks up entry from data file. 'Snaps' to closest + * entry and sets 'entrybuf'. + * + * ENT: away - number of entries offset from key (default = 0) + * + * RET: error status + */ + +char RawLD4::getEntry(long away) +{ + long start = 0; + unsigned long size = 0; + char *idxbuf = 0; + char retval = 0; + + char *buf = new char [ strlen(*key) + 6 ]; + strcpy(buf, *key); + + strongsPad(buf); + + entryBuf = ""; + if (!(retval = findOffset(buf, &start, &size, away))) { + readText(start, &size, &idxbuf, entryBuf); + rawFilter(entryBuf, 0); // hack, decipher + rawFilter(entryBuf, key); + entrySize = size; // support getEntrySize call + if (!key->Persist()) // If we have our own key + *key = idxbuf; // reset it to entry index buffer + + stdstr(&entkeytxt, idxbuf); // set entry key text that module 'snapped' to. + delete [] idxbuf; + } + + delete [] buf; + return retval; +} + + +/****************************************************************************** + * RawLD4::getRawEntry - Returns the correct entry when char * cast + * is requested + * + * RET: string buffer with entry + */ + +SWBuf &RawLD4::getRawEntryBuf() { + + char ret = getEntry(); + if (!ret) { +// if (!isUnicode()) + prepText(entryBuf); + } + else error = ret; + + return entryBuf; +} + + +/****************************************************************************** + * RawLD4::increment - Increments module key a number of entries + * + * ENT: increment - Number of entries to jump forward + * + * RET: *this + */ + +void RawLD4::increment(int steps) { + char tmperror; + + if (key->isTraversable()) { + *key += steps; + error = key->Error(); + steps = 0; + } + + tmperror = (getEntry(steps)) ? KEYERR_OUTOFBOUNDS : 0; + error = (error)?error:tmperror; + *key = entkeytxt; +} + + +void RawLD4::setEntry(const char *inbuf, long len) { + doSetText(*key, inbuf, len); +} + + +void RawLD4::linkEntry(const SWKey *inkey) { + doLinkEntry(*key, *inkey); +} + + +/****************************************************************************** + * RawFiles::deleteEntry - deletes this entry + * + * RET: *this + */ + +void RawLD4::deleteEntry() { + doSetText(*key, ""); +} + +SWORD_NAMESPACE_END |