Usage: vercmp version1 lt|gt|le|ge|eq version2
return value 0 if true, else 1

It's a shorter version of this:
http://svn.openmoko.org/trunk/src/host/opkg-utils/opkg-compare-versions.c

It produces the same results..

It's meant to work like this:

ver1="3.1.2-9"
ver2="3.1.3-1"

if vercmp ${ver1} gt ${ver2} ; then
    ..actions..
fi

or you can uncomment this line:

//printf("%s\n", res == 0 ? "true" : "false");

Then it will print true or false, it's up to you..

This is just a suggestion in the form of a patch..
---
 miscutils/vercmp.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 miscutils/vercmp.c

diff --git a/miscutils/vercmp.c b/miscutils/vercmp.c
new file mode 100644
index 0000000..67af35b
--- /dev/null
+++ b/miscutils/vercmp.c
@@ -0,0 +1,83 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * libdpkg - Debian packaging suite library routines
+ * vercmp.c - comparison of version numbers
+ *
+ * Copyright (C) 1995 Ian Jackson <[email protected]>
+ *
+ * Licensed under GPLv2, see file LICENSE in this source tree
+ */
+
+//applet:IF_VERCMP(APPLET(vercmp, BB_DIR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_VERCMP) += vercmp.o
+
+//config:config VERCMP
+//config:      bool "vercmp"
+//config:      default n
+//config:      help
+//config:        Compare version strings
+
+//usage:#define vercmp_trivial_usage
+//usage:       "version1 lt|gt|le|ge|eq version2"
+//usage:#define vercmp_full_usage "\n\n"
+//usage:       "return value 0 if true, else 1\n\n"
+//usage:       "l = less, g = greater, t = than, e|eq = equal"
+
+#include "libbb.h"
+
+static int ver_cmp(const char *val, const char *ref)
+{
+       int vc, rc;
+       long vl, rl;
+       const char *vp, *rp;
+       const char *vsep, *rsep;
+
+       for (;;) {
+               vp= val;  while (*vp && !isdigit(*vp)) vp++;
+               rp= ref;  while (*rp && !isdigit(*rp)) rp++;
+               for (;;) {
+                       vc= val == vp ? 0 : *val++;
+                       rc= ref == rp ? 0 : *ref++;
+                       if (!rc && !vc) break;
+                       if (vc && !isalpha(vc)) vc += 256; /* assumes ASCII 
character set */
+                       if (rc && !isalpha(rc)) rc += 256;
+                       if (vc != rc) return vc - rc;
+               }
+               val= vp;
+               ref= rp;
+               vl=0;  if (isdigit(*vp)) vl= strtol(val,(char**)&val,10);
+               rl=0;  if (isdigit(*rp)) rl= strtol(ref,(char**)&ref,10);
+               if (vl != rl) return vl - rl;
+
+               vc = *val;
+               rc = *ref;
+               vsep = strchr(".-", vc);
+               rsep = strchr(".-", rc);
+               if (vsep && !rsep) return -1;
+               if (!vsep && rsep) return +1;
+
+               if (!*val && !*ref) return 0;
+               if (!*val) return -1;
+               if (!*ref) return +1;
+       }
+}
+
+int vercmp_main (int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int vercmp_main (int argc, char **argv)
+{
+       int r, res;
+       if (argc < 4) bb_show_usage();
+       if (*argv[1] == '\0' || *argv[3] == '\0') bb_show_usage();
+       r = ver_cmp(argv[1], argv[3]);
+
+       if      (!strcmp(argv[2], "le")) res = !(r <= 0);
+       else if (!strcmp(argv[2], "ge")) res = !(r >= 0);
+       else if (!strcmp(argv[2], "lt")) res = !(r < 0);
+       else if (!strcmp(argv[2], "gt")) res = !(r > 0);
+       else if (!strcmp(argv[2], "eq")) res = !(r == 0);
+       else bb_error_msg_and_die("unknown operator: %s", argv[2]);
+
+       //printf("%s\n", res == 0 ? "true" : "false");
+       return res;
+}
-- 
2.8.3

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to