Player: Reduced the selectable codepages to those which can actually work, and made them work.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12990 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
4954bdf6d3
commit
738c37cdcf
6 changed files with 162 additions and 69 deletions
|
@ -947,18 +947,28 @@ const struct settings_list settings[] = {
|
|||
OFFON_SETTING(0,tagcache_autoupdate,
|
||||
LANG_TAGCACHE_AUTOUPDATE,false,"tagcache_autoupdate",NULL),
|
||||
#endif
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
CHOICE_SETTING(0, default_codepage, LANG_DEFAULT_CODEPAGE, 0,
|
||||
"default codepage",
|
||||
"default codepage", /* The order must match with that in unicode.c */
|
||||
"iso8859-1,iso8859-7,iso8859-8,cp1251,iso8859-11,cp1256,"
|
||||
"iso8859-9,iso8859-2,sjis,gb2312,ksx1001,big5,utf-8,cp1256",
|
||||
"iso8859-9,iso8859-2,sjis,gb2312,ksx1001,big5,utf-8",
|
||||
set_codepage, 13,
|
||||
ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK),
|
||||
ID2P(LANG_CODEPAGE_HEBREW), ID2P(LANG_CODEPAGE_CYRILLIC),
|
||||
ID2P(LANG_CODEPAGE_THAI), ID2P(LANG_CODEPAGE_ARABIC),
|
||||
ID2P(LANG_CODEPAGE_TURKISH), ID2P(LANG_CODEPAGE_LATIN_EXTENDED),
|
||||
ID2P(LANG_CODEPAGE_JAPANESE), ID2P(LANG_CODEPAGE_SIMPLIFIED),
|
||||
ID2P(LANG_CODEPAGE_KOREAN),
|
||||
ID2P(LANG_CODEPAGE_TRADITIONAL), ID2P(LANG_CODEPAGE_UTF8)),
|
||||
ID2P(LANG_CODEPAGE_KOREAN), ID2P(LANG_CODEPAGE_TRADITIONAL),
|
||||
ID2P(LANG_CODEPAGE_UTF8)),
|
||||
#else /* !HAVE_LCD_BITMAP */
|
||||
CHOICE_SETTING(0, default_codepage, LANG_DEFAULT_CODEPAGE, 0,
|
||||
"default codepage", /* The order must match with that in unicode.c */
|
||||
"iso8859-1,iso8859-7,cp1251,iso8859-9,iso8859-2,utf-8",
|
||||
set_codepage, 6,
|
||||
ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK),
|
||||
ID2P(LANG_CODEPAGE_CYRILLIC), ID2P(LANG_CODEPAGE_TURKISH),
|
||||
ID2P(LANG_CODEPAGE_LATIN_EXTENDED), ID2P(LANG_CODEPAGE_UTF8)),
|
||||
#endif
|
||||
|
||||
OFFON_SETTING(0,warnon_erase_dynplaylist,
|
||||
LANG_WARN_ERASEDYNPLAYLIST_MENU,false,
|
||||
|
|
|
@ -17,19 +17,20 @@
|
|||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
#define NUM_TABLES 5
|
||||
#define NUM_CODEPAGES 13
|
||||
|
||||
#define CODEPAGE_DIR "/.rockbox/codepages"
|
||||
static int default_codepage = 0;
|
||||
static unsigned short codepage_table[MAX_CP_TABLE_SIZE];
|
||||
static int loaded_cp_table = 0;
|
||||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
|
||||
static const unsigned char utf8comp[6] =
|
||||
{
|
||||
0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
|
||||
#define MAX_CP_TABLE_SIZE 32768
|
||||
#define NUM_TABLES 5
|
||||
|
||||
enum {
|
||||
ISO_8859_1 = 0, ISO_8859_7, ISO_8859_8, WIN_1251,
|
||||
ISO_8859_11, WIN_1256, ISO_8859_9, ISO_8859_2,
|
||||
SJIS, GB_2312, KSX_1001, BIG_5, UTF_8, NUM_CODEPAGES
|
||||
};
|
||||
|
||||
static const char *filename[NUM_TABLES] =
|
||||
{
|
||||
CODEPAGE_DIR"/iso.cp",
|
||||
|
@ -38,12 +39,38 @@ static const char *filename[NUM_TABLES] =
|
|||
CODEPAGE_DIR"/949.cp", /* KSX1001 */
|
||||
CODEPAGE_DIR"/950.cp" /* BIG5 */
|
||||
};
|
||||
|
||||
static const char cp_2_table[NUM_CODEPAGES] =
|
||||
{
|
||||
0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 0
|
||||
};
|
||||
|
||||
#else /* !HAVE_LCD_BITMAP, reduced support */
|
||||
|
||||
#define MAX_CP_TABLE_SIZE 512
|
||||
#define NUM_TABLES 1
|
||||
|
||||
enum {
|
||||
ISO_8859_1 = 0, ISO_8859_7, WIN_1251,
|
||||
ISO_8859_9, ISO_8859_2, UTF_8, NUM_CODEPAGES
|
||||
};
|
||||
static const char *filename[NUM_TABLES] =
|
||||
{
|
||||
CODEPAGE_DIR"/isomini.cp",
|
||||
};
|
||||
static const char cp_2_table[NUM_CODEPAGES] =
|
||||
{
|
||||
0, 1, 1, 1, 1, 0
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
static unsigned short codepage_table[MAX_CP_TABLE_SIZE];
|
||||
|
||||
static const unsigned char utf8comp[6] =
|
||||
{
|
||||
0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
|
||||
};
|
||||
|
||||
/* Load codepage file into memory */
|
||||
static int load_cp_table(int cp)
|
||||
{
|
||||
|
@ -113,34 +140,37 @@ unsigned char* iso_decode(const unsigned char *iso, unsigned char *utf8,
|
|||
if (!load_cp_table(cp)) cp = 0;
|
||||
|
||||
while (count--) {
|
||||
if (*iso < 128 || cp == 0x0C) /* Already UTF-8 */
|
||||
if (*iso < 128 || cp == UTF_8) /* Already UTF-8 */
|
||||
*utf8++ = *iso++;
|
||||
|
||||
else {
|
||||
|
||||
/* cp tells us which codepage to convert from */
|
||||
switch (cp) {
|
||||
case 0x01: /* Greek (ISO-8859-7) */
|
||||
case 0x02: /* Hebrew (ISO-8859-8) */
|
||||
case 0x03: /* Cyrillic (CP1251) */
|
||||
case 0x04: /* Thai (ISO-8859-11) */
|
||||
case 0x05: /* Arabic (CP1256) */
|
||||
case 0x06: /* Turkish (ISO-8859-9) */
|
||||
case 0x07: /* Latin Extended (ISO-8859-2) */
|
||||
case ISO_8859_7: /* Greek */
|
||||
case WIN_1251: /* Cyrillic */
|
||||
case ISO_8859_9: /* Turkish */
|
||||
case ISO_8859_2: /* Latin Extended */
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
case ISO_8859_8: /* Hebrew */
|
||||
case ISO_8859_11: /* Thai */
|
||||
case WIN_1256: /* Arabic */
|
||||
#endif
|
||||
tmp = ((cp-1)*128) + (*iso++ - 128);
|
||||
ucs = codepage_table[tmp];
|
||||
break;
|
||||
|
||||
case 0x08: /* Japanese (SJIS) */
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
case SJIS: /* Japanese */
|
||||
if (*iso > 0xA0 && *iso < 0xE0) {
|
||||
tmp = *iso++ | (0xA100 - 0x8000);
|
||||
ucs = codepage_table[tmp];
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x09: /* Simplified Chinese (GB2312) */
|
||||
case 0x0A: /* Korean (KSX1001) */
|
||||
case 0x0B: /* Traditional Chinese (BIG5) */
|
||||
case GB_2312: /* Simplified Chinese */
|
||||
case KSX_1001: /* Korean */
|
||||
case BIG5: /* Traditional Chinese */
|
||||
if (count < 1 || !iso[1]) {
|
||||
ucs = *iso++;
|
||||
break;
|
||||
|
@ -154,6 +184,7 @@ unsigned char* iso_decode(const unsigned char *iso, unsigned char *utf8,
|
|||
ucs = codepage_table[tmp];
|
||||
count--;
|
||||
break;
|
||||
#endif /* HAVE_LCD_BITMAP */
|
||||
|
||||
default:
|
||||
ucs = *iso++;
|
||||
|
|
|
@ -8,10 +8,6 @@
|
|||
* http://en.wikipedia.org/wiki/Unicode
|
||||
*/
|
||||
|
||||
#define CODEPAGE_DIR "/.rockbox/codepages"
|
||||
|
||||
#define MAX_CP_TABLE_SIZE 32768
|
||||
|
||||
#define MASK 0xC0 /* 11000000 */
|
||||
#define COMP 0x80 /* 10x */
|
||||
|
||||
|
|
|
@ -178,9 +178,18 @@ sub buildzip {
|
|||
}
|
||||
|
||||
mkdir ".rockbox/wps", 0777;
|
||||
mkdir ".rockbox/codepages", 0777;
|
||||
|
||||
if($bitmap) {
|
||||
system("$ROOT/tools/codepages");
|
||||
}
|
||||
else {
|
||||
system("$ROOT/tools/codepages -m");
|
||||
}
|
||||
$c = 'find . -name "*.cp" ! -empty -exec mv {} .rockbox/codepages/ \; >/dev/null 2>&1';
|
||||
`$c`;
|
||||
|
||||
if($bitmap) {
|
||||
mkdir ".rockbox/codepages", 0777;
|
||||
mkdir ".rockbox/codecs", 0777;
|
||||
mkdir ".rockbox/themes", 0777;
|
||||
if($depth > 1) {
|
||||
|
@ -190,10 +199,6 @@ sub buildzip {
|
|||
my $c = 'find apps -name "*.codec" ! -empty -exec cp {} .rockbox/codecs/ \; 2>/dev/null';
|
||||
`$c`;
|
||||
|
||||
system("$ROOT/tools/codepages");
|
||||
$c = 'find . -name "*.cp" ! -empty -exec mv {} .rockbox/codepages/ \; >/dev/null 2>&1';
|
||||
`$c`;
|
||||
|
||||
my @call = `find .rockbox/codecs -type f 2>/dev/null`;
|
||||
if(!$call[0]) {
|
||||
# no codec was copied, remove directory again
|
||||
|
|
|
@ -23,6 +23,10 @@
|
|||
|
||||
#define MAX_TABLE_SIZE 32768
|
||||
|
||||
static const int mini_index[5] = {
|
||||
0, 1, 3, 6, 7
|
||||
};
|
||||
|
||||
static unsigned short iso_table[MAX_TABLE_SIZE];
|
||||
|
||||
unsigned short iso_decode(unsigned char *latin1, int cp, int count)
|
||||
|
@ -147,53 +151,100 @@ int writeshort(FILE *f, unsigned short s)
|
|||
return putc(s>>8, f) != EOF;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
void print_usage(void)
|
||||
{
|
||||
printf("Usage: codepages [-m]\n"
|
||||
"\t-m Create isomini.cp only\n");
|
||||
printf("build date: " __DATE__ "\n\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int mini = 0;
|
||||
int i, j;
|
||||
unsigned char k;
|
||||
unsigned short uni;
|
||||
FILE *of;
|
||||
|
||||
for (i = 1;i < argc;i++)
|
||||
{
|
||||
if (argv[i][0] == '-')
|
||||
{
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case 'm': /* create isomini.cp only */
|
||||
mini = 1;
|
||||
break;
|
||||
|
||||
case 'h': /* help */
|
||||
case '?':
|
||||
print_usage();
|
||||
exit(1);
|
||||
break;
|
||||
|
||||
default:
|
||||
print_usage();
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
iso_table[i] = 0;
|
||||
|
||||
of = fopen("iso.cp", "wb");
|
||||
if (!of) return 1;
|
||||
if (mini) {
|
||||
of = fopen("isomini.cp", "wb");
|
||||
if (!of) return 1;
|
||||
|
||||
for (i=1; i<8; i++) {
|
||||
for (i=1; i<5; i++) {
|
||||
|
||||
for (j=0; j<128; j++) {
|
||||
k = (unsigned char)j + 128;
|
||||
uni = iso_decode(&k, i, 1);
|
||||
writeshort(of, uni);
|
||||
for (j=0; j<128; j++) {
|
||||
k = (unsigned char)j + 128;
|
||||
uni = iso_decode(&k, mini_index[i], 1);
|
||||
writeshort(of, uni);
|
||||
}
|
||||
}
|
||||
fclose(of);
|
||||
}
|
||||
fclose(of);
|
||||
else {
|
||||
of = fopen("iso.cp", "wb");
|
||||
if (!of) return 1;
|
||||
|
||||
of = fopen("932.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp932_table[i]);
|
||||
fclose(of);
|
||||
for (i=1; i<8; i++) {
|
||||
|
||||
of = fopen("936.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp936_table[i]);
|
||||
fclose(of);
|
||||
for (j=0; j<128; j++) {
|
||||
k = (unsigned char)j + 128;
|
||||
uni = iso_decode(&k, i, 1);
|
||||
writeshort(of, uni);
|
||||
}
|
||||
}
|
||||
fclose(of);
|
||||
|
||||
of = fopen("949.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp949_table[i]);
|
||||
fclose(of);
|
||||
of = fopen("932.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp932_table[i]);
|
||||
fclose(of);
|
||||
|
||||
of = fopen("950.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp950_table[i]);
|
||||
fclose(of);
|
||||
of = fopen("936.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp936_table[i]);
|
||||
fclose(of);
|
||||
|
||||
of = fopen("949.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp949_table[i]);
|
||||
fclose(of);
|
||||
|
||||
of = fopen("950.cp", "wb");
|
||||
if (!of) return 1;
|
||||
for (i=0; i < MAX_TABLE_SIZE; i++)
|
||||
writeshort(of, cp950_table[i]);
|
||||
fclose(of);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
12
tools/configure
vendored
12
tools/configure
vendored
|
@ -598,16 +598,16 @@ EOF
|
|||
buildfor=`input`;
|
||||
|
||||
# Set of tools built for all target platforms:
|
||||
toolset="rdf2binary convbdf"
|
||||
toolset="rdf2binary convbdf codepages"
|
||||
|
||||
# Toolsets for some target families:
|
||||
archosbitmaptools="$toolset scramble descramble sh2d uclpack bmp2rb codepages"
|
||||
iriverbitmaptools="$toolset scramble descramble mkboot bmp2rb codepages"
|
||||
iaudiobitmaptools="$toolset scramble descramble mkboot bmp2rb codepages"
|
||||
archosbitmaptools="$toolset scramble descramble sh2d uclpack bmp2rb"
|
||||
iriverbitmaptools="$toolset scramble descramble mkboot bmp2rb"
|
||||
iaudiobitmaptools="$toolset scramble descramble mkboot bmp2rb"
|
||||
ipodbitmaptools="$toolset scramble ipod_fw bmp2rb codepages"
|
||||
gigabeatbitmaptools="$toolset scramble descramble bmp2rb codepages"
|
||||
gigabeatbitmaptools="$toolset scramble descramble bmp2rb"
|
||||
# generic is used by IFP, H10, Sansa-e200
|
||||
genericbitmaptools="$toolset bmp2rb codepages"
|
||||
genericbitmaptools="$toolset bmp2rb"
|
||||
|
||||
|
||||
# ---- For each target ----
|
||||
|
|
Loading…
Reference in a new issue