]> pd.if.org Git - zpackage/blobdiff - src/vercmp.c
fix vercmp bugs
[zpackage] / src / vercmp.c
index b0e5117b8e703384f89f65dee630ca7dea8e2566..340d80fbd013b4df2cc02bf0ba04fcfaf9406be5 100644 (file)
@@ -19,30 +19,23 @@ 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;
+       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) {
@@ -54,43 +47,44 @@ int main(int ac, char *av[]) {
        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);
@@ -101,11 +95,6 @@ int main(int ac, char *av[]) {
                default:
                        break;
        }
-       fflush(stdout);
 
-       if (testmask == 0) {
-               return cmp;
-       } else {
-               return failed ? 1 : 0;
-       }
+       return cmp == -1 ? 2 : cmp;
 }