/** * Helpers * * Authors: * Mitsuru Oka * Lauris Kaplinski * * Copyright (C) 2002 authors * * Released under GNU GPL, read the file 'COPYING' for more information */ #include #include #include #include "gnome-utils.h" /** * gnome_uri_list_extract_uris: * @uri_list: an uri-list in the standard format. * * Returns a GList containing strings allocated with g_malloc * that have been splitted from @uri-list. */ GList *gnome_uri_list_extract_uris(const gchar *uri_list) { const gchar *p, *q; gchar *retval; GList *result = NULL; g_return_val_if_fail(uri_list != NULL, NULL); p = uri_list; /* We don't actually try to validate the URI according to RFC * 2396, or even check for allowed characters - we just ignore * comments and trim whitespace off the ends. We also * allow LF delimination as well as the specified CRLF. */ while (p) { if (*p != '#') { while (isspace(*p)) p++; q = p; while (*q && (*q != '\n') && (*q != '\r')) q++; if (q > p) { q--; while (q > p && isspace(*q)) q--; retval = (gchar *)g_malloc(q - p + 2); strncpy(retval, p, q - p + 1); retval[q - p + 1] = '\0'; result = g_list_prepend(result, retval); } } p = strchr(p, '\n'); if (p) p++; } return g_list_reverse(result); } /** * gnome_uri_list_extract_filenames: * @uri_list: an uri-list in the standard format * * Returns a GList containing strings allocated with g_malloc * that contain the filenames in the uri-list. * * Note that unlike gnome_uri_list_extract_uris() function, this * will discard any non-file uri from the result value. */ GList *gnome_uri_list_extract_filenames(const gchar *uri_list) { g_return_val_if_fail(uri_list != NULL, NULL); GList *result = gnome_uri_list_extract_uris(uri_list); GList *tmp_list = result; while (tmp_list) { gchar *s = (gchar *)tmp_list->data; GList *node = tmp_list; tmp_list = tmp_list->next; if (!strncmp(s, "file:", 5)) { node->data = g_filename_from_uri(s, NULL, NULL); /* not sure if this fallback is useful at all */ if (!node->data) node->data = g_strdup(s + 5); } else { result = g_list_remove_link(result, node); g_list_free_1(node); } g_free(s); } return result; } /* Local Variables: mode:c++ c-file-style:"stroustrup" c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :