implement non-stub strverscmp
authorRich Felker <dalias@aerifal.cx>
Tue, 26 Feb 2013 06:36:47 +0000 (01:36 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 26 Feb 2013 06:36:47 +0000 (01:36 -0500)
patch by Isaac Dunham.

src/string/strverscmp.c

index 7054967..33a42ee 100644 (file)
@@ -1,7 +1,40 @@
+#define _GNU_SOURCE
+#include <ctype.h>
 #include <string.h>
+#include <sys/types.h>
 
 int strverscmp(const char *l, const char *r)
 {
-       /* FIXME */
-       return strcmp(l, r);
+       int haszero=1;
+       while (*l==*r) {
+               if (!*l) return 0;
+
+               if (*l=='0') {
+                       if (haszero==1) {
+                               haszero=0;
+                       }
+               } else if (isdigit(*l)) {
+                       if (haszero==1) {
+                               haszero=2;
+                       }
+               } else {
+                       haszero=1;
+               }
+               l++; r++;
+       }
+       if (haszero==1 && (*l=='0' || *r=='0')) {
+               haszero=0;
+       }
+       if ((isdigit(*l) && isdigit(*r) ) && haszero) {
+               size_t lenl=0, lenr=0;
+               while (isdigit(l[lenl]) ) lenl++;
+               while (isdigit(r[lenr]) ) lenr++;
+               if (lenl==lenr) {
+                       return (*l -  *r);
+               } else {
+                       return (lenl - lenr);
+               }
+       } else {
+               return (*l -  *r);
+       }
 }