codec.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include <string.h>
00009
00010 #include "charset/aliases.h"
00011 #include "charset/codecs/codec_impl.h"
00012
00013 extern parserutils_charset_handler charset_ascii_codec_handler;
00014 extern parserutils_charset_handler charset_8859_codec_handler;
00015 extern parserutils_charset_handler charset_ext8_codec_handler;
00016 extern parserutils_charset_handler charset_utf8_codec_handler;
00017 extern parserutils_charset_handler charset_utf16_codec_handler;
00018
00019 static parserutils_charset_handler *handler_table[] = {
00020 &charset_utf8_codec_handler,
00021 &charset_utf16_codec_handler,
00022 &charset_8859_codec_handler,
00023 &charset_ext8_codec_handler,
00024 &charset_ascii_codec_handler,
00025 NULL,
00026 };
00027
00038 parserutils_error parserutils_charset_codec_create(const char *charset,
00039 parserutils_charset_codec **codec)
00040 {
00041 parserutils_charset_codec *c;
00042 parserutils_charset_handler **handler;
00043 const parserutils_charset_aliases_canon * canon;
00044 parserutils_error error;
00045
00046 if (charset == NULL || codec == NULL)
00047 return PARSERUTILS_BADPARM;
00048
00049
00050 canon = parserutils__charset_alias_canonicalise(charset,
00051 strlen(charset));
00052 if (canon == NULL)
00053 return PARSERUTILS_BADENCODING;
00054
00055
00056 for (handler = handler_table; *handler != NULL; handler++) {
00057 if ((*handler)->handles_charset(canon->name))
00058 break;
00059 }
00060
00061
00062 if ((*handler) == NULL)
00063 return PARSERUTILS_BADENCODING;
00064
00065
00066 error = (*handler)->create(canon->name, &c);
00067 if (error != PARSERUTILS_OK)
00068 return error;
00069
00070
00071 c->mibenum = canon->mib_enum;
00072
00073 c->errormode = PARSERUTILS_CHARSET_CODEC_ERROR_LOOSE;
00074
00075 *codec = c;
00076
00077 return PARSERUTILS_OK;
00078 }
00079
00086 parserutils_error parserutils_charset_codec_destroy(
00087 parserutils_charset_codec *codec)
00088 {
00089 if (codec == NULL)
00090 return PARSERUTILS_BADPARM;
00091
00092 codec->handler.destroy(codec);
00093
00094 free(codec);
00095
00096 return PARSERUTILS_OK;
00097 }
00098
00107 parserutils_error parserutils_charset_codec_setopt(
00108 parserutils_charset_codec *codec,
00109 parserutils_charset_codec_opttype type,
00110 parserutils_charset_codec_optparams *params)
00111 {
00112 if (codec == NULL || params == NULL)
00113 return PARSERUTILS_BADPARM;
00114
00115 switch (type) {
00116 case PARSERUTILS_CHARSET_CODEC_ERROR_MODE:
00117 codec->errormode = params->error_mode.mode;
00118 break;
00119 }
00120
00121 return PARSERUTILS_OK;
00122 }
00123
00136 parserutils_error parserutils_charset_codec_encode(
00137 parserutils_charset_codec *codec,
00138 const uint8_t **source, size_t *sourcelen,
00139 uint8_t **dest, size_t *destlen)
00140 {
00141 if (codec == NULL || source == NULL || *source == NULL ||
00142 sourcelen == NULL || dest == NULL || *dest == NULL ||
00143 destlen == NULL)
00144 return PARSERUTILS_BADPARM;
00145
00146 return codec->handler.encode(codec, source, sourcelen, dest, destlen);
00147 }
00148
00163 parserutils_error parserutils_charset_codec_decode(
00164 parserutils_charset_codec *codec,
00165 const uint8_t **source, size_t *sourcelen,
00166 uint8_t **dest, size_t *destlen)
00167 {
00168 if (codec == NULL || source == NULL || *source == NULL ||
00169 sourcelen == NULL || dest == NULL || *dest == NULL ||
00170 destlen == NULL)
00171 return PARSERUTILS_BADPARM;
00172
00173 return codec->handler.decode(codec, source, sourcelen, dest, destlen);
00174 }
00175
00182 parserutils_error parserutils_charset_codec_reset(
00183 parserutils_charset_codec *codec)
00184 {
00185 if (codec == NULL)
00186 return PARSERUTILS_BADPARM;
00187
00188 return codec->handler.reset(codec);
00189 }
00190