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
