diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2009-01-06 16:57:35 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2009-01-06 16:57:35 +0000 |
commit | 039bf2e7e5b8e0a35867b6f00641a351a95d4fbc (patch) | |
tree | ef530ce37337fc938fac90927b95b5dac73e074a /src/input/inputstream.c | |
parent | dc43c01c1562f6bef60e5ee6725e25c9b0c77a31 (diff) | |
download | libparserutils-039bf2e7e5b8e0a35867b6f00641a351a95d4fbc.tar.gz libparserutils-039bf2e7e5b8e0a35867b6f00641a351a95d4fbc.tar.bz2 |
Correct return value when we can't find a charset in inputstream constructor.
Add new API to enable on-the-fly changing of the input charset. This is only possible if no data has been read from the stream.
svn path=/trunk/libparserutils/; revision=5969
Diffstat (limited to 'src/input/inputstream.c')
-rw-r--r-- | src/input/inputstream.c | 76 |
1 files changed, 62 insertions, 14 deletions
diff --git a/src/input/inputstream.c b/src/input/inputstream.c index f678e66..1bc40c5 100644 --- a/src/input/inputstream.c +++ b/src/input/inputstream.c @@ -107,22 +107,23 @@ parserutils_error parserutils_inputstream_create(const char *enc, s->mibenum = parserutils_charset_mibenum_from_name(enc, strlen(enc)); - if (s->mibenum != 0) { - params.encoding.name = enc; - - error = parserutils_filter_setopt(s->input, - PARSERUTILS_FILTER_SET_ENCODING, - ¶ms); - if (error != PARSERUTILS_OK) { - parserutils_filter_destroy(s->input); - parserutils_buffer_destroy(s->public.utf8); - parserutils_buffer_destroy(s->raw); - alloc(s, 0, pw); - return error; - } + if (s->mibenum == 0) + return PARSERUTILS_BADENCODING; + + params.encoding.name = enc; - s->encsrc = encsrc; + error = parserutils_filter_setopt(s->input, + PARSERUTILS_FILTER_SET_ENCODING, + ¶ms); + if (error != PARSERUTILS_OK) { + parserutils_filter_destroy(s->input); + parserutils_buffer_destroy(s->public.utf8); + parserutils_buffer_destroy(s->raw); + alloc(s, 0, pw); + return error; } + + s->encsrc = encsrc; } else { s->mibenum = 0; s->encsrc = 0; @@ -308,6 +309,53 @@ const char *parserutils_inputstream_read_charset( return parserutils_charset_mibenum_to_name(s->mibenum); } +/** + * Change the source charset of the input stream + * + * \param stream Input stream to modify + * \param charset Charset name + * \param source Charset source identifier + * \return PARSERUTILS_OK on success, + * PARSERUTILS_BADPARM on invalid parameters, + * PARSERUTILS_INVALID if called after data has been read from stream, + * PARSERUTILS_BADENCODING if the encoding is unsupported, + * PARSERUTILS_NOMEM on memory exhaustion. + */ +parserutils_error parserutils_inputstream_change_charset( + parserutils_inputstream *stream, + const char *enc, uint32_t source) +{ + parserutils_inputstream_private *s = + (parserutils_inputstream_private *) stream; + parserutils_filter_optparams params; + uint16_t temp; + parserutils_error error; + + if (stream == NULL || enc == NULL) + return PARSERUTILS_BADPARM; + + if (s->done_first_chunk) + return PARSERUTILS_INVALID; + + temp = parserutils_charset_mibenum_from_name(enc, strlen(enc)); + if (temp == 0) + return PARSERUTILS_BADENCODING; + + /* Ensure filter is using the correct encoding */ + params.encoding.name = enc; + error = parserutils_filter_setopt(s->input, + PARSERUTILS_FILTER_SET_ENCODING, + ¶ms); + if (error != PARSERUTILS_OK) + return error; + + /* Finally, replace the current settings */ + s->mibenum = temp; + s->encsrc = source; + + return PARSERUTILS_OK; +} + /****************************************************************************** ******************************************************************************/ |