102 lines
4 KiB
C
102 lines
4 KiB
C
|
/***************************************************************************
|
||
|
* __________ __ ___.
|
||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||
|
* \/ \/ \/ \/ \/
|
||
|
* $Id$
|
||
|
*
|
||
|
* Copyright (C) 2002 by Alex Gitelman
|
||
|
*
|
||
|
* All files in this archive are subject to the GNU General Public License.
|
||
|
* See the file COPYING in the source tree root for full license agreement.
|
||
|
*
|
||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||
|
* KIND, either express or implied.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
#include "unicode.h"
|
||
|
#include "string.h"
|
||
|
|
||
|
#define MAX_TYPE 3
|
||
|
|
||
|
unsigned char *conversion_table[255];
|
||
|
unsigned char *reverse_conversion_table[255];
|
||
|
|
||
|
static unsigned char page_04[] = {
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
|
||
|
0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
|
||
|
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
|
||
|
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||
|
};
|
||
|
|
||
|
void install_unicode_tables(void)
|
||
|
{
|
||
|
install_conversion_table(0x04, page_04);
|
||
|
}
|
||
|
|
||
|
void unicode_init(void)
|
||
|
{
|
||
|
memset(conversion_table, 0, sizeof(conversion_table));
|
||
|
memset(reverse_conversion_table, 0, sizeof(reverse_conversion_table));
|
||
|
install_unicode_tables();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Convertion table defines how chars in ing given page map to ascii
|
||
|
*/
|
||
|
void install_conversion_table(unsigned char page, unsigned char* conv_table)
|
||
|
{
|
||
|
if (conv_table!=0)
|
||
|
conversion_table[page] = conv_table;
|
||
|
else
|
||
|
conversion_table[page] = 0;
|
||
|
}
|
||
|
|
||
|
void install_reverse_conversion_table(unsigned char page,
|
||
|
unsigned char* rev_conv_table)
|
||
|
{
|
||
|
if (rev_conv_table!=0)
|
||
|
reverse_conversion_table[page] = rev_conv_table;
|
||
|
else
|
||
|
reverse_conversion_table[page] = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
unsigned char from_unicode(const unsigned char *uni_char)
|
||
|
{
|
||
|
/*
|
||
|
Here we should get proper code page conversions.
|
||
|
For now hack for Cyrrilic->Unicode
|
||
|
*/
|
||
|
unsigned char *table = conversion_table[uni_char[0]];
|
||
|
if (table!=0)
|
||
|
return table[uni_char[1]];
|
||
|
/* If page is not present -> no conversion */
|
||
|
return uni_char[1];
|
||
|
|
||
|
}
|
||
|
|
||
|
void to_unicode(unsigned char c, unsigned char page, unsigned char *uni_char)
|
||
|
{
|
||
|
unsigned char *table = reverse_conversion_table[page];
|
||
|
if (table!=0)
|
||
|
uni_char[1] = table[c];
|
||
|
else
|
||
|
uni_char[1] = c;
|
||
|
uni_char[0] = page;
|
||
|
}
|