Always use the builtin charset conversion
This commit is contained in:
parent
99240bdcca
commit
7f34935eb1
4 changed files with 13 additions and 115 deletions
|
@ -25,6 +25,4 @@ void
|
|||
dvb_init(uint32_t adapter_mask)
|
||||
{
|
||||
dvb_adapter_init(adapter_mask);
|
||||
dvb_conversion_init();
|
||||
|
||||
}
|
||||
|
|
|
@ -33,32 +33,13 @@
|
|||
#include "tvheadend.h"
|
||||
#include "dvb_support.h"
|
||||
#include "dvb.h"
|
||||
|
||||
#ifdef CONFIG_DVBCONV // Use builtin charset conversion
|
||||
#define dvbconv_t int
|
||||
static dvbconv_t convert_iso_8859[16];
|
||||
static dvbconv_t convert_utf8;
|
||||
static dvbconv_t convert_latin1;
|
||||
|
||||
#include "dvb_charset_tables.h"
|
||||
|
||||
#define CONV_UTF8 14
|
||||
#define CONV_ISO6937 15
|
||||
void
|
||||
dvb_conversion_init(void)
|
||||
{
|
||||
int i;
|
||||
convert_utf8 = CONV_UTF8;
|
||||
convert_iso_8859[0] = -1;
|
||||
for (i=1; i<=11; i++) {
|
||||
convert_iso_8859[i] = i-1;
|
||||
}
|
||||
convert_iso_8859[12] = -1; // There is no ISO-8859-12
|
||||
for (i=13; i<=15; i++) {
|
||||
convert_iso_8859[i] = i-2;
|
||||
}
|
||||
convert_latin1 = CONV_ISO6937;
|
||||
}
|
||||
static int convert_iso_8859[16] = {
|
||||
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, 11, 12, 13
|
||||
};
|
||||
#define convert_utf8 14
|
||||
#define convert_iso6937 15
|
||||
|
||||
static inline int encode_utf8(uint16_t c, char *outb, int outleft)
|
||||
{
|
||||
|
@ -100,7 +81,7 @@ static inline size_t conv_utf8(const uint8_t *src, size_t srclen,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline size_t conv_8859(dvbconv_t conv,
|
||||
static inline size_t conv_8859(int conv,
|
||||
const uint8_t *src, size_t srclen,
|
||||
char *dst, size_t *dstlen)
|
||||
{
|
||||
|
@ -204,96 +185,17 @@ static inline size_t conv_6937(const uint8_t *src, size_t srclen,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static size_t dvb_convert(dvbconv_t conv,
|
||||
static inline size_t dvb_convert(int conv,
|
||||
const uint8_t *src, size_t srclen,
|
||||
char *dst, size_t *dstlen)
|
||||
{
|
||||
switch (conv) {
|
||||
case CONV_UTF8: return conv_utf8(src, srclen, dst, dstlen);
|
||||
case CONV_ISO6937: return conv_6937(src, srclen, dst, dstlen);
|
||||
case convert_utf8: return conv_utf8(src, srclen, dst, dstlen);
|
||||
case convert_iso6937: return conv_6937(src, srclen, dst, dstlen);
|
||||
default: return conv_8859(conv, src, srclen, dst, dstlen);
|
||||
}
|
||||
}
|
||||
|
||||
#else // use iconv for charset conversion
|
||||
|
||||
#include <iconv.h>
|
||||
#define dvbconv_t iconv_t
|
||||
static dvbconv_t convert_iso_8859[16];
|
||||
static dvbconv_t convert_utf8;
|
||||
static dvbconv_t convert_latin1;
|
||||
|
||||
static dvbconv_t
|
||||
dvb_iconv_open(const char *srcencoding)
|
||||
{
|
||||
dvbconv_t ic;
|
||||
ic = iconv_open("UTF-8", srcencoding);
|
||||
return ic;
|
||||
}
|
||||
|
||||
void
|
||||
dvb_conversion_init(void)
|
||||
{
|
||||
char buf[50];
|
||||
int i;
|
||||
|
||||
for(i = 1; i <= 15; i++) {
|
||||
snprintf(buf, sizeof(buf), "ISO-8859-%d", i);
|
||||
convert_iso_8859[i] = dvb_iconv_open(buf);
|
||||
}
|
||||
|
||||
convert_utf8 = dvb_iconv_open("UTF-8");
|
||||
convert_latin1 = dvb_iconv_open("ISO6937");
|
||||
if(convert_latin1 == (dvbconv_t)(-1)) {
|
||||
convert_latin1 = dvb_iconv_open("ISO_8859-1");
|
||||
}
|
||||
}
|
||||
static size_t dvb_convert(dvbconv_t ic,
|
||||
const uint8_t *src, size_t srclen,
|
||||
char *dst, size_t *outlen) {
|
||||
char *in, *out;
|
||||
size_t inlen;
|
||||
unsigned char *tmp;
|
||||
int i;
|
||||
int r;
|
||||
|
||||
tmp = alloca(srclen + 1);
|
||||
memcpy(tmp, src, srclen);
|
||||
tmp[srclen] = 0;
|
||||
|
||||
/* Escape control codes */
|
||||
if(ic != convert_utf8) {
|
||||
for(i = 0; i < srclen; i++) {
|
||||
if(tmp[i] >= 0x80 && tmp[i] <= 0x9f)
|
||||
tmp[i] = ' ';
|
||||
}
|
||||
}
|
||||
|
||||
out = dst;
|
||||
in = (char *)tmp;
|
||||
inlen = srclen;
|
||||
|
||||
while(inlen > 0) {
|
||||
r = iconv(ic, &in, &inlen, &out, outlen);
|
||||
|
||||
if(r == (size_t) -1) {
|
||||
if(errno == EILSEQ) {
|
||||
in++;
|
||||
inlen--;
|
||||
continue;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* DVB String conversion according to EN 300 468, Annex A
|
||||
* Not all character sets are supported, but it should cover most of them
|
||||
|
@ -302,7 +204,7 @@ static size_t dvb_convert(dvbconv_t ic,
|
|||
int
|
||||
dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char *dvb_default_charset)
|
||||
{
|
||||
dvbconv_t ic;
|
||||
int ic;
|
||||
size_t len, outlen;
|
||||
int i;
|
||||
|
||||
|
@ -345,10 +247,10 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char
|
|||
if (i > 0 && i < 16) {
|
||||
ic = convert_iso_8859[i];
|
||||
} else {
|
||||
ic = convert_latin1;
|
||||
ic = convert_iso6937;
|
||||
}
|
||||
} else {
|
||||
ic = convert_latin1;
|
||||
ic = convert_iso6937;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -358,7 +260,7 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char
|
|||
return 0;
|
||||
}
|
||||
|
||||
if(ic == (dvbconv_t) -1)
|
||||
if(ic == -1)
|
||||
return -1;
|
||||
|
||||
outlen = dstlen - 1;
|
||||
|
|
|
@ -69,7 +69,6 @@ th_dvb_mux_instance_t *dvb_mux_find_by_identifier(const char *identifier);
|
|||
void dvb_mux_nicename(char *buf, size_t size, th_dvb_mux_instance_t *tdmi);
|
||||
int dvb_mux_badness(th_dvb_mux_instance_t *tdmi);
|
||||
const char *dvb_mux_status(th_dvb_mux_instance_t *tdmi);
|
||||
void dvb_conversion_init(void);
|
||||
void dvb_mux_nicefreq(char *buf, size_t size, th_dvb_mux_instance_t *tdmi);
|
||||
|
||||
void atsc_utf16_to_utf8(uint8_t *src, int len, char *buf, int buflen);
|
||||
|
|
|
@ -25,7 +25,6 @@ CONFIG_LIST="
|
|||
linuxdvb
|
||||
v4l
|
||||
execinfo
|
||||
dvbconv
|
||||
"
|
||||
|
||||
die() {
|
||||
|
|
Loading…
Add table
Reference in a new issue