]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve error checking and error messages in string-collation functions.
authorEli Zaretskii <eliz@gnu.org>
Sat, 30 Aug 2014 08:19:24 +0000 (11:19 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 30 Aug 2014 08:19:24 +0000 (11:19 +0300)
 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.

src/ChangeLog
src/sysdep.c
src/w32proc.c

index 19e9985b082454c4ce5123c75ce1410efcab2203..0e0fdb2e7381457e342b1deef06a8012a89cef89 100644 (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.
index e1da2f87eb2ab2e53455f24f7f56fcd407ce47bc..8b62c8c4f623e053b3e5768c138bca822cd31566 100644 (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 */
index 0b441d45186fd97d379dcfbf6c43b4a83b4b35f1..399ed009ce34f419749b8f3c0186fc9bd6f72fcf 100644 (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)