Blame gettext-tools/gnulib-lib/libcroco/cr-enc-handler.c

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
}