aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-10-15 19:36:30 +0200
committerMax Kellermann <max@duempel.org>2008-10-15 19:36:30 +0200
commit8746a58ab93f0662bf1e8b91a36c261822ffeed5 (patch)
treeecacc9d8c682cb2621cbd8d3298ef7e3ee056542
parente89599eaad23990973efd43f01cb802917a31cff (diff)
downloadmpd-8746a58ab93f0662bf1e8b91a36c261822ffeed5.tar.gz
mpd-8746a58ab93f0662bf1e8b91a36c261822ffeed5.tar.xz
mpd-8746a58ab93f0662bf1e8b91a36c261822ffeed5.zip
path, tag_id3: use g_convert() instead of charConv.c
GLib provides an easier API for character set conversion than iconv(). Use g_convert() / g_convert_with_fallback() for all character conversions. We should optimize the path.h API later to return a newly allocated buffer, so we can just pass GLib's return value.
-rw-r--r--src/Makefile.am2
-rw-r--r--src/charConv.c177
-rw-r--r--src/charConv.h26
-rw-r--r--src/path.c54
-rw-r--r--src/tag_id3.c15
5 files changed, 40 insertions, 234 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 41bc69f05..3652caaa9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -45,7 +45,6 @@ mpd_headers = \
output_control.h \
audioOutputs/audioOutput_shout.h \
buffer2array.h \
- charConv.h \
command.h \
idle.h \
condition.h \
@@ -131,7 +130,6 @@ mpd_SOURCES = \
output_control.c \
output_init.c \
buffer2array.c \
- charConv.c \
command.c \
idle.c \
condition.c \
diff --git a/src/charConv.c b/src/charConv.c
deleted file mode 100644
index ba1ea50dd..000000000
--- a/src/charConv.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* the Music Player Daemon (MPD)
- * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
- * This project's homepage is: http://www.musicpd.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 "charConv.h"
-#include "utf8.h"
-#include "utils.h"
-#include "path.h"
-#include "os_compat.h"
-
-#include "../config.h"
-
-#ifdef HAVE_ICONV
-#include <iconv.h>
-static iconv_t char_conv_iconv;
-#endif
-
-static char *char_conv_to;
-static char *char_conv_from;
-static int8_t char_conv_same;
-static int8_t char_conv_use_iconv;
-
-/* 1 is to use latin1ToUtf8
- 0 is not to use latin1/utf8 converter
- -1 is to use utf8ToLatin1*/
-static int8_t char_conv_latin1ToUtf8;
-
-#define BUFFER_SIZE MPD_PATH_MAX
-
-static void closeCharSetConversion(void);
-
-int setCharSetConversion(const char *to, const char *from)
-{
- if (char_conv_to && char_conv_from) {
- if (char_conv_latin1ToUtf8 &&
- !strcmp(from, char_conv_to) &&
- !strcmp(to, char_conv_from)) {
- char *swap = char_conv_from;
- char_conv_from = char_conv_to;
- char_conv_to = swap;
- char_conv_latin1ToUtf8 *= -1;
- return 0;
- } else if (!strcmp(to, char_conv_to) &&
- !strcmp(from,char_conv_from)) {
- return 0;
- }
- }
-
- closeCharSetConversion();
-
- if (0 == strcmp(to, from)) {
- char_conv_same = 1;
- char_conv_to = xstrdup(to);
- char_conv_from = xstrdup(from);
- return 0;
- }
-
- if (strcmp(to, "UTF-8") == 0 && strcmp(from, "ISO-8859-1") == 0) {
- char_conv_latin1ToUtf8 = 1;
- } else if (strcmp(to, "ISO-8859-1") == 0 && strcmp(from, "UTF-8") == 0) {
- char_conv_latin1ToUtf8 = -1;
- }
-
- if (char_conv_latin1ToUtf8 != 0) {
- char_conv_to = xstrdup(to);
- char_conv_from = xstrdup(from);
- return 0;
- }
-#ifdef HAVE_ICONV
- if ((char_conv_iconv = iconv_open(to, from)) == (iconv_t) (-1))
- return -1;
-
- char_conv_to = xstrdup(to);
- char_conv_from = xstrdup(from);
- char_conv_use_iconv = 1;
-
- return 0;
-#else
- return -1;
-#endif
-}
-
-#ifdef HAVE_ICONV
-static inline size_t deconst_iconv(iconv_t cd,
- const char **inbuf, size_t *inbytesleft,
- char **outbuf, size_t *outbytesleft)
-{
- union {
- const char **a;
- char **b;
- } deconst;
-
- deconst.a = inbuf;
-
- return iconv(cd, deconst.b, inbytesleft, outbuf, outbytesleft);
-}
-#endif
-
-char *char_conv_str(char *dest, const char *string)
-{
- if (!char_conv_to)
- return NULL;
-
- if (char_conv_same)
- return strcpy(dest, string);
-
-#ifdef HAVE_ICONV
- if (char_conv_use_iconv) {
- /* not optimized: */
- char buffer[BUFFER_SIZE];
- size_t inleft = strlen(string);
- size_t outleft;
- size_t retlen = 0;
- size_t err;
- char *bufferPtr;
-
- dest[0] = '\0';
-
- while (inleft) {
- bufferPtr = buffer;
- outleft = BUFFER_SIZE;
- err =
- deconst_iconv(char_conv_iconv, &string, &inleft,
- &bufferPtr, &outleft);
- if (outleft == BUFFER_SIZE
- || (err == (size_t)-1L && errno != E2BIG)) {
- return NULL;
- }
- memcpy(dest + retlen, buffer, BUFFER_SIZE - outleft);
- retlen += BUFFER_SIZE - outleft;
- dest[retlen] = '\0';
- }
-
- return dest;
- }
-#endif
-
- switch (char_conv_latin1ToUtf8) {
- case 1:
- return latin1_to_utf8(dest, string);
- case -1:
- return utf8_to_latin1(dest, string);
- }
-
- return NULL;
-}
-
-static void closeCharSetConversion(void)
-{
- if (char_conv_to) {
-#ifdef HAVE_ICONV
- if (char_conv_use_iconv)
- iconv_close(char_conv_iconv);
-#endif
- free(char_conv_to);
- free(char_conv_from);
- char_conv_to = NULL;
- char_conv_from = NULL;
- char_conv_same = 0;
- char_conv_latin1ToUtf8 = 0;
- char_conv_use_iconv = 0;
- }
-}
diff --git a/src/charConv.h b/src/charConv.h
deleted file mode 100644
index 728f549bb..000000000
--- a/src/charConv.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* the Music Player Daemon (MPD)
- * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
- * This project's homepage is: http://www.musicpd.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
- */
-
-#ifndef CHAR_CONV_H
-#define CHAR_CONV_H
-
-int setCharSetConversion(const char *to, const char *from);
-
-char *char_conv_str(char *dest, const char *string);
-
-#endif
diff --git a/src/path.c b/src/path.c
index 8d1b0018d..0728aee64 100644
--- a/src/path.c
+++ b/src/path.c
@@ -18,7 +18,6 @@
#include "path.h"
#include "log.h"
-#include "charConv.h"
#include "conf.h"
#include "utf8.h"
#include "utils.h"
@@ -32,28 +31,48 @@
#endif
#endif
+#include <glib.h>
+
const char *musicDir;
static const char *playlistDir;
static size_t music_dir_len;
static size_t playlist_dir_len;
static char *fsCharset;
-static char *path_conv_charset(char *dest, const char *to,
- const char *from, const char *str)
-{
- return setCharSetConversion(to, from) ? NULL : char_conv_str(dest, str);
-}
-
char *fs_charset_to_utf8(char *dst, const char *str)
{
- char *ret = path_conv_charset(dst, "UTF-8", fsCharset, str);
- return (ret && !validUtf8String(ret, strlen(ret))) ? NULL : ret;
+ gchar *p;
+ GError *error = NULL;
+
+ p = g_convert(str, -1,
+ fsCharset, "utf-8",
+ NULL, NULL, &error);
+ if (p == NULL)
+ /* no fallback */
+ return NULL;
+
+ g_strlcpy(dst, p, MPD_PATH_MAX);
+ g_free(p);
+ return dst;
}
char *utf8_to_fs_charset(char *dst, const char *str)
{
- char *ret = path_conv_charset(dst, fsCharset, "UTF-8", str);
- return ret ? ret : strcpy(dst, str);
+ gchar *p;
+ GError *error = NULL;
+
+ p = g_convert(str, -1,
+ "utf-8", fsCharset,
+ NULL, NULL, &error);
+ if (p == NULL) {
+ /* fall back to UTF-8 */
+ g_error_free(error);
+ return strcpy(dst, str);
+ }
+
+ g_strlcpy(dst, p, MPD_PATH_MAX);
+ g_free(p);
+ return dst;
}
void setFsCharset(const char *charset)
@@ -67,19 +86,6 @@ void setFsCharset(const char *charset)
DEBUG("setFsCharset: fs charset is: %s\n", fsCharset);
- if (setCharSetConversion("UTF-8", fsCharset) != 0) {
- WARNING("fs charset conversion problem: "
- "not able to convert from \"%s\" to \"%s\"\n",
- fsCharset, "UTF-8");
- error = 1;
- }
- if (setCharSetConversion(fsCharset, "UTF-8") != 0) {
- WARNING("fs charset conversion problem: "
- "not able to convert from \"%s\" to \"%s\"\n",
- "UTF-8", fsCharset);
- error = 1;
- }
-
if (error) {
free(fsCharset);
WARNING("setting fs charset to ISO-8859-1!\n");
diff --git a/src/tag_id3.c b/src/tag_id3.c
index 7fcf9f0a1..5d144b583 100644
--- a/src/tag_id3.c
+++ b/src/tag_id3.c
@@ -21,9 +21,9 @@
#include "utils.h"
#include "log.h"
#include "conf.h"
-#include "charConv.h"
#ifdef HAVE_ID3TAG
+#include <glib.h>
#include <id3tag.h>
#endif
@@ -54,16 +54,21 @@ static id3_utf8_t * processID3FieldString (int is_id3v1, const id3_ucs4_t *ucs4,
/* use encoding field here? */
if (is_id3v1 &&
(encoding = getConfigParamValue(CONF_ID3V1_ENCODING))) {
+ GError *error = NULL;
+
isostr = id3_ucs4_latin1duplicate(ucs4);
if (mpd_unlikely(!isostr)) {
return NULL;
}
- setCharSetConversion("UTF-8", encoding);
- utf8 = xmalloc(strlen((char *)isostr) + 1);
- utf8 = (id3_utf8_t *)char_conv_str((char *)utf8, (char *)isostr);
- if (!utf8) {
+
+ utf8 = (id3_utf8_t *)
+ g_convert_with_fallback((const char*)isostr, -1,
+ encoding, "utf-8",
+ NULL, NULL, NULL, &error);
+ if (utf8 == NULL) {
DEBUG("Unable to convert %s string to UTF-8: "
"'%s'\n", encoding, isostr);
+ g_error_free(error);
free(isostr);
return NULL;
}