From 21fe34c3a1938a5dedf1ea384573f28cef52b75a Mon Sep 17 00:00:00 2001 From: Tobias Stoeckmann Date: Sat, 18 Jun 2016 18:58:07 +0200 Subject: Handle all POSIX compliant systems in mbscasecmp. The width of wchar_t is allowed to be of the same width as long, according to standards. The return type of mbscasecmp is int though. On amd64 with a 32 bit int, this means that mbscasecmp can return zero (indicating that strings are equal) even though the input strings differ. Signed-off-by: Tobias Stoeckmann Signed-off-by: Allan McRae (cherry picked from commit af83a585745d6108d7af2d4a2d1eae9b28a8c4b6) --- src/pacman/util.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pacman/util.c b/src/pacman/util.c index 3346a340..9c53c8b6 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -1488,6 +1488,8 @@ int select_question(int count) return (preset - 1); } +#define CMP(x, y) ((x) < (y) ? -1 : ((x) > (y) ? 1 : 0)) + static int mbscasecmp(const char *s1, const char *s2) { size_t len1 = strlen(s1), len2 = strlen(s2); @@ -1505,19 +1507,19 @@ static int mbscasecmp(const char *s1, const char *s2) return strcasecmp(p1, p2); } if(b1 == 0 || b2 == 0) { - return c1 - c2; + return CMP(c1, c2); } c1 = towlower(c1); c2 = towlower(c2); if(c1 != c2) { - return c1 - c2; + return CMP(c1, c2); } p1 += b1; p2 += b2; len1 -= b1; len2 -= b2; } - return *p1 - *p2; + return CMP(*p1, *p2); } /* presents a prompt and gets a Y/N answer */ -- cgit v1.2.3-70-g09d2