<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Crypto++: misc.cpp Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.3.7 --> <div class="qindex"><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">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>misc.cpp</h1><pre class="fragment"><div>00001 <span class="comment">// misc.cpp - written and placed in the public domain by Wei Dai</span> 00002 00003 <span class="preprocessor">#include "pch.h"</span> 00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span> 00006 <span class="preprocessor"></span> 00007 <span class="preprocessor">#include "misc.h"</span> 00008 <span class="preprocessor">#include "words.h"</span> 00009 <span class="preprocessor">#include <new></span> 00010 00011 NAMESPACE_BEGIN(CryptoPP) 00012 00013 void xorbuf(byte *buf, const byte *mask, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) 00014 { 00015 <span class="keywordflow">if</span> (((size_t)buf | (size_t)mask | count) % WORD_SIZE == 0) 00016 XorWords((word *)buf, (<span class="keyword">const</span> word *)mask, count/WORD_SIZE); 00017 <span class="keywordflow">else</span> 00018 { 00019 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<count; i++) 00020 buf[i] ^= mask[i]; 00021 } 00022 } 00023 00024 <span class="keywordtype">void</span> xorbuf(byte *output, <span class="keyword">const</span> byte *input, <span class="keyword">const</span> byte *mask, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) 00025 { 00026 <span class="keywordflow">if</span> (((size_t)output | (size_t)input | (size_t)mask | count) % WORD_SIZE == 0) 00027 XorWords((word *)output, (<span class="keyword">const</span> word *)input, (<span class="keyword">const</span> word *)mask, count/WORD_SIZE); 00028 <span class="keywordflow">else</span> 00029 { 00030 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<count; i++) 00031 output[i] = input[i] ^ mask[i]; 00032 } 00033 } 00034 00035 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Parity(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value) 00036 { 00037 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=8*<span class="keyword">sizeof</span>(value)/2; i>0; i/=2) 00038 value ^= value >> i; 00039 <span class="keywordflow">return</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)value&1; 00040 } 00041 00042 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BytePrecision(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value) 00043 { 00044 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i; 00045 <span class="keywordflow">for</span> (i=<span class="keyword">sizeof</span>(value); i; --i) 00046 <span class="keywordflow">if</span> (value >> (i-1)*8) 00047 <span class="keywordflow">break</span>; 00048 00049 <span class="keywordflow">return</span> i; 00050 } 00051 00052 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitPrecision(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value) 00053 { 00054 <span class="keywordflow">if</span> (!value) 00055 <span class="keywordflow">return</span> 0; 00056 00057 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> l=0, h=8*<span class="keyword">sizeof</span>(value); 00058 00059 <span class="keywordflow">while</span> (h-l > 1) 00060 { 00061 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t = (l+h)/2; 00062 <span class="keywordflow">if</span> (value >> t) 00063 l = t; 00064 <span class="keywordflow">else</span> 00065 h = t; 00066 } 00067 00068 <span class="keywordflow">return</span> h; 00069 } 00070 00071 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Crop(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) 00072 { 00073 <span class="keywordflow">if</span> (size < 8*<span class="keyword">sizeof</span>(value)) 00074 <span class="keywordflow">return</span> (value & ((1L << size) - 1)); 00075 <span class="keywordflow">else</span> 00076 <span class="keywordflow">return</span> value; 00077 } 00078 00079 <span class="preprocessor">#if !(defined(_MSC_VER) && (_MSC_VER < 1300))</span> 00080 <span class="preprocessor"></span><span class="keyword">using</span> std::new_handler; 00081 <span class="keyword">using</span> std::set_new_handler; 00082 <span class="preprocessor">#endif</span> 00083 <span class="preprocessor"></span> 00084 <span class="keywordtype">void</span> CallNewHandler() 00085 { 00086 new_handler newHandler = set_new_handler(NULL); 00087 <span class="keywordflow">if</span> (newHandler) 00088 set_new_handler(newHandler); 00089 00090 <span class="keywordflow">if</span> (newHandler) 00091 newHandler(); 00092 <span class="keywordflow">else</span> 00093 <span class="keywordflow">throw</span> std::bad_alloc(); 00094 } 00095 00096 NAMESPACE_END 00097 00098 <span class="preprocessor">#endif</span> </div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:58 2004 for Crypto++ by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address> </body> </html>