<!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>swbasicfilter.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>swbasicfilter.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/******************************************************************************</font> 00002 <font class="comment"> * swbasicfilter.h - definition of class SWBasicFilter. An SWFilter</font> 00003 <font class="comment"> * impl that provides some basic methods that</font> 00004 <font class="comment"> * many filters will need and can use as a starting</font> 00005 <font class="comment"> * point. </font> 00006 <font class="comment"> *</font> 00007 <font class="comment"> * $Id: swbasicfilter_8cpp-source.html,v 1.3 2002/06/20 20:23:10 mgruner Exp $</font> 00008 <font class="comment"> *</font> 00009 <font class="comment"> * Copyright 2001 CrossWire Bible Society (http://www.crosswire.org)</font> 00010 <font class="comment"> * CrossWire Bible Society</font> 00011 <font class="comment"> * P. O. Box 2528</font> 00012 <font class="comment"> * Tempe, AZ 85280-2528</font> 00013 <font class="comment"> *</font> 00014 <font class="comment"> * This program is free software; you can redistribute it and/or modify it</font> 00015 <font class="comment"> * under the terms of the GNU General Public License as published by the</font> 00016 <font class="comment"> * Free Software Foundation version 2.</font> 00017 <font class="comment"> *</font> 00018 <font class="comment"> * This program is distributed in the hope that it will be useful, but</font> 00019 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00020 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> 00021 <font class="comment"> * General Public License for more details.</font> 00022 <font class="comment"> *</font> 00023 <font class="comment"> */</font> 00024 00025 <font class="preprocessor">#include <stdlib.h></font> 00026 <font class="preprocessor">#include <string.h></font> 00027 <font class="preprocessor">#include <swbasicfilter.h></font> 00028 <font class="preprocessor">#include <stdio.h></font> 00029 <font class="preprocessor">#include <stdarg.h></font> 00030 00031 SWBasicFilter::SWBasicFilter() { 00032 tokenStart = 0; 00033 tokenEnd = 0; 00034 escStart = 0; 00035 escEnd = 0; 00036 00037 setTokenStart(<font class="stringliteral">"<"</font>); 00038 setTokenEnd(<font class="stringliteral">">"</font>); 00039 setEscapeStart(<font class="stringliteral">"&"</font>); 00040 setEscapeEnd(<font class="stringliteral">";"</font>); 00041 00042 escStringCaseSensitive = <font class="keyword">false</font>; 00043 tokenCaseSensitive = <font class="keyword">false</font>; 00044 passThruUnknownToken = <font class="keyword">false</font>; 00045 passThruUnknownEsc = <font class="keyword">false</font>; 00046 } 00047 00048 <a name="l00049"></a><a class="code" href="class_s_w_basic_filter.html#b4">00049</a> <font class="keywordtype">void</font> <a class="code" href="class_s_w_basic_filter.html#b4">SWBasicFilter::setPassThruUnknownToken</a>(<font class="keywordtype">bool</font> val) { 00050 passThruUnknownToken = val; 00051 } 00052 00053 <a name="l00054"></a><a class="code" href="class_s_w_basic_filter.html#b5">00054</a> <font class="keywordtype">void</font> <a class="code" href="class_s_w_basic_filter.html#b5">SWBasicFilter::setPassThruUnknownEscapeString</a>(<font class="keywordtype">bool</font> val) { 00055 passThruUnknownEsc = val; 00056 } 00057 00058 00059 <font class="keywordtype">void</font> SWBasicFilter::setTokenCaseSensitive(<font class="keywordtype">bool</font> val) { 00060 tokenCaseSensitive = val; 00061 } 00062 00063 00064 <font class="keywordtype">void</font> SWBasicFilter::setEscapeStringCaseSensitive(<font class="keywordtype">bool</font> val) { 00065 escStringCaseSensitive = val; 00066 } 00067 00068 00069 SWBasicFilter::~SWBasicFilter() { 00070 <font class="keywordflow">if</font> (tokenStart) 00071 <font class="keyword">delete</font> [] tokenStart; 00072 00073 <font class="keywordflow">if</font> (tokenEnd) 00074 <font class="keyword">delete</font> [] tokenEnd; 00075 00076 <font class="keywordflow">if</font> (escStart) 00077 <font class="keyword">delete</font> [] escStart; 00078 00079 <font class="keywordflow">if</font> (escEnd) 00080 <font class="keyword">delete</font> [] escEnd; 00081 } 00082 00083 00084 <font class="keywordtype">void</font> SWBasicFilter::addTokenSubstitute(<font class="keyword">const</font> <font class="keywordtype">char</font> *findString, <font class="keyword">const</font> <font class="keywordtype">char</font> *replaceString) { 00085 <font class="keywordtype">char</font> *buf = 0; 00086 00087 <font class="keywordflow">if</font> (!tokenCaseSensitive) { 00088 stdstr(&buf, findString); 00089 toupperstr(buf); 00090 tokenSubMap.insert(DualStringMap::value_type(buf, replaceString)); 00091 <font class="keyword">delete</font> [] buf; 00092 } 00093 <font class="keywordflow">else</font> tokenSubMap.insert(DualStringMap::value_type(findString, replaceString)); 00094 } 00095 00096 00097 <font class="keywordtype">void</font> SWBasicFilter::addEscapeStringSubstitute(<font class="keyword">const</font> <font class="keywordtype">char</font> *findString, <font class="keyword">const</font> <font class="keywordtype">char</font> *replaceString) { 00098 <font class="keywordtype">char</font> *buf = 0; 00099 00100 <font class="keywordflow">if</font> (!escStringCaseSensitive) { 00101 stdstr(&buf, findString); 00102 toupperstr(buf); 00103 escSubMap.insert(DualStringMap::value_type(buf, replaceString)); 00104 <font class="keyword">delete</font> [] buf; 00105 } 00106 <font class="keywordflow">else</font> escSubMap.insert(DualStringMap::value_type(findString, replaceString)); 00107 } 00108 00109 <a name="l00110"></a><a class="code" href="class_s_w_basic_filter.html#b12">00110</a> <font class="keywordtype">void</font> <a class="code" href="class_s_w_basic_filter.html#b12">SWBasicFilter::pushString</a>(<font class="keywordtype">char</font> **buf, <font class="keyword">const</font> <font class="keywordtype">char</font> *format, ...) { 00111 va_list argptr; 00112 00113 va_start(argptr, format); 00114 *buf += vsprintf(*buf, format, argptr); 00115 va_end(argptr); 00116 00117 <font class="comment">// *buf += strlen(*buf);</font> 00118 } 00119 00120 00121 <font class="keywordtype">bool</font> SWBasicFilter::substituteToken(<font class="keywordtype">char</font> **buf, <font class="keyword">const</font> <font class="keywordtype">char</font> *token) { 00122 DualStringMap::iterator it; 00123 00124 <font class="keywordflow">if</font> (!tokenCaseSensitive) { 00125 <font class="keywordtype">char</font> *tmp = 0; 00126 stdstr(&tmp, token); 00127 toupperstr(tmp); 00128 it = tokenSubMap.find(tmp); 00129 <font class="keyword">delete</font> [] tmp; 00130 } <font class="keywordflow">else</font> 00131 it = tokenSubMap.find(token); 00132 00133 <font class="keywordflow">if</font> (it != tokenSubMap.end()) { 00134 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(buf, it->second.c_str()); 00135 <font class="keywordflow">return</font> <font class="keyword">true</font>; 00136 } 00137 <font class="keywordflow">return</font> <font class="keyword">false</font>; 00138 } 00139 00140 00141 <font class="keywordtype">bool</font> SWBasicFilter::substituteEscapeString(<font class="keywordtype">char</font> **buf, <font class="keyword">const</font> <font class="keywordtype">char</font> *escString) { 00142 DualStringMap::iterator it; 00143 00144 <font class="keywordflow">if</font> (!escStringCaseSensitive) { 00145 <font class="keywordtype">char</font> *tmp = 0; 00146 stdstr(&tmp, escString); 00147 toupperstr(tmp); 00148 it = escSubMap.find(tmp); 00149 <font class="keyword">delete</font> [] tmp; 00150 } <font class="keywordflow">else</font> 00151 it = escSubMap.find(escString); 00152 00153 <font class="keywordflow">if</font> (it != escSubMap.end()) { 00154 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(buf, it->second.c_str()); 00155 <font class="keywordflow">return</font> <font class="keyword">true</font>; 00156 } 00157 <font class="keywordflow">return</font> <font class="keyword">false</font>; 00158 } 00159 00160 <a name="l00161"></a><a class="code" href="class_s_w_basic_filter.html#b13">00161</a> <font class="keywordtype">bool</font> <a class="code" href="class_s_w_basic_filter.html#b13">SWBasicFilter::handleToken</a>(<font class="keywordtype">char</font> **buf, <font class="keyword">const</font> <font class="keywordtype">char</font> *token, DualStringMap &userData) { 00162 <font class="keywordflow">return</font> substituteToken(buf, token); 00163 } 00164 00165 <a name="l00166"></a><a class="code" href="class_s_w_basic_filter.html#b14">00166</a> <font class="keywordtype">bool</font> <a class="code" href="class_s_w_basic_filter.html#b14">SWBasicFilter::handleEscapeString</a>(<font class="keywordtype">char</font> **buf, <font class="keyword">const</font> <font class="keywordtype">char</font> *escString, DualStringMap &userData) { 00167 <font class="keywordflow">return</font> substituteEscapeString(buf, escString); 00168 } 00169 00170 <a name="l00171"></a><a class="code" href="class_s_w_basic_filter.html#b0">00171</a> <font class="keywordtype">void</font> <a class="code" href="class_s_w_basic_filter.html#b0">SWBasicFilter::setEscapeStart</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *escStart) { 00172 stdstr(&(this->escStart), escStart); 00173 } 00174 00175 <a name="l00176"></a><a class="code" href="class_s_w_basic_filter.html#b1">00176</a> <font class="keywordtype">void</font> <a class="code" href="class_s_w_basic_filter.html#b1">SWBasicFilter::setEscapeEnd</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *escEnd) { 00177 stdstr(&(this->escEnd), escEnd); 00178 } 00179 00180 <a name="l00181"></a><a class="code" href="class_s_w_basic_filter.html#b2">00181</a> <font class="keywordtype">void</font> <a class="code" href="class_s_w_basic_filter.html#b2">SWBasicFilter::setTokenStart</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *tokenStart) { 00182 stdstr(&(this->tokenStart), tokenStart); 00183 } 00184 00185 <a name="l00186"></a><a class="code" href="class_s_w_basic_filter.html#b3">00186</a> <font class="keywordtype">void</font> <a class="code" href="class_s_w_basic_filter.html#b3">SWBasicFilter::setTokenEnd</a>(<font class="keyword">const</font> <font class="keywordtype">char</font> *tokenEnd) { 00187 stdstr(&(this->tokenEnd), tokenEnd); 00188 } 00189 00190 00191 <font class="keywordtype">char</font> SWBasicFilter::ProcessText(<font class="keywordtype">char</font> *text, <font class="keywordtype">int</font> maxlen, <font class="keyword">const</font> <a class="code" href="class_s_w_key.html">SWKey</a> *key, <font class="keyword">const</font> <a class="code" href="class_s_w_module.html">SWModule</a> *module) { 00192 this->key = key; 00193 this->module = module; 00194 <font class="keywordtype">char</font> *to, *from, token[4096]; 00195 <font class="keywordtype">int</font> tokpos = 0; 00196 <font class="keywordtype">bool</font> intoken = <font class="keyword">false</font>; 00197 <font class="keywordtype">int</font> len; 00198 <font class="keywordtype">bool</font> inEsc = <font class="keyword">false</font>; 00199 <font class="keywordtype">char</font> escStartLen = strlen(escStart); 00200 <font class="keywordtype">char</font> escEndLen = strlen(escEnd); 00201 <font class="keywordtype">char</font> escStartPos = 0, escEndPos = 0; 00202 <font class="keywordtype">char</font> tokenStartLen = strlen(tokenStart); 00203 <font class="keywordtype">char</font> tokenEndLen = strlen(tokenEnd); 00204 <font class="keywordtype">char</font> tokenStartPos = 0, tokenEndPos = 0; 00205 DualStringMap userData; 00206 string lastTextNode; 00207 00208 <font class="keywordtype">bool</font> suspendTextPassThru = <font class="keyword">false</font>; 00209 userData[<font class="stringliteral">"suspendTextPassThru"</font>] = <font class="stringliteral">"false"</font>; 00210 00211 len = strlen(text) + 1; <font class="comment">// shift string to right of buffer</font> 00212 <font class="keywordflow">if</font> (len < maxlen) { 00213 memmove(&text[maxlen - len], text, len); 00214 from = &text[maxlen - len]; 00215 } 00216 <font class="keywordflow">else</font> from = text; <font class="comment">// -------------------------------</font> 00217 00218 resultBuffer = text; 00219 00220 <font class="keywordflow">for</font> (to = text; *from; from++) { 00221 <font class="keywordflow">if</font> (*from == tokenStart[tokenStartPos]) { 00222 <font class="keywordflow">if</font> (tokenStartPos == (tokenStartLen - 1)) { 00223 intoken = <font class="keyword">true</font>; 00224 tokpos = 0; 00225 token[0] = 0; 00226 token[1] = 0; 00227 token[2] = 0; 00228 inEsc = <font class="keyword">false</font>; 00229 } 00230 <font class="keywordflow">else</font> tokenStartPos++; 00231 <font class="keywordflow">continue</font>; 00232 } 00233 00234 <font class="keywordflow">if</font> (*from == escStart[escStartPos]) { 00235 <font class="keywordflow">if</font> (escStartPos == (escStartLen - 1)) { 00236 intoken = <font class="keyword">true</font>; 00237 tokpos = 0; 00238 token[0] = 0; 00239 token[1] = 0; 00240 token[2] = 0; 00241 inEsc = <font class="keyword">true</font>; 00242 } 00243 <font class="keywordflow">else</font> escStartPos++; 00244 <font class="keywordflow">continue</font>; 00245 } 00246 00247 <font class="keywordflow">if</font> (inEsc) { 00248 <font class="keywordflow">if</font> (*from == escEnd[escEndPos]) { 00249 <font class="keywordflow">if</font> (escEndPos == (escEndLen - 1)) { 00250 intoken = <font class="keyword">false</font>; 00251 userData[<font class="stringliteral">"lastTextNode"</font>] = lastTextNode; 00252 <font class="keywordflow">if</font> ((!<a class="code" href="class_s_w_basic_filter.html#b14">handleEscapeString</a>(&to, token, userData)) && (passThruUnknownEsc)) { 00253 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&to, escStart); 00254 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&to, token); 00255 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&to, escEnd); 00256 } 00257 escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0; 00258 lastTextNode = <font class="stringliteral">""</font>; 00259 suspendTextPassThru = (!userData[<font class="stringliteral">"suspendTextPassThru"</font>].compare(<font class="stringliteral">"true"</font>)); 00260 <font class="keywordflow">continue</font>; 00261 } 00262 } 00263 } 00264 00265 <font class="keywordflow">if</font> (!inEsc) { 00266 <font class="keywordflow">if</font> (*from == tokenEnd[tokenEndPos]) { 00267 <font class="keywordflow">if</font> (tokenEndPos == (tokenEndLen - 1)) { 00268 intoken = <font class="keyword">false</font>; 00269 userData[<font class="stringliteral">"lastTextNode"</font>] = lastTextNode; 00270 <font class="keywordflow">if</font> ((!<a class="code" href="class_s_w_basic_filter.html#b13">handleToken</a>(&to, token, userData)) && (passThruUnknownToken)) { 00271 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&to, tokenStart); 00272 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&to, token); 00273 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&to, tokenEnd); 00274 } 00275 escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0; 00276 lastTextNode = <font class="stringliteral">""</font>; 00277 suspendTextPassThru = (!userData[<font class="stringliteral">"suspendTextPassThru"</font>].compare(<font class="stringliteral">"true"</font>)); 00278 <font class="keywordflow">continue</font>; 00279 } 00280 } 00281 } 00282 00283 <font class="keywordflow">if</font> (intoken) { 00284 <font class="keywordflow">if</font> (tokpos < 4090) 00285 token[tokpos++] = *from; 00286 token[tokpos+2] = 0; 00287 } 00288 <font class="keywordflow">else</font> { 00289 <font class="keywordflow">if</font> (!suspendTextPassThru) 00290 *to++ = *from; 00291 lastTextNode += *from; 00292 } 00293 } 00294 *to++ = 0; 00295 *to = 0; 00296 <font class="keywordflow">return</font> 0; 00297 } 00298 00299 00300 </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>