sj4/lib/sj4core/getcost.c
2026-06-24 11:39:52 +09:00

97 lines
1.7 KiB
C

#include "sj_kanakan.h"
static void getcost_atrb(SJ4_CONTEXT u_char* p, int* len) {
*len = 2;
}
static int getcost_ofs(SJ4_CONTEXT u_char* p, int* len) {
*len = 0;
return getcost(SJ4_CONTEXT_PASS dicbuf + ((*p & KANJICODEMASK) << 8) + *(p + 1));
}
static int getcost_knj(SJ4_CONTEXT u_char* p, int* len) {
*len = 1;
return getcost(SJ4_CONTEXT_PASS askknj[*p & KNJASSYUKUMASK]);
}
static void getcost_hask(SJ4_CONTEXT u_char* p, int* len) {
*len = 1;
}
static void getcost_kask(SJ4_CONTEXT u_char* p, int* len) {
*len = 1;
}
static void getcost_norm(SJ4_CONTEXT u_char* p, int* len) {
*len = codesize(*p);
}
static void getcost_hira(SJ4_CONTEXT u_char* p, int* len) {
u_char ch;
*len = codesize(*p);
ch = *(p + 1);
switch(*p) {
case 0x24:
if(ch >= 0x21 && ch <= 0x73) return;
return;
case 0x25:
if(ch >= 0x21 && ch <= 0x76) return;
return;
default:
break;
}
}
int getcost(SJ4_CONTEXT u_char* p) {
char flg = TRUE;
int i;
int result;
do {
if(p[codesize(*p)] == KANJISTREND) flg = FALSE;
switch(*p & KANJIMODEMASK) {
case ZENHIRAASSYUKU:
getcost_hask(SJ4_CONTEXT_PASS p, &i);
break;
case ZENKATAASSYUKU:
getcost_kask(SJ4_CONTEXT_PASS p, &i);
break;
case OFFSETASSYUKU:
result = getcost_ofs(SJ4_CONTEXT_PASS p, &i);
break;
case AIATTRIBUTE:
getcost_atrb(SJ4_CONTEXT_PASS p, &i);
break;
case LEADINGHANKAKU:
getcost_norm(SJ4_CONTEXT_PASS p, &i);
break;
case KANJIASSYUKU:
result = getcost_knj(SJ4_CONTEXT_PASS p, &i);
break;
case KANAKANCOST:
result = ((*p & 0xf) << 8) | *(p + 1);
result++;
i = 2;
break;
default:
getcost_hira(SJ4_CONTEXT_PASS p, &i);
}
if(result) return result - 1;
p += i;
} while(flg);
return 0;
}