summaryrefslogtreecommitdiff
path: root/tools/codepages.c
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2012-04-06 20:21:29 +0200
committerJens Arnold <amiconn@rockbox.org>2012-05-19 01:42:53 +0200
commit2d9c0bab540274e99480d965f38f266d20097976 (patch)
treee004fcdc65cd091521ca12575b82e672cc5908e3 /tools/codepages.c
parent4a6b875eda8fe7827b8a55e42e48184a6588ee4c (diff)
downloadrockbox-2d9c0bab540274e99480d965f38f266d20097976.tar.gz
rockbox-2d9c0bab540274e99480d965f38f266d20097976.zip
Add support for cp1252 (Western European) codepage.
In Europe Windows defaults to its own codepage cp1252 (also known as "WinLatin" or "Windows-1252"). cp1252 adds some characters to ISO-8859-1. Some mp3 tagging software on Windows uses cp1252 instead of ISO-8859-1. This violates the ID3 specification, which requires tags to be ISO-8859-1 or Unicode. However, similar violations are made for other codepages and supported by Rockbox using the "Default Codepage" setting. Add support for cp1252 to enable people using such broken tools to override the correct decoding to get their tags displayed properly. Change-Id: I9f2ec478afe2503e99ee8e6609416c92b0f453e0 Reviewed-on: http://gerrit.rockbox.org/209 Reviewed-by: Jens Arnold <amiconn@rockbox.org> Tested-by: Jens Arnold <amiconn@rockbox.org>
Diffstat (limited to 'tools/codepages.c')
-rw-r--r--tools/codepages.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/tools/codepages.c b/tools/codepages.c
index 9c214397de..fb01c4dfb3 100644
--- a/tools/codepages.c
+++ b/tools/codepages.c
@@ -25,8 +25,8 @@
25 25
26#define MAX_TABLE_SIZE 32768 26#define MAX_TABLE_SIZE 32768
27 27
28static const int mini_index[6] = { 28static const int mini_index[7] = {
29 0, 1, 3, 6, 7, 8 29 0, 1, 3, 6, 7, 8, 9
30}; 30};
31 31
32static unsigned short iso_table[MAX_TABLE_SIZE]; 32static unsigned short iso_table[MAX_TABLE_SIZE];
@@ -140,7 +140,7 @@ unsigned short iso_decode(unsigned char *latin1, int cp, int count)
140 ucs = iso8859_2_to_uni[*latin1++ - 0xA1]; 140 ucs = iso8859_2_to_uni[*latin1++ - 0xA1];
141 } 141 }
142 break; 142 break;
143 143
144 case 0x08: /* Central European (CP1250) */ 144 case 0x08: /* Central European (CP1250) */
145 while (count--) { 145 while (count--) {
146 /* first convert to unicode */ 146 /* first convert to unicode */
@@ -150,7 +150,17 @@ unsigned short iso_decode(unsigned char *latin1, int cp, int count)
150 ucs = cp1250_to_uni[*latin1++ - 0x80]; 150 ucs = cp1250_to_uni[*latin1++ - 0x80];
151 } 151 }
152 break; 152 break;
153 153
154 case 0x09: /* Western European (CP1252) */
155 while (count--) {
156 /* first convert to unicode */
157 if (*latin1 < 0x80 || *latin1 >= 0xa0)
158 ucs = *latin1++;
159 else
160 ucs = cp1252_to_uni[*latin1++ - 0x80];
161 }
162 break;
163
154 default: 164 default:
155 break; 165 break;
156 } 166 }
@@ -209,7 +219,7 @@ int main(int argc, char **argv)
209 of = fopen("isomini.cp", "wb"); 219 of = fopen("isomini.cp", "wb");
210 if (!of) return 1; 220 if (!of) return 1;
211 221
212 for (i=1; i<6; i++) { 222 for (i=1; i<7; i++) {
213 223
214 for (j=0; j<128; j++) { 224 for (j=0; j<128; j++) {
215 k = (unsigned char)j + 128; 225 k = (unsigned char)j + 128;
@@ -223,7 +233,7 @@ int main(int argc, char **argv)
223 of = fopen("iso.cp", "wb"); 233 of = fopen("iso.cp", "wb");
224 if (!of) return 1; 234 if (!of) return 1;
225 235
226 for (i=1; i<9; i++) { 236 for (i=1; i<10; i++) {
227 237
228 for (j=0; j<128; j++) { 238 for (j=0; j<128; j++) {
229 k = (unsigned char)j + 128; 239 k = (unsigned char)j + 128;