|
Packit |
5b56b6 |
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
/*
|
|
Packit |
5b56b6 |
* This file is part of The Croco Library
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
* Copyright (C) 2002-2003 Dodji Seketeli <dodji@seketeli.org>
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
* This program is free software; you can redistribute it and/or
|
|
Packit |
5b56b6 |
* modify it under the terms of version 3 of the GNU General Public
|
|
Packit |
5b56b6 |
* License as published by the Free Software Foundation.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
5b56b6 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
5b56b6 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
5b56b6 |
* GNU General Public License for more details.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
5b56b6 |
* along with this program; if not, write to the Free Software
|
|
Packit |
5b56b6 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
Packit |
5b56b6 |
* USA
|
|
Packit |
5b56b6 |
*/
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
/*
|
|
Packit |
5b56b6 |
*$Id: cr-enc-handler.c,v 1.8 2005/05/10 19:48:56 dodji Exp $
|
|
Packit |
5b56b6 |
*/
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
/**
|
|
Packit |
5b56b6 |
*@file
|
|
Packit |
5b56b6 |
*The definition of the #CREncHandler class.
|
|
Packit |
5b56b6 |
*/
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
#include <config.h>
|
|
Packit |
5b56b6 |
#include "cr-enc-handler.h"
|
|
Packit |
5b56b6 |
#include "cr-utils.h"
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
#include <string.h>
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
struct CREncAlias {
|
|
Packit |
5b56b6 |
const gchar *name;
|
|
Packit |
5b56b6 |
enum CREncoding encoding;
|
|
Packit |
5b56b6 |
};
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
static struct CREncAlias gv_default_aliases[] = {
|
|
Packit |
5b56b6 |
{"UTF-8", CR_UTF_8},
|
|
Packit |
5b56b6 |
{"UTF_8", CR_UTF_8},
|
|
Packit |
5b56b6 |
{"UTF8", CR_UTF_8},
|
|
Packit |
5b56b6 |
{"UTF-16", CR_UTF_16},
|
|
Packit |
5b56b6 |
{"UTF_16", CR_UTF_16},
|
|
Packit |
5b56b6 |
{"UTF16", CR_UTF_16},
|
|
Packit |
5b56b6 |
{"UCS1", CR_UCS_1},
|
|
Packit |
5b56b6 |
{"UCS-1", CR_UCS_1},
|
|
Packit |
5b56b6 |
{"UCS_1", CR_UCS_1},
|
|
Packit |
5b56b6 |
{"ISO-8859-1", CR_UCS_1},
|
|
Packit |
5b56b6 |
{"ISO_8859-1", CR_UCS_1},
|
|
Packit |
5b56b6 |
{"UCS-1", CR_UCS_1},
|
|
Packit |
5b56b6 |
{"UCS_1", CR_UCS_1},
|
|
Packit |
5b56b6 |
{"UCS4", CR_UCS_4},
|
|
Packit |
5b56b6 |
{"UCS-4", CR_UCS_4},
|
|
Packit |
5b56b6 |
{"UCS_4", CR_UCS_4},
|
|
Packit |
5b56b6 |
{"ASCII", CR_ASCII},
|
|
Packit |
5b56b6 |
{0, 0}
|
|
Packit |
5b56b6 |
};
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
static CREncHandler gv_default_enc_handlers[] = {
|
|
Packit |
5b56b6 |
{CR_UCS_1, cr_utils_ucs1_to_utf8, cr_utils_utf8_to_ucs1,
|
|
Packit |
5b56b6 |
cr_utils_ucs1_str_len_as_utf8, cr_utils_utf8_str_len_as_ucs1},
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
{CR_ISO_8859_1, cr_utils_ucs1_to_utf8, cr_utils_utf8_to_ucs1,
|
|
Packit |
5b56b6 |
cr_utils_ucs1_str_len_as_utf8, cr_utils_utf8_str_len_as_ucs1},
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
{CR_ASCII, cr_utils_ucs1_to_utf8, cr_utils_utf8_to_ucs1,
|
|
Packit |
5b56b6 |
cr_utils_ucs1_str_len_as_utf8, cr_utils_utf8_str_len_as_ucs1},
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
{0, NULL, NULL, NULL, NULL}
|
|
Packit |
5b56b6 |
};
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
/**
|
|
Packit |
5b56b6 |
* cr_enc_handler_get_instance:
|
|
Packit |
5b56b6 |
*@a_enc: the encoding of the Handler.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
*Gets the instance of encoding handler.
|
|
Packit |
5b56b6 |
*This function implements a singleton pattern.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
*Returns the instance of #CREncHandler.
|
|
Packit |
5b56b6 |
*/
|
|
Packit |
5b56b6 |
CREncHandler *
|
|
Packit |
5b56b6 |
cr_enc_handler_get_instance (enum CREncoding a_enc)
|
|
Packit |
5b56b6 |
{
|
|
Packit |
5b56b6 |
gulong i = 0;
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
for (i = 0; gv_default_enc_handlers[i].encoding; i++) {
|
|
Packit |
5b56b6 |
if (gv_default_enc_handlers[i].encoding == a_enc) {
|
|
Packit |
5b56b6 |
return (CREncHandler *)
|
|
Packit |
5b56b6 |
& gv_default_enc_handlers[i].encoding;
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
return NULL;
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
/**
|
|
Packit |
5b56b6 |
* cr_enc_handler_resolve_enc_alias:
|
|
Packit |
5b56b6 |
*@a_alias_name: the encoding name.
|
|
Packit |
5b56b6 |
*@a_enc: output param. The returned encoding type
|
|
Packit |
5b56b6 |
*or 0 if the alias is not supported.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
*Given an encoding name (called an alias name)
|
|
Packit |
5b56b6 |
*the function returns the matching encoding type.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
*Returns CR_OK upon successfull completion, an error code otherwise.
|
|
Packit |
5b56b6 |
*/
|
|
Packit |
5b56b6 |
enum CRStatus
|
|
Packit |
5b56b6 |
cr_enc_handler_resolve_enc_alias (const guchar * a_alias_name,
|
|
Packit |
5b56b6 |
enum CREncoding *a_enc)
|
|
Packit |
5b56b6 |
{
|
|
Packit |
5b56b6 |
gulong i = 0;
|
|
Packit |
5b56b6 |
guchar *alias_name_up = NULL;
|
|
Packit |
5b56b6 |
enum CRStatus status = CR_ENCODING_NOT_FOUND_ERROR;
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
g_return_val_if_fail (a_alias_name != NULL, CR_BAD_PARAM_ERROR);
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
alias_name_up = g_strdup (a_alias_name);
|
|
Packit |
5b56b6 |
g_ascii_strup (alias_name_up, -1);
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
for (i = 0; gv_default_aliases[i].name; i++) {
|
|
Packit |
5b56b6 |
if (!strcmp (gv_default_aliases[i].name, alias_name_up)) {
|
|
Packit |
5b56b6 |
*a_enc = gv_default_aliases[i].encoding;
|
|
Packit |
5b56b6 |
status = CR_OK;
|
|
Packit |
5b56b6 |
break;
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
return status;
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
/**
|
|
Packit |
5b56b6 |
* cr_enc_handler_convert_input:
|
|
Packit |
5b56b6 |
*@a_this: the current instance of #CREncHandler.
|
|
Packit |
5b56b6 |
*@a_in: the input buffer to convert.
|
|
Packit |
5b56b6 |
*@a_in_len: in/out parameter. The len of the input
|
|
Packit |
5b56b6 |
*buffer to convert. After return, contains the number of
|
|
Packit |
5b56b6 |
*bytes actually consumed.
|
|
Packit |
5b56b6 |
*@a_out: output parameter. The converted output buffer.
|
|
Packit |
5b56b6 |
*Must be freed by the buffer.
|
|
Packit |
5b56b6 |
*@a_out_len: output parameter. The length of the output buffer.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
*Converts a raw input buffer into an utf8 buffer.
|
|
Packit |
5b56b6 |
*
|
|
Packit |
5b56b6 |
*Returns CR_OK upon successfull completion, an error code otherwise.
|
|
Packit |
5b56b6 |
*/
|
|
Packit |
5b56b6 |
enum CRStatus
|
|
Packit |
5b56b6 |
cr_enc_handler_convert_input (CREncHandler * a_this,
|
|
Packit |
5b56b6 |
const guchar * a_in,
|
|
Packit |
5b56b6 |
gulong * a_in_len,
|
|
Packit |
5b56b6 |
guchar ** a_out, gulong * a_out_len)
|
|
Packit |
5b56b6 |
{
|
|
Packit |
5b56b6 |
enum CRStatus status = CR_OK;
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
g_return_val_if_fail (a_this && a_in && a_in_len && a_out,
|
|
Packit |
5b56b6 |
CR_BAD_PARAM_ERROR);
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
if (a_this->decode_input == NULL)
|
|
Packit |
5b56b6 |
return CR_OK;
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
if (a_this->enc_str_len_as_utf8) {
|
|
Packit |
5b56b6 |
status = a_this->enc_str_len_as_utf8 (a_in,
|
|
Packit |
5b56b6 |
&a_in[*a_in_len - 1],
|
|
Packit |
5b56b6 |
a_out_len);
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
g_return_val_if_fail (status == CR_OK, status);
|
|
Packit |
5b56b6 |
} else {
|
|
Packit |
5b56b6 |
*a_out_len = *a_in_len;
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
*a_out = g_malloc0 (*a_out_len);
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
status = a_this->decode_input (a_in, a_in_len, *a_out, a_out_len);
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
if (status != CR_OK) {
|
|
Packit |
5b56b6 |
g_free (*a_out);
|
|
Packit |
5b56b6 |
*a_out = NULL;
|
|
Packit |
5b56b6 |
}
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
g_return_val_if_fail (status == CR_OK, status);
|
|
Packit |
5b56b6 |
|
|
Packit |
5b56b6 |
return CR_OK;
|
|
Packit |
5b56b6 |
}
|