/* * 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: setkouho.c,v $ * $SonyRevision: 1.1 $ * $SonyDate: 1994/06/03 08:02:20 $ */ #include "sj_euc.h" #include "sj_kcnv.h" #include "sj_hinsi.h" #include "sj_kanakan.h" static int hiraknj(); void setkouho(CLREC *clrec, TypeDicOfs offs, int mode) { JREC *jrec; KHREC *kptr; u_char *fptr; int flg; int i; if (khcount >= MAXKOUHONUMBER) return; jrec = clrec -> jnode; kptr = &kouhotbl[khcount++]; if (mode && !offs) nkhcount++; kptr -> clrec = clrec; kptr -> offs = offs; kptr -> rank = 0; kptr -> styno = 0; kptr -> mode = (u_char)mode; if (jrec -> flags & JFLAG_KA) { kptr -> ka_fg = 1; kptr -> ka_kj = 1; flg = 1; } else if (clrec -> fzk_ka) { kptr -> ka_fg = 1; kptr -> ka_kj = 0; flg = 2; } else { kptr -> ka_fg = 0; kptr -> ka_kj = 0; flg = 0; } kptr -> sttfg = kptr -> sttkj = 0; if (!(fptr = Settou_ptr(jrec -> sttofs))) return; if (!SttHiraKnj(fptr)) return; kptr -> sttfg = 1; kptr -> sttkj = 0; i = hiraknj(dicbuf + offs); if (offs > 1 && (i == 2 || i == 3)) return; if (khcount >= MAXKOUHONUMBER) return; kptr++; khcount++; if (mode && !offs) nkhcount++; kptr -> clrec = clrec; kptr -> offs = offs; kptr -> rank = 0; kptr -> styno = 0; kptr -> mode = (u_char)mode; kptr -> sttfg = 1; kptr -> sttkj = 1; switch (flg) { case 1: kptr -> ka_fg = kptr -> ka_kj = 1; break; case 2: kptr -> ka_fg = 1; kptr -> ka_kj = 0; break; default: kptr -> ka_fg = kptr -> ka_kj = 0; break; } } void ph_setkouho(CLREC *clrec, TypeDicOfs offs, STDYIN *sptr) { JREC *jrec; u_char *p; if (sptr) { stdytop = sptr; kouhotbl[0].styno = sptr -> styno; kouhotbl[0].sttkj = sptr -> sttkj; } else { kouhotbl[0].styno = -1; kouhotbl[0].sttkj = 0; } kouhotbl[0].clrec = clrec; kouhotbl[0].offs = offs; kouhotbl[0].rank = 0; kouhotbl[0].mode = sel_sjmode(jrec = clrec -> jnode); kouhotbl[0].sttfg = (u_char) ((p = Settou_ptr(jrec->sttofs)) ? (SttHiraKnj(p)?1:0) : 0); if (jrec -> flags & JFLAG_KA) { kouhotbl[0].ka_fg = kouhotbl[0].ka_kj = 1; } else if (clrec -> fzk_ka) { kouhotbl[0].ka_fg = 1; kouhotbl[0].ka_kj = 0; } else { kouhotbl[0].ka_fg = kouhotbl[0].ka_kj = 0; } khcount = 1; } static int hiraknj(u_char *p) { char flg = TRUE; int i; int result; do { if (p[codesize(*p)] == KANJISTREND) flg = FALSE; switch(*p & KANJIMODEMASK) { case ZENHIRAASSYUKU: result = hiraknj_hask(p, &i); break; case ZENKATAASSYUKU: result = hiraknj_kask(p, &i); break; case OFFSETASSYUKU: result = hiraknj_ofs(p, &i); break; case AIATTRIBUTE: result = hiraknj_atrb(p, &i); break; case LEADINGHANKAKU: result = hiraknj_norm(p, &i); break; case KANJIASSYUKU: result = hiraknj_knj(p, &i); break; default: result = hiraknj_hira(p, &i); } if (result) return result; p += i; } while (flg); return 0; } int hiraknj_atrb(u_char *p, int *len) { *len = 2; return 0; } int hiraknj_ofs(u_char *p, int *len) { *len = 2; return hiraknj(dicbuf + ((*p & KANJICODEMASK) << 8) + *(p + 1)); } int hiraknj_knj(u_char *p, int *len) { *len = 1; return hiraknj(askknj[*p & KNJASSYUKUMASK]); } int hiraknj_hask(u_char *p, int *len) { *len = 1; return 2; } int hiraknj_kask(u_char *p, int *len) { *len = 1; return 3; } int hiraknj_norm(u_char *p, int *len) { *len = codesize(*p); return 1; } int hiraknj_hira(u_char *p, int *len) { u_char ch; *len = codesize(*p); ch = *(p + 1); switch (*p) { case 0x24: if (ch >= 0x21 && ch <= 0x73) return 2; return 1; case 0x25: if (ch >= 0x21 && ch <= 0x76) return 3; return 1; default: break; } return 1; }