Libparserutils
codec.c
Go to the documentation of this file.
1 /*
2  * This file is part of LibParserUtils.
3  * Licensed under the MIT License,
4  * http://www.opensource.org/licenses/mit-license.php
5  * Copyright 2007 John-Mark Bell <jmb@netsurf-browser.org>
6  */
7 
8 #include <string.h>
9 
10 #include "charset/aliases.h"
12 
18 
25  NULL,
26 };
27 
40 {
44  parserutils_error error;
45 
46  if (charset == NULL || codec == NULL)
47  return PARSERUTILS_BADPARM;
48 
49  /* Canonicalise parserutils_charset name. */
51  strlen(charset));
52  if (canon == NULL)
54 
55  /* Search for handler class */
56  for (handler = handler_table; *handler != NULL; handler++) {
57  if ((*handler)->handles_charset(canon->name))
58  break;
59  }
60 
61  /* None found */
62  if ((*handler) == NULL)
64 
65  /* Instantiate class */
66  error = (*handler)->create(canon->name, &c);
67  if (error != PARSERUTILS_OK)
68  return error;
69 
70  /* and initialise it */
71  c->mibenum = canon->mib_enum;
72 
74 
75  *codec = c;
76 
77  return PARSERUTILS_OK;
78 }
79 
88 {
89  if (codec == NULL)
90  return PARSERUTILS_BADPARM;
91 
92  codec->handler.destroy(codec);
93 
94  free(codec);
95 
96  return PARSERUTILS_OK;
97 }
98 
111 {
112  if (codec == NULL || params == NULL)
113  return PARSERUTILS_BADPARM;
114 
115  switch (type) {
117  codec->errormode = params->error_mode.mode;
118  break;
119  }
120 
121  return PARSERUTILS_OK;
122 }
123 
138  const uint8_t **source, size_t *sourcelen,
139  uint8_t **dest, size_t *destlen)
140 {
141  if (codec == NULL || source == NULL || *source == NULL ||
142  sourcelen == NULL || dest == NULL || *dest == NULL ||
143  destlen == NULL)
144  return PARSERUTILS_BADPARM;
145 
146  return codec->handler.encode(codec, source, sourcelen, dest, destlen);
147 }
148 
165  const uint8_t **source, size_t *sourcelen,
166  uint8_t **dest, size_t *destlen)
167 {
168  if (codec == NULL || source == NULL || *source == NULL ||
169  sourcelen == NULL || dest == NULL || *dest == NULL ||
170  destlen == NULL)
171  return PARSERUTILS_BADPARM;
172 
173  return codec->handler.decode(codec, source, sourcelen, dest, destlen);
174 }
175 
184 {
185  if (codec == NULL)
186  return PARSERUTILS_BADPARM;
187 
188  return codec->handler.reset(codec);
189 }
190 
charset_ext8_codec_handler
parserutils_charset_handler charset_ext8_codec_handler
Definition: codec_ext8.c:579
handler_table
static parserutils_charset_handler * handler_table[]
Definition: codec.c:19
parserutils_charset_codec_destroy
parserutils_error parserutils_charset_codec_destroy(parserutils_charset_codec *codec)
Destroy a charset codec.
Definition: codec.c:86
parserutils_charset_codec_create
parserutils_error parserutils_charset_codec_create(const char *charset, parserutils_charset_codec **codec)
Create a charset codec.
Definition: codec.c:38
PARSERUTILS_BADPARM
@ PARSERUTILS_BADPARM
Definition: errors.h:22
parserutils_charset_codec_optparams::error_mode
struct parserutils_charset_codec_optparams::@0 error_mode
Parameters for error mode setting.
parserutils_charset_codec::encode
parserutils_error(* encode)(parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, uint8_t **dest, size_t *destlen)
Definition: codec_impl.h:26
PARSERUTILS_CHARSET_CODEC_ERROR_MODE
@ PARSERUTILS_CHARSET_CODEC_ERROR_MODE
Set codec error mode.
Definition: codec.h:76
parserutils_charset_codec_encode
parserutils_error parserutils_charset_codec_encode(parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, uint8_t **dest, size_t *destlen)
Encode a chunk of UCS-4 data into a codec's charset.
Definition: codec.c:136
parserutils_charset_codec::handler
struct parserutils_charset_codec::@3 handler
Vtable for handler code.
charset_ascii_codec_handler
parserutils_charset_handler charset_ascii_codec_handler
Definition: codec_ascii.c:527
parserutils_charset_codec::destroy
parserutils_error(* destroy)(parserutils_charset_codec *codec)
Definition: codec_impl.h:25
PARSERUTILS_OK
@ PARSERUTILS_OK
Definition: errors.h:19
PARSERUTILS_BADENCODING
@ PARSERUTILS_BADENCODING
Definition: errors.h:26
parserutils_charset_codec::mibenum
uint16_t mibenum
MIB enum for charset.
Definition: codec_impl.h:20
parserutils_charset_codec
Core charset codec definition; implementations extend this.
Definition: codec_impl.h:19
parserutils_charset_aliases_canon::mib_enum
uint16_t mib_enum
Definition: aliases.h:17
charset_utf8_codec_handler
parserutils_charset_handler charset_utf8_codec_handler
Definition: codec_utf8.c:542
parserutils_charset_codec::reset
parserutils_error(* reset)(parserutils_charset_codec *codec)
Definition: codec_impl.h:32
parserutils_charset_codec::errormode
parserutils_charset_codec_errormode errormode
error mode
Definition: codec_impl.h:22
parserutils_charset_codec_setopt
parserutils_error parserutils_charset_codec_setopt(parserutils_charset_codec *codec, parserutils_charset_codec_opttype type, parserutils_charset_codec_optparams *params)
Configure a charset codec.
Definition: codec.c:107
codec_impl.h
parserutils_charset_codec_optparams
Charset codec option parameters.
Definition: codec.h:82
parserutils_charset_codec_decode
parserutils_error parserutils_charset_codec_decode(parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, uint8_t **dest, size_t *destlen)
Decode a chunk of data in a codec's charset into UCS-4.
Definition: codec.c:163
aliases.h
parserutils_error
parserutils_error
Definition: errors.h:18
parserutils_charset_codec_optparams::mode
parserutils_charset_codec_errormode mode
The desired error handling mode.
Definition: codec.h:86
parserutils_charset_aliases_canon::name
const char * name
Definition: aliases.h:19
parserutils_charset_codec_opttype
parserutils_charset_codec_opttype
Charset codec option types.
Definition: codec.h:74
parserutils_charset_codec_reset
parserutils_error parserutils_charset_codec_reset(parserutils_charset_codec *codec)
Clear a charset codec's encoding state.
Definition: codec.c:182
parserutils_charset_handler
Codec factory component definition.
Definition: codec_impl.h:39
PARSERUTILS_CHARSET_CODEC_ERROR_LOOSE
@ PARSERUTILS_CHARSET_CODEC_ERROR_LOOSE
Replace unrepresentable characters with single alternate.
Definition: codec.h:66
charset_utf16_codec_handler
parserutils_charset_handler charset_utf16_codec_handler
Definition: codec_utf16.c:542
parserutils_charset_aliases_canon
Definition: aliases.h:15
charset_8859_codec_handler
parserutils_charset_handler charset_8859_codec_handler
Definition: codec_8859.c:587
parserutils_charset_codec::decode
parserutils_error(* decode)(parserutils_charset_codec *codec, const uint8_t **source, size_t *sourcelen, uint8_t **dest, size_t *destlen)
Definition: codec_impl.h:29
parserutils__charset_alias_canonicalise
parserutils_charset_aliases_canon * parserutils__charset_alias_canonicalise(const char *alias, size_t len)
Retrieve the canonical form of an alias name.
Definition: aliases.c:79