summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2003-06-06 20:12:59 +0000
committerJim Meyering <jim@meyering.net>2003-06-06 20:12:59 +0000
commit2e637905f9308268a330a5d5a520701d863acce4 (patch)
tree155a618428468ca7889cdacffaa6b5855aafda9c
parent353c4cbcd4c8a3f9626013a22ce6399a25f0a60c (diff)
downloadcoreutils-2e637905f9308268a330a5d5a520701d863acce4.tar.xz
Include "memcoll.h", which gets us size_t and checks
our interface, instead of including <sys/types.h> (memcoll): Fall back on a simple algorithm using memcmp if strcoll doesn't work.
-rw-r--r--lib/memcoll.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/memcoll.c b/lib/memcoll.c
index a2decfe27..1176da15a 100644
--- a/lib/memcoll.c
+++ b/lib/memcoll.c
@@ -1,5 +1,5 @@
/* Locale-specific memory comparison.
- Copyright 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -21,26 +21,29 @@
# include <config.h>
#endif
+#include "memcoll.h"
+
#include <errno.h>
#ifndef errno
extern int errno;
#endif
-#include <sys/types.h>
-
#if HAVE_STRING_H
# include <string.h>
#endif
/* Compare S1 (with length S1LEN) and S2 (with length S2LEN) according
to the LC_COLLATE locale. S1 and S2 do not overlap, and are not
- adjacent. Temporarily modify the bytes after S1 and S2, but
- restore their original contents before returning. Set errno to an
+ adjacent. Perhaps temporarily modify the bytes after S1 and S2,
+ but restore their original contents before returning. Set errno to an
error number if there is an error, and to zero otherwise. */
int
memcoll (char *s1, size_t s1len, char *s2, size_t s2len)
{
int diff;
+
+#if HAVE_STRCOLL
+
char n1 = s1[s1len];
char n2 = s2[s2len];
@@ -75,5 +78,13 @@ memcoll (char *s1, size_t s1len, char *s2, size_t s2len)
s1[s1len - 1] = n1;
s2[s2len - 1] = n2;
+#else
+
+ diff = memcmp (s1, s2, s1len < s2len ? s1len : s2len);
+ if (! diff)
+ diff = s1len < s2len ? -1 : s1len != s2len;
+
+#endif
+
return diff;
}