summaryrefslogtreecommitdiff
path: root/src/modules/filters/swbasicfilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/filters/swbasicfilter.cpp')
-rw-r--r--src/modules/filters/swbasicfilter.cpp152
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