#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; } }