wok-current rev 3214

busybox: add replay, speedup unlzma
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu May 28 13:57:09 2009 +0200 (2009-05-28)
parents db989f95819d
children 2ebadeb1077e
files busybox/receipt busybox/stuff/busybox-1.12.0-replay.u busybox/stuff/busybox-1.12.0-unlzma.u busybox/stuff/busybox-1.12.0.config
line diff
     1.1 --- a/busybox/receipt	Thu May 28 11:47:11 2009 +0200
     1.2 +++ b/busybox/receipt	Thu May 28 13:57:09 2009 +0200
     1.3 @@ -34,6 +34,8 @@
     1.4  mkswap.u
     1.5  install.u
     1.6  basename.u
     1.7 +unlzma.u
     1.8 +replay.u
     1.9  EOT
    1.10      cp ../stuff/$PACKAGE-$VERSION.config .config
    1.11      make oldconfig
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/busybox/stuff/busybox-1.12.0-replay.u	Thu May 28 13:57:09 2009 +0200
     2.3 @@ -0,0 +1,222 @@
     2.4 +--- busybox-1.12.0/util-linux/script.c
     2.5 ++++ busybox-1.12.0/util-linux/script.c
     2.6 +@@ -36,6 +36,15 @@
     2.7 + 	const char *shell;
     2.8 + 	char shell_opt[] = "-i";
     2.9 + 	char *shell_arg = NULL;
    2.10 ++	enum {
    2.11 ++		OPT_a = (1 << 0),
    2.12 ++		OPT_c = (1 << 1),
    2.13 ++		OPT_f = (1 << 2),
    2.14 ++		OPT_q = (1 << 3),
    2.15 ++#if ENABLE_REPLAY
    2.16 ++		OPT_t = (1 << 4),
    2.17 ++#endif
    2.18 ++	};
    2.19 + 
    2.20 + #if ENABLE_GETOPT_LONG
    2.21 + 	static const char getopt_longopts[] ALIGN1 =
    2.22 +@@ -43,25 +52,28 @@
    2.23 + 		"command\0" Required_argument "c"
    2.24 + 		"flush\0"   No_argument       "f"
    2.25 + 		"quiet\0"   No_argument       "q"
    2.26 ++# if ENABLE_REPLAY
    2.27 ++		"timing\0"  No_argument       "t"
    2.28 ++# endif
    2.29 + 		;
    2.30 + 
    2.31 + 	applet_long_options = getopt_longopts;
    2.32 + #endif
    2.33 + 	opt_complementary = "?1"; /* max one arg */
    2.34 +-	opt = getopt32(argv, "ac:fq", &shell_arg);
    2.35 ++	opt = getopt32(argv, "ac:fq" USE_REPLAY("t") , &shell_arg);
    2.36 + 	//argc -= optind;
    2.37 + 	argv += optind;
    2.38 + 	if (argv[0]) {
    2.39 + 		fname = argv[0];
    2.40 + 	}
    2.41 + 	mode = O_CREAT|O_TRUNC|O_WRONLY;
    2.42 +-	if (opt & 1) {
    2.43 ++	if (opt & OPT_a) {
    2.44 + 		mode = O_CREAT|O_APPEND|O_WRONLY;
    2.45 + 	}
    2.46 +-	if (opt & 2) {
    2.47 ++	if (opt & OPT_c) {
    2.48 + 		shell_opt[1] = 'c';
    2.49 + 	}
    2.50 +-	if (!(opt & 8)) { /* not -q */
    2.51 ++	if (!(opt & OPT_q)) {
    2.52 + 		printf("Script started, file is %s\n", fname);
    2.53 + 	}
    2.54 + 	shell = getenv("SHELL");
    2.55 +@@ -97,6 +109,10 @@
    2.56 + #define buf bb_common_bufsiz1
    2.57 + 		struct pollfd pfd[2];
    2.58 + 		int outfd, count, loop;
    2.59 ++#if ENABLE_REPLAY
    2.60 ++		struct timeval tv;
    2.61 ++		double oldtime=time(NULL), newtime;
    2.62 ++#endif
    2.63 + 
    2.64 + 		outfd = xopen(fname, mode);
    2.65 + 		pfd[0].fd = pty;
    2.66 +@@ -118,15 +134,27 @@
    2.67 + 			}
    2.68 + 			if (pfd[0].revents) {
    2.69 + 				errno = 0;
    2.70 ++#if ENABLE_REPLAY
    2.71 ++				if (opt & OPT_t) {
    2.72 ++					gettimeofday(&tv, NULL);
    2.73 ++				}
    2.74 ++#endif
    2.75 + 				count = safe_read(pty, buf, sizeof(buf));
    2.76 + 				if (count <= 0 && errno != EAGAIN) {
    2.77 + 					/* err/eof from pty: exit */
    2.78 + 					goto restore;
    2.79 + 				}
    2.80 + 				if (count > 0) {
    2.81 ++#if ENABLE_REPLAY
    2.82 ++					if (opt & OPT_t) {
    2.83 ++						newtime = tv.tv_sec + (double) tv.tv_usec / 1000000;
    2.84 ++						fprintf(stderr, "%f %i\n", newtime - oldtime, count);
    2.85 ++						oldtime = newtime;
    2.86 ++					}
    2.87 ++#endif
    2.88 + 					full_write(STDOUT_FILENO, buf, count);
    2.89 + 					full_write(outfd, buf, count);
    2.90 +-					if (opt & 4) { /* -f */
    2.91 ++					if (opt & OPT_f) {
    2.92 + 						fsync(outfd);
    2.93 + 					}
    2.94 + 				}
    2.95 +@@ -158,7 +186,7 @@
    2.96 +  restore:
    2.97 + 		if (attr_ok == 0)
    2.98 + 			tcsetattr(0, TCSAFLUSH, &tt);
    2.99 +-		if (!(opt & 8)) /* not -q */
   2.100 ++		if (!(opt & OPT_q))
   2.101 + 			printf("Script done, file is %s\n", fname);
   2.102 + 		return EXIT_SUCCESS;
   2.103 + 	}
   2.104 +
   2.105 +--- busybox-1.12.0/util-linux/Config.in
   2.106 ++++ busybox-1.12.0/util-linux/Config.in
   2.107 +@@ -719,6 +719,13 @@
   2.108 + 	help
   2.109 + 	  This allows you to parse /proc/profile for basic profiling.
   2.110 + 
   2.111 ++config REPLAY
   2.112 ++	bool "replay"
   2.113 ++	default n
   2.114 ++	help
   2.115 ++	  This program replays a typescript, using timing information
   2.116 ++	  given by script -t.
   2.117 ++
   2.118 + config RTCWAKE
   2.119 + 	bool "rtcwake"
   2.120 + 	default n
   2.121 +
   2.122 +--- busybox-1.12.0/util-linux/Kbuild
   2.123 ++++ busybox-1.12.0/util-linux/Kbuild
   2.124 +@@ -28,6 +28,7 @@
   2.125 + lib-$(CONFIG_RDATE)             += rdate.o
   2.126 + lib-$(CONFIG_RDEV)              += rdev.o
   2.127 + lib-$(CONFIG_READPROFILE)       += readprofile.o
   2.128 ++lib-$(CONFIG_REPLAY)            += replay.o
   2.129 + lib-$(CONFIG_RTCWAKE)           += rtcwake.o
   2.130 + lib-$(CONFIG_SCRIPT)            += script.o
   2.131 + lib-$(CONFIG_SETARCH)           += setarch.o
   2.132 +
   2.133 +--- busybox-1.12.0/include/applets.h
   2.134 +USE_RM(APPLET_NOFORK(rm, rm, _BB_DIR_BIN, _BB_SUID_NEVER, rm))
   2.135 ++++ busybox-1.12.0/include/applets.h
   2.136 +@@ -294,6 +294,7 @@
   2.137 + USE_REALPATH(APPLET(realpath, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
   2.138 + USE_HALT(APPLET_ODDNAME(reboot, halt, _BB_DIR_SBIN, _BB_SUID_NEVER, reboot))
   2.139 + USE_RENICE(APPLET(renice, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
   2.140 ++USE_REPLAY(APPLET(replay, _BB_DIR_BIN, _BB_SUID_NEVER))
   2.141 + USE_RESET(APPLET(reset, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
   2.142 + USE_RESIZE(APPLET(resize, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
   2.143 + USE_RESTORECON(APPLET_ODDNAME(restorecon, setfiles, _BB_DIR_SBIN, _BB_SUID_NEVER, restorecon))
   2.144 +
   2.145 +--- busybox-1.12.0/include/usage.h
   2.146 ++++ busybox-1.12.0/include/usage.h
   2.147 +@@ -3244,6 +3244,11 @@
   2.148 +      "\n	-g	Process group id(s)" \
   2.149 +      "\n	-u	Process user name(s) and/or id(s)" \
   2.150 + 
   2.151 ++#define replay_trivial_usage \
   2.152 ++       "timingfile [typescript [divisor]]"
   2.153 ++#define replay_full_usage "\n\n" \
   2.154 ++       "Play back typescripts, using timing information"
   2.155 ++
   2.156 + #define reset_trivial_usage \
   2.157 +        ""
   2.158 + #define reset_full_usage "\n\n" \
   2.159 +@@ -3426,13 +3431,20 @@
   2.160 + 
   2.161 + #define script_trivial_usage \
   2.162 +        "[-afq] [-c COMMAND] [OUTFILE]"
   2.163 +-#define script_full_usage "\n\n" \
   2.164 ++#define script_full_usage_base "\n\n" \
   2.165 +        "Options:" \
   2.166 +      "\n	-a	Append output" \
   2.167 +      "\n	-c	Run COMMAND, not shell" \
   2.168 +      "\n	-f	Flush output after each write" \
   2.169 +      "\n	-q	Quiet" \
   2.170 + 
   2.171 ++#ifdef USE_REPLAY
   2.172 ++#define script_full_usage script_full_usage_base \
   2.173 ++     "\n	-t	Send timing to stderr"
   2.174 ++#else
   2.175 ++#define script_full_usage script_full_usage_base
   2.176 ++#endif
   2.177 ++
   2.178 + #define sed_trivial_usage \
   2.179 +        "[-efinr] pattern [files...]"
   2.180 + #define sed_full_usage "\n\n" \
   2.181 +
   2.182 +--- busybox-1.12.0/util-linux/replay.c
   2.183 ++++ busybox-1.12.0/util-linux/replay.c
   2.184 +@@ -0,0 +1,41 @@
   2.185 ++/* vi: set sw=4 ts=4: */
   2.186 ++/*
   2.187 ++ * replay - play back typescripts, using timing information
   2.188 ++ *
   2.189 ++ * pascal.bellard@ads-lu.com
   2.190 ++ *
   2.191 ++ * Licensed under GPLv2 or later, see file License in this tarball for details.
   2.192 ++ *
   2.193 ++ */
   2.194 ++
   2.195 ++#include "libbb.h"
   2.196 ++
   2.197 ++int replay_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
   2.198 ++int replay_main(int argc, char **argv)
   2.199 ++{
   2.200 ++	const char *script = "typescript";
   2.201 ++	double delay, factor = 1000000.0;
   2.202 ++	int fd;
   2.203 ++	long count;
   2.204 ++	FILE *tfp;
   2.205 ++
   2.206 ++	switch (argc) {
   2.207 ++	case 4: factor /= atof(argv[3]);
   2.208 ++	case 3: script = argv[2];
   2.209 ++	case 2:	break;
   2.210 ++	default:
   2.211 ++		bb_show_usage();
   2.212 ++	}
   2.213 ++
   2.214 ++	tfp = xfopen_for_read(argv[1]);
   2.215 ++	fd = open(script, O_RDONLY);
   2.216 ++	while (fscanf(tfp, "%lf %ld\n", &delay, &count) == 2) {
   2.217 ++		usleep(delay * factor);
   2.218 ++		bb_copyfd_exact_size(fd, STDOUT_FILENO, count);
   2.219 ++	}
   2.220 ++#if ENABLE_FEATURE_CLEAN_UP
   2.221 ++	close(fd);
   2.222 ++	fclose(tfp);
   2.223 ++#endif
   2.224 ++	return EXIT_SUCCESS;
   2.225 ++}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/busybox/stuff/busybox-1.12.0-unlzma.u	Thu May 28 13:57:09 2009 +0200
     3.3 @@ -0,0 +1,302 @@
     3.4 +--- busybox-1.12.0/archival/libunarchive/decompress_unlzma.c
     3.5 ++++ busybox-1.12.0/archival/libunarchive/decompress_unlzma.c
     3.6 +@@ -14,8 +14,10 @@
     3.7 + 
     3.8 + #if ENABLE_FEATURE_LZMA_FAST
     3.9 + #  define speed_inline ALWAYS_INLINE
    3.10 ++#  define size_inline
    3.11 + #else
    3.12 + #  define speed_inline
    3.13 ++#  define size_inline ALWAYS_INLINE
    3.14 + #endif
    3.15 + 
    3.16 + 
    3.17 +@@ -44,8 +46,8 @@
    3.18 + #define RC_MODEL_TOTAL_BITS 11
    3.19 + 
    3.20 + 
    3.21 +-/* Called twice: once at startup and once in rc_normalize() */
    3.22 +-static void rc_read(rc_t *rc)
    3.23 ++/* Called twice: once at startup (LZMA_FAST only) and once in rc_normalize() */
    3.24 ++static size_inline void rc_read(rc_t *rc)
    3.25 + {
    3.26 + 	int buffer_size = safe_read(rc->fd, RC_BUFFER, RC_BUFFER_SIZE);
    3.27 + 	if (buffer_size <= 0)
    3.28 +@@ -54,8 +56,17 @@
    3.29 + 	rc->buffer_end = RC_BUFFER + buffer_size;
    3.30 + }
    3.31 + 
    3.32 ++/* Called twice, but one callsite is in speed_inline'd rc_is_bit_1() */
    3.33 ++static void rc_do_normalize(rc_t *rc)
    3.34 ++{
    3.35 ++	if (rc->ptr >= rc->buffer_end)
    3.36 ++		rc_read(rc);
    3.37 ++	rc->range <<= 8;
    3.38 ++	rc->code = (rc->code << 8) | *rc->ptr++;
    3.39 ++}
    3.40 ++
    3.41 + /* Called once */
    3.42 +-static rc_t* rc_init(int fd) /*, int buffer_size) */
    3.43 ++static ALWAYS_INLINE rc_t* rc_init(int fd) /*, int buffer_size) */
    3.44 + {
    3.45 + 	int i;
    3.46 + 	rc_t *rc;
    3.47 +@@ -63,17 +74,18 @@
    3.48 + 	rc = xmalloc(sizeof(*rc) + RC_BUFFER_SIZE);
    3.49 + 
    3.50 + 	rc->fd = fd;
    3.51 +-	/* rc->buffer_size = buffer_size; */
    3.52 +-	rc->buffer_end = RC_BUFFER + RC_BUFFER_SIZE;
    3.53 + 	rc->ptr = rc->buffer_end;
    3.54 + 
    3.55 +-	rc->code = 0;
    3.56 +-	rc->range = 0xFFFFFFFF;
    3.57 + 	for (i = 0; i < 5; i++) {
    3.58 ++#if ENABLE_FEATURE_LZMA_FAST
    3.59 + 		if (rc->ptr >= rc->buffer_end)
    3.60 + 			rc_read(rc);
    3.61 + 		rc->code = (rc->code << 8) | *rc->ptr++;
    3.62 ++#else
    3.63 ++		rc_do_normalize(rc);
    3.64 ++#endif
    3.65 + 	}
    3.66 ++	rc->range = 0xFFFFFFFF;
    3.67 + 	return rc;
    3.68 + }
    3.69 + 
    3.70 +@@ -83,14 +95,6 @@
    3.71 + 	free(rc);
    3.72 + }
    3.73 + 
    3.74 +-/* Called twice, but one callsite is in speed_inline'd rc_is_bit_0_helper() */
    3.75 +-static void rc_do_normalize(rc_t *rc)
    3.76 +-{
    3.77 +-	if (rc->ptr >= rc->buffer_end)
    3.78 +-		rc_read(rc);
    3.79 +-	rc->range <<= 8;
    3.80 +-	rc->code = (rc->code << 8) | *rc->ptr++;
    3.81 +-}
    3.82 + static ALWAYS_INLINE void rc_normalize(rc_t *rc)
    3.83 + {
    3.84 + 	if (rc->range < (1 << RC_TOP_BITS)) {
    3.85 +@@ -98,49 +102,30 @@
    3.86 + 	}
    3.87 + }
    3.88 + 
    3.89 +-/* rc_is_bit_0 is called 9 times */
    3.90 +-/* Why rc_is_bit_0_helper exists?
    3.91 +- * Because we want to always expose (rc->code < rc->bound) to optimizer.
    3.92 +- * Thus rc_is_bit_0 is always inlined, and rc_is_bit_0_helper is inlined
    3.93 +- * only if we compile for speed.
    3.94 +- */
    3.95 +-static speed_inline uint32_t rc_is_bit_0_helper(rc_t *rc, uint16_t *p)
    3.96 ++/* rc_is_bit_1 is called 9 times */
    3.97 ++static speed_inline int rc_is_bit_1(rc_t *rc, uint16_t *p)
    3.98 + {
    3.99 + 	rc_normalize(rc);
   3.100 + 	rc->bound = *p * (rc->range >> RC_MODEL_TOTAL_BITS);
   3.101 +-	return rc->bound;
   3.102 ++	if (rc->code < rc->bound) {
   3.103 ++		rc->range = rc->bound;
   3.104 ++		*p += ((1 << RC_MODEL_TOTAL_BITS) - *p) >> RC_MOVE_BITS;
   3.105 ++		return 0;
   3.106 ++	}
   3.107 ++	else {
   3.108 ++		rc->range -= rc->bound;
   3.109 ++		rc->code -= rc->bound;
   3.110 ++		*p -= *p >> RC_MOVE_BITS;
   3.111 ++		return 1;
   3.112 ++	}
   3.113 + }
   3.114 +-static ALWAYS_INLINE int rc_is_bit_0(rc_t *rc, uint16_t *p)
   3.115 +-{
   3.116 +-	uint32_t t = rc_is_bit_0_helper(rc, p);
   3.117 +-	return rc->code < t;
   3.118 +-}
   3.119 + 
   3.120 +-/* Called ~10 times, but very small, thus inlined */
   3.121 +-static speed_inline void rc_update_bit_0(rc_t *rc, uint16_t *p)
   3.122 +-{
   3.123 +-	rc->range = rc->bound;
   3.124 +-	*p += ((1 << RC_MODEL_TOTAL_BITS) - *p) >> RC_MOVE_BITS;
   3.125 +-}
   3.126 +-static speed_inline void rc_update_bit_1(rc_t *rc, uint16_t *p)
   3.127 +-{
   3.128 +-	rc->range -= rc->bound;
   3.129 +-	rc->code -= rc->bound;
   3.130 +-	*p -= *p >> RC_MOVE_BITS;
   3.131 +-}
   3.132 +-
   3.133 + /* Called 4 times in unlzma loop */
   3.134 +-static int rc_get_bit(rc_t *rc, uint16_t *p, int *symbol)
   3.135 ++static speed_inline int rc_get_bit(rc_t *rc, uint16_t *p, int *symbol)
   3.136 + {
   3.137 +-	if (rc_is_bit_0(rc, p)) {
   3.138 +-		rc_update_bit_0(rc, p);
   3.139 +-		*symbol *= 2;
   3.140 +-		return 0;
   3.141 +-	} else {
   3.142 +-		rc_update_bit_1(rc, p);
   3.143 +-		*symbol = *symbol * 2 + 1;
   3.144 +-		return 1;
   3.145 +-	}
   3.146 ++	int ret = rc_is_bit_1(rc, p);
   3.147 ++	*symbol = *symbol * 2 + ret;
   3.148 ++	return ret;
   3.149 + }
   3.150 + 
   3.151 + /* Called once */
   3.152 +@@ -266,13 +251,13 @@
   3.153 + 	header.dst_size = SWAP_LE64(header.dst_size);
   3.154 + 
   3.155 + 	if (header.dict_size == 0)
   3.156 +-		header.dict_size = 1;
   3.157 ++		header.dict_size++;
   3.158 + 
   3.159 + 	buffer = xmalloc(MIN(header.dst_size, header.dict_size));
   3.160 + 
   3.161 + 	num_probs = LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp));
   3.162 + 	p = xmalloc(num_probs * sizeof(*p));
   3.163 +-	num_probs = LZMA_LITERAL + (LZMA_LIT_SIZE << (lc + lp));
   3.164 ++	num_probs += LZMA_LITERAL - LZMA_BASE_SIZE;
   3.165 + 	for (i = 0; i < num_probs; i++)
   3.166 + 		p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1;
   3.167 + 
   3.168 +@@ -282,9 +267,8 @@
   3.169 + 		int pos_state = (buffer_pos + global_pos) & pos_state_mask;
   3.170 + 
   3.171 + 		prob = p + LZMA_IS_MATCH + (state << LZMA_NUM_POS_BITS_MAX) + pos_state;
   3.172 +-		if (rc_is_bit_0(rc, prob)) {
   3.173 ++		if (!rc_is_bit_1(rc, prob)) {
   3.174 + 			mi = 1;
   3.175 +-			rc_update_bit_0(rc, prob);
   3.176 + 			prob = (p + LZMA_LITERAL
   3.177 + 			        + (LZMA_LIT_SIZE * ((((buffer_pos + global_pos) & literal_pos_mask) << lc)
   3.178 + 			                            + (previous_byte >> (8 - lc))
   3.179 +@@ -340,26 +324,21 @@
   3.180 + 			int offset;
   3.181 + 			uint16_t *prob_len;
   3.182 + 
   3.183 +-			rc_update_bit_1(rc, prob);
   3.184 + 			prob = p + LZMA_IS_REP + state;
   3.185 +-			if (rc_is_bit_0(rc, prob)) {
   3.186 +-				rc_update_bit_0(rc, prob);
   3.187 ++			if (!rc_is_bit_1(rc, prob)) {
   3.188 + 				rep3 = rep2;
   3.189 + 				rep2 = rep1;
   3.190 + 				rep1 = rep0;
   3.191 + 				state = state < LZMA_NUM_LIT_STATES ? 0 : 3;
   3.192 + 				prob = p + LZMA_LEN_CODER;
   3.193 + 			} else {
   3.194 +-				rc_update_bit_1(rc, prob);
   3.195 +-				prob = p + LZMA_IS_REP_G0 + state;
   3.196 +-				if (rc_is_bit_0(rc, prob)) {
   3.197 +-					rc_update_bit_0(rc, prob);
   3.198 ++				prob += LZMA_IS_REP_G0 - LZMA_IS_REP;
   3.199 ++				if (!rc_is_bit_1(rc, prob)) {
   3.200 + 					prob = (p + LZMA_IS_REP_0_LONG
   3.201 + 					        + (state << LZMA_NUM_POS_BITS_MAX)
   3.202 + 					        + pos_state
   3.203 + 					);
   3.204 +-					if (rc_is_bit_0(rc, prob)) {
   3.205 +-						rc_update_bit_0(rc, prob);
   3.206 ++					if (!rc_is_bit_1(rc, prob)) {
   3.207 + 
   3.208 + 						state = state < LZMA_NUM_LIT_STATES ? 9 : 11;
   3.209 + #if ENABLE_FEATURE_LZMA_FAST
   3.210 +@@ -372,25 +351,16 @@
   3.211 + 						len = 1;
   3.212 + 						goto string;
   3.213 + #endif
   3.214 +-					} else {
   3.215 +-						rc_update_bit_1(rc, prob);
   3.216 + 					}
   3.217 + 				} else {
   3.218 + 					uint32_t distance;
   3.219 + 
   3.220 +-					rc_update_bit_1(rc, prob);
   3.221 +-					prob = p + LZMA_IS_REP_G1 + state;
   3.222 +-					if (rc_is_bit_0(rc, prob)) {
   3.223 +-						rc_update_bit_0(rc, prob);
   3.224 +-						distance = rep1;
   3.225 +-					} else {
   3.226 +-						rc_update_bit_1(rc, prob);
   3.227 +-						prob = p + LZMA_IS_REP_G2 + state;
   3.228 +-						if (rc_is_bit_0(rc, prob)) {
   3.229 +-							rc_update_bit_0(rc, prob);
   3.230 +-							distance = rep2;
   3.231 +-						} else {
   3.232 +-							rc_update_bit_1(rc, prob);
   3.233 ++					prob += LZMA_IS_REP_G1 - LZMA_IS_REP_G0;
   3.234 ++					distance = rep1;
   3.235 ++					if (rc_is_bit_1(rc, prob)) {
   3.236 ++						prob += LZMA_IS_REP_G2 - LZMA_IS_REP_G1;
   3.237 ++						distance = rep2;
   3.238 ++						if (rc_is_bit_1(rc, prob)) {
   3.239 + 							distance = rep3;
   3.240 + 							rep3 = rep2;
   3.241 + 						}
   3.242 +@@ -404,24 +374,20 @@
   3.243 + 			}
   3.244 + 
   3.245 + 			prob_len = prob + LZMA_LEN_CHOICE;
   3.246 +-			if (rc_is_bit_0(rc, prob_len)) {
   3.247 +-				rc_update_bit_0(rc, prob_len);
   3.248 +-				prob_len = (prob + LZMA_LEN_LOW
   3.249 +-				            + (pos_state << LZMA_LEN_NUM_LOW_BITS));
   3.250 ++			if (!rc_is_bit_1(rc, prob_len)) {
   3.251 ++				prob_len += LZMA_LEN_LOW - LZMA_LEN_CHOICE
   3.252 ++				            + (pos_state << LZMA_LEN_NUM_LOW_BITS);
   3.253 + 				offset = 0;
   3.254 + 				num_bits = LZMA_LEN_NUM_LOW_BITS;
   3.255 + 			} else {
   3.256 +-				rc_update_bit_1(rc, prob_len);
   3.257 +-				prob_len = prob + LZMA_LEN_CHOICE_2;
   3.258 +-				if (rc_is_bit_0(rc, prob_len)) {
   3.259 +-					rc_update_bit_0(rc, prob_len);
   3.260 +-					prob_len = (prob + LZMA_LEN_MID
   3.261 +-					            + (pos_state << LZMA_LEN_NUM_MID_BITS));
   3.262 ++				prob_len += LZMA_LEN_CHOICE_2 - LZMA_LEN_CHOICE;
   3.263 ++				if (!rc_is_bit_1(rc, prob_len)) {
   3.264 ++					prob_len += LZMA_LEN_MID - LZMA_LEN_CHOICE_2
   3.265 ++					            + (pos_state << LZMA_LEN_NUM_MID_BITS);
   3.266 + 					offset = 1 << LZMA_LEN_NUM_LOW_BITS;
   3.267 + 					num_bits = LZMA_LEN_NUM_MID_BITS;
   3.268 + 				} else {
   3.269 +-					rc_update_bit_1(rc, prob_len);
   3.270 +-					prob_len = prob + LZMA_LEN_HIGH;
   3.271 ++					prob_len += LZMA_LEN_HIGH - LZMA_LEN_CHOICE_2;
   3.272 + 					offset = ((1 << LZMA_LEN_NUM_LOW_BITS)
   3.273 + 					          + (1 << LZMA_LEN_NUM_MID_BITS));
   3.274 + 					num_bits = LZMA_LEN_NUM_HIGH_BITS;
   3.275 +@@ -440,17 +406,18 @@
   3.276 + 				         << LZMA_NUM_POS_SLOT_BITS);
   3.277 + 				rc_bit_tree_decode(rc, prob, LZMA_NUM_POS_SLOT_BITS,
   3.278 + 								   &pos_slot);
   3.279 ++				rep0 = pos_slot;
   3.280 + 				if (pos_slot >= LZMA_START_POS_MODEL_INDEX) {
   3.281 + 					num_bits = (pos_slot >> 1) - 1;
   3.282 + 					rep0 = 2 | (pos_slot & 1);
   3.283 ++					prob = p + LZMA_ALIGN;
   3.284 + 					if (pos_slot < LZMA_END_POS_MODEL_INDEX) {
   3.285 + 						rep0 <<= num_bits;
   3.286 +-						prob = p + LZMA_SPEC_POS + rep0 - pos_slot - 1;
   3.287 ++						prob += LZMA_SPEC_POS - LZMA_ALIGN - 1 + rep0 - pos_slot ;
   3.288 + 					} else {
   3.289 + 						num_bits -= LZMA_NUM_ALIGN_BITS;
   3.290 + 						while (num_bits--)
   3.291 + 							rep0 = (rep0 << 1) | rc_direct_bit(rc);
   3.292 +-						prob = p + LZMA_ALIGN;
   3.293 + 						rep0 <<= LZMA_NUM_ALIGN_BITS;
   3.294 + 						num_bits = LZMA_NUM_ALIGN_BITS;
   3.295 + 					}
   3.296 +@@ -461,8 +428,7 @@
   3.297 + 							rep0 |= i;
   3.298 + 						i <<= 1;
   3.299 + 					}
   3.300 +-				} else
   3.301 +-					rep0 = pos_slot;
   3.302 ++				}
   3.303 + 				if (++rep0 == 0)
   3.304 + 					break;
   3.305 + 			}
     4.1 --- a/busybox/stuff/busybox-1.12.0.config	Thu May 28 11:47:11 2009 +0200
     4.2 +++ b/busybox/stuff/busybox-1.12.0.config	Thu May 28 13:57:09 2009 +0200
     4.3 @@ -1,7 +1,7 @@
     4.4  #
     4.5  # Automatically generated make config: don't edit
     4.6  # Busybox version: 1.12.0
     4.7 -# Wed May 27 18:07:33 2009
     4.8 +# Thu May 28 13:47:09 2009
     4.9  #
    4.10  CONFIG_HAVE_DOT_CONFIG=y
    4.11  
    4.12 @@ -500,7 +500,7 @@
    4.13  CONFIG_FEATURE_VOLUMEID_EXT=y
    4.14  CONFIG_FEATURE_VOLUMEID_REISERFS=y
    4.15  CONFIG_FEATURE_VOLUMEID_FAT=y
    4.16 -# CONFIG_FEATURE_VOLUMEID_HFS is not set
    4.17 +CONFIG_FEATURE_VOLUMEID_HFS=y
    4.18  # CONFIG_FEATURE_VOLUMEID_JFS is not set
    4.19  CONFIG_FEATURE_VOLUMEID_XFS=y
    4.20  CONFIG_FEATURE_VOLUMEID_NTFS=y
    4.21 @@ -526,6 +526,7 @@
    4.22  CONFIG_RDATE=y
    4.23  # CONFIG_RDEV is not set
    4.24  CONFIG_READPROFILE=y
    4.25 +CONFIG_REPLAY=y
    4.26  # CONFIG_RTCWAKE is not set
    4.27  CONFIG_SCRIPT=y
    4.28  CONFIG_SETARCH=y