Re: URIs vs. half-baked URIs [glib PATCH]
- From: Owen Taylor <otaylor redhat com>
- To: Alex Larsson <alexl redhat com>
- Cc: Darin Adler <darin bentspoon com>, <gtk-devel-list gnome org>, <gnome-hackers gnome org>
- Subject: Re: URIs vs. half-baked URIs [glib PATCH]
- Date: 24 Aug 2001 11:50:13 -0400
Alex Larsson <alexl redhat com> writes:
> +/* Test of haystack has the needle prefix, comparing case
> + * insensitive. haystack may be UTF-8, but needle must
> + * contain only ascii. */
> +static gboolean
> +has_case_prefix (const gchar *haystack, const gchar *needle)
> +{
> + const gchar *h, *n;
> + gchar hc, nc;
> +
> + /* Eat one character at a time. */
> + h = haystack == NULL ? "" : haystack;
> + n = needle == NULL ? "" : needle;
Please remove the NULL checks .... NULL != "" in GLib/GTK+.
> + do
> + {
> + if (*n == '\0')
> + return TRUE;
> + if (*h == '\0')
> + return FALSE;
> +
> + hc = *h++;
> + nc = *n++;
> +
> + hc = g_ascii_tolower (hc);
> + nc = g_ascii_tolower (nc);
> + }
> + while (hc == nc);
> +
> + return FALSE;
> +}
I find this a little awkward and would tend to write:
while (*n && *h &&
g_ascii_tolower (*n) == g_ascii_tolower (*h))
{
n++;
h++;
}
return *n == '\0';
> +#define HEX_ESCAPE '%'
I fail to see how this #define makes the code clearer, actually. :-)
> + if (string == NULL)
> + return NULL;
Again, such handling of NULL doesn't fit GLib conventions.
(g_strdup() is a very special case.)
> +static gchar *
> +g_escape_file_uri (const gchar *hostname,
> + const gchar *pathname)
> +{
> + char *escaped_hostname = NULL;
> + char *escaped_path;
> +
> + if (hostname)
> + {
> + escaped_hostname = g_escape_uri_string (hostname, UNSAFE_HOST);
> + }
> +
> + escaped_path = g_escape_uri_string (pathname, UNSAFE_DOS_PATH);
> +
> + return g_strconcat ("file://",
> + (escaped_hostname)?escaped_hostname:"",
> + (*escaped_path!='/')?"/":"",
> + escaped_path,
> + NULL);
> +}
Memleaks ... Also GLib convention is to surround binary operators
with ' '.
> +/**
> + * g_filename_from_uri:
> + * @uri: a uri describing a filename (escaped, UTF8-encoded)
encoded in UTF-8
> + * @hostname: If the URI specifies a hostname it will be placed here,
> + or %NULL to ignore the hostname.
Location to store hostname for the URI, or %NULL.
If there is no hostname in the URI, %NULL will be
stored in this location.
> + * @error: location to store the error occuring, or %NULL to ignore
occurring
> + * errors. Any of the errors in #GConvertError may occur.
> + *
> + * Converts an escaped UTF-8 encoded URI to a local filename in the
> + * encoding used for filenames.
> + * Or NULL if the URI doesn't specify a local filename.
I'd drop this as confusing ... sounds like you can get %NULL without
*error being set.
x> + if (hostname)
> + {
> + char *t;
> + t = g_strndup (host_part, path_part - host_part);
> + *hostname = g_unescape_uri_string (t, "");
> + g_free (t);
> +
> + if (*hostname == NULL)
> + {
> + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_INVALID_URI,
> + _("The hostname of the URI `%s' is contains invalidly escaped characters"),
> + uri);
> + return NULL;
> + }
> + }
> + }
I'd be pendantic here and unescape and free the hostname even if the
hostname wasn't asked for so we can detect errors.
It might be worth adding an optional length to g_unescape_uri_string()
to avoid the strndup.
> +/**
> + * g_filename_to_uri:
> + * @filename: an absolute filename specified in the encoding
> + * used for filenames.
by the operating system.
> + * @hostname: A utf-8 encoded hostname, or %NULL for none.
UTF-8
> + * Converts an absolute filename to an escaped UTF8 encoded URI.
UTF-8
> +
> + escaped_uri = g_escape_file_uri (hostname,
> + utf8_filename);
> +
> + return escaped_uri;
Isn't utf8_filename leaked here?
> @@ -37,7 +37,10 @@ typedef enum
> G_CONVERT_ERROR_NO_CONVERSION,
> G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
> G_CONVERT_ERROR_FAILED,
> - G_CONVERT_ERROR_PARTIAL_INPUT
> + G_CONVERT_ERROR_PARTIAL_INPUT,
> + G_CONVERT_ERROR_NOT_LOCAL_FILE,
> + G_CONVERT_ERROR_INVALID_URI,
> + G_CONVERT_ERROR_NOT_ABSOLUTE_PATH
> } GConvertError;
I have some vague feeling that perhaps it would be better to use
a separate enumeration for these errors, but it's probably
better not to add that clutter.
Regards,
Owen
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]