mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
Some cleanups in iri.c
This commit is contained in:
parent
ac4687846e
commit
c74bc2da70
70
src/iri.c
70
src/iri.c
@ -46,9 +46,6 @@ as that of the covered work. */
|
|||||||
|
|
||||||
/* Note: locale encoding is kept in options struct (opt.locale) */
|
/* 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);
|
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
|
static bool
|
||||||
open_locale_to_utf8 (void)
|
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
|
/* Try converting string str from locale to UTF-8. Return a new string
|
||||||
@ -147,22 +124,35 @@ open_locale_to_utf8 (void)
|
|||||||
const char *
|
const char *
|
||||||
locale_to_utf8 (const char *str)
|
locale_to_utf8 (const char *str)
|
||||||
{
|
{
|
||||||
|
iconv_t l2u;
|
||||||
char *new;
|
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;
|
return str;
|
||||||
|
|
||||||
if (!open_locale_to_utf8 ())
|
l2u = iconv_open ("UTF-8", opt.locale);
|
||||||
return str;
|
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 (const char *) new;
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do the conversion according to the passed conversion descriptor cd. *out
|
/* 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. */
|
unspecified otherwise. */
|
||||||
static bool
|
static bool
|
||||||
do_conversion (iconv_t cd, char *in, size_t inlen, char **out)
|
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 (!i->utf8_encode)
|
||||||
{
|
{
|
||||||
if (!remote_to_utf8 (i, (const char *) host, (const char **) &new))
|
if (!remote_to_utf8 (i, (const char *) host, (const char **) &new))
|
||||||
{
|
return NULL; /* Nothing to encode or an error occured */
|
||||||
/* Nothing to encode or an error occured */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
host = new;
|
host = new;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,18 +267,13 @@ idn_decode (char *host)
|
|||||||
bool
|
bool
|
||||||
remote_to_utf8 (struct iri *i, const char *str, const char **new)
|
remote_to_utf8 (struct iri *i, const char *str, const char **new)
|
||||||
{
|
{
|
||||||
char *r;
|
|
||||||
iconv_t cd;
|
iconv_t cd;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
if (opt.encoding_remote)
|
if (!i->uri_encoding)
|
||||||
r = opt.encoding_remote;
|
|
||||||
else if (i->uri_encoding)
|
|
||||||
r = i->uri_encoding;
|
|
||||||
else
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
cd = iconv_open ("UTF-8", r);
|
cd = iconv_open ("UTF-8", i->uri_encoding);
|
||||||
if (cd == (iconv_t)(-1))
|
if (cd == (iconv_t)(-1))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -311,6 +292,7 @@ remote_to_utf8 (struct iri *i, const char *str, const char **new)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate a new iri structure and return a pointer to it. */
|
||||||
struct iri *
|
struct iri *
|
||||||
iri_new (void)
|
iri_new (void)
|
||||||
{
|
{
|
||||||
@ -321,6 +303,7 @@ iri_new (void)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Completely free an iri structure. */
|
||||||
void
|
void
|
||||||
iri_free (struct iri *i)
|
iri_free (struct iri *i)
|
||||||
{
|
{
|
||||||
@ -329,10 +312,12 @@ iri_free (struct iri *i)
|
|||||||
xfree (i);
|
xfree (i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set uri_encoding of struct iri i. If a remote encoding was specified, use
|
||||||
|
it unless force is true. */
|
||||||
void
|
void
|
||||||
set_uri_encoding (struct iri *i, char *charset, bool force)
|
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)
|
if (!force && opt.encoding_remote)
|
||||||
return;
|
return;
|
||||||
if (i->uri_encoding)
|
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;
|
i->uri_encoding = charset ? xstrdup (charset) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set content_encoding of struct iri i. */
|
||||||
void
|
void
|
||||||
set_content_encoding (struct iri *i, char *charset)
|
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)
|
if (opt.encoding_remote)
|
||||||
return;
|
return;
|
||||||
if (i->content_encoding)
|
if (i->content_encoding)
|
||||||
|
@ -31,9 +31,9 @@ as that of the covered work. */
|
|||||||
#define IRI_H
|
#define IRI_H
|
||||||
|
|
||||||
struct iri {
|
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 */
|
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
|
#ifdef ENABLE_IRI
|
||||||
|
Loading…
Reference in New Issue
Block a user