/* * 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: peepdic.c,v $ * $SonyRevision: 1.2 $ * $SonyDate: 1995/07/21 05:22:51 $ */ #include "sj_kcnv.h" #include "sj_yomi.h" #include "sj_kanakan.h" static int prev_kanji(), prev_hinsi(), prev_douon(); static int next_kanji(), next_hinsi(), next_douon(); static void set_kanji(), set_buf(), add_yomi(); static void set_idxyomi(); static void cd2sjh_chr(u_char ch, u_char* dst); int getusr(u_char* buf) { int nlen; peepyomi[0] = peepknj[0] = peepgrm = 0; (*curdict->getdic)(curdict, peepidx = DICSEGBASE); get_askknj(); peepdptr = segtop(); if(segend(peepdptr)) return 0; add_yomi(); nlen = getnlen(peepdptr); peephptr = peepdptr + DOUONBLKSIZENUMBER + nlen; peepgrm = *peephptr; peepkptr = peephptr + 1; set_kanji(); set_buf(buf); return -1; } int nextusr(u_char* buf) { (*curdict->getdic)(curdict, peepidx); get_askknj(); if(next_kanji()) { set_kanji(); set_buf(buf); return -1; } return 0; } int prevusr(u_char* buf) { (*curdict->getdic)(curdict, peepidx); get_askknj(); if(prev_kanji()) { set_kanji(); set_buf(buf); return -1; } return 0; } static void set_kanji() { int len; len = getkanji(peepyomi, getnlen(peepdptr) + getplen(peepdptr), peepkptr, peepknj); *(peepknj + len) = 0; } static void set_buf(u_char* buf) { u_char* p; int i, csize; for(p = peepyomi; *p;) *buf++ = *p++; *buf++ = 0; for(p = peepknj; *p;) { csize = euc_codesize(*p); for(i = 0; i < csize; i++) *buf++ = *p++; } *buf++ = 0; *buf++ = peepgrm; *buf++ = 0; } static int prev_kanji() { u_char* p1; u_char* p2; p1 = peephptr + 1; if(peepkptr <= p1) return prev_hinsi(); p2 = peepkptr; while(p1 < p2) { peepkptr = p1; p1 = skipkstr(p1); } return -1; } static int prev_hinsi() { u_char* p1; u_char* p2; int nlen; nlen = getnlen(peepdptr); p1 = peepdptr + DOUONBLKSIZENUMBER + nlen; if(peephptr <= p1) return prev_douon(); p2 = peephptr; while(p1 < p2) { peephptr = p1; p1 = skiphblk(p1); } peepgrm = *peephptr; p1 = peephptr + 1; while(*p1 != HINSIBLKTERM) { peepkptr = p1; p1 = skipkstr(p1); } return -1; } static int prev_douon() { u_char* p1; u_char* p2; int nlen; if(peepdptr <= segtop()) { if(peepidx <= DICSEGBASE) return 0; (*curdict->getdic)(curdict, --peepidx); get_askknj(); set_idxyomi(); p1 = segtop(); do { peepdptr = p1; add_yomi(); p1 = getntag(p1); } while(!segend(p1)); } else { set_idxyomi(); p1 = segtop(); p2 = peepdptr; do { peepdptr = p1; add_yomi(); p1 = getntag(p1); } while(p1 < p2); } nlen = getnlen(peepdptr); p1 = peepdptr + DOUONBLKSIZENUMBER + nlen; p2 = getntag(peepdptr); do { peephptr = p1; p1 = skiphblk(p1); } while(p1 < p2); peepgrm = *peephptr; p1 = peephptr + 1; do { peepkptr = p1; p1 = skipkstr(p1); } while(*p1 != HINSIBLKTERM); return -1; } static int next_kanji() { u_char* p1; p1 = skipkstr(peepkptr); if(*p1 == HINSIBLKTERM) return next_hinsi(); peepkptr = p1; return -1; } static int next_hinsi() { u_char* p1; p1 = skiphblk(peephptr); if(p1 >= getntag(peepdptr)) return next_douon(); peephptr = p1; peepgrm = *p1; peepkptr = p1 + 1; return -1; } static int next_douon() { u_char* p1; int nlen; p1 = getntag(peepdptr); if(segend(p1)) { if(peepidx + 1 < curdict->segunit) { (*curdict->getdic)(curdict, ++peepidx); get_askknj(); peepdptr = segtop(); set_idxyomi(); } else return 0; } else { peepdptr = p1; } add_yomi(); nlen = getnlen(peepdptr); peephptr = peepdptr + DOUONBLKSIZENUMBER + nlen; peepgrm = *peephptr; peepkptr = peephptr + 1; return -1; } static void set_idxyomi() { u_char *p1, *p2; if(p2 = get_idxptr(peepidx)) { p1 = peepyomi; while(*p2) { cd2sjh_chr(*p2++, p1); p1 += 2; } *p1 = 0; } } static void add_yomi() { int nlen; u_char *p1, *p2; nlen = getnlen(peepdptr); p1 = peepyomi + getplen(peepdptr) * 2; p2 = peepdptr + DOUONBLKSIZENUMBER; while(nlen--) { cd2sjh_chr(*p2++, p1); p1 += 2; } *p1 = 0; } static void cd2sjh_chr(u_char ch, u_char* dst) { if(ch == _TYOUON) { *dst++ = 0xa1; *dst++ = 0xbc; } else if(ch == _IGETA) { *dst++ = 0xa1; *dst++ = 0xf4; } else if(ch == _ATTO) { *dst++ = 0xa1; *dst++ = 0xf7; } else if(ch == _YUUBIN) { *dst++ = 0xa2; *dst++ = 0xa9; } else if(ch < N_0) { } else if(ch <= N_9) { *dst++ = 0xa3; *dst++ = ch + 0xa0; } else if(ch <= A_Z) { *dst++ = 0xa3; *dst++ = ch + 0xa7; } else if(ch <= A_z) { *dst++ = 0xa3; *dst++ = ch + 0xad; } else if(ch <= _NN) { *dst++ = 0xa4; *dst++ = ch + 0x53; } else if(ch <= _XKE) { *dst++ = 0xa5; *dst++ = ch + 0x53; } else { } }