Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > by-pkgid > a74ec78bdb789d910d054e3918f3f007 > files > 470

libsword1-devel-1.5.5-2mdk.ppc.rpm

<!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> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </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 &lt;stdlib.h&gt;</font>
00026 <font class="preprocessor">#include &lt;string.h&gt;</font>
00027 <font class="preprocessor">#include &lt;swbasicfilter.h&gt;</font>
00028 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
00029 <font class="preprocessor">#include &lt;stdarg.h&gt;</font>
00030 
00031 SWBasicFilter::SWBasicFilter() {
00032         tokenStart = 0;
00033         tokenEnd = 0;
00034         escStart = 0;
00035         escEnd = 0;
00036 
00037         setTokenStart(<font class="stringliteral">"&lt;"</font>);
00038         setTokenEnd(<font class="stringliteral">"&gt;"</font>);
00039         setEscapeStart(<font class="stringliteral">"&amp;"</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(&amp;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(&amp;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(&amp;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-&gt;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(&amp;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-&gt;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 &amp;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 &amp;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(&amp;(this-&gt;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(&amp;(this-&gt;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(&amp;(this-&gt;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(&amp;(this-&gt;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-&gt;key = key;
00193         this-&gt;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 &lt; maxlen) {
00213                 memmove(&amp;text[maxlen - len], text, len);
00214                 from = &amp;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>(&amp;to, token, userData)) &amp;&amp; (passThruUnknownEsc)) {
00253                                                 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&amp;to, escStart);
00254                                                 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&amp;to, token);
00255                                                 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&amp;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>(&amp;to, token, userData)) &amp;&amp; (passThruUnknownToken)) {
00271                                                 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&amp;to, tokenStart);
00272                                                 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&amp;to, token);
00273                                                 <a class="code" href="class_s_w_basic_filter.html#b12">pushString</a>(&amp;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 &lt; 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>