[glib] win32: improve the package installation dir lookup
- From: Ignacio Casal Quinteiro <icq src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] win32: improve the package installation dir lookup
- Date: Thu, 31 Jul 2014 11:05:06 +0000 (UTC)
commit 786590fe93682c9b28136ccf65d870b23dd807f7
Author: Ignacio Casal Quinteiro <icq gnome org>
Date: Tue Jul 29 18:59:21 2014 +0200
win32: improve the package installation dir lookup
As an example, the core of gedit is in a private library
placed in %INSTALLDIR%/lib/gedit/libgedit.dll
Before this patch we would get %INSTALLDIR%/lib/gedit as the
installation package dir, while what we actually want is to get
%INSTALLDIR%
https://bugzilla.gnome.org/show_bug.cgi?id=733934
glib/gwin32.c | 33 +++++++++++++++++++++++++++------
1 files changed, 27 insertions(+), 6 deletions(-)
---
diff --git a/glib/gwin32.c b/glib/gwin32.c
index 3c60df4..ffc5fe2 100644
--- a/glib/gwin32.c
+++ b/glib/gwin32.c
@@ -238,22 +238,43 @@ g_win32_error_message (gint error)
gchar *
g_win32_get_package_installation_directory_of_module (gpointer hmodule)
{
+ gchar *filename;
gchar *retval;
gchar *p;
wchar_t wc_fn[MAX_PATH];
+ /* NOTE: it relies that GetModuleFileNameW returns only canonical paths */
if (!GetModuleFileNameW (hmodule, wc_fn, MAX_PATH))
return NULL;
- retval = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL);
+ filename = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL);
- if ((p = strrchr (retval, G_DIR_SEPARATOR)) != NULL)
+ if ((p = strrchr (filename, G_DIR_SEPARATOR)) != NULL)
*p = '\0';
- p = strrchr (retval, G_DIR_SEPARATOR);
- if (p && (g_ascii_strcasecmp (p + 1, "bin") == 0 ||
- g_ascii_strcasecmp (p + 1, "lib") == 0))
- *p = '\0';
+ retval = g_strdup (filename);
+
+ do
+ {
+ p = strrchr (retval, G_DIR_SEPARATOR);
+ if (p == NULL)
+ break;
+
+ *p = '\0';
+
+ if (g_ascii_strcasecmp (p + 1, "bin") == 0 ||
+ g_ascii_strcasecmp (p + 1, "lib") == 0)
+ break;
+ }
+ while (p != NULL);
+
+ if (p == NULL)
+ {
+ g_free (retval);
+ retval = filename;
+ }
+ else
+ g_free (filename);
#ifdef G_WITH_CYGWIN
/* In Cygwin we need to have POSIX paths */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]