From: Jaroslav Kysela Date: Tue, 20 May 2014 19:25:44 +0000 (+0200) Subject: intlconv: use iconv for utf8 conversions X-Git-Tag: v4.1~2045 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d07071bf908137f0718bacbc46ae8e6663167794;p=thirdparty%2Ftvheadend.git intlconv: use iconv for utf8 conversions --- diff --git a/Makefile b/Makefile index dee8c4122..0be59cfe5 100644 --- a/Makefile +++ b/Makefile @@ -117,7 +117,8 @@ SRCS = src/version.c \ src/rtsp.c \ src/fsmonitor.c \ src/cron.c \ - src/esfilter.c + src/esfilter.c \ + src/intlconv.c SRCS-${CONFIG_UPNP} += \ src/upnp.c @@ -133,7 +134,8 @@ SRCS += \ src/api/api_epg.c \ src/api/api_epggrab.c \ src/api/api_imagecache.c \ - src/api/api_esfilter.c + src/api/api_esfilter.c \ + src/api/api_intlconv.c SRCS += \ src/parsers/parsers.c \ diff --git a/src/api.c b/src/api.c index 833926225..f88c20957 100644 --- a/src/api.c +++ b/src/api.c @@ -126,6 +126,7 @@ void api_init ( void ) api_status_init(); api_imagecache_init(); api_esfilter_init(); + api_intlconv_init(); } void api_done ( void ) diff --git a/src/api.h b/src/api.h index f51f7ebe1..ce5db1d9b 100644 --- a/src/api.h +++ b/src/api.h @@ -68,6 +68,7 @@ void api_epggrab_init ( void ); void api_status_init ( void ); void api_imagecache_init ( void ); void api_esfilter_init ( void ); +void api_intlconv_init ( void ); /* * IDnode diff --git a/src/api/api_intlconv.c b/src/api/api_intlconv.c new file mode 100644 index 000000000..dfe0c4266 --- /dev/null +++ b/src/api/api_intlconv.c @@ -0,0 +1,68 @@ +/* + * API - international character conversions + * + * Copyright (C) 2014 Jaroslav Kysela + * + * 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 3 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, see . + */ + +#ifndef __TVH_API_INTLCONV_H__ +#define __TVH_API_INTLCONV_H__ + +#include "tvheadend.h" +#include "access.h" +#include "api.h" +#include "intlconv.h" + +static int +api_intlconv_charset_enum + ( void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) +{ + const char **chrst; + htsmsg_t *l, *e; + + int _enum = htsmsg_get_bool_or_default(args, "enum", 0); + + if (_enum) { + l = htsmsg_create_list(); + chrst = intlconv_charsets; + while (*chrst) { + e = htsmsg_create_map(); + htsmsg_add_str(e, "key", *chrst); + htsmsg_add_str(e, "val", *chrst); + htsmsg_add_msg(l, NULL, e); + chrst++; + } + *resp = htsmsg_create_map(); + htsmsg_add_msg(*resp, "entries", l); + } else { + // TODO: support full listing v enum + } + return 0; +} + +void api_intlconv_init ( void ) +{ + static api_hook_t ah[] = { + + { "intlconv/charsets", ACCESS_ANONYMOUS, api_intlconv_charset_enum, NULL }, + + { NULL }, + }; + + api_register_all(ah); +} + + +#endif /* __TVH_API_INTLCONV_H__ */ diff --git a/src/intlconv.c b/src/intlconv.c new file mode 100644 index 000000000..cfea4f211 --- /dev/null +++ b/src/intlconv.c @@ -0,0 +1,1336 @@ +#include +#include "tvheadend.h" +#include "intlconv.h" + +typedef struct intlconv_cache { + RB_ENTRY(intlconv_cache) ic_link; + char *ic_charset_id; + iconv_t *ic_handle; +} intlconv_cache_t; + +static RB_HEAD(,intlconv_cache) intlconv_all; +static intlconv_cache_t *intlconv_last_ic; +pthread_mutex_t intlconv_lock; + +void +intlconv_init( void ) +{ + pthread_mutex_init(&intlconv_lock, NULL); +} + +void +intlconv_done( void ) +{ + intlconv_cache_t *ic; + + pthread_mutex_lock(&intlconv_lock); + intlconv_last_ic = NULL; + while ((ic = RB_FIRST(&intlconv_all)) != NULL) { + iconv_close(ic->ic_handle); + free(ic->ic_charset_id); + RB_REMOVE(&intlconv_all, ic, ic_link); + free(ic); + } + pthread_mutex_unlock(&intlconv_lock); +} + +static int +intlconv_cmp ( intlconv_cache_t *a, intlconv_cache_t *b ) +{ + return strcmp(a->ic_charset_id, b->ic_charset_id); +} + +char * +intlconv_charset_id( const char *charset, + int transil, + int ignore_bad_chars ) +{ + static char __thread buf[128]; + const char *delim; + + if (charset == NULL || charset[0] == '\0' || + strcasecmp(charset, "UTF8") == 0 || + strcasecmp(charset, "UTF-8") == 0) + return NULL; + delim = index(charset, '/') ? + (charset[strlen(charset)-1] != '/' ? "/" : "") : "//"; + if (transil && ignore_bad_chars) + snprintf(buf, sizeof(buf), "%s%sTRANSLIT//IGNORE", charset, delim); + else if (transil) + snprintf(buf, sizeof(buf), "%s%sTRANSLIT", charset, delim); + else if (ignore_bad_chars) + snprintf(buf, sizeof(buf), "%s%sIGNORE", charset, delim); + else { + strncpy(buf, charset, sizeof(buf)); + buf[sizeof(buf)-1] = '\0'; + } + return buf; +} + +ssize_t +intlconv_utf8( char *dst, size_t dst_size, + const char *dst_charset_id, + const char *src_utf8 ) +{ + intlconv_cache_t templ, *ic; + char **inbuf, **outbuf; + size_t inbuf_left, outbuf_left; + ssize_t res; + + if (dst_charset_id == NULL) { + strncpy(dst, src_utf8, dst_size); + dst[dst_size - 1] = '\0'; + return strlen(dst); + } + templ.ic_charset_id = (char *)dst_charset_id; + pthread_mutex_lock(&intlconv_lock); + if (intlconv_last_ic && + strcmp(intlconv_last_ic->ic_charset_id, dst_charset_id) == 0) { + ic = intlconv_last_ic; + goto found; + } + ic = RB_FIND(&intlconv_all, &templ, ic_link, intlconv_cmp); + if (!ic) { + iconv_t c = iconv_open(dst_charset_id, "UTF-8"); + if ((iconv_t)-1 == c) { + pthread_mutex_unlock(&intlconv_lock); + return -EIO; + } + ic = malloc(sizeof(*ic)); + if (ic == NULL) { + pthread_mutex_unlock(&intlconv_lock); + return -ENOMEM; + } + ic->ic_charset_id = strdup(dst_charset_id); + if (ic->ic_charset_id == NULL) { + pthread_mutex_unlock(&intlconv_lock); + free(ic); + iconv_close(c); + return -ENOMEM; + } + ic->ic_handle = c; + RB_INSERT_SORTED(&intlconv_all, ic, ic_link, intlconv_cmp); + } +found: + inbuf = (char **)&src_utf8; + inbuf_left = strlen(src_utf8); + outbuf = &dst; + outbuf_left = dst_size; + res = iconv(ic->ic_handle, inbuf, &inbuf_left, outbuf, &outbuf_left); + if (res == -1) { + res = -errno; + } else { + intlconv_last_ic = ic; + } + pthread_mutex_unlock(&intlconv_lock); + if (res >= 0) + res = dst_size - outbuf_left; + return res; +} + +char * +intlconv_utf8safestr( const char *dst_charset_id, + const char *src_utf8, + size_t max_size ) +{ + char *str = alloca(max_size), *res; + ssize_t r = intlconv_utf8(str, max_size, dst_charset_id, src_utf8); + size_t i; + if (r <= 0) + return NULL; + if (r >= max_size) + r--; + str[r++] = '\0'; + res = strdup(str); + if (res == NULL) { + free(str); + } else { + /* don't terminate string */ + for (i = 0; i < r - 1; i++) + if (str[i] == '\0') + str[i] = ' '; + } + return res; +} + +/* + * + */ + +const char *intlconv_charsets[] = { + "437", + "500", + "500V1", + "850", + "851", + "852", + "855", + "856", + "857", + "860", + "861", + "862", + "863", + "864", + "865", + "866", + "866NAV", + "869", + "874", + "904", + "1026", + "1046", + "1047", + "8859_1", + "8859_2", + "8859_3", + "8859_4", + "8859_5", + "8859_6", + "8859_7", + "8859_8", + "8859_9", + "10646-1:1993", + "10646-1:1993/UCS4", + "ANSI_X3.4-1968", + "ANSI_X3.4-1986", + "ANSI_X3.4", + "ANSI_X3.110-1983", + "ANSI_X3.110", + "ARABIC", + "ARABIC7", + "ARMSCII-8", + "ASCII", + "ASMO-708", + "ASMO_449", + "BALTIC", + "BIG-5", + "BIG-FIVE", + "BIG5-HKSCS", + "BIG5", + "BIG5HKSCS", + "BIGFIVE", + "BRF", + "BS_4730", + "CA", + "CN-BIG5", + "CN-GB", + "CN", + "CP-AR", + "CP-GR", + "CP-HU", + "CP037", + "CP038", + "CP273", + "CP274", + "CP275", + "CP278", + "CP280", + "CP281", + "CP282", + "CP284", + "CP285", + "CP290", + "CP297", + "CP367", + "CP420", + "CP423", + "CP424", + "CP437", + "CP500", + "CP737", + "CP770", + "CP771", + "CP772", + "CP773", + "CP774", + "CP775", + "CP803", + "CP813", + "CP819", + "CP850", + "CP851", + "CP852", + "CP855", + "CP856", + "CP857", + "CP860", + "CP861", + "CP862", + "CP863", + "CP864", + "CP865", + "CP866", + "CP866NAV", + "CP868", + "CP869", + "CP870", + "CP871", + "CP874", + "CP875", + "CP880", + "CP891", + "CP901", + "CP902", + "CP903", + "CP904", + "CP905", + "CP912", + "CP915", + "CP916", + "CP918", + "CP920", + "CP921", + "CP922", + "CP930", + "CP932", + "CP933", + "CP935", + "CP936", + "CP937", + "CP939", + "CP949", + "CP950", + "CP1004", + "CP1008", + "CP1025", + "CP1026", + "CP1046", + "CP1047", + "CP1070", + "CP1079", + "CP1081", + "CP1084", + "CP1089", + "CP1097", + "CP1112", + "CP1122", + "CP1123", + "CP1124", + "CP1125", + "CP1129", + "CP1130", + "CP1132", + "CP1133", + "CP1137", + "CP1140", + "CP1141", + "CP1142", + "CP1143", + "CP1144", + "CP1145", + "CP1146", + "CP1147", + "CP1148", + "CP1149", + "CP1153", + "CP1154", + "CP1155", + "CP1156", + "CP1157", + "CP1158", + "CP1160", + "CP1161", + "CP1162", + "CP1163", + "CP1164", + "CP1166", + "CP1167", + "CP1250", + "CP1251", + "CP1252", + "CP1253", + "CP1254", + "CP1255", + "CP1256", + "CP1257", + "CP1258", + "CP1282", + "CP1361", + "CP1364", + "CP1371", + "CP1388", + "CP1390", + "CP1399", + "CP4517", + "CP4899", + "CP4909", + "CP4971", + "CP5347", + "CP9030", + "CP9066", + "CP9448", + "CP10007", + "CP12712", + "CP16804", + "CPIBM861", + "CSA7-1", + "CSA7-2", + "CSASCII", + "CSA_T500-1983", + "CSA_T500", + "CSA_Z243.4-1985-1", + "CSA_Z243.4-1985-2", + "CSA_Z243.419851", + "CSA_Z243.419852", + "CSDECMCS", + "CSEBCDICATDE", + "CSEBCDICATDEA", + "CSEBCDICCAFR", + "CSEBCDICDKNO", + "CSEBCDICDKNOA", + "CSEBCDICES", + "CSEBCDICESA", + "CSEBCDICESS", + "CSEBCDICFISE", + "CSEBCDICFISEA", + "CSEBCDICFR", + "CSEBCDICIT", + "CSEBCDICPT", + "CSEBCDICUK", + "CSEBCDICUS", + "CSEUCKR", + "CSEUCPKDFMTJAPANESE", + "CSGB2312", + "CSHPROMAN8", + "CSIBM037", + "CSIBM038", + "CSIBM273", + "CSIBM274", + "CSIBM275", + "CSIBM277", + "CSIBM278", + "CSIBM280", + "CSIBM281", + "CSIBM284", + "CSIBM285", + "CSIBM290", + "CSIBM297", + "CSIBM420", + "CSIBM423", + "CSIBM424", + "CSIBM500", + "CSIBM803", + "CSIBM851", + "CSIBM855", + "CSIBM856", + "CSIBM857", + "CSIBM860", + "CSIBM863", + "CSIBM864", + "CSIBM865", + "CSIBM866", + "CSIBM868", + "CSIBM869", + "CSIBM870", + "CSIBM871", + "CSIBM880", + "CSIBM891", + "CSIBM901", + "CSIBM902", + "CSIBM903", + "CSIBM904", + "CSIBM905", + "CSIBM918", + "CSIBM921", + "CSIBM922", + "CSIBM930", + "CSIBM932", + "CSIBM933", + "CSIBM935", + "CSIBM937", + "CSIBM939", + "CSIBM943", + "CSIBM1008", + "CSIBM1025", + "CSIBM1026", + "CSIBM1097", + "CSIBM1112", + "CSIBM1122", + "CSIBM1123", + "CSIBM1124", + "CSIBM1129", + "CSIBM1130", + "CSIBM1132", + "CSIBM1133", + "CSIBM1137", + "CSIBM1140", + "CSIBM1141", + "CSIBM1142", + "CSIBM1143", + "CSIBM1144", + "CSIBM1145", + "CSIBM1146", + "CSIBM1147", + "CSIBM1148", + "CSIBM1149", + "CSIBM1153", + "CSIBM1154", + "CSIBM1155", + "CSIBM1156", + "CSIBM1157", + "CSIBM1158", + "CSIBM1160", + "CSIBM1161", + "CSIBM1163", + "CSIBM1164", + "CSIBM1166", + "CSIBM1167", + "CSIBM1364", + "CSIBM1371", + "CSIBM1388", + "CSIBM1390", + "CSIBM1399", + "CSIBM4517", + "CSIBM4899", + "CSIBM4909", + "CSIBM4971", + "CSIBM5347", + "CSIBM9030", + "CSIBM9066", + "CSIBM9448", + "CSIBM12712", + "CSIBM16804", + "CSIBM11621162", + "CSISO4UNITEDKINGDOM", + "CSISO10SWEDISH", + "CSISO11SWEDISHFORNAMES", + "CSISO14JISC6220RO", + "CSISO15ITALIAN", + "CSISO16PORTUGESE", + "CSISO17SPANISH", + "CSISO18GREEK7OLD", + "CSISO19LATINGREEK", + "CSISO21GERMAN", + "CSISO25FRENCH", + "CSISO27LATINGREEK1", + "CSISO49INIS", + "CSISO50INIS8", + "CSISO51INISCYRILLIC", + "CSISO58GB1988", + "CSISO60DANISHNORWEGIAN", + "CSISO60NORWEGIAN1", + "CSISO61NORWEGIAN2", + "CSISO69FRENCH", + "CSISO84PORTUGUESE2", + "CSISO85SPANISH2", + "CSISO86HUNGARIAN", + "CSISO88GREEK7", + "CSISO89ASMO449", + "CSISO90", + "CSISO92JISC62991984B", + "CSISO99NAPLPS", + "CSISO103T618BIT", + "CSISO111ECMACYRILLIC", + "CSISO121CANADIAN1", + "CSISO122CANADIAN2", + "CSISO139CSN369103", + "CSISO141JUSIB1002", + "CSISO143IECP271", + "CSISO150", + "CSISO150GREEKCCITT", + "CSISO151CUBA", + "CSISO153GOST1976874", + "CSISO646DANISH", + "CSISO2022CN", + "CSISO2022JP", + "CSISO2022JP2", + "CSISO2022KR", + "CSISO2033", + "CSISO5427CYRILLIC", + "CSISO5427CYRILLIC1981", + "CSISO5428GREEK", + "CSISO10367BOX", + "CSISOLATIN1", + "CSISOLATIN2", + "CSISOLATIN3", + "CSISOLATIN4", + "CSISOLATIN5", + "CSISOLATIN6", + "CSISOLATINARABIC", + "CSISOLATINCYRILLIC", + "CSISOLATINGREEK", + "CSISOLATINHEBREW", + "CSKOI8R", + "CSKSC5636", + "CSMACINTOSH", + "CSNATSDANO", + "CSNATSSEFI", + "CSN_369103", + "CSPC8CODEPAGE437", + "CSPC775BALTIC", + "CSPC850MULTILINGUAL", + "CSPC862LATINHEBREW", + "CSPCP852", + "CSSHIFTJIS", + "CSUCS4", + "CSUNICODE", + "CSWINDOWS31J", + "CUBA", + "CWI-2", + "CWI", + "CYRILLIC", + "DE", + "DEC-MCS", + "DEC", + "DECMCS", + "DIN_66003", + "DK", + "DS2089", + "DS_2089", + "E13B", + "EBCDIC-AT-DE-A", + "EBCDIC-AT-DE", + "EBCDIC-BE", + "EBCDIC-BR", + "EBCDIC-CA-FR", + "EBCDIC-CP-AR1", + "EBCDIC-CP-AR2", + "EBCDIC-CP-BE", + "EBCDIC-CP-CA", + "EBCDIC-CP-CH", + "EBCDIC-CP-DK", + "EBCDIC-CP-ES", + "EBCDIC-CP-FI", + "EBCDIC-CP-FR", + "EBCDIC-CP-GB", + "EBCDIC-CP-GR", + "EBCDIC-CP-HE", + "EBCDIC-CP-IS", + "EBCDIC-CP-IT", + "EBCDIC-CP-NL", + "EBCDIC-CP-NO", + "EBCDIC-CP-ROECE", + "EBCDIC-CP-SE", + "EBCDIC-CP-TR", + "EBCDIC-CP-US", + "EBCDIC-CP-WT", + "EBCDIC-CP-YU", + "EBCDIC-CYRILLIC", + "EBCDIC-DK-NO-A", + "EBCDIC-DK-NO", + "EBCDIC-ES-A", + "EBCDIC-ES-S", + "EBCDIC-ES", + "EBCDIC-FI-SE-A", + "EBCDIC-FI-SE", + "EBCDIC-FR", + "EBCDIC-GREEK", + "EBCDIC-INT", + "EBCDIC-INT1", + "EBCDIC-IS-FRISS", + "EBCDIC-IT", + "EBCDIC-JP-E", + "EBCDIC-JP-KANA", + "EBCDIC-PT", + "EBCDIC-UK", + "EBCDIC-US", + "EBCDICATDE", + "EBCDICATDEA", + "EBCDICCAFR", + "EBCDICDKNO", + "EBCDICDKNOA", + "EBCDICES", + "EBCDICESA", + "EBCDICESS", + "EBCDICFISE", + "EBCDICFISEA", + "EBCDICFR", + "EBCDICISFRISS", + "EBCDICIT", + "EBCDICPT", + "EBCDICUK", + "EBCDICUS", + "ECMA-114", + "ECMA-118", + "ECMA-128", + "ECMA-CYRILLIC", + "ECMACYRILLIC", + "ELOT_928", + "ES", + "ES2", + "EUC-CN", + "EUC-JISX0213", + "EUC-JP-MS", + "EUC-JP", + "EUC-KR", + "EUC-TW", + "EUCCN", + "EUCJP-MS", + "EUCJP-OPEN", + "EUCJP-WIN", + "EUCJP", + "EUCKR", + "EUCTW", + "FI", + "FR", + "GB", + "GB2312", + "GB13000", + "GB18030", + "GBK", + "GB_1988-80", + "GB_198880", + "GEORGIAN-ACADEMY", + "GEORGIAN-PS", + "GOST_19768-74", + "GOST_19768", + "GOST_1976874", + "GREEK-CCITT", + "GREEK", + "GREEK7-OLD", + "GREEK7", + "GREEK7OLD", + "GREEK8", + "GREEKCCITT", + "HEBREW", + "HP-GREEK8", + "HP-ROMAN8", + "HP-ROMAN9", + "HP-THAI8", + "HP-TURKISH8", + "HPGREEK8", + "HPROMAN8", + "HPROMAN9", + "HPTHAI8", + "HPTURKISH8", + "HU", + "IBM-803", + "IBM-856", + "IBM-901", + "IBM-902", + "IBM-921", + "IBM-922", + "IBM-930", + "IBM-932", + "IBM-933", + "IBM-935", + "IBM-937", + "IBM-939", + "IBM-943", + "IBM-1008", + "IBM-1025", + "IBM-1046", + "IBM-1047", + "IBM-1097", + "IBM-1112", + "IBM-1122", + "IBM-1123", + "IBM-1124", + "IBM-1129", + "IBM-1130", + "IBM-1132", + "IBM-1133", + "IBM-1137", + "IBM-1140", + "IBM-1141", + "IBM-1142", + "IBM-1143", + "IBM-1144", + "IBM-1145", + "IBM-1146", + "IBM-1147", + "IBM-1148", + "IBM-1149", + "IBM-1153", + "IBM-1154", + "IBM-1155", + "IBM-1156", + "IBM-1157", + "IBM-1158", + "IBM-1160", + "IBM-1161", + "IBM-1162", + "IBM-1163", + "IBM-1164", + "IBM-1166", + "IBM-1167", + "IBM-1364", + "IBM-1371", + "IBM-1388", + "IBM-1390", + "IBM-1399", + "IBM-4517", + "IBM-4899", + "IBM-4909", + "IBM-4971", + "IBM-5347", + "IBM-9030", + "IBM-9066", + "IBM-9448", + "IBM-12712", + "IBM-16804", + "IBM037", + "IBM038", + "IBM256", + "IBM273", + "IBM274", + "IBM275", + "IBM277", + "IBM278", + "IBM280", + "IBM281", + "IBM284", + "IBM285", + "IBM290", + "IBM297", + "IBM367", + "IBM420", + "IBM423", + "IBM424", + "IBM437", + "IBM500", + "IBM775", + "IBM803", + "IBM813", + "IBM819", + "IBM848", + "IBM850", + "IBM851", + "IBM852", + "IBM855", + "IBM856", + "IBM857", + "IBM860", + "IBM861", + "IBM862", + "IBM863", + "IBM864", + "IBM865", + "IBM866", + "IBM866NAV", + "IBM868", + "IBM869", + "IBM870", + "IBM871", + "IBM874", + "IBM875", + "IBM880", + "IBM891", + "IBM901", + "IBM902", + "IBM903", + "IBM904", + "IBM905", + "IBM912", + "IBM915", + "IBM916", + "IBM918", + "IBM920", + "IBM921", + "IBM922", + "IBM930", + "IBM932", + "IBM933", + "IBM935", + "IBM937", + "IBM939", + "IBM943", + "IBM1004", + "IBM1008", + "IBM1025", + "IBM1026", + "IBM1046", + "IBM1047", + "IBM1089", + "IBM1097", + "IBM1112", + "IBM1122", + "IBM1123", + "IBM1124", + "IBM1129", + "IBM1130", + "IBM1132", + "IBM1133", + "IBM1137", + "IBM1140", + "IBM1141", + "IBM1142", + "IBM1143", + "IBM1144", + "IBM1145", + "IBM1146", + "IBM1147", + "IBM1148", + "IBM1149", + "IBM1153", + "IBM1154", + "IBM1155", + "IBM1156", + "IBM1157", + "IBM1158", + "IBM1160", + "IBM1161", + "IBM1162", + "IBM1163", + "IBM1164", + "IBM1166", + "IBM1167", + "IBM1364", + "IBM1371", + "IBM1388", + "IBM1390", + "IBM1399", + "IBM4517", + "IBM4899", + "IBM4909", + "IBM4971", + "IBM5347", + "IBM9030", + "IBM9066", + "IBM9448", + "IBM12712", + "IBM16804", + "IEC_P27-1", + "IEC_P271", + "INIS-8", + "INIS-CYRILLIC", + "INIS", + "INIS8", + "INISCYRILLIC", + "ISIRI-3342", + "ISIRI3342", + "ISO-2022-CN-EXT", + "ISO-2022-CN", + "ISO-2022-JP-2", + "ISO-2022-JP-3", + "ISO-2022-JP", + "ISO-2022-KR", + "ISO-8859-1", + "ISO-8859-2", + "ISO-8859-3", + "ISO-8859-4", + "ISO-8859-5", + "ISO-8859-6", + "ISO-8859-7", + "ISO-8859-8", + "ISO-8859-9", + "ISO-8859-9E", + "ISO-8859-10", + "ISO-8859-11", + "ISO-8859-13", + "ISO-8859-14", + "ISO-8859-15", + "ISO-8859-16", + "ISO-10646-UCS-2", + "ISO-10646", + "ISO-10646/UCS2", + "ISO-10646/UCS4", + "ISO-10646/UTF-8", + "ISO-10646/UTF8", + "ISO-CELTIC", + "ISO-IR-4", + "ISO-IR-6", + "ISO-IR-8-1", + "ISO-IR-9-1", + "ISO-IR-10", + "ISO-IR-11", + "ISO-IR-14", + "ISO-IR-15", + "ISO-IR-16", + "ISO-IR-17", + "ISO-IR-18", + "ISO-IR-19", + "ISO-IR-21", + "ISO-IR-25", + "ISO-IR-27", + "ISO-IR-37", + "ISO-IR-49", + "ISO-IR-50", + "ISO-IR-51", + "ISO-IR-54", + "ISO-IR-55", + "ISO-IR-57", + "ISO-IR-60", + "ISO-IR-61", + "ISO-IR-69", + "ISO-IR-84", + "ISO-IR-85", + "ISO-IR-86", + "ISO-IR-88", + "ISO-IR-89", + "ISO-IR-90", + "ISO-IR-92", + "ISO-IR-98", + "ISO-IR-99", + "ISO-IR-100", + "ISO-IR-101", + "ISO-IR-103", + "ISO-IR-109", + "ISO-IR-110", + "ISO-IR-111", + "ISO-IR-121", + "ISO-IR-122", + "ISO-IR-126", + "ISO-IR-127", + "ISO-IR-138", + "ISO-IR-139", + "ISO-IR-141", + "ISO-IR-143", + "ISO-IR-144", + "ISO-IR-148", + "ISO-IR-150", + "ISO-IR-151", + "ISO-IR-153", + "ISO-IR-155", + "ISO-IR-156", + "ISO-IR-157", + "ISO-IR-166", + "ISO-IR-179", + "ISO-IR-193", + "ISO-IR-197", + "ISO-IR-199", + "ISO-IR-203", + "ISO-IR-209", + "ISO-IR-226", + "ISO/TR_11548-1", + "ISO646-CA", + "ISO646-CA2", + "ISO646-CN", + "ISO646-CU", + "ISO646-DE", + "ISO646-DK", + "ISO646-ES", + "ISO646-ES2", + "ISO646-FI", + "ISO646-FR", + "ISO646-FR1", + "ISO646-GB", + "ISO646-HU", + "ISO646-IT", + "ISO646-JP-OCR-B", + "ISO646-JP", + "ISO646-KR", + "ISO646-NO", + "ISO646-NO2", + "ISO646-PT", + "ISO646-PT2", + "ISO646-SE", + "ISO646-SE2", + "ISO646-US", + "ISO646-YU", + "ISO2022CN", + "ISO2022CNEXT", + "ISO2022JP", + "ISO2022JP2", + "ISO2022KR", + "ISO6937", + "ISO8859-1", + "ISO8859-2", + "ISO8859-3", + "ISO8859-4", + "ISO8859-5", + "ISO8859-6", + "ISO8859-7", + "ISO8859-8", + "ISO8859-9", + "ISO8859-9E", + "ISO8859-10", + "ISO8859-11", + "ISO8859-13", + "ISO8859-14", + "ISO8859-15", + "ISO8859-16", + "ISO11548-1", + "ISO88591", + "ISO88592", + "ISO88593", + "ISO88594", + "ISO88595", + "ISO88596", + "ISO88597", + "ISO88598", + "ISO88599", + "ISO88599E", + "ISO885910", + "ISO885911", + "ISO885913", + "ISO885914", + "ISO885915", + "ISO885916", + "ISO_646.IRV:1991", + "ISO_2033-1983", + "ISO_2033", + "ISO_5427-EXT", + "ISO_5427", + "ISO_5427:1981", + "ISO_5427EXT", + "ISO_5428", + "ISO_5428:1980", + "ISO_6937-2", + "ISO_6937-2:1983", + "ISO_6937", + "ISO_6937:1992", + "ISO_8859-1", + "ISO_8859-1:1987", + "ISO_8859-2", + "ISO_8859-2:1987", + "ISO_8859-3", + "ISO_8859-3:1988", + "ISO_8859-4", + "ISO_8859-4:1988", + "ISO_8859-5", + "ISO_8859-5:1988", + "ISO_8859-6", + "ISO_8859-6:1987", + "ISO_8859-7", + "ISO_8859-7:1987", + "ISO_8859-7:2003", + "ISO_8859-8", + "ISO_8859-8:1988", + "ISO_8859-9", + "ISO_8859-9:1989", + "ISO_8859-9E", + "ISO_8859-10", + "ISO_8859-10:1992", + "ISO_8859-14", + "ISO_8859-14:1998", + "ISO_8859-15", + "ISO_8859-15:1998", + "ISO_8859-16", + "ISO_8859-16:2001", + "ISO_9036", + "ISO_10367-BOX", + "ISO_10367BOX", + "ISO_11548-1", + "ISO_69372", + "IT", + "JIS_C6220-1969-RO", + "JIS_C6229-1984-B", + "JIS_C62201969RO", + "JIS_C62291984B", + "JOHAB", + "JP-OCR-B", + "JP", + "JS", + "JUS_I.B1.002", + "KOI-7", + "KOI-8", + "KOI8-R", + "KOI8-RU", + "KOI8-T", + "KOI8-U", + "KOI8", + "KOI8R", + "KOI8U", + "KSC5636", + "L1", + "L2", + "L3", + "L4", + "L5", + "L6", + "L7", + "L8", + "L10", + "LATIN-9", + "LATIN-GREEK-1", + "LATIN-GREEK", + "LATIN1", + "LATIN2", + "LATIN3", + "LATIN4", + "LATIN5", + "LATIN6", + "LATIN7", + "LATIN8", + "LATIN9", + "LATIN10", + "LATINGREEK", + "LATINGREEK1", + "MAC-CENTRALEUROPE", + "MAC-CYRILLIC", + "MAC-IS", + "MAC-SAMI", + "MAC-UK", + "MAC", + "MACCYRILLIC", + "MACINTOSH", + "MACIS", + "MACUK", + "MACUKRAINIAN", + "MIK", + "MS-ANSI", + "MS-ARAB", + "MS-CYRL", + "MS-EE", + "MS-GREEK", + "MS-HEBR", + "MS-MAC-CYRILLIC", + "MS-TURK", + "MS932", + "MS936", + "MSCP949", + "MSCP1361", + "MSMACCYRILLIC", + "MSZ_7795.3", + "MS_KANJI", + "NAPLPS", + "NATS-DANO", + "NATS-SEFI", + "NATSDANO", + "NATSSEFI", + "NC_NC0010", + "NC_NC00-10", + "NC_NC00-10:81", + "NF_Z_62-010", + "NF_Z_62-010_(1973)", + "NF_Z_62-010_1973", + "NF_Z_62010", + "NF_Z_62010_1973", + "NO", + "NO2", + "NS_4551-1", + "NS_4551-2", + "NS_45511", + "NS_45512", + "OS2LATIN1", + "OSF00010001", + "OSF00010002", + "OSF00010003", + "OSF00010004", + "OSF00010005", + "OSF00010006", + "OSF00010007", + "OSF00010008", + "OSF00010009", + "OSF0001000A", + "OSF00010020", + "OSF00010100", + "OSF00010101", + "OSF00010102", + "OSF00010104", + "OSF00010105", + "OSF00010106", + "OSF00030010", + "OSF0004000A", + "OSF0005000A", + "OSF05010001", + "OSF100201A4", + "OSF100201A8", + "OSF100201B5", + "OSF100201F4", + "OSF100203B5", + "OSF1002011C", + "OSF1002011D", + "OSF1002035D", + "OSF1002035E", + "OSF1002035F", + "OSF1002036B", + "OSF1002037B", + "OSF10010001", + "OSF10010004", + "OSF10010006", + "OSF10020025", + "OSF10020111", + "OSF10020115", + "OSF10020116", + "OSF10020118", + "OSF10020122", + "OSF10020129", + "OSF10020352", + "OSF10020354", + "OSF10020357", + "OSF10020359", + "OSF10020360", + "OSF10020364", + "OSF10020365", + "OSF10020366", + "OSF10020367", + "OSF10020370", + "OSF10020387", + "OSF10020388", + "OSF10020396", + "OSF10020402", + "OSF10020417", + "PT", + "PT2", + "PT154", + "R8", + "R9", + "RK1048", + "ROMAN8", + "ROMAN9", + "RUSCII", + "SE", + "SE2", + "SEN_850200_B", + "SEN_850200_C", + "SHIFT-JIS", + "SHIFT_JIS", + "SHIFT_JISX0213", + "SJIS-OPEN", + "SJIS-WIN", + "SJIS", + "SS636127", + "STRK1048-2002", + "ST_SEV_358-88", + "T.61-8BIT", + "T.61", + "T.618BIT", + "TCVN-5712", + "TCVN", + "TCVN5712-1", + "TCVN5712-1:1993", + "THAI8", + "TIS-620", + "TIS620-0", + "TIS620.2529-1", + "TIS620.2533-0", + "TIS620", + "TS-5881", + "TSCII", + "TURKISH8", + "UCS-2", + "UCS-2BE", + "UCS-2LE", + "UCS-4", + "UCS-4BE", + "UCS-4LE", + "UCS2", + "UCS4", + "UHC", + "UJIS", + "UK", + "UNICODE", + "UNICODEBIG", + "UNICODELITTLE", + "US-ASCII", + "US", + "UTF-7", + "UTF-8", + "UTF-16", + "UTF-16BE", + "UTF-16LE", + "UTF-32", + "UTF-32BE", + "UTF-32LE", + "UTF7", + "UTF8", + "UTF16", + "UTF16BE", + "UTF16LE", + "UTF32", + "UTF32BE", + "UTF32LE", + "VISCII", + "WCHAR_T", + "WIN-SAMI-2", + "WINBALTRIM", + "WINDOWS-31J", + "WINDOWS-874", + "WINDOWS-936", + "WINDOWS-1250", + "WINDOWS-1251", + "WINDOWS-1252", + "WINDOWS-1253", + "WINDOWS-1254", + "WINDOWS-1255", + "WINDOWS-1256", + "WINDOWS-1257", + "WINDOWS-1258", + "WINSAMI2", + "WS2", + "YU", + NULL +}; diff --git a/src/intlconv.h b/src/intlconv.h new file mode 100644 index 000000000..54dd987ad --- /dev/null +++ b/src/intlconv.h @@ -0,0 +1,39 @@ +/* + * tvheadend, iconv interface + * Copyright (C) 2014 Jaroslav Kysela + * + * 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 3 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, see . + */ + +#ifndef INTLCONV_H_ +#define INTLCONV_H_ + +extern const char *intlconv_charsets[]; + +void intlconv_init( void ); +void intlconv_done( void ); +char * +intlconv_charset_id( const char *charset, + int transil, + int ignore_bad_chars ); +ssize_t +intlconv_utf8( char *dst, size_t dst_size, + const char *dst_charset_id, + const char *src_utf8 ); +char * +intlconv_utf8safestr( const char *dst_charset_id, + const char *src_utf8, + size_t max_size ); + +#endif /* INTLCONV_H_ */ diff --git a/src/main.c b/src/main.c index 7602838c5..0eda2218f 100644 --- a/src/main.c +++ b/src/main.c @@ -62,6 +62,7 @@ #include "fsmonitor.h" #include "lang_codes.h" #include "esfilter.h" +#include "intlconv.h" #if ENABLE_LIBAV #include "libav.h" #include "plumbing/transcoding.h" @@ -755,6 +756,8 @@ main(int argc, char **argv) /** * Initialize subsystems */ + + intlconv_init(); api_init(); @@ -880,6 +883,7 @@ main(int argc, char **argv) tvhftrace("main", dvb_done); tvhftrace("main", lang_str_done); tvhftrace("main", esfilter_done); + tvhftrace("main", intlconv_done); tvhftrace("main", urlparse_done); tvhlog(LOG_NOTICE, "STOP", "Exiting HTS Tvheadend");