diff options
Diffstat (limited to '')
-rw-r--r-- | src/charset.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/charset.c b/src/charset.c new file mode 100644 index 000000000..41269f38b --- /dev/null +++ b/src/charset.c @@ -0,0 +1,116 @@ +/* + * (c) 2006 by Kalle Wallin <kaw@linux.se> + * Copyright (C) 2008 Max Kellermann <max@duempel.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "charset.h" +#include "i18n.h" + +#include <assert.h> +#include <string.h> +#include <glib.h> + +extern void screen_status_printf(const char *format, ...); + +static bool noconvert = true; + +void +charset_init(bool disable) +{ + noconvert = disable; +} + +size_t +my_strlen(const char *str) +{ + assert(str != NULL); + + if (g_utf8_validate(str, -1, NULL)) { + size_t len = g_utf8_strlen(str, -1); + size_t width = 0; + gunichar c; + + while (len--) { + c = g_utf8_get_char(str); + width += g_unichar_iswide(c) ? 2 : 1; + str += g_unichar_to_utf8(c, NULL); + } + + return width; + } else + return strlen(str); +} + +char * +utf8_to_locale(const char *utf8str) +{ + gchar *str; + gsize rb, wb; + GError *error; + + assert(utf8str != NULL); + + if (noconvert) + return g_strdup(utf8str); + + rb = 0; /* bytes read */ + wb = 0; /* bytes written */ + error = NULL; + str = g_locale_from_utf8(utf8str, + strlen(utf8str), + &wb, &rb, + &error); + if (error) { + const char *charset; + + g_get_charset(&charset); + screen_status_printf(_("Error: Unable to convert characters to %s"), + charset); + g_error_free(error); + return g_strdup(utf8str); + } + + return str; +} + +char * +locale_to_utf8(const char *localestr) +{ + gchar *str; + gsize rb, wb; + GError *error; + + assert(localestr != NULL); + + if (noconvert) + return g_strdup(localestr); + + rb = 0; /* bytes read */ + wb = 0; /* bytes written */ + error = NULL; + str = g_locale_to_utf8(localestr, + strlen(localestr), + &wb, &rb, + &error); + if (error) { + screen_status_printf(_("Error: Unable to convert characters to UTF-8")); + g_error_free(error); + return g_strdup(localestr); + } + + return str; +} |