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