From c74bc2da704de7c291521093368b8bab7149909d Mon Sep 17 00:00:00 2001 From: Xavier Saint Date: Sun, 3 Aug 2008 22:30:12 +0200 Subject: [PATCH] Some cleanups in iri.c --- src/iri.c | 70 ++++++++++++++++++++++--------------------------------- src/iri.h | 4 ++-- 2 files changed, 30 insertions(+), 44 deletions(-) diff --git a/src/iri.c b/src/iri.c index 9050e858..dce9e2ed 100644 --- a/src/iri.c +++ b/src/iri.c @@ -46,9 +46,6 @@ as that of the covered work. */ /* Note: locale encoding is kept in options struct (opt.locale) */ -static iconv_t locale2utf8; - -static bool open_locale_to_utf8 (void); static bool do_conversion (iconv_t cd, char *in, size_t inlen, char **out); @@ -119,27 +116,7 @@ check_encoding_name (char *encoding) static bool open_locale_to_utf8 (void) { - if (locale2utf8) - return true; - /* sXXXav : That shouldn't happen, just in case */ - if (!opt.locale) - { - logprintf (LOG_VERBOSE, "open_locale_to_utf8: locale is unset\n"); - opt.locale = find_locale (); - } - - if (!opt.locale) - return false; - - locale2utf8 = iconv_open ("UTF-8", opt.locale); - if (locale2utf8 != (iconv_t)(-1)) - return true; - - logprintf (LOG_VERBOSE, "Conversion from %s to %s isn't supported\n", - quote (opt.locale), quote ("UTF-8")); - locale2utf8 = NULL; - return false; } /* Try converting string str from locale to UTF-8. Return a new string @@ -147,22 +124,35 @@ open_locale_to_utf8 (void) const char * locale_to_utf8 (const char *str) { + iconv_t l2u; char *new; - if (!strcasecmp (opt.locale, "utf-8")) + /* That shouldn't happen, just in case */ + if (!opt.locale) + { + logprintf (LOG_VERBOSE, "open_locale_to_utf8: locale is unset\n"); + opt.locale = find_locale (); + } + + if (!opt.locale || !strcasecmp (opt.locale, "utf-8")) return str; - if (!open_locale_to_utf8 ()) - return str; + l2u = iconv_open ("UTF-8", opt.locale); + if (l2u != (iconv_t)(-1)) + { + logprintf (LOG_VERBOSE, "Conversion from %s to %s isn't supported\n", + quote (opt.locale), quote ("UTF-8")); + return str; + } - if (do_conversion (locale2utf8, (char *) str, strlen ((char *) str), &new)) + if (do_conversion (l2u, (char *) str, strlen ((char *) str), &new)) return (const char *) new; return str; } /* Do the conversion according to the passed conversion descriptor cd. *out - will containes the transcoded string on success. *out content is + will contain the transcoded string on success. *out content is unspecified otherwise. */ static bool do_conversion (iconv_t cd, char *in, size_t inlen, char **out) @@ -236,11 +226,7 @@ idn_encode (struct iri *i, char *host) if (!i->utf8_encode) { if (!remote_to_utf8 (i, (const char *) host, (const char **) &new)) - { - /* Nothing to encode or an error occured */ - return NULL; - } - + return NULL; /* Nothing to encode or an error occured */ host = new; } @@ -281,18 +267,13 @@ idn_decode (char *host) bool remote_to_utf8 (struct iri *i, const char *str, const char **new) { - char *r; iconv_t cd; bool ret = false; - if (opt.encoding_remote) - r = opt.encoding_remote; - else if (i->uri_encoding) - r = i->uri_encoding; - else + if (!i->uri_encoding) return false; - cd = iconv_open ("UTF-8", r); + cd = iconv_open ("UTF-8", i->uri_encoding); if (cd == (iconv_t)(-1)) return false; @@ -311,6 +292,7 @@ remote_to_utf8 (struct iri *i, const char *str, const char **new) return ret; } +/* Allocate a new iri structure and return a pointer to it. */ struct iri * iri_new (void) { @@ -321,6 +303,7 @@ iri_new (void) return i; } +/* Completely free an iri structure. */ void iri_free (struct iri *i) { @@ -329,10 +312,12 @@ iri_free (struct iri *i) xfree (i); } +/* Set uri_encoding of struct iri i. If a remote encoding was specified, use + it unless force is true. */ void set_uri_encoding (struct iri *i, char *charset, bool force) { - DEBUGP (("[IRI uri = `%s'\n", charset ? quote (charset) : "None")); + DEBUGP (("URI encoding = `%s'\n", charset ? quote (charset) : "None")); if (!force && opt.encoding_remote) return; if (i->uri_encoding) @@ -345,10 +330,11 @@ set_uri_encoding (struct iri *i, char *charset, bool force) i->uri_encoding = charset ? xstrdup (charset) : NULL; } +/* Set content_encoding of struct iri i. */ void set_content_encoding (struct iri *i, char *charset) { - DEBUGP (("[IRI content = %s\n", charset ? quote (charset) : "None")); + DEBUGP (("URI content encoding = %s\n", charset ? quote (charset) : "None")); if (opt.encoding_remote) return; if (i->content_encoding) diff --git a/src/iri.h b/src/iri.h index e7f3fe3e..c024de72 100644 --- a/src/iri.h +++ b/src/iri.h @@ -31,9 +31,9 @@ as that of the covered work. */ #define IRI_H struct iri { - char *uri_encoding; /* Encoding of the uri to fetch */ + char *uri_encoding; /* Encoding of the uri to fetch */ char *content_encoding; /* Encoding of links inside the fetched file */ - bool utf8_encode; /* Will/Is the current url encoded in utf8 */ + bool utf8_encode; /* Will/Is the current url encoded in utf8 */ }; #ifdef ENABLE_IRI