/* * Copyright (c) 1991-1994 Sony Corporation * * 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: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * 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. * * 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. * */ /* * $SonyRCSfile: mknumber.c,v $ * $SonyRevision: 1.1 $ * $SonyDate: 1994/06/03 08:02:05 $ */ #include "sj_kcnv.h" #include "sj_yomi.h" #include "sj_suuji.h" #include "sj_kanakan.h" static int word2char(u_short wd, u_char *tbl, int keta, int flg) { int mask; int num; u_char *src; for (mask = 0x1000 ; mask ; mask >>= 4) { switch (num = (unsigned int)wd / mask) { case 0: break; case _NUM0: if (!flg) break; default: src = tbl + (num - _NUM0) * 2; *kanjitmp++ = *src++; *kanjitmp++ = *src; flg = TRUE; if (keta && !(keta % 3)) { *kanjitmp++ = COMMAHIGH; *kanjitmp++ = COMMALOW; } } if (keta) keta--; wd &= (mask - 1); } return flg; } static void words2num(u_short *wd, u_char *tbl, int flgc) { int i; int keta; int flg; u_char *kp = kanjitmp; if (flgc) { keta = NUMKETALENGTH - 1; flg = FALSE; } else { keta = 0; flg = TRUE; } for (i = NUMWORDBUF ; i-- > 0 ; ) { flg = word2char(*(wd + i), tbl, keta, flg); if (keta) keta -= 4; } if (kp == kanjitmp) { *kanjitmp++ = *tbl++; *kanjitmp++ = *tbl; } } void num_type00(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num1tbl, FALSE); } void num_type01(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num1tbl, FALSE); } void num_type02(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num1tbl, TRUE); } void num_type03(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num2tbl, FALSE); } void num_type04(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num2tbl, FALSE); } void num_type05(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num2tbl, TRUE); } void num_type06(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num3tbl, FALSE); } void num_type07(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); words2num(num, Num3tbl, FALSE); } static void kan_num(u_short *wd, u_char *tbl1, u_char *tbl2) { int ii; u_short tmp; int mask; int num; int flg; u_char *kurai1; u_char *kurai2; u_char *src; u_char *keep = kanjitmp; kurai2 = Num6tbl - 2; mask = 0; wd += NUMWORDBUF - 1; flg = FALSE; for (ii = NUMKETALENGTH ; ii-- > 0 ; ) { if (!mask) { if (flg) { *kanjitmp++ = *kurai2++; *kanjitmp++ = *kurai2++; } else kurai2 += 2; mask = 0x1000; tmp = *wd--; flg = FALSE; kurai1 = tbl2; } if ((num = (unsigned int)tmp / mask) > _NUM0) { if ((num != _NUM1) || !*kurai1) { src = tbl1 + (num - _NUM0) * 2; *kanjitmp++ = *src++; *kanjitmp++ = *src; } if (*kurai1) { *kanjitmp++ = *kurai1++; *kanjitmp++ = *kurai1++; } flg = TRUE; } else kurai1 += 2; tmp &= (mask - 1); mask >>= 4; } if (kanjitmp == keep) { *kanjitmp++ = *tbl1++; *kanjitmp++ = *tbl1; } } void num_type08(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); kan_num(num, Num2tbl, Num4tbl); } void num_type09(u_char *s1, u_char *s2, JREC *jrec) { u_short num[NUMWORDBUF]; setwdnum(s1, (int)jrec -> numlen, num); kan_num(num, Num3tbl, Num5tbl); } void num_type10(u_char *s1, u_char *s2, JREC *jrec) { int i; for (i = jrec -> numlen ; i > 0 ; i--) { if (Chrtbl[*s1++] & NUMBER) { *kanjitmp++ = *s2++; *kanjitmp++ = *s2++; } else s2 += euc_codesize(*s2); } } void num_type11(u_char *s1, u_char *s2, JREC *jrec) { int i; int j; i = j = jrec -> numlen; if (!(Chrtbl[*(s1 + j - 4)] & NUMBER)) j -= (j - 1) / 4; for ( ; i > 0 ; i--) { if (Chrtbl[*s1++] & NUMBER) { *kanjitmp++ = *s2++; *kanjitmp++ = *s2++; if (--j > 0) { if ((j % 3) == 0) { *kanjitmp++ = COMMAHIGH; *kanjitmp++ = COMMALOW; } } } else s2 += euc_codesize(*s2); } } void num_type12(u_char *s1, u_char *s2, JREC *jrec) { int i; int j; for (i = jrec -> numlen ; i > 0 ; i--) { if (Chrtbl[j = *s1++] & NUMBER) { j = (j - N_0) * 2; *kanjitmp++ = Num2tbl[j]; *kanjitmp++ = Num2tbl[j + 1]; } } } static void num_kurai(u_char *p, int len, u_char *tbl) { int i; int j; u_char tmp; for (i = 0 ; i < len ; i++) { tmp = *p++; *kanjitmp++ = tbl[j = ((tmp & 0x0f) - _NUM0) * 2]; *kanjitmp++ = tbl[j + 1]; if (j = ((tmp >> 4) & 3)) { *kanjitmp++ = Num4tbl[j = (3 - j) * 2]; *kanjitmp++ = Num4tbl[j + 1]; } if (j = ((tmp >> 6) & 3)) { *kanjitmp++ = Num6tbl[j = (3 - j) * 2]; *kanjitmp++ = Num6tbl[j + 1]; } } } void num_type13(u_char *s1, u_char *s2, JREC *jrec) { u_char num[NUMKETALENGTH]; int len; len = setucnum(s1, (int)jrec -> numlen, num); num_kurai(num, len, Num1tbl); } void num_type14(u_char *s1, u_char *s2, JREC *jrec) { u_char num[NUMKETALENGTH]; int len; len = setucnum(s1, (int)jrec -> numlen, num); num_kurai(num, len, Num2tbl); }