summaryrefslogtreecommitdiff
path: root/src/charset
diff options
context:
space:
mode:
Diffstat (limited to 'src/charset')
-rw-r--r--src/charset/codec.c48
-rw-r--r--src/charset/codecs/codec_8859.c53
-rw-r--r--src/charset/codecs/codec_ascii.c51
-rw-r--r--src/charset/codecs/codec_ext8.c53
-rw-r--r--src/charset/codecs/codec_impl.h7
-rw-r--r--src/charset/codecs/codec_utf16.c55
-rw-r--r--src/charset/codecs/codec_utf8.c55
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;
}
/**