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;
+ int argn, opt = 0;
+ int inorder = 1, equal = 1;
char *greatest = 0;
char *least = 0;
- if (ac < 2) return 1;
-
- while ((opt = getopt(ac, av, "qgleLG")) != -1) {
+ while ((opt = getopt(ac, av, "qLG")) != -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;
+ case 'G': print = 2; break;
+ case 'L': print = 3; break;
default:
exit(EXIT_FAILURE);
break;
}
}
+
argn = optind;
if (ac > argn) {
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(a, b);
+ switch (cmp) {
+ case 0:
+ break;
+ case -1:
+ equal = 0;
+ break;
+ case 1:
+ equal = 0;
+ inorder = 0;
+ break;
+ default:
+ break;
}
-
- cmp = zpm_vercmp(greatest, b);
+
+ cmp = zpm_vercmp(b, greatest);
if (cmp > 0) {
greatest = b;
}
- cmp = zpm_vercmp(least, b);
+ cmp = zpm_vercmp(b, least);
if (cmp < 0) {
least = b;
}
+ a = 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;
+ if (equal) {
+ cmp = 0;
+ } else if (inorder) {
+ cmp = -1;
+ } else {
+ cmp = 1;
}
switch (print) {
case 1:
- printf("%d\n", cmp == 2 ? -1 : cmp);
+ printf("%d\n", cmp);
break;
case 2:
if (greatest) printf("%s\n", greatest);
default:
break;
}
- fflush(stdout);
- if (testmask == 0) {
- return cmp;
- } else {
- return failed ? 1 : 0;
- }
+ return cmp == -1 ? 2 : cmp;
}