-DEFUN ("w32-get-locale-info", Fw32_get_locale_info, Sw32_get_locale_info, 1, 2, 0,
- "Return information about the Windows locale LCID.\n\
-By default, return a three letter locale code which encodes the default\n\
-language as the first two characters, and the country or regionial variant\n\
-as the third letter. For example, ENU refers to `English (United States)',\n\
-while ENC means `English (Canadian)'.\n\
-\n\
-If the optional argument LONGFORM is t, the long form of the locale\n\
-name is returned, e.g. `English (United States)' instead; if LONGFORM\n\
-is a number, it is interpreted as an LCTYPE constant and the corresponding\n\
-locale information is returned.\n\
-\n\
-If LCID (a 16-bit number) is not a valid locale, the result is nil.")
+ if (need_len <= 0)
+ nl_langinfo_buf[0] = 0;
+ else
+ {
+ if (item == CODESET)
+ {
+ need_len += 2; /* for the "cp" prefix */
+ if (need_len < 8) /* for the case we call GetACP */
+ need_len = 8;
+ }
+ if (nl_langinfo_len <= need_len)
+ nl_langinfo_buf = xrealloc (nl_langinfo_buf,
+ nl_langinfo_len = need_len);
+ if (!GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP,
+ nl_langinfo_buf, nl_langinfo_len))
+ nl_langinfo_buf[0] = 0;
+ else if (item == CODESET)
+ {
+ if (strcmp (nl_langinfo_buf, "0") == 0 /* CP_ACP */
+ || strcmp (nl_langinfo_buf, "1") == 0) /* CP_OEMCP */
+ sprintf (nl_langinfo_buf, "cp%u", GetACP ());
+ else
+ {
+ memmove (nl_langinfo_buf + 2, nl_langinfo_buf,
+ strlen (nl_langinfo_buf) + 1);
+ nl_langinfo_buf[0] = 'c';
+ nl_langinfo_buf[1] = 'p';
+ }
+ }
+ }
+ }
+ return nl_langinfo_buf;
+}
+#endif /* HAVE_LANGINFO_CODESET */
+
+DEFUN ("w32-get-locale-info", Fw32_get_locale_info,
+ Sw32_get_locale_info, 1, 2, 0,
+ doc: /* Return information about the Windows locale LCID.
+By default, return a three letter locale code which encodes the default
+language as the first two characters, and the country or regionial variant
+as the third letter. For example, ENU refers to `English (United States)',
+while ENC means `English (Canadian)'.
+
+If the optional argument LONGFORM is t, the long form of the locale
+name is returned, e.g. `English (United States)' instead; if LONGFORM
+is a number, it is interpreted as an LCTYPE constant and the corresponding
+locale information is returned.
+
+If LCID (a 16-bit number) is not a valid locale, the result is nil. */)