Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

misc.cpp

00001 // misc.cpp - written and placed in the public domain by Wei Dai 00002 00003 #include "pch.h" 00004 00005 #ifndef CRYPTOPP_IMPORTS 00006 00007 #include "misc.h" 00008 #include "words.h" 00009 #include <new> 00010 00011 NAMESPACE_BEGIN(CryptoPP) 00012 00013 void xorbuf(byte *buf, const byte *mask, unsigned int count) 00014 { 00015 if (((size_t)buf | (size_t)mask | count) % WORD_SIZE == 0) 00016 XorWords((word *)buf, (const word *)mask, count/WORD_SIZE); 00017 else 00018 { 00019 for (unsigned int i=0; i<count; i++) 00020 buf[i] ^= mask[i]; 00021 } 00022 } 00023 00024 void xorbuf(byte *output, const byte *input, const byte *mask, unsigned int count) 00025 { 00026 if (((size_t)output | (size_t)input | (size_t)mask | count) % WORD_SIZE == 0) 00027 XorWords((word *)output, (const word *)input, (const word *)mask, count/WORD_SIZE); 00028 else 00029 { 00030 for (unsigned int i=0; i<count; i++) 00031 output[i] = input[i] ^ mask[i]; 00032 } 00033 } 00034 00035 unsigned int Parity(unsigned long value) 00036 { 00037 for (unsigned int i=8*sizeof(value)/2; i>0; i/=2) 00038 value ^= value >> i; 00039 return (unsigned int)value&1; 00040 } 00041 00042 unsigned int BytePrecision(unsigned long value) 00043 { 00044 unsigned int i; 00045 for (i=sizeof(value); i; --i) 00046 if (value >> (i-1)*8) 00047 break; 00048 00049 return i; 00050 } 00051 00052 unsigned int BitPrecision(unsigned long value) 00053 { 00054 if (!value) 00055 return 0; 00056 00057 unsigned int l=0, h=8*sizeof(value); 00058 00059 while (h-l > 1) 00060 { 00061 unsigned int t = (l+h)/2; 00062 if (value >> t) 00063 l = t; 00064 else 00065 h = t; 00066 } 00067 00068 return h; 00069 } 00070 00071 unsigned long Crop(unsigned long value, unsigned int size) 00072 { 00073 if (size < 8*sizeof(value)) 00074 return (value & ((1L << size) - 1)); 00075 else 00076 return value; 00077 } 00078 00079 #if !(defined(_MSC_VER) && (_MSC_VER < 1300)) 00080 using std::new_handler; 00081 using std::set_new_handler; 00082 #endif 00083 00084 void CallNewHandler() 00085 { 00086 new_handler newHandler = set_new_handler(NULL); 00087 if (newHandler) 00088 set_new_handler(newHandler); 00089 00090 if (newHandler) 00091 newHandler(); 00092 else 00093 throw std::bad_alloc(); 00094 } 00095 00096 NAMESPACE_END 00097 00098 #endif

Generated on Fri Aug 27 15:51:08 2004 for Crypto++ by doxygen 1.3.8