Don't call g_set_error() unless the GError pointer is non-NULL. This

2005-04-27  Tor Lillqvist  <tml@novell.com>

	* glib/gconvert.c (open_converter, g_convert_with_iconv): Don't
	call g_set_error() unless the GError pointer is non-NULL. This
	avoids infinite recursion problems in certain rare situations on
	Windows, when g_locale_from_utf8() is called from
	_glib_get_locale_dir() after the change below. It's the
	_glib_gettext() calls to translate error messages that are
	parameters to g_set_error() that cause the recursion, not
	g_set_error() itself.

	* glib/gwin32.c (g_win32_locale_filename_from_utf8): New
	function. Converts a filename to the system codepage, and if a
	straight conversion isn't possible (because the filename contains
	characters not in the system codepage), try looking up the
	filename (which should refer to an existing file for this to
	succeed) with short (8.3) pathname components.

	* glib/gutils.c (_glib_get_locale_dir): No need to cache the
	result, this function is normally called only once. Return the
	path to the locale directory in system codepage, not UTF-8. The
	path is passed to bindtextdomain(), which doesn't use UTF-8 file
	names. Use g_win32_locale_filename_from_utf8(). (#301772)

	Don't do run-time lookup of message catalog directory on
	Cygwin. Cygwin is supposed to look and feel like Unix, and on Unix
	we use paths fixed at configure time.
This commit is contained in:
Tor Lillqvist
2005-04-27 09:50:09 +00:00
committed by Tor Lillqvist
parent 810e3f1605
commit dc11b4370f
8 changed files with 226 additions and 27 deletions

View File

@@ -2781,23 +2781,46 @@ _g_utils_thread_init (void)
#include <libintl.h>
#ifdef G_PLATFORM_WIN32
#ifdef G_OS_WIN32
/**
* _glib_get_locale_dir:
*
* Return the path to the lib\locale subfolder of the GLib
* installation folder. The path is in the system codepage. We have to
* use system codepage as bindtextdomain() doesn't have a UTF-8
* interface.
*/
static const gchar *
_glib_get_locale_dir (void)
{
static const gchar *cache = NULL;
if (cache == NULL)
cache = g_win32_get_package_installation_subdirectory
(GETTEXT_PACKAGE, dll_name, "lib\\locale");
gchar *dir, *cp_dir;
gchar *retval = NULL;
return cache;
dir = g_win32_get_package_installation_directory (GETTEXT_PACKAGE, dll_name);
cp_dir = g_win32_locale_filename_from_utf8 (dir);
g_free (dir);
if (cp_dir)
{
/* Don't use g_build_filename() on pathnames in the system
* codepage. In CJK locales cp_dir might end with a double-byte
* character whose trailing byte is a backslash.
*/
retval = g_strconcat (cp_dir, "\\lib\\locale", NULL);
g_free (cp_dir);
}
if (retval)
return retval;
else
return g_strdup ("");
}
#undef GLIB_LOCALE_DIR
#define GLIB_LOCALE_DIR _glib_get_locale_dir ()
#endif /* G_PLATFORM_WIN32 */
#endif /* G_OS_WIN32 */
G_CONST_RETURN gchar *
_glib_gettext (const gchar *str)