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,
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,

View file

@ -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++;

View file

@ -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 */

View file

@ -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

View file

@ -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
View file

@ -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 ----