Helps to hit Reply all rather than Reply

---
Hopefully this works better.

Eugene

Denys Vlasenko wrote:
On Wednesday 19 November 2008 22:54, Eugene T. Bordenkircher wrote:
Hello all,

Below, you'll find a patch against the current SVN head to fix a couple of bugs in the version comparison code for dpkg. As a brief explanation: (1) the old code did not handle epochs that were greater than a single digit, and (2) it did not compare alpha() portions of the version string correctly, most notably portions that included ~'s and other punctuation.

You'll notice that the solution is almost a mirror image of the official code in dpkg. I looked at it and couldn't think of any better way than that to do the comparison. I added the copyright information at the top to make it official.

So it correctly compares versions now and probably more importantly to some:

    text           data     bss     dec     hex filename
  688420           2168    9388  699976   aae48 busybox.orig/busybox
  688273           2168    9388  699829   aadb5 busybox.new/busybox

Enjoy, and let me know if there is anything I missed or need to do a bit differently.

Patch appears to be corrupted:

# patch -p1 </tmp/dpkg_version_comparison.diff --dry-run
patching file archival/dpkg.c
Hunk #1 FAILED at 6.
Hunk #2 FAILED at 32.
Hunk #3 FAILED at 189.
Hunk #4 FAILED at 237.
Hunk #5 FAILED at 263.
5 out of 5 hunks FAILED -- saving rejects to file archival/dpkg.c.rej

Please resend as an attachment instead of cut-n-paste.
--
vda



--
Eugene T. Bordenkircher
[EMAIL PROTECTED]

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFIXwV3dDGWbBTETf8RAhvKAJ9EAwNxecoKh/cgToujZO+DmOv6GACeO0Jr
W+jn2V1RjJeVq9YsuBGJuJg=
=RS4u
-----END PGP SIGNATURE-----


--
Eugene T. Bordenkircher
[EMAIL PROTECTED]

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFIXwV3dDGWbBTETf8RAhvKAJ9EAwNxecoKh/cgToujZO+DmOv6GACeO0Jr
W+jn2V1RjJeVq9YsuBGJuJg=
=RS4u
-----END PGP SIGNATURE-----
--- busybox.orig/archival/dpkg.c	2008-11-19 12:48:29.000000000 -0800
+++ busybox.new/archival/dpkg.c	2008-11-19 12:56:43.000000000 -0800
@@ -6,6 +6,10 @@
  *  written by glenn mcgrath with the help of others
  *  copyright (c) 2001 by glenn mcgrath
  *
+ *  parts of the version comparison code is plucked from the real dpkg
+ *  application which is licensed GPLv2 and
+ *  copyright (c) 1995 Ian Jackson <[EMAIL PROTECTED]>
+ *
  *  started life as a busybox implementation of udpkg
  *
  * licensed under gplv2 or later, see file license in this tarball for details.
@@ -28,6 +32,8 @@
 #include <fnmatch.h>
 #include "unarchive.h"
 
+#include <ctype.h>
+
 /* note: if you vary hash_prime sizes be aware,
  * 1) tweaking these will have a big effect on how much memory this program uses.
  * 2) for computational efficiency these hash tables should be at least 20%
@@ -183,60 +189,41 @@
 	return probe_address;
 }
 
-/* Need to rethink version comparison, maybe the official dpkg has something i can use ? */
-static int version_compare_part(const char *version1, const char *version2)
+/* This code is taken from dpkg and was converted to a function to save
+ * a few bytes in the text section of busybox */
+static int order( char x )
 {
-	int upstream_len1 = 0;
-	int upstream_len2 = 0;
-	char *name1_char;
-	char *name2_char;
-	int len1 = 0;
-	int len2 = 0;
-	int tmp_int;
-	int ver_num1;
-	int ver_num2;
-
-	if (version1 == NULL) {
-		version1 = xstrdup("");
-	}
-	if (version2 == NULL) {
-		version2 = xstrdup("");
-	}
-	upstream_len1 = strlen(version1);
-	upstream_len2 = strlen(version2);
-
-	while ((len1 < upstream_len1) || (len2 < upstream_len2)) {
-		/* Compare non-digit section */
-		tmp_int = strcspn(&version1[len1], "0123456789");
-		name1_char = xstrndup(&version1[len1], tmp_int);
-		len1 += tmp_int;
-		tmp_int = strcspn(&version2[len2], "0123456789");
-		name2_char = xstrndup(&version2[len2], tmp_int);
-		len2 += tmp_int;
-		tmp_int = strcmp(name1_char, name2_char);
-		free(name1_char);
-		free(name2_char);
-		if (tmp_int != 0) {
-			return tmp_int;
-		}
-
-		/* Compare digits */
-		tmp_int = strspn(&version1[len1], "0123456789");
-		name1_char = xstrndup(&version1[len1], tmp_int);
-		len1 += tmp_int;
-		tmp_int = strspn(&version2[len2], "0123456789");
-		name2_char = xstrndup(&version2[len2], tmp_int);
-		len2 += tmp_int;
-		ver_num1 = atoi(name1_char);
-		ver_num2 = atoi(name2_char);
-		free(name1_char);
-		free(name2_char);
-		if (ver_num1 < ver_num2) {
-			return -1;
+	return ( x == '~' ? -1
+			 : isdigit(x) ? 0
+			 : !(x) ? 0
+			 : isalpha(x) ? x
+			 : x + 256 );
 		}
-		if (ver_num1 > ver_num2) {
-			return 1;
+
+/* This code is taken from dpkg and modified slightly to work with busybox */
+static int version_compare_part(const char *val, const char *ref)
+{
+	if (!val) val = "";
+	if (!ref) ref = "";
+
+	while (*val || *ref) {
+		int first_diff = 0;
+
+		while ( (*val && !isdigit(*val)) || (*ref && !isdigit(*ref)) ) {
+			int vc = order(*val), rc = order(*ref);
+			if (vc != rc) return vc - rc;
+			val++; ref++;
+		}
+
+		while ( *val == '0' ) val++;
+		while ( *ref == '0' ) ref++;
+		while (isdigit(*val) && isdigit(*ref)) {
+			if (!first_diff) first_diff = *val - *ref;
+			val++; ref++;
 		}
+		if (isdigit(*val)) return 1;
+		if (isdigit(*ref)) return -1;
+		if (first_diff) return first_diff;
 	}
 	return 0;
 }
@@ -250,27 +237,23 @@
 	char *ch_ver1 = name_hashtable[ver1];
 	char *ch_ver2 = name_hashtable[ver2];
 
-	char epoch1, epoch2;
+	unsigned long epoch1 = 0, epoch2 = 0;
+	char *colon;
 	char *deb_ver1, *deb_ver2;
-	char *ver1_ptr, *ver2_ptr;
 	char *upstream_ver1;
 	char *upstream_ver2;
 	int result;
 
 	/* Compare epoch */
-	if (ch_ver1[1] == ':') {
-		epoch1 = ch_ver1[0];
-		ver1_ptr = strchr(ch_ver1, ':') + 1;
-	} else {
-		epoch1 = '0';
-		ver1_ptr = ch_ver1;
-	}
-	if (ch_ver2[1] == ':') {
-		epoch2 = ch_ver2[0];
-		ver2_ptr = strchr(ch_ver2, ':') + 1;
-	} else {
-		epoch2 = '0';
-		ver2_ptr = ch_ver2;
+	colon = strchr(ch_ver1,':');
+	if (colon) {
+		epoch1 = atoi(ch_ver1);
+		ch_ver1 = colon+1;
+	}
+	colon = strchr(ch_ver2,':');
+	if (colon) {
+		epoch2 = atoi(ch_ver2);
+		ch_ver2 = colon+1;
 	}
 	if (epoch1 < epoch2) {
 		return -1;
@@ -280,8 +263,8 @@
 	}
 
 	/* Compare upstream version */
-	upstream_ver1 = xstrdup(ver1_ptr);
-	upstream_ver2 = xstrdup(ver2_ptr);
+	upstream_ver1 = xstrdup(ch_ver1);
+	upstream_ver2 = xstrdup(ch_ver2);
 
 	/* Chop off debian version, and store for later use */
 	deb_ver1 = strrchr(upstream_ver1, '-');

_______________________________________________
busybox mailing list
busybox@busybox.net
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to