okstreq "$res" 0 "$1 == $1"
}
-plan 45
+least() {
+ want=$1
+ shift
+ l=$(zpm vercmp -L "$@")
+ okstreq "$l" "$want" "least $*"
+}
+
+greatest() {
+ want=$1
+ shift
+ g=$(zpm vercmp -G "$@")
+ okstreq "$g" "$want" "greatest $*"
+}
+
+plan 53
+
+least 1.0a 1.0a 1.0b
+least 1.0a 1.0b 1.0a
+greatest z a b z
+greatest z a z b
+least abc abc
+greatest abc abc
+
+zpm vercmp -gq 'gnupg-1.0-1' "gnupg-2.0-1"
+exitwith 1 vercmp -g not gt
+
+zpm vercmp -gq 'gnupg-2.0-1' "gnupg-1.0-1"
+exitwith 0 vercmp -g is gt
# alpha
vtest 1.0a 1.0b
+#define _POSIX_C_SOURCE 2
+
#include <stdlib.h>
#include <stdio.h>
+#include <unistd.h>
+
#include "zpm.h"
+/*
+ * -g greater than
+ * -l less than
+ * -e equal
+ * -L least : print least
+ * -G greatest : print greatest
+ * -q quiet: no print
+ */
int main(int ac, char *av[]) {
int cmp;
+ char *a = 0, *b = 0;
+ int print = 1;
+ int argn, opt, pass, failed = 0;
+
+ /* 0x1 = less than, 0x2 = equal, 0x4 = greater */
+ unsigned testmask = 0;
+ unsigned testcases = 0;
+
+ char *greatest = 0;
+ char *least = 0;
if (ac < 2) return 1;
- cmp = zpm_vercmp(av[1], av[2]);
- printf("%d\n", cmp);
- if (cmp == -1) cmp = 2;
- return cmp;
+ while ((opt = getopt(ac, av, "qgleLG")) != -1) {
+ switch (opt) {
+ case 'q': print = 0; break;
+ case 'l': testmask |= 0x1; break;
+ case 'e': testmask |= 0x2; break;
+ case 'g': testmask |= 0x4; break;
+ case 'L': print = 2; break;
+ case 'G': print = 3; break;
+ default:
+ exit(EXIT_FAILURE);
+ break;
+ }
+ }
+ argn = optind;
+
+ if (ac > argn) {
+ a = av[argn++];
+ greatest = a;
+ least = a;
+ }
+
+ while (ac > argn) {
+ b = av[argn++];
+
+ cmp = zpm_vercmp(a, b) + 1;
+ testcases |= (1<<cmp);
+
+ if (testmask) {
+ pass = (testmask & (1 << cmp));
+ if (!pass) {
+ failed++;
+ }
+ }
+
+ cmp = zpm_vercmp(greatest, b);
+ if (cmp > 0) {
+ greatest = b;
+ }
+
+ cmp = zpm_vercmp(least, b);
+ if (cmp < 0) {
+ least = b;
+ }
+ }
+
+ switch (testcases) {
+ case 0: /* no tests */
+ cmp = 0; break;
+ case 1: /* only less than */
+ cmp = 2; break;
+ case 2: /* only equal */
+ cmp = 0; break;
+ case 4: /* only greater than */
+ cmp = 1; break;
+ default: /* mixed */
+ cmp = 3; break;
+ }
+
+ switch (print) {
+ case 1:
+ printf("%d\n", cmp == 2 ? -1 : cmp);
+ break;
+ case 2:
+ if (greatest) printf("%s\n", greatest);
+ break;
+ case 3:
+ if (least) printf("%s\n", least);
+ break;
+ default:
+ break;
+ }
+ fflush(stdout);
+
+ if (testmask == 0) {
+ return cmp;
+ } else {
+ return failed ? 1 : 0;
+ }
}