/* * 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: mkjiritu.c,v $ * $SonyRevision: 1.1 $ * $SonyDate: 1994/06/03 08:02:03 $ */ #include #include "sj_kcnv.h" #include "sj_kanakan.h" static void dic_mu(), dic_cl(); void mkjiritu(int mode) { u_char chkind1; u_char chkind2; JREC* jrec; u_char* stb; headcode = headlen = 0; maxjptr = NULL; chkind1 = Chrtbl[*cnvstart]; if(chkind1 & DICTOP) { dic_mu(mode); } if(mode & DO_CLSTUDY) dic_cl(); srchnum(); if(srchhead() && cnvlen != headlen) { cnvstart += headlen; cnvlen -= headlen; chkind2 = Chrtbl[*cnvstart]; if(chkind2 & DICTOP) { dic_mu(mode); } if(headcode == SETTOU_DAI) { srchnum(); } cnvstart -= headlen; cnvlen += headlen; } for(jrec = maxjptr; jrec; jrec = jrec->jsort) { if(stb = getstb(jrec->hinsi)) setubi(jrec, stb); } } static void dic_mu(int mode) { u_char* tagp; DICTL* dp; for(dp = dictlist; dp; dp = dp->next) { curdict = dp->dict; dicinl = 1; dicsaml = 0; prevseg = -1; while(tagp = srchdict(tagp)) setjrec(tagp, mode); } } JREC* argjrec(int len, JREC* rec) { JREC* ptr; JREC* jrec; JREC* child; jrec = alloc_jrec(); if(!jrec) { if(!maxjptr) return NULL; ptr = NULL; jrec = maxjptr; while(child = jrec->jsort) { ptr = jrec; jrec = child; } if(len <= (int)jrec->jlen) return NULL; if(ptr) ptr->jsort = NULL; else maxjptr = NULL; } if(rec) memcpy((u_char*)jrec, (u_char*)rec, sizeof(JREC)); else memset((u_char*)jrec, 0, sizeof(*jrec)); jrec->jlen = (u_char)len; if(!maxjptr) { maxjptr = jrec; jrec->jsort = NULL; return jrec; } ptr = maxjptr; if((int)ptr->jlen < len) { jrec->jsort = maxjptr; maxjptr = jrec; return jrec; } while(child = ptr->jsort) { if((int)child->jlen < len) break; ptr = child; } ptr->jsort = jrec; jrec->jsort = child; return jrec; } static void dic_cl() { u_char* p; u_short pos; int len; int cmp; if(!StudyExist()) return; if((pos = CLSTUDYIDX[(short)*cnvstart / CLSTUDYSTEP]) != (u_short)-1) { for(p = CLSTUDYDICT + pos; !iseocl(p); p = ClNextTag(p)) { cmp = sstrncmp(cnvstart, (u_char*)ClYomiPos(p), len = ClYomiLen(p)); if(cmp == MATCH) { if(!isdpnd(*(cnvstart + len))) { setcrec(p); } } else if(cmp == OVER) break; } } }