From 5cf3c0297baa7bd10bcde0ea45eec81168d53f43 Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Wed, 23 Feb 2011 18:15:30 +0100 Subject: [PATCH] [Fix] Make path building on windows behave the same as stock mono+glib. * src/gpath.c: Make path building on windows behave the same as stock mono+glib. License: MIT/X11 --- eglib/src/gpath.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/eglib/src/gpath.c b/eglib/src/gpath.c index 39c6aa150be..9e8c03d1cb8 100644 --- a/eglib/src/gpath.c +++ b/eglib/src/gpath.c @@ -45,6 +45,10 @@ g_build_path (const gchar *separator, const gchar *first_element, ...) const char *s, *p, *next; size_t slen; va_list args; + gboolean found; +#ifdef G_OS_WIN32 + const gchar alt_separator = '/'; +#endif g_return_val_if_fail (separator != NULL, NULL); @@ -57,24 +61,41 @@ g_build_path (const gchar *separator, const gchar *first_element, ...) va_start (args, first_element); for (s = first_element; s != NULL; s = next){ + found = FALSE; next = va_arg (args, char *); p = (s + strlen (s)); - if (next && p - slen > s){ - for (; strncmp (p-slen, separator, slen) == 0; ){ + /* Strip all but one trailing separator */ + if (next && p - slen >= s){ + for (; strncmp (p-slen, separator, slen) == 0 +#ifdef G_OS_WIN32 + || alt_separator == *(p-slen) +#endif + ;){ + found = TRUE; p -= slen; } } + if (found) p += slen; + + /* Append path token */ g_string_append_len (result, s, p - s); if (next && *next){ - if (strncmp (separator, result->str + strlen (result->str) - slen, slen)) + /* Append separator if needed */ + if (!found) g_string_append (result, separator); - for (; strncmp (next, separator, slen) == 0; ) + /* Strip multiple contiguous separators */ + for (; strncmp (next, separator, slen) == 0 +#ifdef G_OS_WIN32 + || alt_separator == *next +#endif + ; ) next += slen; } } + /* Nul-terminate */ g_string_append_c (result, 0); va_end (args); -- 2.11.4.GIT