From: Eli Zaretskii Date: Sat, 30 Aug 2014 08:19:24 +0000 (+0300) Subject: Improve error checking and error messages in string-collation functions. X-Git-Tag: emacs-25.0.90~2635^2~679^2~391 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e7027eab55d9b3b63ddc1c26f3e222692c8c9499;p=emacs.git 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. --- diff --git a/src/ChangeLog b/src/ChangeLog index 19e9985b082..0e0fdb2e738 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2014-08-30 Eli Zaretskii + + * 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 * sysdep.c (str_collate) [__STDC_ISO_10646__]: Move up setting errno. diff --git a/src/sysdep.c b/src/sysdep.c index e1da2f87eb2..8b62c8c4f62 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -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 */ diff --git a/src/w32proc.c b/src/w32proc.c index 0b441d45186..399ed009ce3 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -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)