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 );
}