dovecot-1.2-sieve: Improved byte code encoding implementation of...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Mon Aug 2 15:22:53 EEST 2010


details:   http://hg.rename-it.nl/dovecot-1.2-sieve/rev/c1d3018ba796
changeset: 1266:c1d3018ba796
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Mon Aug 02 14:22:43 2010 +0200
description:
Improved byte code encoding implementation of integers and offsets.

diffstat:

 src/lib-sieve/sieve-binary.c |  45 ++++++++++++++++++++++++---------------------
 1 files changed, 24 insertions(+), 21 deletions(-)

diffs (110 lines):

diff -r f91059c42ab1 -r c1d3018ba796 src/lib-sieve/sieve-binary.c
--- a/src/lib-sieve/sieve-binary.c	Fri Jul 30 17:56:10 2010 +0200
+++ b/src/lib-sieve/sieve-binary.c	Mon Aug 02 14:22:43 2010 +0200
@@ -1514,11 +1514,14 @@
 {
 	int i;
 	sieve_size_t address = _sieve_binary_get_code_size(binary);
+	uint8_t encoded[4];
 
 	for ( i = 3; i >= 0; i-- ) {
-		uint8_t c = (uint8_t) (offset >> (i * 8));
-		_sieve_binary_emit_data(binary, &c, 1);
+		encoded[i] = (uint8_t) offset;
+		offset >>= 8;
 	}
+
+	_sieve_binary_emit_data(binary, encoded, 4);
 	
 	return address;
 }
@@ -1527,43 +1530,40 @@
 	(struct sieve_binary *binary, sieve_size_t address) 
 {
 	int i;
-	sieve_offset_t offset = _sieve_binary_get_code_size(binary) - address; 
-	
+	sieve_offset_t offset = _sieve_binary_get_code_size(binary) - address;
+	uint8_t encoded[4];
+
 	for ( i = 3; i >= 0; i-- ) {
-		uint8_t c = (uint8_t) (offset >> (i * 8));	
-		_sieve_binary_update_data(binary, address + 3 - i, &c, 1);
+		encoded[i] = (uint8_t) offset;
+		offset >>= 8;
 	}
+
+	_sieve_binary_update_data(binary, address, encoded, 4);
 }
 
 /* Literal emission */
 
-/* FIXME: this integer format is compact, but it might be too slow. 
- */
-
 sieve_size_t sieve_binary_emit_integer
 (struct sieve_binary *binary, sieve_number_t integer)
 {
 	sieve_size_t address = _sieve_binary_get_code_size(binary);
-	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;
-		}
-	} 
-  
+	/* Emit encoded integer */
+	bufpos++;  
 	_sieve_binary_emit_data(binary, buffer + bufpos, sizeof(buffer) - bufpos);
 
 	return address;
@@ -1687,7 +1687,7 @@
 		}
 	  
 		if ( offset_r != NULL )
-			*offset_r = (int) offs;
+			*offset_r = offs;
 			
 		return TRUE;
 	}
@@ -1705,11 +1705,13 @@
 	if ( ADDR_BYTES_LEFT(binary, address) == 0 )
 		return FALSE;
   
+	/* Read first integer bytes [1xxxxxxx] */
 	while ( (ADDR_DATA_AT(binary, address) & 0x80) > 0 ) {
 		if ( ADDR_BYTES_LEFT(binary, address) > 0 && bits > 0) {
 			*int_r |= ADDR_DATA_AT(binary, address) & 0x7F;
 			ADDR_JUMP(address, 1);
     
+			/* Each byte encodes 7 bits of the integer */
 			*int_r <<= 7;
 			bits -= 7;
 		} else {
@@ -1718,6 +1720,7 @@
 		}
 	}
   
+	/* Read last byte [0xxxxxxx] */
 	*int_r |= ADDR_DATA_AT(binary, address) & 0x7F;
 	ADDR_JUMP(address, 1);
   


More information about the dovecot-cvs mailing list