summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-01-06 16:57:35 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-01-06 16:57:35 +0000
commit039bf2e7e5b8e0a35867b6f00641a351a95d4fbc (patch)
treeef530ce37337fc938fac90927b95b5dac73e074a
parentdc43c01c1562f6bef60e5ee6725e25c9b0c77a31 (diff)
downloadlibparserutils-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
-rw-r--r--include/parserutils/input/inputstream.h4
-rw-r--r--src/input/inputstream.c76
2 files changed, 66 insertions, 14 deletions
diff --git a/include/parserutils/input/inputstream.h b/include/parserutils/input/inputstream.h
index 9c0be7d..fe67aeb 100644
--- a/include/parserutils/input/inputstream.h
+++ b/include/parserutils/input/inputstream.h
@@ -169,6 +169,10 @@ static inline void parserutils_inputstream_advance(
/* Read the document charset */
const char *parserutils_inputstream_read_charset(
parserutils_inputstream *stream, uint32_t *source);
+/* Change the document charset */
+parserutils_error parserutils_inputstream_change_charset(
+ parserutils_inputstream *stream,
+ const char *enc, uint32_t source);
#endif
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,
- &params);
- 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,
+ &params);
+ 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,
+ &params);
+ if (error != PARSERUTILS_OK)
+ return error;
+
+ /* Finally, replace the current settings */
+ s->mibenum = temp;
+ s->encsrc = source;
+
+ return PARSERUTILS_OK;
+}
+
/******************************************************************************
******************************************************************************/