Source Code (Use browser search to find items of interest.)
Class Index
khexedit'SFilterControl (./kdeutils/khexedit/hexbuffer.h:69)
struct SFilterControl
{
enum Operation
{
OperandAndData = 0,
OperandOrData,
OperandXorData,
InvertData,
ReverseData,
RotateData,
ShiftData,
SwapBits
};
int execute( uchar *dest, uchar *src, uint size );
QByteArray operand;
int rotate[2];
Operation operation;
bool fromCursor;
bool inSelection;
bool forward;
};
khexedit'SFilterControl::execute() (./kdeutils/khexedit/hexbuffer.cc:104)
int SFilterControl::execute( uchar *dest, uchar *src, uint size )
{
if( size == 0 )
{
return( Err_IllegalArgument );
}
uint numElement = operand.size();
if( operation == OperandAndData )
{
if( numElement == 0 ) { return( Err_IllegalArgument ); }
if( forward == true )
{
for( uint i = 0; i < size; )
{
for( uint j = 0; i < size && j < numElement; j++, i++ )
{
dest[i] = src[i] & operand[j];
}
}
}
else
{
for( uint i = size; i > 0; )
{
for( uint j = numElement; i > 0 && j > 0; j--, i-- )
{
dest[i-1] = src[i-1] & operand[j-1];
}
}
}
}
else if( operation == OperandOrData )
{
if( numElement == 0 ) { return( Err_IllegalArgument ); }
if( forward == true )
{
for( uint i = 0; i < size; )
{
for( uint j = 0; i < size && j < numElement; j++, i++ )
{
dest[i] = src[i] | operand[j];
}
}
}
else
{
for( uint i = size; i > 0; )
{
for( uint j = numElement; i > 0 && j > 0; j--, i-- )
{
dest[i-1] = src[i-1] | operand[j-1];
}
}
}
}
else if( operation == OperandXorData )
{
if( numElement == 0 ) { return( Err_IllegalArgument ); }
if( forward == true )
{
for( uint i = 0; i < size; )
{
for( uint j = 0; i < size && j < numElement; j++, i++ )
{
dest[i] = src[i] ^ operand[j];
}
}
}
else
{
for( uint i = size; i > 0; )
{
for( uint j = numElement; i > 0 && j > 0; j--, i-- )
{
dest[i-1] = src[i-1] ^ operand[j-1];
}
}
}
}
else if( operation == InvertData )
{
for( uint i = 0; i < size; i++ )
{
dest[i] = ~src[i];
}
}
else if( operation == ReverseData )
{
for( uint i = 0; i < size; i++ )
{
uchar flag = src[i];
uchar rev = 0;
for( uint j = 0; j < 8; j++ )
{
rev |= (((flag & 0x80) >> (7-j)));
flag <<= 1;
}
dest[i] = rev;
}
}
else if( operation == RotateData || operation == ShiftData )
{
//
// Only forward here
//
bool up = rotate[1] > 0 ? true : false;
int range = rotate[0];
int shift = abs(rotate[1]);
if( range == 0 || shift == 0 ) { return( Err_IllegalArgument ); }
shift = shift % (range*8);
int b = shift / 8;
int s = shift - b * 8;
for( uint i = 0; i < size; )
{
if( up == true )
{
int j;
if( operation == RotateData )
{
for( j=0; j < b && i+range < size ; i++, j++ )
{
dest[i] = src[i+range-b];
}
}
else
{
for( j=0; j < b && i < size ; dest[i] = 0, i++, j++ );
}
for( ; j < range && i < size ; i++, j++ )
{
dest[i] = src[i-b];
}
uchar last = dest[i-1];
for( int k=1; k <= j; k++ )
{
dest[i-k] >>= s;
if( k < j )
{
dest[i-k] |= dest[i-k-1]<<(8-s);
}
else if( j == range && operation == RotateData )
{
dest[i-k] |= last<<(8-s);
}
}
}
else
{
int j;
for( j=0; j+b < range && i+b < size ; i++, j++ )
{
dest[i] = src[i+b];
}
for( ; j < range && i < size ; i++, j++ )
{
dest[i] = operation == RotateData ? src[i+b-range] : 0;
}
uchar first = dest[i-j];
for( int k=j; k>0; k-- )
{
dest[i-k] <<= s;
if( k>1 )
{
dest[i-k] |= dest[i-k+1]>>(8-s);
}
else if( j == range && operation == RotateData )
{
dest[i-k] |= first>>(8-s);
}
}
}
}
}
else if( operation == SwapBits )
{
//
// Swap bits. Based on Leon Lessing's work.
//
//
// Make non swapped version first.
//
for( uint i = 0; i < size; i++ )
{
dest[i] = src[i];
}
//
// Swap the pairs the have been defined
// Format of operand (example):
// 7 2 5 0 0 0 0 0
// Swap bit 7 with bit 2 and swap bit 5 with bit 0
//
for( uint j=0; j<4; j++ )
{
uchar b1 = 1 << (uchar)operand[j*2];
uchar b2 = 1 << (uchar)operand[j*2+1];
if( b1 == b2 ) { continue; } // Equal, no need to swap.
for( uint i = 0; i < size; i++ )
{
uchar b = 0;
if( dest[i] & b1 ) { b |= b2; }
if( dest[i] & b2 ) { b |= b1; }
//
// A short description so that I will understand what the
// h... is going on five minutes from now.
//
// Destination byte is masked (AND'ed) with the inverse bitmap
// (the noninversed bitmap contains position of the
// two swap bits, eg 7-2 gives 10000100). Then the destination
// is OR'ed with the swapped bitmap.
//
dest[i] = (dest[i] & ~(b1 | b2)) | b;
}
}
}
else
{
return( Err_IllegalArgument );
}
return( Err_Success );
}