2008-01-11 11:57:08 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 1991-1994 Sony Corporation
|
2026-06-19 01:49:53 +09:00
|
|
|
*
|
2008-01-11 11:57:08 +00:00
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
|
|
|
* a copy of this software and associated documentation files (the
|
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
|
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
|
|
|
* the following conditions:
|
2026-06-19 01:49:53 +09:00
|
|
|
*
|
2008-01-11 11:57:08 +00:00
|
|
|
* The above copyright notice and this permission notice shall be
|
|
|
|
|
* included in all copies or substantial portions of the Software.
|
2026-06-19 01:49:53 +09:00
|
|
|
*
|
2008-01-11 11:57:08 +00:00
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
|
|
|
* IN NO EVENT SHALL SONY CORPORATION BE LIABLE FOR ANY CLAIM,
|
|
|
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
|
|
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
|
|
|
|
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
2026-06-19 01:49:53 +09:00
|
|
|
*
|
2008-01-11 11:57:08 +00:00
|
|
|
* Except as contained in this notice, the name of Sony Corporation
|
|
|
|
|
* shall not be used in advertising or otherwise to promote the sale, use
|
|
|
|
|
* or other dealings in this Software without prior written authorization
|
|
|
|
|
* from Sony Corporation.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
2026-06-19 01:49:53 +09:00
|
|
|
* $SonyRCSfile: srchnum.c,v $
|
|
|
|
|
* $SonyRevision: 1.1 $
|
2008-01-11 11:57:08 +00:00
|
|
|
* $SonyDate: 1994/06/03 08:02:30 $
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include "sj_kcnv.h"
|
|
|
|
|
#include "sj_yomi.h"
|
|
|
|
|
#include "sj_hinsi.h"
|
|
|
|
|
#include "sj_suuji.h"
|
|
|
|
|
|
|
|
|
|
#include "sj_kanakan.h"
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
static void srch_kurai1(), srch_kurai2();
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_josuu_sub(JREC* jrec, TypeGram gram) {
|
|
|
|
|
u_char* tagp;
|
|
|
|
|
DICTL* dp;
|
|
|
|
|
|
|
|
|
|
for(dp = dictlist; dp; dp = dp->next) {
|
|
|
|
|
curdict = dp->dict;
|
|
|
|
|
dicinl = 1;
|
2008-01-11 11:57:08 +00:00
|
|
|
dicsaml = 0;
|
|
|
|
|
prevseg = -1;
|
2026-06-19 01:49:53 +09:00
|
|
|
while(tagp = srchdict(tagp)) setnumrec(tagp, jrec, gram);
|
2008-01-11 11:57:08 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_josuu(JREC* jrec) {
|
|
|
|
|
u_char* kp;
|
2008-01-11 11:57:08 +00:00
|
|
|
int klen;
|
|
|
|
|
int len;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(headcode && headcode != SETTOU_DAI) return;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
kp = cnvstart;
|
|
|
|
|
klen = cnvlen;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
cnvstart += (len = jrec->numlen);
|
|
|
|
|
cnvlen -= len;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
srch_josuu_sub(jrec, JOSUUSI);
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!headcode) srch_josuu_sub(jrec, JOSUUSI2);
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
cnvstart = kp;
|
2026-06-19 01:49:53 +09:00
|
|
|
cnvlen = klen;
|
2008-01-11 11:57:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
setnrec_sub(u_char* p, u_short flag, int stb) {
|
|
|
|
|
JREC* rec;
|
|
|
|
|
int len1;
|
|
|
|
|
int len2;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
len1 = len2 = p - suuji_yptr;
|
2026-06-19 01:49:53 +09:00
|
|
|
if(headcode) len1 += headlen;
|
|
|
|
|
if(stb) len2--;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if((int)suuji_len == len2) {
|
|
|
|
|
if(suuji_wkeep) {
|
|
|
|
|
memcpy((u_char*)suuji_wkeep, (u_char*)suuji_wbuf,
|
|
|
|
|
sizeof(suuji_wbuf[0]) * NUMWORDBUF);
|
2008-01-11 11:57:08 +00:00
|
|
|
}
|
2026-06-19 01:49:53 +09:00
|
|
|
if(suuji_ukeep) {
|
2008-01-11 11:57:08 +00:00
|
|
|
memcpy(suuji_ukeep, suuji_ubuf, NUMKETALENGTH);
|
|
|
|
|
}
|
|
|
|
|
suuji_exit = suuji_keta;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(rec = argjrec(len1, (JREC*)NULL)) {
|
|
|
|
|
rec->class = suuji_class;
|
|
|
|
|
rec->hinsi = SUUSI;
|
|
|
|
|
rec->sttofs = headcode;
|
|
|
|
|
rec->stbofs = (u_char)stb;
|
|
|
|
|
rec->flags = flag;
|
|
|
|
|
rec->numlen = (u_char)len2;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!stb) srch_josuu(rec);
|
2008-01-11 11:57:08 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
setnrec(u_char* p, u_short flag) {
|
2008-01-11 11:57:08 +00:00
|
|
|
setnrec_sub(p, flag, 0);
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!headcode && (*p == Y_S_KIGOU2)) {
|
2008-01-11 11:57:08 +00:00
|
|
|
setnrec_sub(p + 1, flag, -1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static u_char*
|
2026-06-19 01:49:53 +09:00
|
|
|
srchtbl(u_char ch, u_char* tbl, int rec, int n) {
|
2008-01-11 11:57:08 +00:00
|
|
|
int high, low, mid;
|
2026-06-19 01:49:53 +09:00
|
|
|
u_char* p;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!ch) return NULL;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
low = 0;
|
2008-01-11 11:57:08 +00:00
|
|
|
high = n - 1;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
while(low <= high) {
|
2008-01-11 11:57:08 +00:00
|
|
|
mid = (low + high) / 2;
|
2026-06-19 01:49:53 +09:00
|
|
|
p = tbl + mid * rec;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(ch == *p)
|
2008-01-11 11:57:08 +00:00
|
|
|
break;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
else if(ch < *p)
|
2008-01-11 11:57:08 +00:00
|
|
|
high = mid - 1;
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
low = mid + 1;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(low > high) return NULL;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
while(mid-- > 0 && ch == *(p - rec)) p -= rec;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
2026-06-19 01:49:53 +09:00
|
|
|
isconnect(u_char* cnct, int num) {
|
2008-01-11 11:57:08 +00:00
|
|
|
return (cnct[num / 8] & (0x80 >> (num % 8)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
2026-06-19 01:49:53 +09:00
|
|
|
string_cmp(u_char* s, int l, u_char* d) {
|
|
|
|
|
u_char* p;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
p = s;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
while(*s && l-- > 0) {
|
|
|
|
|
if(*s != *d) return 0;
|
2008-01-11 11:57:08 +00:00
|
|
|
s++;
|
|
|
|
|
d++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (s - p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
2026-06-19 01:49:53 +09:00
|
|
|
check_num(u_char* ptr) {
|
2008-01-11 11:57:08 +00:00
|
|
|
int i;
|
|
|
|
|
int j;
|
|
|
|
|
int k;
|
|
|
|
|
int tmp;
|
|
|
|
|
int hketa;
|
|
|
|
|
int lketa;
|
|
|
|
|
int flg = FALSE;
|
|
|
|
|
int cnt;
|
2026-06-19 01:49:53 +09:00
|
|
|
u_short flag;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
memset((u_char*)suuji_wbuf, 0, sizeof(u_short) * NUMWORDBUF);
|
2008-01-11 11:57:08 +00:00
|
|
|
flag = 0;
|
|
|
|
|
|
|
|
|
|
hketa = lketa = cnt = 0;
|
2026-06-19 01:49:53 +09:00
|
|
|
for(i = suuji_keta; --i >= 0;) {
|
|
|
|
|
if(hketa >= 4) return FALSE;
|
2008-01-11 11:57:08 +00:00
|
|
|
tmp = suuji_ubuf[i];
|
2026-06-19 01:49:53 +09:00
|
|
|
if(j = ((tmp >> 6) & 3)) {
|
|
|
|
|
if(j < hketa) return FALSE;
|
|
|
|
|
if(j > hketa) {
|
2008-01-11 11:57:08 +00:00
|
|
|
flag |= JFLAG_N01;
|
|
|
|
|
do {
|
2026-06-19 01:49:53 +09:00
|
|
|
suuji_wbuf[hketa] |= (_NUM0 << (lketa * 4));
|
|
|
|
|
if(++lketa >= 4) {
|
2008-01-11 11:57:08 +00:00
|
|
|
lketa = 0;
|
|
|
|
|
hketa++;
|
|
|
|
|
}
|
2026-06-19 01:49:53 +09:00
|
|
|
} while(j > hketa);
|
2008-01-11 11:57:08 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
k = ((tmp >> 4) & 3);
|
2026-06-19 01:49:53 +09:00
|
|
|
if(j || k) {
|
|
|
|
|
if(k < lketa) return FALSE;
|
|
|
|
|
if(k > lketa) {
|
2008-01-11 11:57:08 +00:00
|
|
|
flag |= JFLAG_N01;
|
|
|
|
|
do {
|
2026-06-19 01:49:53 +09:00
|
|
|
suuji_wbuf[hketa] |= (_NUM0 << (lketa * 4));
|
2008-01-11 11:57:08 +00:00
|
|
|
lketa++;
|
2026-06-19 01:49:53 +09:00
|
|
|
} while(k > lketa);
|
2008-01-11 11:57:08 +00:00
|
|
|
}
|
|
|
|
|
flg = TRUE;
|
|
|
|
|
}
|
|
|
|
|
tmp &= 0x0f;
|
|
|
|
|
suuji_wbuf[hketa] |= (tmp << (lketa * 4));
|
|
|
|
|
cnt++;
|
|
|
|
|
|
|
|
|
|
j = (1 << tmp);
|
2026-06-19 01:49:53 +09:00
|
|
|
if(j & NUMBERS1) flag |= JFLAG_NS1;
|
|
|
|
|
if(j & NUMBER01) flag |= JFLAG_N01;
|
|
|
|
|
if(j & NUMBER23) flag |= JFLAG_N23;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(tmp != _NUM0) {
|
2008-01-11 11:57:08 +00:00
|
|
|
flg = FALSE;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
switch(lketa) {
|
2008-01-11 11:57:08 +00:00
|
|
|
case 0:
|
2026-06-19 01:49:53 +09:00
|
|
|
if(tmp == _NUM1) flag |= JFLAG_N_1;
|
2008-01-11 11:57:08 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
|
flag |= JFLAG_N10;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-06-19 01:49:53 +09:00
|
|
|
if(++lketa >= 4) {
|
2008-01-11 11:57:08 +00:00
|
|
|
lketa = 0;
|
|
|
|
|
hketa++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(flg) return FALSE;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(suuji_keta == 1 || tmp != _NUM0) flag |= JFLAG_NN0;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(hketa)
|
2008-01-11 11:57:08 +00:00
|
|
|
flag |= (JFLAG_NK4 | JFLAG_NK2);
|
2026-06-19 01:49:53 +09:00
|
|
|
else if(lketa > 1)
|
2008-01-11 11:57:08 +00:00
|
|
|
flag |= JFLAG_NK2;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(cnt > 1) flag |= JFLAG_NSN;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
setnrec(ptr, flag);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_number1(u_char* ptr) {
|
|
|
|
|
u_char ch;
|
|
|
|
|
u_char mode;
|
|
|
|
|
u_char* p;
|
|
|
|
|
int l;
|
|
|
|
|
TypeClass cls;
|
|
|
|
|
int len;
|
|
|
|
|
u_char* tptr;
|
|
|
|
|
|
|
|
|
|
if(suuji_keta >= NUMKETALENGTH) return;
|
|
|
|
|
|
|
|
|
|
if(!(p = srchtbl((ch = *ptr), Suuji_tbl, SJTBLRECLEN, SJTBLRECNUM)))
|
2008-01-11 11:57:08 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
len = suuji_yptr + MAXCLINPUTLEN - ptr;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
for(; *SjTblYPos(p) == ch; p += SJTBLRECLEN) {
|
|
|
|
|
if(!(l = string_cmp(SjTblYPos(p), SJTBLYLEN, ptr))) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(l > len) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
mode = *SjTblModeP(p);
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta++] = SjTblNumber(mode);
|
2026-06-19 01:49:53 +09:00
|
|
|
tptr = ptr + l;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
switch(suuji_class) {
|
2008-01-11 11:57:08 +00:00
|
|
|
case C_N_ARABIA:
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!(mode & SJTBLNARABIAF)) break;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
srch_number1(tptr);
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai2(tptr, (u_char*)NULL);
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case C_N_SUUJI:
|
2026-06-19 01:49:53 +09:00
|
|
|
if(mode & (SJTBLNARABIAF | SJTBLNYOMIF)) break;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
srch_number1(tptr);
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai1(tptr, (u_char*)NULL);
|
|
|
|
|
srch_kurai2(tptr, (u_char*)NULL);
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case C_N_KAZU:
|
|
|
|
|
case C_N_NANSUU:
|
2026-06-19 01:49:53 +09:00
|
|
|
if(mode & SJTBLNNARABIF) break;
|
|
|
|
|
if(mode & SJTBLNNANSUUF) {
|
|
|
|
|
cls = suuji_class;
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_NANSUU;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
srch_kurai1(tptr, SjTblCnctP(p));
|
|
|
|
|
srch_kurai2(tptr, SjTblCnctP(p));
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(mode & SJTBLNNANSUUF) suuji_class = cls;
|
2008-01-11 11:57:08 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
2026-06-19 01:49:53 +09:00
|
|
|
if(mode & SJTBLNARABIAF) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_ARABIA;
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
srch_number1(tptr);
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai2(tptr, (u_char*)NULL);
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
suuji_class = C_N_KAZU;
|
2026-06-19 01:49:53 +09:00
|
|
|
} else if(mode & SJTBLNYOMIF) {
|
|
|
|
|
if(mode & SJTBLNNANSUUF)
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_NANSUU;
|
|
|
|
|
else
|
|
|
|
|
suuji_class = C_N_KAZU;
|
|
|
|
|
check_num(tptr);
|
2026-06-19 01:49:53 +09:00
|
|
|
} else if(mode & SJTBLNNARABIF) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_SUUJI;
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
srch_number1(tptr);
|
|
|
|
|
break;
|
2026-06-19 01:49:53 +09:00
|
|
|
} else {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_SUUJI;
|
|
|
|
|
srch_number1(tptr);
|
|
|
|
|
|
|
|
|
|
suuji_class = C_N_KAZU;
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
}
|
|
|
|
|
srch_kurai1(tptr, SjTblCnctP(p));
|
|
|
|
|
srch_kurai2(tptr, SjTblCnctP(p));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
suuji_keta--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai1(u_char* ptr, u_char* cnct) {
|
|
|
|
|
u_char ch;
|
|
|
|
|
u_char* p;
|
|
|
|
|
int l;
|
|
|
|
|
int keta;
|
|
|
|
|
int mode;
|
|
|
|
|
TypeClass cls;
|
|
|
|
|
int len;
|
|
|
|
|
u_char* tptr;
|
|
|
|
|
|
|
|
|
|
if(!(p = srchtbl((ch = *ptr), Kurai1_tbl, KR1TBLRECLEN, KR1TBLRECNUM)))
|
2008-01-11 11:57:08 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
len = suuji_yptr + MAXCLINPUTLEN - ptr;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
for(; *Kr1TblYPos(p) == ch; p += KR1TBLRECLEN) {
|
|
|
|
|
if(!(l = string_cmp(Kr1TblYPos(p), KR1TBLYLEN, ptr))) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(l > len) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
mode = *Kr1TblModeP(p);
|
|
|
|
|
keta = Kr1TblKeta(mode);
|
|
|
|
|
tptr = ptr + l;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(suuji_class != C_N_KAZU && suuji_class != C_N_NANSUU) {
|
|
|
|
|
cls = suuji_class;
|
|
|
|
|
suuji_class = (suuji_class == C_N_ARABIA) ? C_N_ARAKURA : C_N_KANKURA;
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta - 1] |= (keta << 4);
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
suuji_class = cls;
|
|
|
|
|
suuji_ubuf[suuji_keta - 1] &= 0xcf;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(cnct) {
|
|
|
|
|
if(!isconnect(cnct, (int)Kr1TblCnct(mode))) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta - 1] |= (keta << 4);
|
2026-06-19 01:49:53 +09:00
|
|
|
} else {
|
|
|
|
|
if(!Kr1TblTop(mode)) continue;
|
|
|
|
|
if(suuji_keta >= NUMKETALENGTH) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta++] = (_NUM1 | (keta << 4));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
|
|
|
|
|
srch_number1(tptr);
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai1(tptr, (u_char*)NULL);
|
2008-01-11 11:57:08 +00:00
|
|
|
srch_kurai2(tptr, Kr1TblCnctP(p));
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(cnct)
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta - 1] &= 0xcf;
|
|
|
|
|
else
|
|
|
|
|
suuji_keta--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai2(u_char* ptr, u_char* cnct) {
|
|
|
|
|
u_char ch;
|
|
|
|
|
u_char* p;
|
|
|
|
|
int l;
|
|
|
|
|
int keta;
|
|
|
|
|
int mode;
|
|
|
|
|
TypeClass cls;
|
|
|
|
|
int len;
|
|
|
|
|
u_char* tptr;
|
|
|
|
|
|
|
|
|
|
if((suuji_ubuf[0] & 0x0f) == _NUM0) return;
|
|
|
|
|
|
|
|
|
|
if(!(p = srchtbl((ch = *ptr), Kurai2_tbl, KR2TBLRECLEN, KR2TBLRECNUM)))
|
2008-01-11 11:57:08 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
len = suuji_yptr + MAXCLINPUTLEN - ptr;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
for(; *Kr2TblYPos(p) == ch; p += KR2TBLRECLEN) {
|
|
|
|
|
if(!(l = string_cmp(Kr2TblYPos(p), KR2TBLYLEN, ptr))) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(l > len) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
mode = *Kr2TblModeP(p);
|
|
|
|
|
keta = Kr2TblKeta(mode);
|
|
|
|
|
tptr = ptr + l;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(suuji_class != C_N_KAZU && suuji_class != C_N_NANSUU) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta - 1] |= (keta << 6);
|
2026-06-19 01:49:53 +09:00
|
|
|
cls = suuji_class;
|
|
|
|
|
suuji_class = (suuji_class == C_N_ARABIA) ? C_N_ARAKURA : C_N_KANKURA;
|
2008-01-11 11:57:08 +00:00
|
|
|
check_num(tptr);
|
|
|
|
|
suuji_class = cls;
|
|
|
|
|
suuji_ubuf[suuji_keta - 1] &= 0x3f;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(cnct) {
|
|
|
|
|
if(!isconnect(cnct, (int)Kr2TblCnct(mode))) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta - 1] |= (keta << 6);
|
2026-06-19 01:49:53 +09:00
|
|
|
} else {
|
|
|
|
|
if(suuji_keta >= NUMKETALENGTH) continue;
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta++] = (_NUM1 | (keta << 6));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
check_num(tptr);
|
|
|
|
|
|
|
|
|
|
srch_number1(tptr);
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai1(tptr, (u_char*)NULL);
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(cnct)
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta - 1] &= 0x3f;
|
|
|
|
|
else
|
|
|
|
|
suuji_keta--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_number2(u_char* p) {
|
|
|
|
|
u_char ch;
|
|
|
|
|
int i;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
suuji_class = (*p == N_0) ? C_N_SUUJILONG : C_N_KAZULONG;
|
|
|
|
|
|
|
|
|
|
suuji_keta = suuji_comma = 0;
|
2026-06-19 01:49:53 +09:00
|
|
|
for(i = 0; i < MAXCLINPUTLEN; i++) {
|
|
|
|
|
if((ch = *p++) == Y_COMMA) {
|
|
|
|
|
if(suuji_keta) {
|
|
|
|
|
if(suuji_comma) {
|
|
|
|
|
if(suuji_comma != 3) break;
|
|
|
|
|
} else {
|
|
|
|
|
if(suuji_keta >= 4) break;
|
|
|
|
|
if(*suuji_yptr == N_0) break;
|
2008-01-11 11:57:08 +00:00
|
|
|
}
|
2026-06-19 01:49:53 +09:00
|
|
|
} else
|
2008-01-11 11:57:08 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
suuji_comma = 1;
|
2026-06-19 01:49:53 +09:00
|
|
|
ch = *p++;
|
|
|
|
|
} else if(suuji_comma) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_comma++;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(suuji_comma > 3) break;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!(Chrtbl[ch] & NUMBER)) break;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(suuji_keta < NUMKETALENGTH) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_ubuf[suuji_keta] = ch - N_0 + _NUM0;
|
|
|
|
|
}
|
|
|
|
|
suuji_keta++;
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!suuji_comma && suuji_keta > NUMKETALENGTH) {
|
2008-01-11 11:57:08 +00:00
|
|
|
setnrec(p, 0);
|
2026-06-19 01:49:53 +09:00
|
|
|
} else if(suuji_comma == 3) {
|
|
|
|
|
if(suuji_keta <= NUMKETALENGTH) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_ARACMA;
|
|
|
|
|
check_num(p);
|
2026-06-19 01:49:53 +09:00
|
|
|
} else {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_KAZULCMA;
|
|
|
|
|
setnrec(p, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2026-06-19 01:49:53 +09:00
|
|
|
srchnum_sub(u_char* p) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_yptr = p;
|
|
|
|
|
|
|
|
|
|
suuji_comma = suuji_keta = 0;
|
2026-06-19 01:49:53 +09:00
|
|
|
suuji_class = 0;
|
2008-01-11 11:57:08 +00:00
|
|
|
srch_number1(p);
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
suuji_keta = 0;
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_class = C_N_KAZU;
|
2026-06-19 01:49:53 +09:00
|
|
|
srch_kurai1(p, (u_char*)NULL);
|
|
|
|
|
if(suuji_exit) return;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
srch_number2(p);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
void srchnum() {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_len = suuji_exit = 0;
|
|
|
|
|
|
|
|
|
|
srchnum_sub(cnvstart);
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
if(!headcode && (*cnvstart == Y_S_KIGOU1)) {
|
2008-01-11 11:57:08 +00:00
|
|
|
headcode = SETTOU_KIGOU;
|
2026-06-19 01:49:53 +09:00
|
|
|
headlen = 1;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
srchnum_sub(cnvstart + 1);
|
|
|
|
|
|
|
|
|
|
headcode = headlen = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
void setwdnum(u_char* p, int len, u_short* wd) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_len = (u_char)len;
|
|
|
|
|
suuji_wkeep = wd;
|
|
|
|
|
suuji_ukeep = NULL;
|
|
|
|
|
headcode = headlen = 0;
|
2026-06-19 01:49:53 +09:00
|
|
|
suuji_exit = 0;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
srchnum_sub(p);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 01:49:53 +09:00
|
|
|
int setucnum(u_char* p, int len, u_char* ud) {
|
2008-01-11 11:57:08 +00:00
|
|
|
suuji_len = (u_char)len;
|
|
|
|
|
suuji_wkeep = NULL;
|
|
|
|
|
suuji_ukeep = ud;
|
|
|
|
|
headcode = headlen = 0;
|
2026-06-19 01:49:53 +09:00
|
|
|
suuji_exit = 0;
|
2008-01-11 11:57:08 +00:00
|
|
|
|
|
|
|
|
srchnum_sub(p);
|
|
|
|
|
|
|
|
|
|
return (int)suuji_exit;
|
|
|
|
|
}
|