codec.c

Go to the documentation of this file.
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 

Generated on Wed Jul 29 11:59:20 2015 for Libparserutils by  doxygen 1.5.6