From 1b7ea5c3a323b3306838fa39d1705007b77cbe0e Mon Sep 17 00:00:00 2001 From: Shiz Date: Sat, 20 Jun 2015 14:51:16 +0200 Subject: remove non-portable include and add back strverscmp. See COPYING.MIDIPIX (9cd0746c) for copyright information. Signed-off-by: Shiz --- libc/cbb-common.h | 1 - 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 #include #include #include 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 +#include + +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); + } +} -- cgit v1.2.3