diff options
Diffstat (limited to 'src/charset')
-rw-r--r-- | src/charset/codec.c | 48 | ||||
-rw-r--r-- | src/charset/codecs/codec_8859.c | 53 | ||||
-rw-r--r-- | src/charset/codecs/codec_ascii.c | 51 | ||||
-rw-r--r-- | src/charset/codecs/codec_ext8.c | 53 | ||||
-rw-r--r-- | src/charset/codecs/codec_impl.h | 7 | ||||
-rw-r--r-- | src/charset/codecs/codec_utf16.c | 55 | ||||
-rw-r--r-- | src/charset/codecs/codec_utf8.c | 55 |
7 files changed, 195 insertions, 127 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; } /** diff --git a/src/charset/codecs/codec_8859.c b/src/charset/codecs/codec_8859.c index 1b8fd37..c04eb87 100644 --- a/src/charset/codecs/codec_8859.c +++ b/src/charset/codecs/codec_8859.c @@ -66,9 +66,11 @@ typedef struct charset_8859_codec { } charset_8859_codec; static bool charset_8859_codec_handles_charset(const char *charset); -static parserutils_charset_codec *charset_8859_codec_create(const char *charset, - parserutils_alloc alloc, void *pw); -static void charset_8859_codec_destroy (parserutils_charset_codec *codec); +static parserutils_error charset_8859_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec); +static parserutils_error charset_8859_codec_destroy( + parserutils_charset_codec *codec); static parserutils_error charset_8859_codec_encode( parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, @@ -125,12 +127,16 @@ bool charset_8859_codec_handles_charset(const char *charset) * \param charset The charset to read from / write to * \param alloc Memory (de)allocation function * \param pw Pointer to client-specific private data (may be NULL) - * \return Pointer to codec, or NULL on failure + * \param codec Pointer to location to receive codec + * \return PARSERUTILS_OK on success, + * PARSERUTILS_BADPARM on bad parameters, + * PARSERUTILS_NOMEM on memory exhausion */ -parserutils_charset_codec *charset_8859_codec_create(const char *charset, - parserutils_alloc alloc, void *pw) +parserutils_error charset_8859_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec) { - charset_8859_codec *codec; + charset_8859_codec *c; uint16_t match = parserutils_charset_mibenum_from_name( charset, strlen(charset)); uint32_t *table = NULL; @@ -144,35 +150,40 @@ parserutils_charset_codec *charset_8859_codec_create(const char *charset, assert(table != NULL); - codec = alloc(NULL, sizeof(charset_8859_codec), pw); - if (codec == NULL) - return NULL; + c = alloc(NULL, sizeof(charset_8859_codec), pw); + if (c == NULL) + return PARSERUTILS_NOMEM; - codec->table = table; + c->table = table; - codec->read_buf[0] = 0; - codec->read_len = 0; + c->read_buf[0] = 0; + c->read_len = 0; - codec->write_buf[0] = 0; - codec->write_len = 0; + c->write_buf[0] = 0; + c->write_len = 0; /* Finally, populate vtable */ - codec->base.handler.destroy = charset_8859_codec_destroy; - codec->base.handler.encode = charset_8859_codec_encode; - codec->base.handler.decode = charset_8859_codec_decode; - codec->base.handler.reset = charset_8859_codec_reset; + c->base.handler.destroy = charset_8859_codec_destroy; + c->base.handler.encode = charset_8859_codec_encode; + c->base.handler.decode = charset_8859_codec_decode; + c->base.handler.reset = charset_8859_codec_reset; + + *codec = (parserutils_charset_codec *) c; - return (parserutils_charset_codec *) codec; + return PARSERUTILS_OK; } /** * Destroy an ISO-8859-n codec * * \param codec The codec to destroy + * \return PARSERUTILS_OK on success, appropriate error otherwise */ -void charset_8859_codec_destroy (parserutils_charset_codec *codec) +parserutils_error charset_8859_codec_destroy (parserutils_charset_codec *codec) { UNUSED(codec); + + return PARSERUTILS_OK; } /** diff --git a/src/charset/codecs/codec_ascii.c b/src/charset/codecs/codec_ascii.c index bce5191..944d354 100644 --- a/src/charset/codecs/codec_ascii.c +++ b/src/charset/codecs/codec_ascii.c @@ -39,9 +39,11 @@ typedef struct charset_ascii_codec { } charset_ascii_codec; static bool charset_ascii_codec_handles_charset(const char *charset); -static parserutils_charset_codec *charset_ascii_codec_create( - const char *charset, parserutils_alloc alloc, void *pw); -static void charset_ascii_codec_destroy (parserutils_charset_codec *codec); +static parserutils_error charset_ascii_codec_create( + const char *charset, parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec); +static parserutils_error charset_ascii_codec_destroy( + parserutils_charset_codec *codec); static parserutils_error charset_ascii_codec_encode( parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, @@ -93,42 +95,51 @@ bool charset_ascii_codec_handles_charset(const char *charset) * \param charset The charset to read from / write to * \param alloc Memory (de)allocation function * \param pw Pointer to client-specific private data (may be NULL) - * \return Pointer to codec, or NULL on failure + * \param codec Pointer to location to receive codec + * \return PARSERUTILS_OK on success, + * PARSERUTILS_BADPARM on bad parameters, + * PARSERUTILS_NOMEM on memory exhausion */ -parserutils_charset_codec *charset_ascii_codec_create(const char *charset, - parserutils_alloc alloc, void *pw) +parserutils_error charset_ascii_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec) { - charset_ascii_codec *codec; + charset_ascii_codec *c; UNUSED(charset); - codec = alloc(NULL, sizeof(charset_ascii_codec), pw); - if (codec == NULL) - return NULL; + c = alloc(NULL, sizeof(charset_ascii_codec), pw); + if (c == NULL) + return PARSERUTILS_NOMEM; - codec->read_buf[0] = 0; - codec->read_len = 0; + c->read_buf[0] = 0; + c->read_len = 0; - codec->write_buf[0] = 0; - codec->write_len = 0; + c->write_buf[0] = 0; + c->write_len = 0; /* Finally, populate vtable */ - codec->base.handler.destroy = charset_ascii_codec_destroy; - codec->base.handler.encode = charset_ascii_codec_encode; - codec->base.handler.decode = charset_ascii_codec_decode; - codec->base.handler.reset = charset_ascii_codec_reset; + c->base.handler.destroy = charset_ascii_codec_destroy; + c->base.handler.encode = charset_ascii_codec_encode; + c->base.handler.decode = charset_ascii_codec_decode; + c->base.handler.reset = charset_ascii_codec_reset; + + *codec = (parserutils_charset_codec *) c; - return (parserutils_charset_codec *) codec; + return PARSERUTILS_OK; } /** * Destroy a US-ASCII codec * * \param codec The codec to destroy + * \return PARSERUTILS_OK on success, appropriate error otherwise */ -void charset_ascii_codec_destroy (parserutils_charset_codec *codec) +parserutils_error charset_ascii_codec_destroy (parserutils_charset_codec *codec) { UNUSED(codec); + + return PARSERUTILS_OK; } /** diff --git a/src/charset/codecs/codec_ext8.c b/src/charset/codecs/codec_ext8.c index 8678890..1f12fea 100644 --- a/src/charset/codecs/codec_ext8.c +++ b/src/charset/codecs/codec_ext8.c @@ -60,9 +60,11 @@ typedef struct charset_ext8_codec { } charset_ext8_codec; static bool charset_ext8_codec_handles_charset(const char *charset); -static parserutils_charset_codec *charset_ext8_codec_create(const char *charset, - parserutils_alloc alloc, void *pw); -static void charset_ext8_codec_destroy (parserutils_charset_codec *codec); +static parserutils_error charset_ext8_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec); +static parserutils_error charset_ext8_codec_destroy( + parserutils_charset_codec *codec); static parserutils_error charset_ext8_codec_encode( parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, @@ -119,12 +121,16 @@ bool charset_ext8_codec_handles_charset(const char *charset) * \param charset The charset to read from / write to * \param alloc Memory (de)allocation function * \param pw Pointer to client-specific private data (may be NULL) - * \return Pointer to codec, or NULL on failure + * \param codec Pointer to location to receive codec + * \return PARSERUTILS_OK on success, + * PARSERUTILS_BADPARM on bad parameters, + * PARSERUTILS_NOMEM on memory exhausion */ -parserutils_charset_codec *charset_ext8_codec_create(const char *charset, - parserutils_alloc alloc, void *pw) +parserutils_error charset_ext8_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec) { - charset_ext8_codec *codec; + charset_ext8_codec *c; uint16_t match = parserutils_charset_mibenum_from_name( charset, strlen(charset)); uint32_t *table = NULL; @@ -138,35 +144,40 @@ parserutils_charset_codec *charset_ext8_codec_create(const char *charset, assert(table != NULL); - codec = alloc(NULL, sizeof(charset_ext8_codec), pw); - if (codec == NULL) - return NULL; + c = alloc(NULL, sizeof(charset_ext8_codec), pw); + if (c == NULL) + return PARSERUTILS_NOMEM; - codec->table = table; + c->table = table; - codec->read_buf[0] = 0; - codec->read_len = 0; + c->read_buf[0] = 0; + c->read_len = 0; - codec->write_buf[0] = 0; - codec->write_len = 0; + c->write_buf[0] = 0; + c->write_len = 0; /* Finally, populate vtable */ - codec->base.handler.destroy = charset_ext8_codec_destroy; - codec->base.handler.encode = charset_ext8_codec_encode; - codec->base.handler.decode = charset_ext8_codec_decode; - codec->base.handler.reset = charset_ext8_codec_reset; + c->base.handler.destroy = charset_ext8_codec_destroy; + c->base.handler.encode = charset_ext8_codec_encode; + c->base.handler.decode = charset_ext8_codec_decode; + c->base.handler.reset = charset_ext8_codec_reset; + + *codec = (parserutils_charset_codec *) c; - return (parserutils_charset_codec *) codec; + return PARSERUTILS_OK; } /** * Destroy an extended 8bit codec * * \param codec The codec to destroy + * \return PARSERUTILS_OK on success, appropriate error otherwise */ -void charset_ext8_codec_destroy (parserutils_charset_codec *codec) +parserutils_error charset_ext8_codec_destroy (parserutils_charset_codec *codec) { UNUSED(codec); + + return PARSERUTILS_OK; } /** diff --git a/src/charset/codecs/codec_impl.h b/src/charset/codecs/codec_impl.h index 9183594..09f622c 100644 --- a/src/charset/codecs/codec_impl.h +++ b/src/charset/codecs/codec_impl.h @@ -25,7 +25,7 @@ struct parserutils_charset_codec { void *alloc_pw; /**< private word */ struct { - void (*destroy)(parserutils_charset_codec *codec); + parserutils_error (*destroy)(parserutils_charset_codec *codec); parserutils_error (*encode)(parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, uint8_t **dest, size_t *destlen); @@ -41,8 +41,9 @@ struct parserutils_charset_codec { */ typedef struct parserutils_charset_handler { bool (*handles_charset)(const char *charset); - parserutils_charset_codec *(*create)(const char *charset, - parserutils_alloc alloc, void *pw); + parserutils_error (*create)(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec); } parserutils_charset_handler; #endif diff --git a/src/charset/codecs/codec_utf16.c b/src/charset/codecs/codec_utf16.c index e17c217..c2a91ed 100644 --- a/src/charset/codecs/codec_utf16.c +++ b/src/charset/codecs/codec_utf16.c @@ -45,9 +45,11 @@ typedef struct charset_utf16_codec { } charset_utf16_codec; static bool charset_utf16_codec_handles_charset(const char *charset); -static parserutils_charset_codec *charset_utf16_codec_create( - const char *charset, parserutils_alloc alloc, void *pw); -static void charset_utf16_codec_destroy (parserutils_charset_codec *codec); +static parserutils_error charset_utf16_codec_create( + const char *charset, parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec); +static parserutils_error charset_utf16_codec_destroy( + parserutils_charset_codec *codec); static parserutils_error charset_utf16_codec_encode( parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, @@ -85,45 +87,54 @@ bool charset_utf16_codec_handles_charset(const char *charset) * \param charset The charset to read from / write to * \param alloc Memory (de)allocation function * \param pw Pointer to client-specific private data (may be NULL) - * \return Pointer to codec, or NULL on failure + * \param codec Pointer to location to receive codec + * \return PARSERUTILS_OK on success, + * PARSERUTILS_BADPARM on bad parameters, + * PARSERUTILS_NOMEM on memory exhausion */ -parserutils_charset_codec *charset_utf16_codec_create(const char *charset, - parserutils_alloc alloc, void *pw) +parserutils_error charset_utf16_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec) { - charset_utf16_codec *codec; + charset_utf16_codec *c; UNUSED(charset); - codec = alloc(NULL, sizeof(charset_utf16_codec), pw); - if (codec == NULL) - return NULL; + c = alloc(NULL, sizeof(charset_utf16_codec), pw); + if (c == NULL) + return PARSERUTILS_NOMEM; - codec->inval_buf[0] = '\0'; - codec->inval_len = 0; + c->inval_buf[0] = '\0'; + c->inval_len = 0; - codec->read_buf[0] = 0; - codec->read_len = 0; + c->read_buf[0] = 0; + c->read_len = 0; - codec->write_buf[0] = 0; - codec->write_len = 0; + c->write_buf[0] = 0; + c->write_len = 0; /* Finally, populate vtable */ - codec->base.handler.destroy = charset_utf16_codec_destroy; - codec->base.handler.encode = charset_utf16_codec_encode; - codec->base.handler.decode = charset_utf16_codec_decode; - codec->base.handler.reset = charset_utf16_codec_reset; + c->base.handler.destroy = charset_utf16_codec_destroy; + c->base.handler.encode = charset_utf16_codec_encode; + c->base.handler.decode = charset_utf16_codec_decode; + c->base.handler.reset = charset_utf16_codec_reset; - return (parserutils_charset_codec *) codec; + *codec = (parserutils_charset_codec *) c; + + return PARSERUTILS_OK; } /** * Destroy a UTF-16 codec * * \param codec The codec to destroy + * \return PARSERUTILS_OK on success, appropriate error otherwise */ -void charset_utf16_codec_destroy (parserutils_charset_codec *codec) +parserutils_error charset_utf16_codec_destroy (parserutils_charset_codec *codec) { UNUSED(codec); + + return PARSERUTILS_OK; } /** diff --git a/src/charset/codecs/codec_utf8.c b/src/charset/codecs/codec_utf8.c index 24eb3e4..f39b8bb 100644 --- a/src/charset/codecs/codec_utf8.c +++ b/src/charset/codecs/codec_utf8.c @@ -45,9 +45,11 @@ typedef struct charset_utf8_codec { } charset_utf8_codec; static bool charset_utf8_codec_handles_charset(const char *charset); -static parserutils_charset_codec *charset_utf8_codec_create(const char *charset, - parserutils_alloc alloc, void *pw); -static void charset_utf8_codec_destroy (parserutils_charset_codec *codec); +static parserutils_error charset_utf8_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec); +static parserutils_error charset_utf8_codec_destroy( + parserutils_charset_codec *codec); static parserutils_error charset_utf8_codec_encode( parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, @@ -86,45 +88,54 @@ bool charset_utf8_codec_handles_charset(const char *charset) * \param charset The charset to read from / write to * \param alloc Memory (de)allocation function * \param pw Pointer to client-specific private data (may be NULL) - * \return Pointer to codec, or NULL on failure + * \param codec Pointer to location to receive codec + * \return PARSERUTILS_OK on success, + * PARSERUTILS_BADPARM on bad parameters, + * PARSERUTILS_NOMEM on memory exhausion */ -parserutils_charset_codec *charset_utf8_codec_create(const char *charset, - parserutils_alloc alloc, void *pw) +parserutils_error charset_utf8_codec_create(const char *charset, + parserutils_alloc alloc, void *pw, + parserutils_charset_codec **codec) { - charset_utf8_codec *codec; + charset_utf8_codec *c; UNUSED(charset); - codec = alloc(NULL, sizeof(charset_utf8_codec), pw); - if (codec == NULL) - return NULL; + c = alloc(NULL, sizeof(charset_utf8_codec), pw); + if (c == NULL) + return PARSERUTILS_NOMEM; - codec->inval_buf[0] = '\0'; - codec->inval_len = 0; + c->inval_buf[0] = '\0'; + c->inval_len = 0; - codec->read_buf[0] = 0; - codec->read_len = 0; + c->read_buf[0] = 0; + c->read_len = 0; - codec->write_buf[0] = 0; - codec->write_len = 0; + c->write_buf[0] = 0; + c->write_len = 0; /* Finally, populate vtable */ - codec->base.handler.destroy = charset_utf8_codec_destroy; - codec->base.handler.encode = charset_utf8_codec_encode; - codec->base.handler.decode = charset_utf8_codec_decode; - codec->base.handler.reset = charset_utf8_codec_reset; + c->base.handler.destroy = charset_utf8_codec_destroy; + c->base.handler.encode = charset_utf8_codec_encode; + c->base.handler.decode = charset_utf8_codec_decode; + c->base.handler.reset = charset_utf8_codec_reset; - return (parserutils_charset_codec *) codec; + *codec = (parserutils_charset_codec *) c; + + return PARSERUTILS_OK; } /** * Destroy a UTF-8 codec * * \param codec The codec to destroy + * \return PARSERUTILS_OK on success, appropriate error otherwise */ -void charset_utf8_codec_destroy (parserutils_charset_codec *codec) +parserutils_error charset_utf8_codec_destroy (parserutils_charset_codec *codec) { UNUSED(codec); + + return PARSERUTILS_OK; } /** |