00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "cr-enc-handler.h"
00034 #include "cr-utils.h"
00035
00036 #include <string.h>
00037
00038 struct CREncAlias {
00039 const gchar * name ;
00040 enum CREncoding encoding ;
00041 } ;
00042
00043 static struct CREncAlias gv_default_aliases[] =
00044 {
00045 {"UTF-8", CR_UTF_8},
00046 {"UTF_8", CR_UTF_8},
00047 {"UTF8", CR_UTF_8},
00048 {"UTF-16", CR_UTF_16},
00049 {"UTF_16", CR_UTF_16},
00050 {"UTF16", CR_UTF_16},
00051 {"UCS1", CR_UCS_1},
00052 {"UCS-1", CR_UCS_1},
00053 {"UCS_1", CR_UCS_1},
00054 {"ISO-8859-1", CR_UCS_1},
00055 {"ISO_8859-1", CR_UCS_1},
00056 {"UCS-1", CR_UCS_1},
00057 {"UCS_1", CR_UCS_1},
00058 {"UCS4", CR_UCS_4},
00059 {"UCS-4", CR_UCS_4},
00060 {"UCS_4", CR_UCS_4},
00061 {"ASCII", CR_ASCII},
00062 {0, 0}
00063 } ;
00064
00065
00066 static CREncHandler gv_default_enc_handlers[] =
00067 {
00068 {CR_UCS_1, cr_utils_ucs1_to_utf8, cr_utils_utf8_to_ucs1,
00069 cr_utils_ucs1_str_len_as_utf8, cr_utils_utf8_str_len_as_ucs1},
00070
00071 {CR_ISO_8859_1, cr_utils_ucs1_to_utf8, cr_utils_utf8_to_ucs1,
00072 cr_utils_ucs1_str_len_as_utf8, cr_utils_utf8_str_len_as_ucs1},
00073
00074 {CR_ASCII, cr_utils_ucs1_to_utf8, cr_utils_utf8_to_ucs1,
00075 cr_utils_ucs1_str_len_as_utf8, cr_utils_utf8_str_len_as_ucs1},
00076
00077 {0, NULL, NULL, NULL, NULL}
00078 } ;
00079
00080
00081
00082
00083
00084
00085
00086
00087 CREncHandler *
00088 cr_enc_handler_get_instance (enum CREncoding a_enc)
00089 {
00090 gulong i = 0 ;
00091
00092 for (i = 0 ;gv_default_enc_handlers[i].encoding ; i++)
00093 {
00094 if (gv_default_enc_handlers[i].encoding == a_enc)
00095 {
00096 return
00097 (CREncHandler *)
00098 &gv_default_enc_handlers[i].encoding ;
00099 }
00100 }
00101
00102 return NULL ;
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 enum CRStatus
00115 cr_enc_handler_resolve_enc_alias (const guchar *a_alias_name,
00116 enum CREncoding *a_enc)
00117 {
00118 gulong i = 0 ;
00119 guchar * alias_name_up = NULL ;
00120 enum CRStatus status = CR_ENCODING_NOT_FOUND_ERROR ;
00121
00122 g_return_val_if_fail (a_alias_name != NULL, CR_BAD_PARAM_ERROR) ;
00123
00124 alias_name_up = g_strdup (a_alias_name) ;
00125 g_strup (alias_name_up) ;
00126
00127 for (i = 0 ; gv_default_aliases[i].name ; i++)
00128 {
00129 if (!strcmp (gv_default_aliases[i].name, alias_name_up))
00130 {
00131 *a_enc = gv_default_aliases[i].encoding ;
00132 status = CR_OK ;
00133 break ;
00134 }
00135 }
00136
00137 return status ;
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 enum CRStatus
00154 cr_enc_handler_convert_input (CREncHandler *a_this,
00155 const guchar *a_in,
00156 gulong *a_in_len,
00157 guchar **a_out,
00158 gulong *a_out_len)
00159 {
00160 enum CRStatus status = CR_OK ;
00161
00162 g_return_val_if_fail (a_this && a_in && a_in_len && a_out,
00163 CR_BAD_PARAM_ERROR) ;
00164
00165 if (a_this->decode_input == NULL) return CR_OK ;
00166
00167 if (a_this->enc_str_len_as_utf8)
00168 {
00169 status =
00170 a_this->enc_str_len_as_utf8 (a_in,
00171 &a_in[*a_in_len -1],
00172 a_out_len) ;
00173
00174 g_return_val_if_fail (status == CR_OK, status) ;
00175 }
00176 else
00177 {
00178 *a_out_len = *a_in_len ;
00179 }
00180
00181 *a_out = g_malloc0 (*a_out_len) ;
00182
00183 status = a_this->decode_input (a_in, a_in_len, *a_out, a_out_len) ;
00184
00185 if (status != CR_OK)
00186 {
00187 g_free (*a_out) ;
00188 *a_out = NULL ;
00189 }
00190
00191 g_return_val_if_fail (status == CR_OK, status) ;
00192
00193 return CR_OK ;
00194 }