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:
Jens Arnold 2007-04-01 13:09:22 +00:00
parent 4954bdf6d3
commit 738c37cdcf
6 changed files with 162 additions and 69 deletions

View file

@ -947,18 +947,28 @@ const struct settings_list settings[] = {
OFFON_SETTING(0,tagcache_autoupdate, OFFON_SETTING(0,tagcache_autoupdate,
LANG_TAGCACHE_AUTOUPDATE,false,"tagcache_autoupdate",NULL), LANG_TAGCACHE_AUTOUPDATE,false,"tagcache_autoupdate",NULL),
#endif #endif
#ifdef HAVE_LCD_BITMAP
CHOICE_SETTING(0, default_codepage, LANG_DEFAULT_CODEPAGE, 0, 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-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, set_codepage, 13,
ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK), ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK),
ID2P(LANG_CODEPAGE_HEBREW), ID2P(LANG_CODEPAGE_CYRILLIC), ID2P(LANG_CODEPAGE_HEBREW), ID2P(LANG_CODEPAGE_CYRILLIC),
ID2P(LANG_CODEPAGE_THAI), ID2P(LANG_CODEPAGE_ARABIC), ID2P(LANG_CODEPAGE_THAI), ID2P(LANG_CODEPAGE_ARABIC),
ID2P(LANG_CODEPAGE_TURKISH), ID2P(LANG_CODEPAGE_LATIN_EXTENDED), ID2P(LANG_CODEPAGE_TURKISH), ID2P(LANG_CODEPAGE_LATIN_EXTENDED),
ID2P(LANG_CODEPAGE_JAPANESE), ID2P(LANG_CODEPAGE_SIMPLIFIED), ID2P(LANG_CODEPAGE_JAPANESE), ID2P(LANG_CODEPAGE_SIMPLIFIED),
ID2P(LANG_CODEPAGE_KOREAN), ID2P(LANG_CODEPAGE_KOREAN), ID2P(LANG_CODEPAGE_TRADITIONAL),
ID2P(LANG_CODEPAGE_TRADITIONAL), ID2P(LANG_CODEPAGE_UTF8)), 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, OFFON_SETTING(0,warnon_erase_dynplaylist,
LANG_WARN_ERASEDYNPLAYLIST_MENU,false, LANG_WARN_ERASEDYNPLAYLIST_MENU,false,

View file

@ -17,19 +17,20 @@
#define O_BINARY 0 #define O_BINARY 0
#endif #endif
#define NUM_TABLES 5 #define CODEPAGE_DIR "/.rockbox/codepages"
#define NUM_CODEPAGES 13
static int default_codepage = 0; static int default_codepage = 0;
static unsigned short codepage_table[MAX_CP_TABLE_SIZE];
static int loaded_cp_table = 0; static int loaded_cp_table = 0;
#ifdef HAVE_LCD_BITMAP
static const unsigned char utf8comp[6] = #define MAX_CP_TABLE_SIZE 32768
{ #define NUM_TABLES 5
0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
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] = static const char *filename[NUM_TABLES] =
{ {
CODEPAGE_DIR"/iso.cp", CODEPAGE_DIR"/iso.cp",
@ -38,12 +39,38 @@ static const char *filename[NUM_TABLES] =
CODEPAGE_DIR"/949.cp", /* KSX1001 */ CODEPAGE_DIR"/949.cp", /* KSX1001 */
CODEPAGE_DIR"/950.cp" /* BIG5 */ CODEPAGE_DIR"/950.cp" /* BIG5 */
}; };
static const char cp_2_table[NUM_CODEPAGES] = static const char cp_2_table[NUM_CODEPAGES] =
{ {
0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 0 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 */ /* Load codepage file into memory */
static int load_cp_table(int cp) 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; if (!load_cp_table(cp)) cp = 0;
while (count--) { while (count--) {
if (*iso < 128 || cp == 0x0C) /* Already UTF-8 */ if (*iso < 128 || cp == UTF_8) /* Already UTF-8 */
*utf8++ = *iso++; *utf8++ = *iso++;
else { else {
/* cp tells us which codepage to convert from */ /* cp tells us which codepage to convert from */
switch (cp) { switch (cp) {
case 0x01: /* Greek (ISO-8859-7) */ case ISO_8859_7: /* Greek */
case 0x02: /* Hebrew (ISO-8859-8) */ case WIN_1251: /* Cyrillic */
case 0x03: /* Cyrillic (CP1251) */ case ISO_8859_9: /* Turkish */
case 0x04: /* Thai (ISO-8859-11) */ case ISO_8859_2: /* Latin Extended */
case 0x05: /* Arabic (CP1256) */ #ifdef HAVE_LCD_BITMAP
case 0x06: /* Turkish (ISO-8859-9) */ case ISO_8859_8: /* Hebrew */
case 0x07: /* Latin Extended (ISO-8859-2) */ case ISO_8859_11: /* Thai */
case WIN_1256: /* Arabic */
#endif
tmp = ((cp-1)*128) + (*iso++ - 128); tmp = ((cp-1)*128) + (*iso++ - 128);
ucs = codepage_table[tmp]; ucs = codepage_table[tmp];
break; break;
case 0x08: /* Japanese (SJIS) */ #ifdef HAVE_LCD_BITMAP
case SJIS: /* Japanese */
if (*iso > 0xA0 && *iso < 0xE0) { if (*iso > 0xA0 && *iso < 0xE0) {
tmp = *iso++ | (0xA100 - 0x8000); tmp = *iso++ | (0xA100 - 0x8000);
ucs = codepage_table[tmp]; ucs = codepage_table[tmp];
break; break;
} }
case 0x09: /* Simplified Chinese (GB2312) */ case GB_2312: /* Simplified Chinese */
case 0x0A: /* Korean (KSX1001) */ case KSX_1001: /* Korean */
case 0x0B: /* Traditional Chinese (BIG5) */ case BIG5: /* Traditional Chinese */
if (count < 1 || !iso[1]) { if (count < 1 || !iso[1]) {
ucs = *iso++; ucs = *iso++;
break; break;
@ -154,6 +184,7 @@ unsigned char* iso_decode(const unsigned char *iso, unsigned char *utf8,
ucs = codepage_table[tmp]; ucs = codepage_table[tmp];
count--; count--;
break; break;
#endif /* HAVE_LCD_BITMAP */
default: default:
ucs = *iso++; ucs = *iso++;

View file

@ -8,10 +8,6 @@
* http://en.wikipedia.org/wiki/Unicode * http://en.wikipedia.org/wiki/Unicode
*/ */
#define CODEPAGE_DIR "/.rockbox/codepages"
#define MAX_CP_TABLE_SIZE 32768
#define MASK 0xC0 /* 11000000 */ #define MASK 0xC0 /* 11000000 */
#define COMP 0x80 /* 10x */ #define COMP 0x80 /* 10x */

View file

@ -178,9 +178,18 @@ sub buildzip {
} }
mkdir ".rockbox/wps", 0777; 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) { if($bitmap) {
mkdir ".rockbox/codepages", 0777;
mkdir ".rockbox/codecs", 0777; mkdir ".rockbox/codecs", 0777;
mkdir ".rockbox/themes", 0777; mkdir ".rockbox/themes", 0777;
if($depth > 1) { if($depth > 1) {
@ -190,10 +199,6 @@ sub buildzip {
my $c = 'find apps -name "*.codec" ! -empty -exec cp {} .rockbox/codecs/ \; 2>/dev/null'; my $c = 'find apps -name "*.codec" ! -empty -exec cp {} .rockbox/codecs/ \; 2>/dev/null';
`$c`; `$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`; my @call = `find .rockbox/codecs -type f 2>/dev/null`;
if(!$call[0]) { if(!$call[0]) {
# no codec was copied, remove directory again # no codec was copied, remove directory again

View file

@ -23,6 +23,10 @@
#define MAX_TABLE_SIZE 32768 #define MAX_TABLE_SIZE 32768
static const int mini_index[5] = {
0, 1, 3, 6, 7
};
static unsigned short iso_table[MAX_TABLE_SIZE]; static unsigned short iso_table[MAX_TABLE_SIZE];
unsigned short iso_decode(unsigned char *latin1, int cp, int count) 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; 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; int i, j;
unsigned char k; unsigned char k;
unsigned short uni; unsigned short uni;
FILE *of; 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++) for (i=0; i < MAX_TABLE_SIZE; i++)
iso_table[i] = 0; iso_table[i] = 0;
of = fopen("iso.cp", "wb"); if (mini) {
if (!of) return 1; 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++) { for (j=0; j<128; j++) {
k = (unsigned char)j + 128; k = (unsigned char)j + 128;
uni = iso_decode(&k, i, 1); uni = iso_decode(&k, mini_index[i], 1);
writeshort(of, uni); writeshort(of, uni);
}
} }
fclose(of);
} }
fclose(of); else {
of = fopen("iso.cp", "wb");
if (!of) return 1;
of = fopen("932.cp", "wb"); for (i=1; i<8; i++) {
if (!of) return 1;
for (i=0; i < MAX_TABLE_SIZE; i++)
writeshort(of, cp932_table[i]);
fclose(of);
of = fopen("936.cp", "wb"); for (j=0; j<128; j++) {
if (!of) return 1; k = (unsigned char)j + 128;
for (i=0; i < MAX_TABLE_SIZE; i++) uni = iso_decode(&k, i, 1);
writeshort(of, cp936_table[i]); writeshort(of, uni);
fclose(of); }
}
fclose(of);
of = fopen("949.cp", "wb"); of = fopen("932.cp", "wb");
if (!of) return 1; if (!of) return 1;
for (i=0; i < MAX_TABLE_SIZE; i++) for (i=0; i < MAX_TABLE_SIZE; i++)
writeshort(of, cp949_table[i]); writeshort(of, cp932_table[i]);
fclose(of); fclose(of);
of = fopen("950.cp", "wb"); of = fopen("936.cp", "wb");
if (!of) return 1; if (!of) return 1;
for (i=0; i < MAX_TABLE_SIZE; i++) for (i=0; i < MAX_TABLE_SIZE; i++)
writeshort(of, cp950_table[i]); writeshort(of, cp936_table[i]);
fclose(of); 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; return 0;
} }

12
tools/configure vendored
View file

@ -598,16 +598,16 @@ EOF
buildfor=`input`; buildfor=`input`;
# Set of tools built for all target platforms: # Set of tools built for all target platforms:
toolset="rdf2binary convbdf" toolset="rdf2binary convbdf codepages"
# Toolsets for some target families: # Toolsets for some target families:
archosbitmaptools="$toolset scramble descramble sh2d uclpack bmp2rb codepages" archosbitmaptools="$toolset scramble descramble sh2d uclpack bmp2rb"
iriverbitmaptools="$toolset scramble descramble mkboot bmp2rb codepages" iriverbitmaptools="$toolset scramble descramble mkboot bmp2rb"
iaudiobitmaptools="$toolset scramble descramble mkboot bmp2rb codepages" iaudiobitmaptools="$toolset scramble descramble mkboot bmp2rb"
ipodbitmaptools="$toolset scramble ipod_fw bmp2rb codepages" 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 # generic is used by IFP, H10, Sansa-e200
genericbitmaptools="$toolset bmp2rb codepages" genericbitmaptools="$toolset bmp2rb"
# ---- For each target ---- # ---- For each target ----