source: titan/titan/strconvert.h @ 32089

Last change on this file since 32089 was 15744, checked in by nit, 12 years ago

[titan] fix spezial chars in webif

File size: 23.4 KB
Line 
1#ifndef STRCONVERT_H
2#define STRCONVERT_H
3
4#ifndef USE_ICONV
5
6static unsigned long c88592[96] = {
70x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7,
80x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
90x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7,
100x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
110x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
120x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
130x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
140x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
150x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
160x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
170x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
180x0142, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
19};
20       
21static unsigned long c88593[96] = {
220x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7,
230x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B,
240x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7,
250x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C,
260x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7,
270x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
280x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7,
290x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
300x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7,
310x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
320x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
330x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9
34};
35
36static unsigned long c88594[96] = {
370x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7,
380x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
390x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7,
400x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
410x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
420x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
430x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
440x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
450x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
460x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
470x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
480x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
49};
50
51static unsigned long c88595[96] = {
520x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
530x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
540x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
550x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
560x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
570x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
580x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
590x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
600x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
610x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
620x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
630x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F
64};
65       
66static unsigned long c88596[96] = {
670x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000,
680x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000,
690x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
700x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F,
710x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
720x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
730x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
740x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
750x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
760x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
770x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
780x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
79};
80       
81static unsigned long c88597[96] = {
820x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7,
830x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015,
840x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7,
850x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
860x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
870x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
880x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
890x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
900x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
910x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
920x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
930x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
94};
95
96static unsigned long c88598[96] = {
970x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
980x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
990x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1000x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000,
1010x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1020x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1030x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1040x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
1050x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
1060x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
1070x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
1080x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
109};
110
111static unsigned long c88599[96] = {
1120x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1130x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1140x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1150x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1160x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1170x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1180x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1190x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
1200x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1210x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1220x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1230x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
124};
125
126static unsigned long c885910[96] = {
1270x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7,
1280x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
1290x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7,
1300x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
1310x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
1320x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
1330x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168,
1340x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1350x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
1360x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
1370x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169,
1380x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138
139};
140       
141static unsigned long c885911[96] = {
1420x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
1430x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
1440x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
1450x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
1460x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
1470x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
1480x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
1490x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
1500x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
1510x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
1520x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
1530x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000
154};
155
156static unsigned long c885913[96] = {
1570x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7,
1580x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
1590x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7,
1600x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
1610x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
1620x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
1630x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
1640x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
1650x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
1660x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
1670x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
1680x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019
169};
170
171static unsigned long c885914[96] = {
1720x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7,
1730x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
1740x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56,
1750x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
1760x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1770x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1780x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A,
1790x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
1800x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1810x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1820x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B,
1830x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF
184};
185
186static unsigned long c885915[96] = {
1870x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7,
1880x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1890x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7,
1900x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF,
1910x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1920x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1930x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1940x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1950x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1960x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1970x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1980x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
199};
200
201static unsigned long c885916[96] = {
2020x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7,
2030x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B,
2040x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7,
2050x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C,
2060x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7,
2070x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
2080x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A,
2090x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF,
2100x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7,
2110x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
2120x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B,
2130x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF
214};
215
216// Two Char Mapping (many polish services and UPC Direct/HBO services)
217// get from http://mitglied.lycos.de/buran/charsets/videotex-suppl.html
218static inline unsigned int doVideoTexSuppl(char c1, char c2)
219{
220        switch((unsigned char)c1)
221        {
222                case 0xC1: // grave
223                        switch(c2)
224                        {
225                                case 0x61: return 224;
226                                case 0x41: return 192;
227                                case 0x65: return 232;
228                                case 0x45: return 200;
229                                case 0x69: return 236;
230                                case 0x49: return 204;
231                                case 0x6f: return 242;
232                                case 0x4f: return 210;
233                                case 0x75: return 249;
234                                case 0x55: return 217;
235                                default: return 0;
236                        }
237                case 0xC2: // acute
238                        switch(c2)
239                        {
240                                case 0x61: return 225;
241                                case 0x41: return 193;
242                                case 0x65: return 233;
243                                case 0x45: return 201;
244                                case 0x69: return 237;
245                                case 0x49: return 205;
246                                case 0x6f: return 243;
247                                case 0x4f: return 211;
248                                case 0x75: return 250;
249                                case 0x55: return 218;
250                                case 0x79: return 253;
251                                case 0x59: return 221;
252                                case 0x63: return 263;
253                                case 0x43: return 262;
254                                case 0x6c: return 314;
255                                case 0x4c: return 313;
256                                case 0x6e: return 324;
257                                case 0x4e: return 323;
258                                case 0x72: return 341;
259                                case 0x52: return 340;
260                                case 0x73: return 347;
261                                case 0x53: return 346;
262                                case 0x7a: return 378;
263                                case 0x5a: return 377;
264                                default: return 0;
265                        }
266                case 0xC3: // cedilla
267                        switch(c2)
268                        {
269                                case 0x61: return 226;
270                                case 0x41: return 194;
271                                case 0x65: return 234;
272                                case 0x45: return 202;
273                                case 0x69: return 238;
274                                case 0x49: return 206;
275                                case 0x6f: return 244;
276                                case 0x4f: return 212;
277                                case 0x75: return 251;
278                                case 0x55: return 219;
279                                case 0x79: return 375;
280                                case 0x59: return 374;
281                                case 0x63: return 265;
282                                case 0x43: return 264;
283                                case 0x67: return 285;
284                                case 0x47: return 284;
285                                case 0x68: return 293;
286                                case 0x48: return 292;
287                                case 0x6a: return 309;
288                                case 0x4a: return 308;
289                                case 0x73: return 349;
290                                case 0x53: return 348;
291                                case 0x77: return 373;
292                                case 0x57: return 372;
293                                default: return 0;
294                        }
295                case 0xC4: // tilde
296                        switch(c2)
297                        {
298                                case 0x61: return 227;
299                                case 0x41: return 195;
300                                case 0x6e: return 241;
301                                case 0x4e: return 209;
302                                case 0x69: return 297;
303                                case 0x49: return 296;
304                                case 0x6f: return 245;
305                                case 0x4f: return 213;
306                                case 0x75: return 361;
307                                case 0x55: return 360;
308                                default: return 0;
309                        }
310                case 0xC6: // breve
311                        switch(c2)
312                        {
313                                case 0x61: return 259;
314                                case 0x41: return 258;
315                                case 0x67: return 287;
316                                case 0x47: return 286;
317                                case 0x75: return 365;
318                                case 0x55: return 364;
319                                default: return 0;
320                        }
321                case 0xC7: // dot above
322                        switch(c2)
323                        {
324                                case 0x63: return 267;
325                                case 0x43: return 266;
326                                case 0x65: return 279;
327                                case 0x45: return 278;
328                                case 0x67: return 289;
329                                case 0x47: return 288;
330                                case 0x49: return 304;
331                                case 0x7a: return 380;
332                                case 0x5a: return 379;
333                                default: return 0;
334                        }
335                case 0xC8: // diaeresis
336                        switch(c2)
337                        {
338                                case 0x61: return 228;
339                                case 0x41: return 196;
340                                case 0x65: return 235;
341                                case 0x45: return 203;
342                                case 0x69: return 239;
343                                case 0x49: return 207;
344                                case 0x6f: return 246;
345                                case 0x4f: return 214;
346                                case 0x75: return 252;
347                                case 0x55: return 220;
348                                case 0x79: return 255;
349                                case 0x59: return 376;
350                                default: return 0;
351                                }
352                case 0xCA: // ring above
353                        switch(c2)
354                        {
355                                case 0x61: return 229;
356                                case 0x41: return 197;
357                                case 0x75: return 367;
358                                case 0x55: return 366;
359                                default: return 0;
360                        }
361                case 0xCB: // cedilla
362                        switch(c2)
363                        {
364                                case 0x63: return 231;
365                                case 0x43: return 199;
366                                case 0x67: return 291;
367                                case 0x47: return 290;
368                                case 0x6b: return 311;
369                                case 0x4b: return 310;
370                                case 0x6c: return 316;
371                                case 0x4c: return 315;
372                                case 0x6e: return 326;
373                                case 0x4e: return 325;
374                                case 0x72: return 343;
375                                case 0x52: return 342;
376                                case 0x73: return 351;
377                                case 0x53: return 350;
378                                case 0x74: return 355;
379                                case 0x54: return 354;
380                                default: return 0;
381                        }
382                case 0xCD: // double acute accent
383                        switch(c2)
384                        {
385                                case 0x6f: return 337;
386                                case 0x4f: return 336;
387                                case 0x75: return 369;
388                                case 0x55: return 368;
389                                default: return 0;
390                        }
391                case 0xCE: // ogonek
392                        switch(c2)
393                        {
394                                case 0x61: return 261;
395                                case 0x41: return 260;
396                                case 0x65: return 281;
397                                case 0x45: return 280;
398                                case 0x69: return 303;
399                                case 0x49: return 302;
400                                case 0x75: return 371;
401                                case 0x55: return 370;
402                                default: return 0;
403                        }
404                case 0xCF: // caron
405                        switch(c2)
406                        {
407                                case 0x63: return 269;
408                                case 0x43: return 268;
409                                case 0x64: return 271;
410                                case 0x44: return 270;
411                                case 0x65: return 283;
412                                case 0x45: return 282;
413                                case 0x6c: return 318;
414                                case 0x4c: return 317;
415                                case 0x6e: return 328;
416                                case 0x4e: return 327;
417                                case 0x72: return 345;
418                                case 0x52: return 344;
419                                case 0x73: return 353;
420                                case 0x53: return 352;
421                                case 0x74: return 357;
422                                case 0x54: return 356;
423                                case 0x7a: return 382;
424                                case 0x5a: return 381;
425                                default: return 0;
426                        }
427        }                   
428        return 0;
429}
430
431static inline unsigned int recode(unsigned char d, int cp)
432{
433        if(d < 0xA0) return d;
434        switch(cp)
435        {
436                case 0:         // Latin1 <-> unicode mapping
437                case 1:         // 8859-1 <-> unicode mapping
438                        return d;
439                case 2:         // 8859-2 -> unicode mapping
440                        return c88592[d-0xA0];
441                case 3:         // 8859-3 -> unicode mapping
442                        return c88593[d-0xA0];
443                case 4:         // 8859-2 -> unicode mapping
444                        return c88594[d-0xA0];
445                case 5:         // 8859-5 -> unicode mapping
446                        return c88595[d-0xA0];
447                case 6:         // 8859-6 -> unicode mapping
448                        return c88596[d-0xA0];
449                case 7:         // 8859-7 -> unicode mapping
450                        return c88597[d-0xA0];
451                case 8:         // 8859-8 -> unicode mapping
452                        return c88598[d-0xA0];
453                case 9:         // 8859-9 -> unicode mapping
454                        return c88599[d-0xA0];
455                case 10:// 8859-10 -> unicode mapping
456                        return c885910[d-0xA0];
457                case 11:// 8859-11 -> unicode mapping
458                        return c885911[d-0xA0];
459/*              case 12:// 8859-12 -> unicode mapping  // reserved for indian use..
460                        return c885912[d-0xA0];*/
461                case 13:// 8859-13 -> unicode mapping
462                        return c885913[d-0xA0];
463                case 14:// 8859-14 -> unicode mapping
464                        return c885914[d-0xA0];
465                case 15:// 8859-15 -> unicode mapping
466                        return c885915[d-0xA0];
467                case 16:// 8859-16 -> unicode mapping
468                        return c885916[d-0xA0];
469                default:
470                        return d;
471        }
472}
473
474//flag: 0 = standard
475//flag: 1 = only for channelname to remove 0x86 and 0x87 (for shortname)
476char* strutf8(struct transponder* tpnode, char *data, int len, int table, int free1, int flag)
477{
478        int newtable = 0;
479        int twochar = 0;
480        int i = 0, t = 0;
481        unsigned char* res = NULL;
482
483        if(len == 0 || data == NULL) return data;
484
485        if(tpnode != NULL && tpnode->encoding == 2)
486                twochar = 1;
487        //else if(flag == 0 && data[0] > 31) return data;
488
489        res = malloc(MINMALLOC);
490        if(res == NULL)
491        {
492                err("no mem");
493                return data;
494        }
495
496        switch(data[0])
497        {
498                case 1 ... 12:
499                        newtable = data[i++] + 4;
500                        debug(110, "(1..12) text encoded in ISO-8859-%d", table);
501                        break;
502                case 0x10:
503                {
504                        int n = (data[i + 1] << 8) | (data[i + 2]);
505                        debug(110, "(0x10) text encoded in ISO-8859-%d", n);
506                        i += 3;
507                        switch(n)
508                        {
509                                case 12:
510                                        debug(110, "unsup. ISO8859-12 enc. %d", n);
511                                default:
512                                        newtable = n;
513                                        break;
514                        }
515                        break;
516                }
517                case 0x11:
518                        ++i;
519                        debug(110, "unsup. Basic Multilingual Plane of ISO/IEC 10646-1 enc.");
520                        break;
521                case 0x12:
522                        ++i;
523                        debug(110, "unsup. KSC 5601 enc.");
524                        break;
525                case 0x13:
526                        ++i;
527                        debug(110, "unsup. GB-2312-1980 enc.");
528                        break;
529                case 0x14:
530                        ++i;
531                        debug(110, "unsup. Big5 subset of ISO/IEC 10646-1 enc.");
532                        break;
533                case 0x0:
534                case 0xD ... 0xF:
535                case 0x15 ... 0x1F:
536                        ++i;
537                        debug(110, "reserved %d", data[0]);
538                        break;
539        }
540
541        if(table == 0) table = newtable;
542
543        while(i < len)
544        {
545                unsigned long code = 0;
546
547                if(flag == 1 && ((unsigned char)data[i] == 0x86 || (unsigned char)data[i] == 0x87))
548                {
549                        i++;
550                        continue;
551                }
552
553                if(i + 1 < len && twochar && (code = doVideoTexSuppl(data[i], data[i + 1])))
554                        i += 2;
555
556                if(code == 0) code = recode(data[i++], table);
557                if(code == 0) continue;
558
559                if(code < 0x80)
560                        res[t++] = code & 0xff;
561                else if((table == 5) && (code == 0x8A))
562                        res[t++] = 0x20;
563                else if(code < 0x800)
564                {
565                        res[t++] = (code >> 6) | 0xC0;
566                        res[t++] = (code & 0x3F) | 0x80;
567                }
568                else if(code < 0x10000)
569                {
570                        res[t++] = (code >> 12) | 0xE0;
571                        res[t++] = ((code >> 6) & 0x3F) | 0x80;
572                        res[t++] = (code & 0x3F) | 0x80;
573                }
574                else
575                {
576                        res[t++] = (code >> 18) | 0xF0;
577                        res[t++] = ((code >> 12) & 0x3F) | 0x80;
578                        res[t++] = ((code >> 6) & 0x3F) | 0x80;
579                        res[t++] = (code & 0x3F) | 0x80;
580                }
581                if(t + 4 > MINMALLOC)
582                {
583                        debug(110, "buffer to small.. break now");
584                        break;
585                }
586        }
587
588        if(free1 == 1) free(data);
589
590        res = realloc(res, t + 1);
591        res[t] = '\0';
592        return (char*)res;
593}
594
595#else //iconv
596
597#include <iconv.h>
598
599static char iconvbuf[1024 * 6]; // UTF-8 needs up to 6 bytes
600
601//The spec says ISO-6937, but many stations get it wrong and use ISO-8859-1
602char *iso6937_encoding = "ISO-8859-1";
603
604int encoding_default(char *t, char **s, char *d)
605{
606        strncpy(t, iso6937_encoding, 16);
607        return 0;
608}
609
610int encoding_fixed(char *t, char **s, char *d)
611{
612        strncpy(t, d, 16);
613        *s += 1;
614        return 0;
615}
616
617int encoding_variable(char *t, char **s, char *d)
618{
619        int i = ((unsigned char) * s[1] << 8) +  (unsigned char) * s[2];
620        snprintf(t, 16, d, i);
621        *s += 3;
622        return 0;
623}
624
625int encoding_reserved(char *t, char **s, char *d)
626{
627        err("Reserved encoding: %02x", *s[0]);
628        return 1;
629}
630
631struct encoding
632{
633        int (*handler)(char *t, char **s, char *d);
634        char *data;
635} encoding[256] = {
636        [0x00] = {encoding_reserved, NULL},
637        [0x01] = {encoding_fixed, "ISO-8859-5"},
638        [0x02] = {encoding_fixed, "ISO-8859-6"},
639        [0x03] = {encoding_fixed, "ISO-8859-7"},
640        [0x04] = {encoding_fixed, "ISO-8859-8"},
641        [0x05] = {encoding_fixed, "ISO-8859-9"},
642        [0x06] = {encoding_fixed, "ISO-8859-10"},
643        [0x07] = {encoding_fixed, "ISO-8859-11"},
644        [0x08] = {encoding_fixed, "ISO-8859-12"},
645        [0x09] = {encoding_fixed, "ISO-8859-13"},
646        [0x0A] = {encoding_fixed, "ISO-8859-14"},
647        [0x0B] = {encoding_fixed, "ISO-8859-15"},
648        [0x0C] = {encoding_reserved, NULL},
649        [0x0D] = {encoding_reserved, NULL},
650        [0x0E] = {encoding_reserved, NULL},
651        [0x0F] = {encoding_reserved, NULL},
652        [0x10] = {encoding_variable, "ISO-8859-%d"},
653        [0x11] = {encoding_fixed, "ISO-10646/UCS2"}, //FIXME: UCS-2 LE/BE ???
654        [0x12] = {encoding_fixed, "KSC_5601"},
655        [0x13] = {encoding_fixed, "GB_2312-80"},
656        [0x14] = {encoding_fixed, "BIG5"},
657        [0x15] = {encoding_fixed, "ISO-10646/UTF8"},
658        [0x16] = {encoding_reserved, NULL},
659        [0x17] = {encoding_reserved, NULL},
660        [0x18] = {encoding_reserved, NULL},
661        [0x19] = {encoding_reserved, NULL},
662        [0x1A] = {encoding_reserved, NULL},
663        [0x1B] = {encoding_reserved, NULL},
664        [0x1C] = {encoding_reserved, NULL},
665        [0x1D] = {encoding_reserved, NULL},
666        [0x1E] = {encoding_reserved, NULL},
667        [0x1F] = {encoding_reserved, NULL},
668        [0x20 ... 0xFF] = {encoding_default, NULL},
669};
670
671char cs_old[16];
672iconv_t cd = NULL;
673
674char* strutf8(struct transponder* tpnode, char *data, int len, int table, int free1, int flag)
675{
676        char cs_new[16];
677
678        if(data == NULL) return data;
679
680        int i = (int)(unsigned char)data[0];
681        if(encoding[i].handler(cs_new, &data, encoding[i].data))
682                return data;
683        if(strncmp(cs_old, cs_new, 16) != 0 || cd == NULL)
684        {
685                if(cd)
686                {
687                        iconv_close(cd);
688                        cd = NULL;
689                }
690                cd = iconv_open("UTF-8", cs_new);
691                if(cd == (iconv_t)-1)
692                {
693                        perr("iconv_open() failed");
694                        cd = NULL;
695                        return data;
696                }
697        }
698
699        char *inbuf = (char*)data;
700        size_t inbytesleft = len;
701        char *outbuf = (char*)iconvbuf;
702        size_t outbytesleft = sizeof(iconvbuf);
703        size_t ret = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
704        // FIXME: handle errors
705
706        return ostrcat(iconvbuf, NULL, 0, 0);
707}
708
709#endif
710
711int strfreetype(char* string, FT_ULong* cret)
712{
713        int ret = 0, len = 0;
714        unsigned char cur = 0;
715        char* tmpstr = string;
716
717        while(*string)
718        {
719                cur = *string++ & 0xFF;
720
721                if(cur >= 0xC0)
722                {
723                        if(cur < 0xE0) //U+0080 - U+07FF
724                        {
725                                ret = len = 1;
726                                *cret = cur & 0x1F;
727                                continue;
728                        }
729                        else if(cur < 0xF0) //U+0800 - U+FFFF
730                        {
731                                ret = len = 2;
732                                *cret = cur & 0x0F;
733                                continue;
734                        }
735                        else if(cur < 0xF8) //U+10000 - U+10FFF
736                        {
737                                ret = len = 3;
738                                *cret = cur & 0x07;
739                                continue;
740                        }
741                        len = 1; //no utf8 char
742                        break;
743                }
744                else if(cur >= 0x80)
745                {
746                        --len;
747                        if(len >=0 )
748                        {
749                                *cret <<= 6;
750                                *cret += cur & 0x3F;
751                        }
752                        if(len > 0)
753                                continue;
754
755                        len = 0;
756                }
757                else
758                        *cret = cur;
759
760                break;
761        }
762
763        if(len != 0) //no utf8 char
764        {
765                *cret = *tmpstr & 0xFF;
766                ret = 0;
767        }
768        return ret;
769}
770
771#endif
Note: See TracBrowser for help on using the repository browser.