summaryrefslogtreecommitdiff
path: root/src/charset/codec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/charset/codec.c')
-rw-r--r--src/charset/codec.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/src/charset/codec.c b/src/charset/codec.c
index 1dc436d..ea1fc7e 100644
--- a/src/charset/codec.c
+++ b/src/charset/codec.c
@@ -31,23 +31,29 @@ static parserutils_charset_handler *handler_table[] = {
* \param charset Target charset
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to codec instance, or NULL on failure
+ * \param codec Pointer to location to receive codec instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhaustion,
+ * PARSERUTILS_BADENCODING on unsupported charset
*/
-parserutils_charset_codec *parserutils_charset_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw)
+parserutils_error parserutils_charset_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec)
{
- parserutils_charset_codec *codec;
+ parserutils_charset_codec *c;
parserutils_charset_handler **handler;
const parserutils_charset_aliases_canon * canon;
+ parserutils_error error;
- if (charset == NULL || alloc == NULL)
- return NULL;
+ if (charset == NULL || alloc == NULL || codec == NULL)
+ return PARSERUTILS_BADPARM;
/* Canonicalise parserutils_charset name. */
canon = parserutils_charset_alias_canonicalise(charset,
strlen(charset));
if (canon == NULL)
- return NULL;
+ return PARSERUTILS_BADENCODING;
/* Search for handler class */
for (handler = handler_table; *handler != NULL; handler++) {
@@ -57,37 +63,43 @@ parserutils_charset_codec *parserutils_charset_codec_create(const char *charset,
/* None found */
if ((*handler) == NULL)
- return NULL;
+ return PARSERUTILS_BADENCODING;
/* Instantiate class */
- codec = (*handler)->create(canon->name, alloc, pw);
- if (codec == NULL)
- return NULL;
+ error = (*handler)->create(canon->name, alloc, pw, &c);
+ if (error != PARSERUTILS_OK)
+ return error;
/* and initialise it */
- codec->mibenum = canon->mib_enum;
+ c->mibenum = canon->mib_enum;
+
+ c->errormode = PARSERUTILS_CHARSET_CODEC_ERROR_LOOSE;
- codec->errormode = PARSERUTILS_CHARSET_CODEC_ERROR_LOOSE;
+ c->alloc = alloc;
+ c->alloc_pw = pw;
- codec->alloc = alloc;
- codec->alloc_pw = pw;
+ *codec = c;
- return codec;
+ return PARSERUTILS_OK;
}
/**
* Destroy a charset codec
*
* \param codec The codec to destroy
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
*/
-void parserutils_charset_codec_destroy(parserutils_charset_codec *codec)
+parserutils_error parserutils_charset_codec_destroy(
+ parserutils_charset_codec *codec)
{
if (codec == NULL)
- return;
+ return PARSERUTILS_BADPARM;
codec->handler.destroy(codec);
codec->alloc(codec, 0, codec->alloc_pw);
+
+ return PARSERUTILS_OK;
}
/**