]> err.no Git - dpkg/commitdiff
New verrevcmp() from Anthony Towns
authorWichert Akkerman <wakkerma@debian.org>
Mon, 16 Jul 2001 13:17:20 +0000 (13:17 +0000)
committerWichert Akkerman <wakkerma@debian.org>
Mon, 16 Jul 2001 13:17:20 +0000 (13:17 +0000)
ChangeLog
debian/changelog
lib/vercmp.c
main/dpkg.8

index fb8b0d68fcff234d77c35a561ec698ea5b08ab89..7bc12e3bfd8b05d58fb93343e78402f4df3edada 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon Jul 16 14:10:18 CEST 2001 Wichert Akkerman <wakkerma@debian.org>
+
+  * lib/vercmp.c: New verrevcmp() from Anthony Towns
+
 Mon Jul 16 13:27:44 CEST 2001 Wichert Akkerman <wakkerma@debian.org>
 
   * Merge a modified patch from Josip Rodin:
index 4f44452ce9ec8888b9ea199fa827b32e84bb0857..55920f202316484fc13b01aac9dd61747e41b24a 100644 (file)
@@ -24,6 +24,8 @@ dpkg (1.10) unstable; urgency=low
     consistent with the package list
   * Fix test for nice(2) failure in start-stop-daemon. Closes: Bug#104561
   * Improve the dselect helpscreen a bit. Closes: Bug#72634
+  * New version comparison routine that can handle arbitrarily large numbers
+    and accepts `~' as a low-sorting character. Closes: Bug#93386
 
  -- Wichert Akkerman <wakkerma@debian.org>  UNRELEASED
 
index 390fd5387217510d240c00a3d0b70fa21cdd7541..56b068f3a72e0629d38337954c1ddfcb5ab1ced5 100644 (file)
@@ -32,6 +32,41 @@ int epochsdiffer(const struct versionrevision *a,
   return a->epoch != b->epoch;
 }
 
+/* assume ascii; warning: evaluates x multiple times! */
+#define order(x) ((x) == '~' ? -1 \
+               : isdigit((x)) ? 0 \
+               : !(x) ? 0 \
+               : isalpha((x)) ? (x) \
+               : (x) + 256)
+
+static int verrevcmp(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;
+}
+
+
+#if 0
 static int verrevcmp(const char *ival, const char *iref) {
   static char empty[] = "";
   int vc, rc;
@@ -64,6 +99,7 @@ static int verrevcmp(const char *ival, const char *iref) {
     if (!*ref) return +1;
   }
 }
+#endif
 
 int versioncompare(const struct versionrevision *version,
                    const struct versionrevision *refversion) {
index 84bc01b555cea08ccb1d5e7721a2da740dc57260..143b63aaa60ec178e5da818ccac863eeac3b7cdd 100644 (file)
@@ -507,6 +507,16 @@ The program \fBdpkg\fP will execute while starting a new shell.
 .B COLUMNS
 Sets the number of columns \fBdpkg\fP should use when displaying formatted
 text.  Currently only used by -l.
+.TP
+.B DPKG_OLD_CONFFILE
+Set by \fBdpkg\fP to the filename of the old configuration file 
+when you start a shell to examine a changed configuration.
+file.
+.TP
+.B DPKG_NEW_CONFFILE
+Set by \fBdpkg\fP to the filename of the newversion of a configuration file
+when you start a shell to examine a changed configuration.
+file.
 
 .SH EXAMPLES
 To list packages related to the editor vi: