diff -dPNur mpg123-1.12.1/configure.ac mpg123-1.12.1-new/configure.ac --- mpg123-1.12.1/configure.ac 2010-03-31 10:27:37.000000000 +0200 +++ mpg123-1.12.1-new/configure.ac 2010-07-07 23:44:57.000000000 +0200 @@ -998,6 +998,21 @@ AC_CHECK_LIB([m], [sqrt]) AC_CHECK_LIB([mx], [powf]) +# LibRCC +AC_CHECK_LIB(rcc, rccInit,[ + AC_CHECK_HEADERS(librcc.h,[ + LIBRCC_LIBS="-lrcc" + LIBRCC_INCLUDES="-DHAVE_LIBRCC" + ],[ + LIBRCC_LIBS="" + LIBRCC_INCLUDES="" +])],[ + LIBRCC_LIBS="" + LIBRCC_INCLUDES="" +]) +AC_SUBST(LIBRCC_LIBS) +AC_SUBST(LIBRCC_INCLUDES) + # attempt to make the signal stuff work... also with GENERIC - later #if test x"$ac_cv_header_sys_signal_h" = xyes; then # AC_CHECK_FUNCS( sigemptyset sigaddset sigprocmask sigaction ) diff -dPNur mpg123-1.12.1/src/libmpg123/id3.c mpg123-1.12.1-new/src/libmpg123/id3.c --- mpg123-1.12.1/src/libmpg123/id3.c 2010-03-31 10:27:35.000000000 +0200 +++ mpg123-1.12.1-new/src/libmpg123/id3.c 2010-07-07 23:51:50.000000000 +0200 @@ -9,6 +9,8 @@ #include "mpg123lib_intern.h" #include "id3.h" #include "debug.h" +#include "rccpatch.h" + #ifndef NO_ID3V2 /* Only the main parsing routine will always be there. */ @@ -829,6 +831,15 @@ size_t length = l; size_t i; unsigned char *p; + char *ctitle; + + ctitle = mpg123_rcc_recode(s, l, &i); + if (ctitle) { + convert_utf8(sb, ctitle, i, 0); + free(ctitle); + return; + } + /* determine real length, a latin1 character can at most take 2 in UTF8 */ for(i=0; i= 0x80) ++length; diff -dPNur mpg123-1.12.1/src/libmpg123/Makefile.am mpg123-1.12.1-new/src/libmpg123/Makefile.am --- mpg123-1.12.1/src/libmpg123/Makefile.am 2010-03-31 10:27:35.000000000 +0200 +++ mpg123-1.12.1-new/src/libmpg123/Makefile.am 2010-07-07 23:44:57.000000000 +0200 @@ -29,6 +29,8 @@ libmpg123_la_DEPENDENCIES = @DECODER_LOBJ@ @LFS_LOBJ@ libmpg123_la_SOURCES = \ + rccpatch.c \ + rccpatch.h \ compat.c \ compat.h \ parse.c \ diff -dPNur mpg123-1.12.1/src/libmpg123/rccpatch.c mpg123-1.12.1-new/src/libmpg123/rccpatch.c --- mpg123-1.12.1/src/libmpg123/rccpatch.c 1970-01-01 01:00:00.000000000 +0100 +++ mpg123-1.12.1-new/src/libmpg123/rccpatch.c 2010-07-07 23:55:59.000000000 +0200 @@ -0,0 +1,76 @@ +#include +#include +#include "mpg123.h" + +#define ID3_CLASS 0 +#define UTF_CLASS 1 +#define OUT_CLASS 2 +static rcc_class classes[] = { + { "id3", RCC_CLASS_STANDARD, NULL, NULL, "ID3 Encoding", 0 }, + { "utf", RCC_CLASS_KNOWN, "UTF-8", NULL, "Unicode Encoding", 0 }, + { "out", RCC_CLASS_STANDARD, NULL, NULL, "Output Encoding", 0 }, + { NULL } +}; + +static int rcc_initialized = 0; + +void mpg123_rcc_free() { + if (rcc_initialized) { + rccFree(); + rcc_initialized = 0; + } +} + +void mpg123_rcc_init() { + if (rcc_initialized) return; + rccInit(); + rccInitDefaultContext(NULL, 0, 0, classes, 0); + rccLoad(NULL, "xmms"); + rccInitDb4(NULL, NULL, 0); + rcc_initialized = 1; +} + +static void mpg123_rcc_try_init() { + if (!rcc_initialized) { + mpg123_rcc_init(); + if (rcc_initialized) atexit(mpg123_rcc_free); + } +} + + +char *mpg123_rcc_recode(const char *str, size_t len, size_t *rlen) { + char *res; + mpg123_rcc_try_init(); + return rccSizedRecode(NULL, ID3_CLASS, UTF_CLASS, str, len, rlen); +} + +static void mpg123_rcc_recode_string(mpg123_string *str, rcc_class_id from, rcc_class_id to) { + size_t size; + char *res; + + if ((!str)||(str->fill<2)) return; + + mpg123_rcc_try_init(); + + res = rccSizedRecode(NULL, from, to, str->p, str->fill - 1, &size); + if (res) { + if (size+1>str->size) { + if (!mpg123_resize_string(str, size + 1)) { + // allocation failed + free(res); + return; + } + } + strncpy(str->p, res, size + 1); + str->fill = size + 1; + free(res); + } +} + +void mpg123_rcc_recode_utf_string(mpg123_string *str) { + mpg123_rcc_recode_string(str, UTF_CLASS, OUT_CLASS); +} + +void mpg123_rcc_recode_latin_string(mpg123_string *str) { + mpg123_rcc_recode_string(str, ID3_CLASS, OUT_CLASS); +} diff -dPNur mpg123-1.12.1/src/libmpg123/rccpatch.h mpg123-1.12.1-new/src/libmpg123/rccpatch.h --- mpg123-1.12.1/src/libmpg123/rccpatch.h 1970-01-01 01:00:00.000000000 +0100 +++ mpg123-1.12.1-new/src/libmpg123/rccpatch.h 2010-07-07 23:44:57.000000000 +0200 @@ -0,0 +1,5 @@ +void mpg123_rcc_free(); +void mpg123_rcc_init(); +char *mpg123_rcc_recode(const char *str, size_t len, size_t *rlen); +void mpg123_rcc_recode_utf_string(mpg123_string *str); +void mpg123_rcc_recode_latin_string(mpg123_string *str); diff -dPNur mpg123-1.12.1/src/Makefile.am mpg123-1.12.1-new/src/Makefile.am --- mpg123-1.12.1/src/Makefile.am 2010-03-31 10:27:36.000000000 +0200 +++ mpg123-1.12.1-new/src/Makefile.am 2010-07-07 23:46:10.000000000 +0200 @@ -5,10 +5,10 @@ ## initially written by Nicholas J. Humfrey AM_CPPFLAGS = -DPKGLIBDIR="\"$(pkglibdir)\"" -mpg123_LDADD = $(LIBLTDL) libmpg123/libmpg123.la @MODULE_OBJ@ @OUTPUT_OBJ@ @OUTPUT_LIBS@ +mpg123_LDADD = $(LIBLTDL) libmpg123/libmpg123.la @MODULE_OBJ@ @OUTPUT_OBJ@ @OUTPUT_LIBS@ @LIBRCC_LIBS@ mpg123_LDFLAGS = @EXEC_LT_LDFLAGS@ @OUTPUT_LDFLAGS@ # Just mpg123_INCLUDES has no effect on build! Trying that before reverting to AM_CPPFLAGS. -INCLUDES = $(LTDLINCL) -I$(top_builddir)/src/libmpg123 -I$(top_srcdir)/src/libmpg123 +INCLUDES = $(LTDLINCL) -I$(top_builddir)/src/libmpg123 -I$(top_srcdir)/src/libmpg123 @LIBRCC_INCLUDES@ # libltdl is not mentioned here... it's not that trivial mpg123_DEPENDENCIES = @OUTPUT_OBJ@ @MODULE_OBJ@ libmpg123/libmpg123.la diff -dPNur mpg123-1.12.1/src/metaprint.c mpg123-1.12.1-new/src/metaprint.c --- mpg123-1.12.1/src/metaprint.c 2010-03-31 10:27:36.000000000 +0200 +++ mpg123-1.12.1-new/src/metaprint.c 2010-07-07 23:54:21.000000000 +0200 @@ -17,7 +17,11 @@ if(source == NULL) return; if(utf8env) mpg123_copy_string(source, dest); - else utf8_ascii(dest, source); + else { + mpg123_copy_string(source, dest); + mpg123_rcc_recode_utf_string(dest); +// utf8_ascii(dest, source); + } } /* print tags... limiting the UTF-8 to ASCII */ @@ -53,6 +57,7 @@ strncpy(tag[TITLE].p,v1->title,30); tag[TITLE].p[30] = 0; tag[TITLE].fill = strlen(tag[TITLE].p) + 1; + mpg123_rcc_recode_latin_string(&tag[TITLE]); } } if(!tag[ARTIST].fill) @@ -62,6 +67,7 @@ strncpy(tag[ARTIST].p,v1->artist,30); tag[ARTIST].p[30] = 0; tag[ARTIST].fill = strlen(tag[ARTIST].p) + 1; + mpg123_rcc_recode_latin_string(&tag[ARTIST]); } } if(!tag[ALBUM].fill) @@ -71,6 +77,7 @@ strncpy(tag[ALBUM].p,v1->album,30); tag[ALBUM].p[30] = 0; tag[ALBUM].fill = strlen(tag[ALBUM].p) + 1; + mpg123_rcc_recode_latin_string(&tag[ALBUM]); } } if(!tag[COMMENT].fill) @@ -80,6 +87,7 @@ strncpy(tag[COMMENT].p,v1->comment,30); tag[COMMENT].p[30] = 0; tag[COMMENT].fill = strlen(tag[COMMENT].p) + 1; + mpg123_rcc_recode_latin_string(&tag[COMMENT]); } } if(!tag[YEAR].fill) diff -dPNur mpg123-1.12.1/src/mpg123.c mpg123-1.12.1-new/src/mpg123.c --- mpg123-1.12.1/src/mpg123.c 2010-03-31 10:27:36.000000000 +0200 +++ mpg123-1.12.1-new/src/mpg123.c 2010-07-07 23:52:58.000000000 +0200 @@ -10,6 +10,7 @@ #include "mpg123app.h" #include "mpg123.h" #include "local.h" +#include "rccpatch.h" #ifdef HAVE_SYS_WAIT_H #include @@ -973,6 +974,8 @@ if(param.term_ctrl) term_init(); #endif + + mpg123_rcc_init(); while ((fname = get_next_file())) { char *dirname, *filename; @@ -1132,6 +1135,8 @@ #endif } } /* end of loop over input files */ + mpg123_rcc_free(); + /* Ensure we played everything. */ if(param.smooth && param.usebuffer) {