X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fxmemcoll.c;h=d2ddc33d08a708860c59f470259339eaa565d123;hb=8099cad631717c6f59d3b1e149971e243eee796e;hp=0e35cb677d583258b1e51772a11a324ffff6d56a;hpb=94236dc199750f41897939d3afef693cc451a660;p=gnulib.git diff --git a/lib/xmemcoll.c b/lib/xmemcoll.c index 0e35cb677..d2ddc33d0 100644 --- a/lib/xmemcoll.c +++ b/lib/xmemcoll.c @@ -1,10 +1,11 @@ /* Locale-specific memory comparison. - Copyright (C) 2002 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + Copyright (C) 2002-2004, 2006, 2009-2010 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -12,37 +13,36 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ /* Contributed by Paul Eggert . */ -#if HAVE_CONFIG_H -# include -#endif +#include #include -#ifndef errno -extern int errno; -#endif - #include -#if ENABLE_NLS -# include -# define _(Text) gettext (Text) -#else -# define _(Text) Text -#endif +#include "gettext.h" +#define _(msgid) gettext (msgid) #include "error.h" +#include "exitfail.h" #include "memcoll.h" #include "quotearg.h" #include "xmemcoll.h" -/* Exit value when xmemcoll fails. - The caller may set it to some other value. */ -int xmemcoll_exit_failure = EXIT_FAILURE; +static void +collate_error (int collation_errno, + char const *s1, size_t s1len, + char const *s2, size_t s2len) +{ + error (0, collation_errno, _("string comparison failed")); + error (0, 0, _("Set LC_ALL='C' to work around the problem.")); + error (exit_failure, 0, + _("The strings compared were %s and %s."), + quotearg_n_style_mem (0, locale_quoting_style, s1, s1len), + quotearg_n_style_mem (1, locale_quoting_style, s2, s2len)); +} /* 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 @@ -55,16 +55,22 @@ xmemcoll (char *s1, size_t s1len, char *s2, size_t s2len) { int diff = memcoll (s1, s1len, s2, s2len); int collation_errno = errno; - if (collation_errno) - { - error (0, collation_errno, _("string comparison failed")); - error (0, 0, _("Set LC_ALL='C' to work around the problem.")); - error (xmemcoll_exit_failure, 0, - _("The strings compared were %s and %s."), - quotearg_n_style_mem (0, locale_quoting_style, s1, s1len), - quotearg_n_style_mem (1, locale_quoting_style, s2, s2len)); - } + collate_error (collation_errno, s1, s1len, s2, s2len); + return diff; +} + +/* Compare S1 (with size S1SIZE) and S2 (with length S2SIZE) according + to the LC_COLLATE locale. S1 and S2 are both blocks of memory with + nonzero sizes, and the last byte in each block must be a null byte. + Report an error and exit if there is an error. */ +int +xmemcoll0 (char const *s1, size_t s1len, char const *s2, size_t s2len) +{ + int diff = memcoll0 (s1, s1len, s2, s2len); + int collation_errno = errno; + if (collation_errno) + collate_error (collation_errno, s1, s1len, s2, s2len); return diff; }