X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=src%2Fvercmp.c;fp=src%2Fvercmp.c;h=b0e5117b8e703384f89f65dee630ca7dea8e2566;hb=5dd3c3e64a9574112dda77a5afc167f5daa53fd8;hp=0000000000000000000000000000000000000000;hpb=bd21f0a1265b43ad5f05353a39db31c16826f05c;p=zpackage diff --git a/src/vercmp.c b/src/vercmp.c new file mode 100644 index 0000000..b0e5117 --- /dev/null +++ b/src/vercmp.c @@ -0,0 +1,111 @@ +#define _POSIX_C_SOURCE 2 + +#include +#include + +#include + +#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; + + 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< 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; + } +}