<!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>swcomprs.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>swcomprs.cpp</h1><div class="fragment"><pre>00001 <font class="comment">/******************************************************************************</font> 00002 <font class="comment"> * swcomprs.cpp - code for class 'SWCompress'- a driver class that provides</font> 00003 <font class="comment"> * compression utilities.</font> 00004 <font class="comment"> */</font> 00005 00006 <font class="preprocessor">#include <string.h></font> 00007 <font class="preprocessor">#include <stdlib.h></font> 00008 <font class="preprocessor">#include <swcomprs.h></font> 00009 00010 00011 <font class="comment">/******************************************************************************</font> 00012 <font class="comment"> * SWCompress Constructor - Initializes data for instance of SWCompress</font> 00013 <font class="comment"> *</font> 00014 <font class="comment"> */</font> 00015 00016 SWCompress::SWCompress() 00017 { 00018 buf = zbuf = 0; 00019 Init(); 00020 } 00021 00022 00023 <font class="comment">/******************************************************************************</font> 00024 <font class="comment"> * SWCompress Destructor - Cleans up instance of SWCompress</font> 00025 <font class="comment"> */</font> 00026 00027 SWCompress::~SWCompress() 00028 { 00029 <font class="keywordflow">if</font> (zbuf) 00030 free(zbuf); 00031 00032 <font class="keywordflow">if</font> (buf) 00033 free(buf); 00034 } 00035 00036 00037 <font class="keywordtype">void</font> SWCompress::Init() 00038 { 00039 <font class="keywordflow">if</font> (buf) 00040 free(buf); 00041 00042 <font class="keywordflow">if</font> (zbuf) 00043 free(zbuf); 00044 00045 buf = 0; 00046 zbuf = 0; 00047 direct = 0; 00048 zlen = 0; 00049 slen = 0; 00050 zpos = 0; 00051 pos = 0; 00052 } 00053 00054 00055 <font class="keywordtype">char</font> *SWCompress::Buf(<font class="keyword">const</font> <font class="keywordtype">char</font> *ibuf, <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> *len) { 00056 <font class="comment">// setting an uncompressed buffer</font> 00057 <font class="keywordflow">if</font> (ibuf) { 00058 Init(); 00059 slen = (len) ? *len : strlen(ibuf); 00060 buf = (<font class="keywordtype">char</font> *) calloc(slen + 1, 1); 00061 memcpy(buf, ibuf, slen); 00062 } 00063 00064 <font class="comment">// getting an uncompressed buffer</font> 00065 <font class="keywordflow">if</font> (!buf) { 00066 buf = (<font class="keywordtype">char</font> *)calloc(1,1); <font class="comment">// be sure we at least allocate an empty buf for return;</font> 00067 direct = 1; 00068 Decode(); 00069 <font class="comment">// slen = strlen(buf);</font> 00070 <font class="keywordflow">if</font> (len) 00071 *len = slen; 00072 } 00073 <font class="keywordflow">return</font> buf; 00074 } 00075 00076 00077 <font class="keywordtype">char</font> *SWCompress::zBuf(<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> *len, <font class="keywordtype">char</font> *ibuf) 00078 { 00079 <font class="comment">// setting a compressed buffer</font> 00080 <font class="keywordflow">if</font> (ibuf) { 00081 Init(); 00082 zbuf = (<font class="keywordtype">char</font> *) malloc(*len); 00083 memcpy(zbuf, ibuf, *len); 00084 zlen = *len; 00085 } 00086 00087 <font class="comment">// getting a compressed buffer</font> 00088 <font class="keywordflow">if</font> (!zbuf) { 00089 direct = 0; 00090 Encode(); 00091 } 00092 00093 *len = zlen; 00094 <font class="keywordflow">return</font> zbuf; 00095 } 00096 00097 00098 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> SWCompress::GetChars(<font class="keywordtype">char</font> *ibuf, <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> len) 00099 { 00100 <font class="keywordflow">if</font> (direct) { 00101 len = (((zlen - zpos) > (unsigned)len) ? len : zlen - zpos); 00102 <font class="keywordflow">if</font> (len > 0) { 00103 memmove(ibuf, &zbuf[zpos], len); 00104 zpos += len; 00105 } 00106 } 00107 <font class="keywordflow">else</font> { 00108 <font class="comment">// slen = strlen(buf);</font> 00109 len = (((slen - pos) > (unsigned)len) ? len : slen - pos); 00110 <font class="keywordflow">if</font> (len > 0) { 00111 memmove(ibuf, &buf[pos], len); 00112 pos += len; 00113 } 00114 } 00115 <font class="keywordflow">return</font> len; 00116 } 00117 00118 00119 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> SWCompress::SendChars(<font class="keywordtype">char</font> *ibuf, <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> len) 00120 { 00121 <font class="keywordflow">if</font> (direct) { 00122 <font class="keywordflow">if</font> (buf) { 00123 <font class="comment">// slen = strlen(buf);</font> 00124 <font class="keywordflow">if</font> ((pos + len) > (unsigned)slen) { 00125 buf = (<font class="keywordtype">char</font> *) realloc(buf, pos + len + 1024); 00126 memset(&buf[pos], 0, len + 1024); 00127 } 00128 } 00129 <font class="keywordflow">else</font> buf = (<font class="keywordtype">char</font> *)calloc(1, len + 1024); 00130 memmove(&buf[pos], ibuf, len); 00131 pos += len; 00132 } 00133 <font class="keywordflow">else</font> { 00134 <font class="keywordflow">if</font> (zbuf) { 00135 <font class="keywordflow">if</font> ((zpos + len) > zlen) { 00136 zbuf = (<font class="keywordtype">char</font> *) realloc(zbuf, zpos + len + 1024); 00137 zlen = zpos + len + 1024; 00138 } 00139 } 00140 <font class="keywordflow">else</font> { 00141 zbuf = (<font class="keywordtype">char</font> *)calloc(1, len + 1024); 00142 zlen = len + 1024; 00143 } 00144 memmove(&zbuf[zpos], ibuf, len); 00145 zpos += len; 00146 } 00147 <font class="keywordflow">return</font> len; 00148 } 00149 00150 00151 <font class="comment">/******************************************************************************</font> 00152 <font class="comment"> * SWCompress::Encode - This function "encodes" the input stream into the</font> 00153 <font class="comment"> * output stream.</font> 00154 <font class="comment"> * The GetChars() and SendChars() functions are</font> 00155 <font class="comment"> * used to separate this method from the actual</font> 00156 <font class="comment"> * i/o.</font> 00157 <font class="comment"> */</font> 00158 00159 <font class="keywordtype">void</font> SWCompress::Encode(<font class="keywordtype">void</font>) 00160 { 00161 cycleStream(); 00162 } 00163 00164 00165 <font class="comment">/******************************************************************************</font> 00166 <font class="comment"> * SWCompress::Decode - This function "decodes" the input stream into the</font> 00167 <font class="comment"> * output stream.</font> 00168 <font class="comment"> * The GetChars() and SendChars() functions are</font> 00169 <font class="comment"> * used to separate this method from the actual</font> 00170 <font class="comment"> * i/o.</font> 00171 <font class="comment"> */</font> 00172 00173 <font class="keywordtype">void</font> SWCompress::Decode(<font class="keywordtype">void</font>) 00174 { 00175 cycleStream(); 00176 } 00177 00178 00179 <font class="keywordtype">void</font> SWCompress::cycleStream() { 00180 <font class="keywordtype">char</font> buf[1024]; 00181 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> len, totlen = 0; 00182 00183 <font class="keywordflow">do</font> { 00184 len = GetChars(buf, 1024); 00185 <font class="keywordflow">if</font> (len) 00186 totlen += SendChars(buf, len); 00187 } <font class="keywordflow">while</font> (len == 1024); 00188 00189 zlen = slen = totlen; 00190 } </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>