#include <errno.h>
#include <stdlib.h>
#include "common_han.h"
#include "common_utf.h"
#include "common_njh.h"
#include "utf_njh_table.h"
static int node_compare(const void *node1, const void *node2)
{
return((int)(((const hcode_table *)node1)->utf8.code) -
(int)(((const hcode_table *)node2)->utf8.code));
}
hcode_type _utf8_to_johap92(hcode_type utfcode)
{
hcode_table *node_ptr, node;
hcode_type johap, unicode;
int udc_index;
if ((udc_index = _utf_to_udcidx(utfcode)) != IDX_UDC_ERROR) {
johap.byte.byte3 = NJH_UDC_SEG;
if (udc_index < NJH_UDC_OFFSET_GAP)
johap.byte.byte4 = (unsigned int)(udc_index +
NJH_UDC_OFFSET1_START);
else
johap.byte.byte4 = NJH_UDC_OFFSET2_START +
(unsigned int)(udc_index - NJH_UDC_OFFSET_GAP);
return(johap);
}
unicode = _utf8_to_uni(utfcode);
if ((UNICODE_HANGUL_START <= unicode.code) &&
(unicode.code <= UNICODE_HANGUL_END)) {
unsigned int uni, x, y, z;
uni = unicode.code - 0xAC00;
x = uni / 588;
y = (uni % 588) / 28;
z = (uni % 588) % 28;
z = z > 0x10 ? z + 2 : z + 1;
johap.code = 0;
johap.johap.msb = 1;
johap.johap.jongsung = z;
johap.johap.joongsung = y > 0x10 ? y + 9 :
y > 0x0A ? y + 7 :
y > 0x04 ? y + 5 : y + 3;
johap.johap.chosung = x + 2;
return(johap);
} else {
node.utf8 = utfcode;
node_ptr = bsearch( &node,
utf2njh_tbl, sizeof(utf2njh_tbl)/sizeof(hcode_table),
sizeof(hcode_table), node_compare);
johap.code = NON_ID_CHAR;
if (node_ptr != NULL)
johap.word.low = node_ptr->code;
return(johap);
}
}