#include <string>
#include <ctype.h>
#include <limits.h>
-#include <lib/base/elock.h>
#include <lib/base/eerror.h>
+#include <lib/base/encoding.h>
#include <lib/base/estring.h>
-static pthread_mutex_t lock=PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP;
+std::string buildShortName( const std::string &str )
+{
+ std::string tmp;
+ static char stropen[3] = { 0xc2, 0x86, 0x00 };
+ static char strclose[3] = { 0xc2, 0x87, 0x00 };
+ unsigned int open=std::string::npos-1;
+ while ( (open = str.find(stropen, open+2)) != std::string::npos )
+ {
+ unsigned int close = str.find(strclose, open);
+ if ( close != std::string::npos )
+ tmp+=str.substr( open+2, close-(open+2) );
+ }
+ return tmp.length() ? tmp : str;
+}
std::string getNum(int val, int sys)
{
int i=0, t=0;
-#if 0 // FIXME
if ( tsidonid )
- {
- std::map<int, int>::iterator it =
- std::string::TransponderDefaultMapping.find(tsidonid);
- if ( it != std::string::TransponderDefaultMapping.end() )
- table = it->second;
- }
-#endif
+ encodingHandler.getTransponderDefaultMapping(tsidonid, table);
switch(data[0])
{
- case 1 ... 12:
+ case 1 ... 11:
table=data[i++]+4;
-// eDebug("(1..12)text encoded in ISO-8859-%d",table);
+// eDebug("(1..11)text encoded in ISO-8859-%d",table);
break;
case 0x10:
{
// eDebug("(0x10)text encoded in ISO-8859-%d",n);
- int n=(data[++i]<<8)|(data[++i]);
+ int n=(data[++i]<<8);
+ n |= (data[++i]);
++i;
switch(n)
{
case 12:
eDebug("unsup. ISO8859-12 enc.", n);
+ break;
default:
table=n;
break;
++i;
eDebug("unsup. Big5 subset of ISO/IEC 10646-1 enc.");
break;
+ case 0x15: // UTF-8 encoding of ISO/IEC 10646-1
+ return std::string((char*)data+1, len-1);
case 0x0:
- case 0xD ... 0xF:
- case 0x15 ... 0x1F:
+ case 0xC ... 0xF:
+ case 0x16 ... 0x1F:
eDebug("reserved %d", data[0]);
++i;
break;
}
+ bool useTwoCharMapping =
+ tsidonid && encodingHandler.getTransponderUseTwoCharMapping(tsidonid);
+
unsigned char res[2048];
while (i < len)
{
unsigned long code=0;
-#if 0 // FIXME
- if ( i+1 < len && tsidonid &&
- std::string::TransponderUseTwoCharMapping.find(tsidonid) != std::string::TransponderUseTwoCharMapping.end() &&
+ if ( useTwoCharMapping && i+1 < len &&
(code=doVideoTexSuppl(data[i], data[i+1])) )
i+=2;
-#endif
+
if (!code)
code=recode(data[i++], table);
if (!code)
while (i < len)
{
- unsigned long code=string[i++];
+ unsigned long code=(unsigned char)string[i++];
// Unicode->UTF8 encoding
if (code < 0x80) // identity latin <-> utf8 mapping
res[t++]=char(code);
int len = s.length();
- for(int i = 0; i < len-1; i++)
+ for(int i = 0; i < len; i++)
{
unsigned char c1 = s[i];
unsigned int c;
/* UTF8? decode (but only simple) */
- if(c1 > 0x80)
+ if((c1 > 0x80) && (i < len-1))
{
unsigned char c2 = s[i + 1];
c = ((c1&0x3F)<<6) + (c2&0x3F);