1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-28 19:42:02 +00:00

Improve error checking and error messages in string-collation functions.

src/sysdep.c (str_collate) [__STDC_ISO_10646__]: Improve the
 wording of the error messages.
 (str_collate) [WINDOWSNT]: Signal an error if w32_compare_strings
 sets errno.
 src/w32proc.c (get_lcid_callback): Accept locale specifications
 without the country part, as in "enu" vs "enu_USA".
 (w32_compare_strings): Signal an error if a locale was specified,
 but couldn't be translated into a valid LCID.
This commit is contained in:
Eli Zaretskii 2014-08-30 11:19:24 +03:00
parent e1a9bbbd4f
commit e7027eab55
3 changed files with 35 additions and 3 deletions

View File

@ -1,3 +1,15 @@
2014-08-30 Eli Zaretskii <eliz@gnu.org>
* sysdep.c (str_collate) [__STDC_ISO_10646__]: Improve the
wording of the error messages.
(str_collate) [WINDOWSNT]: Signal an error if w32_compare_strings
sets errno.
* w32proc.c (get_lcid_callback): Accept locale specifications
without the country part, as in "enu" vs "enu_USA".
(w32_compare_strings): Signal an error if a locale was specified,
but couldn't be translated into a valid LCID.
2014-08-29 Michael Albinus <michael.albinus@gmx.de>
* sysdep.c (str_collate) [__STDC_ISO_10646__]: Move up setting errno.

View File

@ -3747,7 +3747,7 @@ str_collate (Lisp_Object s1, Lisp_Object s2,
locale_t loc = newlocale (LC_COLLATE_MASK | LC_CTYPE_MASK,
SSDATA (locale), 0);
if (!loc)
error ("Wrong locale: %s", strerror (errno));
error ("Invalid locale %s: %s", SSDATA (locale), strerror (errno));
if (! NILP (ignore_case))
for (int i = 1; i < 3; i++)
@ -3774,8 +3774,13 @@ str_collate (Lisp_Object s1, Lisp_Object s2,
res = wcscoll (p1, p2);
err = errno;
}
# ifndef HAVE_NEWLOCALE
if (err)
error ("Wrong argument: %s", strerror (err));
error ("Invalid locale or string for collation: %s", strerror (err));
# else
if (err)
error ("Invalid string for collation: %s", strerror (err));
# endif
SAFE_FREE ();
return res;
@ -3789,7 +3794,14 @@ str_collate (Lisp_Object s1, Lisp_Object s2,
{
char *loc = STRINGP (locale) ? SSDATA (locale) : NULL;
int res, err = errno;
return w32_compare_strings (SDATA (s1), SDATA (s2), loc, !NILP (ignore_case));
errno = 0;
res = w32_compare_strings (SDATA (s1), SDATA (s2), loc, !NILP (ignore_case));
if (errno)
error ("Invalid string for collation: %s", strerror (errno));
errno = err;
return res;
}
#endif /* WINDOWSNT */

View File

@ -3164,6 +3164,12 @@ get_lcid_callback (LPTSTR locale_num_str)
if (GetLocaleInfo (try_lcid, LOCALE_SABBREVLANGNAME,
locval, LOCALE_NAME_MAX_LENGTH))
{
/* This is for when they only specify the language, as in "ENU". */
if (stricmp (locval, lname) == 0)
{
found_lcid = try_lcid;
return FALSE;
}
strcat (locval, "_");
if (GetLocaleInfo (try_lcid, LOCALE_SABBREVCTRYNAME,
locval + strlen (locval), LOCALE_NAME_MAX_LENGTH))
@ -3287,6 +3293,8 @@ w32_compare_strings (const char *s1, const char *s2, char *locname,
if (new_lcid > 0)
lcid = new_lcid;
else
error ("Invalid locale %s: Invalid argument", locname);
}
if (ignore_case)