Mercurial > pidgin
changeset 15992:e78b15c2c60f
"elb: g_build_pathv is Glib 2.8"
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Wed, 04 Apr 2007 20:20:59 +0000 |
parents | e05e5b148723 |
children | f77f1d5870b6 |
files | finch/libgnt/gntfilesel.c |
diffstat | 1 files changed, 106 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/finch/libgnt/gntfilesel.c Wed Apr 04 08:33:50 2007 +0000 +++ b/finch/libgnt/gntfilesel.c Wed Apr 04 20:20:59 2007 +0000 @@ -37,6 +37,106 @@ } } +#if !GLIB_CHECK_VERSION(2,8,0) +/* ripped from glib/gfileutils.c */ +static gchar * +g_build_path_va (const gchar *separator, + gchar **str_array) +{ + GString *result; + gint separator_len = strlen (separator); + gboolean is_first = TRUE; + gboolean have_leading = FALSE; + const gchar *single_element = NULL; + const gchar *next_element; + const gchar *last_trailing = NULL; + gint i = 0; + + result = g_string_new (NULL); + + next_element = str_array[i++]; + + while (TRUE) { + const gchar *element; + const gchar *start; + const gchar *end; + + if (next_element) { + element = next_element; + next_element = str_array[i++]; + } else + break; + + /* Ignore empty elements */ + if (!*element) + continue; + + start = element; + + if (separator_len) { + while (start && + strncmp (start, separator, separator_len) == 0) + start += separator_len; + } + + end = start + strlen (start); + + if (separator_len) { + while (end >= start + separator_len && + strncmp (end - separator_len, separator, separator_len) == 0) + end -= separator_len; + + last_trailing = end; + while (last_trailing >= element + separator_len && + strncmp (last_trailing - separator_len, separator, separator_len) == 0) + last_trailing -= separator_len; + + if (!have_leading) { + /* If the leading and trailing separator strings are in the + * same element and overlap, the result is exactly that element + */ + if (last_trailing <= start) + single_element = element; + + g_string_append_len (result, element, start - element); + have_leading = TRUE; + } else + single_element = NULL; + } + + if (end == start) + continue; + + if (!is_first) + g_string_append (result, separator); + + g_string_append_len (result, start, end - start); + is_first = FALSE; + } + + if (single_element) { + g_string_free (result, TRUE); + return g_strdup (single_element); + } else { + if (last_trailing) + g_string_append (result, last_trailing); + + return g_string_free (result, FALSE); + } +} + +static gchar * +g_build_pathv (const gchar *separator, + gchar **args) +{ + if (!args) + return NULL; + + return g_build_path_va (separator, args); +} + +#endif + static char * process_path(const char *path) { @@ -259,6 +359,11 @@ path = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", sel->current, str); str = process_path(path); g_free(path); + path = str; + + if (gnt_file_sel_set_current_location(sel, path)) + goto success; + path = g_path_get_dirname(str); g_free(str); @@ -298,8 +403,8 @@ gnt_widget_draw(sel->files); } globfree(&gl); +#endif success: -#endif g_free(path); return TRUE; }