diff options
-rw-r--r-- | libc/cbb-common.h | 1 | ||||
-rw-r--r-- | libiberty/strverscmp.c | 46 |
2 files changed, 44 insertions, 3 deletions
diff --git a/libc/cbb-common.h b/libc/cbb-common.h index f07c7faed..3bbbdfac7 100644 --- a/libc/cbb-common.h +++ b/libc/cbb-common.h @@ -16,7 +16,6 @@ extern "C" { /* a minimal, modernized libiberty */ -#include <features.h> #include <stdarg.h> #include <stdint.h> #include <stdio.h> diff --git a/libiberty/strverscmp.c b/libiberty/strverscmp.c index 59ec5d2bc..0a005db2a 100644 --- a/libiberty/strverscmp.c +++ b/libiberty/strverscmp.c @@ -1,2 +1,44 @@ -/* empty translation unit for build system compatibility */ -typedef int dummy; +/* strverscmp from musl. Copyright © 2005-2015 Rich Felker, et al. + Released under the MIT license. + See http://git.musl-libc.org/cgit/musl/tree/COPYRIGHT?id=eceaf1d29f32656e5befb5e37b1f7db632f2e1dc for details. */ +#define _GNU_SOURCE +#include <ctype.h> +#include <string.h> + +int strverscmp(const char *l, const char *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 if (lenl>lenr) { + return 1; + } else { + return -1; + } + } else { + return (*l - *r); + } +} |