svn commit: trunk/busybox/archival/libunarchive

vda at busybox.net vda at busybox.net
Sun Mar 2 18:55:49 UTC 2008


Author: vda
Date: 2008-03-02 10:55:49 -0800 (Sun, 02 Mar 2008)
New Revision: 21155

Log:
unlzma: if !LZMA_FAST, save ~200 more bytes (Pascal Bellard <pascal.bellard AT ads-lu.com>)



Modified:
   trunk/busybox/archival/libunarchive/decompress_unlzma.c


Changeset:
Modified: trunk/busybox/archival/libunarchive/decompress_unlzma.c
===================================================================
--- trunk/busybox/archival/libunarchive/decompress_unlzma.c	2008-03-02 14:36:46 UTC (rev 21154)
+++ trunk/busybox/archival/libunarchive/decompress_unlzma.c	2008-03-02 18:55:49 UTC (rev 21155)
@@ -282,14 +282,16 @@
 	while (global_pos + buffer_pos < header.dst_size) {
 		int pos_state = (buffer_pos + global_pos) & pos_state_mask;
 
-		prob =
-			p + LZMA_IS_MATCH + (state << LZMA_NUM_POS_BITS_MAX) + pos_state;
+		prob = p + LZMA_IS_MATCH + (state << LZMA_NUM_POS_BITS_MAX) + pos_state;
 		if (rc_is_bit_0(rc, prob)) {
 			mi = 1;
 			rc_update_bit_0(rc, prob);
-			prob = (p + LZMA_LITERAL + (LZMA_LIT_SIZE
-					* ((((buffer_pos + global_pos) & literal_pos_mask) << lc)
-					+ (previous_byte >> (8 - lc)))));
+			prob = (p + LZMA_LITERAL
+			        + (LZMA_LIT_SIZE * ((((buffer_pos + global_pos) & literal_pos_mask) << lc)
+			                            + (previous_byte >> (8 - lc))
+			                           )
+			          )
+			);
 
 			if (state >= LZMA_NUM_LIT_STATES) {
 				int match_byte;
@@ -317,8 +319,15 @@
 				prob_lit = prob + mi;
 				rc_get_bit(rc, prob_lit, &mi);
 			}
+
+			state -= 3;
+			if (state < 4-3)
+				state = 0;
+			if (state >= 10-3)
+				state -= 6-3;
+
 			previous_byte = (uint8_t) mi;
-
+#if ENABLE_FEATURE_LZMA_FAST
 			buffer[buffer_pos++] = previous_byte;
 			if (buffer_pos == header.dict_size) {
 				buffer_pos = 0;
@@ -327,12 +336,10 @@
 					goto bad;
 				USE_DESKTOP(total_written += header.dict_size;)
 			}
-			if (state < 4)
-				state = 0;
-			else if (state < 10)
-				state -= 3;
-			else
-				state -= 6;
+#else
+			len = 1;
+			goto one_byte;
+#endif
 		} else {
 			int offset;
 			uint16_t *prob_len;
@@ -352,11 +359,14 @@
 				if (rc_is_bit_0(rc, prob)) {
 					rc_update_bit_0(rc, prob);
 					prob = (p + LZMA_IS_REP_0_LONG
-							+ (state << LZMA_NUM_POS_BITS_MAX) + pos_state);
+					        + (state << LZMA_NUM_POS_BITS_MAX)
+					        + pos_state
+					);
 					if (rc_is_bit_0(rc, prob)) {
 						rc_update_bit_0(rc, prob);
 
 						state = state < LZMA_NUM_LIT_STATES ? 9 : 11;
+#if ENABLE_FEATURE_LZMA_FAST
 						pos = buffer_pos - rep0;
 						while (pos >= header.dict_size)
 							pos += header.dict_size;
@@ -370,6 +380,10 @@
 							USE_DESKTOP(total_written += header.dict_size;)
 						}
 						continue;
+#else
+						len = 1;
+						goto string;
+#endif
 					} else {
 						rc_update_bit_1(rc, prob);
 					}
@@ -405,7 +419,7 @@
 			if (rc_is_bit_0(rc, prob_len)) {
 				rc_update_bit_0(rc, prob_len);
 				prob_len = (prob + LZMA_LEN_LOW
-							+ (pos_state << LZMA_LEN_NUM_LOW_BITS));
+				            + (pos_state << LZMA_LEN_NUM_LOW_BITS));
 				offset = 0;
 				num_bits = LZMA_LEN_NUM_LOW_BITS;
 			} else {
@@ -414,14 +428,14 @@
 				if (rc_is_bit_0(rc, prob_len)) {
 					rc_update_bit_0(rc, prob_len);
 					prob_len = (prob + LZMA_LEN_MID
-								+ (pos_state << LZMA_LEN_NUM_MID_BITS));
+					            + (pos_state << LZMA_LEN_NUM_MID_BITS));
 					offset = 1 << LZMA_LEN_NUM_LOW_BITS;
 					num_bits = LZMA_LEN_NUM_MID_BITS;
 				} else {
 					rc_update_bit_1(rc, prob_len);
 					prob_len = prob + LZMA_LEN_HIGH;
 					offset = ((1 << LZMA_LEN_NUM_LOW_BITS)
-							  + (1 << LZMA_LEN_NUM_MID_BITS));
+					          + (1 << LZMA_LEN_NUM_MID_BITS));
 					num_bits = LZMA_LEN_NUM_HIGH_BITS;
 				}
 			}
@@ -432,12 +446,10 @@
 				int pos_slot;
 
 				state += LZMA_NUM_LIT_STATES;
-				prob =
-					p + LZMA_POS_SLOT +
-					((len <
-					  LZMA_NUM_LEN_TO_POS_STATES ? len :
-					  LZMA_NUM_LEN_TO_POS_STATES - 1)
-					 << LZMA_NUM_POS_SLOT_BITS);
+				prob = p + LZMA_POS_SLOT +
+				       ((len < LZMA_NUM_LEN_TO_POS_STATES ? len :
+				         LZMA_NUM_LEN_TO_POS_STATES - 1)
+				         << LZMA_NUM_POS_SLOT_BITS);
 				rc_bit_tree_decode(rc, prob, LZMA_NUM_POS_SLOT_BITS,
 								   &pos_slot);
 				if (pos_slot >= LZMA_START_POS_MODEL_INDEX) {
@@ -468,12 +480,13 @@
 			}
 
 			len += LZMA_MATCH_MIN_LEN;
-
+ SKIP_FEATURE_LZMA_FAST(string:)
 			do {
 				pos = buffer_pos - rep0;
 				while (pos >= header.dict_size)
 					pos += header.dict_size;
 				previous_byte = buffer[pos];
+ SKIP_FEATURE_LZMA_FAST(one_byte:)
 				buffer[buffer_pos++] = previous_byte;
 				if (buffer_pos == header.dict_size) {
 					buffer_pos = 0;
@@ -487,7 +500,6 @@
 		}
 	}
 
-
 	if (full_write(dst_fd, buffer, buffer_pos) != buffer_pos) {
  bad:
 		rc_free(rc);




More information about the busybox-cvs mailing list