|
Libparserutils
|
00001 /* 00002 * This file is part of LibParserUtils. 00003 * Licensed under the MIT License, 00004 * http://www.opensource.org/licenses/mit-license.php 00005 * Copyright 2007 John-Mark Bell <jmb@netsurf-browser.org> 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 /* Canonicalise parserutils_charset name. */ 00050 canon = parserutils__charset_alias_canonicalise(charset, 00051 strlen(charset)); 00052 if (canon == NULL) 00053 return PARSERUTILS_BADENCODING; 00054 00055 /* Search for handler class */ 00056 for (handler = handler_table; *handler != NULL; handler++) { 00057 if ((*handler)->handles_charset(canon->name)) 00058 break; 00059 } 00060 00061 /* None found */ 00062 if ((*handler) == NULL) 00063 return PARSERUTILS_BADENCODING; 00064 00065 /* Instantiate class */ 00066 error = (*handler)->create(canon->name, &c); 00067 if (error != PARSERUTILS_OK) 00068 return error; 00069 00070 /* and initialise it */ 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
1.7.3