diff options
Diffstat (limited to 'src/modules/filters/swbasicfilter.cpp')
-rw-r--r-- | src/modules/filters/swbasicfilter.cpp | 152 |
1 files changed, 87 insertions, 65 deletions
diff --git a/src/modules/filters/swbasicfilter.cpp b/src/modules/filters/swbasicfilter.cpp index 2865085..55c8843 100644 --- a/src/modules/filters/swbasicfilter.cpp +++ b/src/modules/filters/swbasicfilter.cpp @@ -4,7 +4,7 @@ * many filters will need and can use as a starting * point. * - * $Id: swbasicfilter.cpp,v 1.17 2002/03/11 19:01:28 scribe Exp $ + * $Id: swbasicfilter.cpp,v 1.33 2003/10/24 02:43:46 scribe Exp $ * * Copyright 2001 CrossWire Bible Society (http://www.crosswire.org) * CrossWire Bible Society @@ -23,16 +23,23 @@ */ #include <stdlib.h> -#include <string.h> #include <swbasicfilter.h> #include <stdio.h> #include <stdarg.h> +SWORD_NAMESPACE_START + +const char SWBasicFilter::INITIALIZE = 1; +const char SWBasicFilter::PRECHAR = 2; +const char SWBasicFilter::POSTCHAR = 4; +const char SWBasicFilter::FINALIZE = 8; + SWBasicFilter::SWBasicFilter() { - tokenStart = 0; - tokenEnd = 0; - escStart = 0; - escEnd = 0; + processStages = 0; + tokenStart = 0; + tokenEnd = 0; + escStart = 0; + escEnd = 0; setTokenStart("<"); setTokenEnd(">"); @@ -40,9 +47,9 @@ SWBasicFilter::SWBasicFilter() { setEscapeEnd(";"); escStringCaseSensitive = false; - tokenCaseSensitive = false; - passThruUnknownToken = false; - passThruUnknownEsc = false; + tokenCaseSensitive = false; + passThruUnknownToken = false; + passThruUnknownEsc = false; } @@ -87,10 +94,18 @@ void SWBasicFilter::addTokenSubstitute(const char *findString, const char *repla if (!tokenCaseSensitive) { stdstr(&buf, findString); toupperstr(buf); - tokenSubMap.insert(DualStringMap::value_type(buf, replaceString)); + tokenSubMap[buf] = replaceString; delete [] buf; } - else tokenSubMap.insert(DualStringMap::value_type(findString, replaceString)); + else tokenSubMap[findString] = replaceString; +} + + +void SWBasicFilter::replaceTokenSubstitute(const char *findString, const char *replaceString) { + if (tokenSubMap.find(findString) != tokenSubMap.end()) { + tokenSubMap.erase( tokenSubMap.find(findString) ); //erase entry + } + addTokenSubstitute(findString, replaceString); } @@ -106,19 +121,15 @@ void SWBasicFilter::addEscapeStringSubstitute(const char *findString, const char else escSubMap.insert(DualStringMap::value_type(findString, replaceString)); } - -void SWBasicFilter::pushString(char **buf, const char *format, ...) { - va_list argptr; - - va_start(argptr, format); - *buf += vsprintf(*buf, format, argptr); - va_end(argptr); - -// *buf += strlen(*buf); +void SWBasicFilter::replaceEscapeStringSubstitute(const char *findString, const char *replaceString) { + if (escSubMap.find(findString) != escSubMap.end()) { + escSubMap.erase( escSubMap.find(findString) ); //erase entry + } + addEscapeStringSubstitute(findString, replaceString); } -bool SWBasicFilter::substituteToken(char **buf, const char *token) { +bool SWBasicFilter::substituteToken(SWBuf &buf, const char *token) { DualStringMap::iterator it; if (!tokenCaseSensitive) { @@ -131,14 +142,14 @@ bool SWBasicFilter::substituteToken(char **buf, const char *token) { it = tokenSubMap.find(token); if (it != tokenSubMap.end()) { - pushString(buf, it->second.c_str()); + buf += it->second.c_str(); return true; } return false; } -bool SWBasicFilter::substituteEscapeString(char **buf, const char *escString) { +bool SWBasicFilter::substituteEscapeString(SWBuf &buf, const char *escString) { DualStringMap::iterator it; if (!escStringCaseSensitive) { @@ -151,72 +162,76 @@ bool SWBasicFilter::substituteEscapeString(char **buf, const char *escString) { it = escSubMap.find(escString); if (it != escSubMap.end()) { - pushString(buf, it->second.c_str()); + buf += it->second.c_str(); return true; } return false; } -bool SWBasicFilter::handleToken(char **buf, const char *token, DualStringMap &userData) { +bool SWBasicFilter::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) { return substituteToken(buf, token); } -bool SWBasicFilter::handleEscapeString(char **buf, const char *escString, DualStringMap &userData) { +bool SWBasicFilter::handleEscapeString(SWBuf &buf, const char *escString, BasicFilterUserData *userData) { return substituteEscapeString(buf, escString); } void SWBasicFilter::setEscapeStart(const char *escStart) { stdstr(&(this->escStart), escStart); + escStartLen = strlen(escStart); } void SWBasicFilter::setEscapeEnd(const char *escEnd) { stdstr(&(this->escEnd), escEnd); + escEndLen = strlen(escEnd); } void SWBasicFilter::setTokenStart(const char *tokenStart) { stdstr(&(this->tokenStart), tokenStart); + tokenStartLen = strlen(tokenStart); } void SWBasicFilter::setTokenEnd(const char *tokenEnd) { stdstr(&(this->tokenEnd), tokenEnd); + tokenEndLen = strlen(tokenEnd); } -char SWBasicFilter::ProcessText(char *text, int maxlen, const SWKey *key, const SWModule *module) { - this->key = key; - this->module = module; - char *to, *from, token[4096]; +char SWBasicFilter::processText(SWBuf &text, const SWKey *key, const SWModule *module) { + char *from; + char token[4096]; int tokpos = 0; - bool intoken = false; - int len; + bool intoken = false; bool inEsc = false; - char escStartLen = strlen(escStart); - char escEndLen = strlen(escEnd); char escStartPos = 0, escEndPos = 0; - char tokenStartLen = strlen(tokenStart); - char tokenEndLen = strlen(tokenEnd); char tokenStartPos = 0, tokenEndPos = 0; - DualStringMap userData; - string lastTextNode; + SWBuf lastTextNode; + BasicFilterUserData *userData = createUserData(module, key); - bool suspendTextPassThru = false; - userData["suspendTextPassThru"] = "false"; + SWBuf orig = text; + from = orig.getRawData(); + text = ""; - len = strlen(text) + 1; // shift string to right of buffer - if (len < maxlen) { - memmove(&text[maxlen - len], text, len); - from = &text[maxlen - len]; + if (processStages & INITIALIZE) { + if (processStage(INITIALIZE, text, from, userData)) { // processStage handled it all + delete userData; + return 0; + } } - else from = text; // ------------------------------- + for (;*from; from++) { + + if (processStages & PRECHAR) { + if (processStage(PRECHAR, text, from, userData)) // processStage handled this char + continue; + } - for (to = text; *from; from++) { if (*from == tokenStart[tokenStartPos]) { if (tokenStartPos == (tokenStartLen - 1)) { intoken = true; @@ -247,15 +262,14 @@ char SWBasicFilter::ProcessText(char *text, int maxlen, const SWKey *key, const if (*from == escEnd[escEndPos]) { if (escEndPos == (escEndLen - 1)) { intoken = false; - userData["lastTextNode"] = lastTextNode; - if ((!handleEscapeString(&to, token, userData)) && (passThruUnknownEsc)) { - pushString(&to, escStart); - pushString(&to, token); - pushString(&to, escEnd); + userData->lastTextNode = lastTextNode; + if ((!handleEscapeString(text, token, userData)) && (passThruUnknownEsc)) { + text += escStart; + text += token; + text += escEnd; } escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0; lastTextNode = ""; - suspendTextPassThru = (!userData["suspendTextPassThru"].compare("true")); continue; } } @@ -265,15 +279,14 @@ char SWBasicFilter::ProcessText(char *text, int maxlen, const SWKey *key, const if (*from == tokenEnd[tokenEndPos]) { if (tokenEndPos == (tokenEndLen - 1)) { intoken = false; - userData["lastTextNode"] = lastTextNode; - if ((!handleToken(&to, token, userData)) && (passThruUnknownToken)) { - pushString(&to, tokenStart); - pushString(&to, token); - pushString(&to, tokenEnd); + userData->lastTextNode = lastTextNode; + if ((!handleToken(text, token, userData)) && (passThruUnknownToken)) { + text += tokenStart; + text += token; + text += tokenEnd; } escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0; lastTextNode = ""; - suspendTextPassThru = (!userData["suspendTextPassThru"].compare("true")); continue; } } @@ -285,15 +298,24 @@ char SWBasicFilter::ProcessText(char *text, int maxlen, const SWKey *key, const token[tokpos+2] = 0; } else { - if (!suspendTextPassThru) - *to++ = *from; - lastTextNode += *from; + if ((!userData->supressAdjacentWhitespace) || (*from != ' ')) { + if (!userData->suspendTextPassThru) + text += *from; + lastTextNode += *from; + } + userData->supressAdjacentWhitespace = false; } + + if (processStages & POSTCHAR) + processStage(POSTCHAR, text, from, userData); + } - *to++ = 0; - *to = 0; - return 0; -} + if (processStages & FINALIZE) + processStage(FINALIZE, text, from, userData); + delete userData; + return 0; +} +SWORD_NAMESPACE_END |