dovecot-2.0-pigeonhole: Improved byte code encoding implementati...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Mon Aug 2 16:00:14 EEST 2010


details:   http://hg.rename-it.nl/dovecot-2.0-pigeonhole/rev/66af5c261028
changeset: 1348:66af5c261028
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Mon Aug 02 14:59:06 2010 +0200
description:
Improved byte code encoding implementation of integers and offsets.

diffstat:

 src/lib-sieve/sieve-binary-code.c |  44 +++++++++++++++++++++++++-------------------
 1 files changed, 25 insertions(+), 19 deletions(-)

diffs (100 lines):

diff -r 5427ab9c95da -r 66af5c261028 src/lib-sieve/sieve-binary-code.c
--- a/src/lib-sieve/sieve-binary-code.c	Fri Jul 30 19:03:30 2010 +0200
+++ b/src/lib-sieve/sieve-binary-code.c	Mon Aug 02 14:59:06 2010 +0200
@@ -85,10 +85,14 @@
 	int i;
 	sieve_size_t address = _sieve_binary_block_get_size(sblock);
 
+	uint8_t encoded[4];
+
 	for ( i = 3; i >= 0; i-- ) {
-		uint8_t c = (uint8_t) (offset >> (i * 8));
-		_sieve_binary_emit_data(sblock, &c, 1);
+		encoded[i] = (uint8_t) offset;
+		offset >>= 8;
 	}
+
+	_sieve_binary_emit_data(sblock, encoded, 4);
 	
 	return address;
 }
@@ -98,11 +102,14 @@
 {
 	int i;
 	sieve_offset_t offset = _sieve_binary_block_get_size(sblock) - address; 
-	
+	uint8_t encoded[4];
+
 	for ( i = 3; i >= 0; i-- ) {
-		uint8_t c = (uint8_t) (offset >> (i * 8));	
-		_sieve_binary_update_data(sblock, address + 3 - i, &c, 1);
+		encoded[i] = (uint8_t) offset;
+		offset >>= 8;
 	}
+
+	_sieve_binary_update_data(sblock, address, encoded, 4);
 }
 
 /* Literal emission */
@@ -111,28 +118,24 @@
 (struct sieve_binary_block *sblock, sieve_number_t integer)
 {
 	sieve_size_t address = _sieve_binary_block_get_size(sblock);
-	int i;
 	uint8_t buffer[sizeof(sieve_number_t) + 1];
-	int bufpos = sizeof(buffer) - 1;
-  
+	int bufpos = sizeof(buffer) - 1;  
+
+	/* Encode last byte [0xxxxxxx]; msb == 0 marks the last byte */
 	buffer[bufpos] = integer & 0x7F;
 	bufpos--;
+
+	/* Encode first bytes [1xxxxxxx] */
 	integer >>= 7;
 	while ( integer > 0 ) {
-		buffer[bufpos] = integer & 0x7F;
+		buffer[bufpos] = (integer & 0x7F) | 0x80;
 		bufpos--;
 		integer >>= 7;  
 	}
   
-	bufpos++;
-	if ( (sizeof(buffer) - bufpos) > 1 ) { 
-		for ( i = bufpos; i < ((int) sizeof(buffer) - 1); i++) {
-			buffer[i] |= 0x80;
-		}
-	} 
-  
-	_sieve_binary_emit_data
-		(sblock, buffer + bufpos, sizeof(buffer) - bufpos);
+	/* Emit encoded integer */
+	bufpos++;  
+	_sieve_binary_emit_data(sblock, buffer + bufpos, sizeof(buffer) - bufpos);
 
 	return address;
 }
@@ -286,12 +289,14 @@
   
 	if ( ADDR_BYTES_LEFT(address) == 0 )
 		return FALSE;
-  
+
+	/* Read first integer bytes [1xxxxxxx] */  
 	while ( (ADDR_DATA_AT(address) & 0x80) > 0 ) {
 		if ( ADDR_BYTES_LEFT(address) > 0 && bits > 0) {
 			*int_r |= ADDR_DATA_AT(address) & 0x7F;
 			ADDR_JUMP(address, 1);
     
+			/* Each byte encodes 7 bits of the integer */
 			*int_r <<= 7;
 			bits -= 7;
 		} else {
@@ -300,6 +305,7 @@
 		}
 	}
   
+	/* Read last byte [0xxxxxxx] */
 	*int_r |= ADDR_DATA_AT(address) & 0x7F;
 	ADDR_JUMP(address, 1);
   


More information about the dovecot-cvs mailing list