Mercurial > kinput2.yaz
diff lib/Xsj3clib/symbol.c @ 0:92745d501b9a
initial import from kinput2-v3.1
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 08 Mar 2010 04:44:30 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/symbol.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,310 @@ +#ifndef lint +static char *rcsid = "$Id: symbol.c,v 2.0 1992/02/13 18:33:43 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include <stdio.h> +#include "common.h" +#include "util.h" +#include "func.h" +#include "table.h" + +Xsj3cSymbol _Xsj3cSymbolInit(); +int Xsj3cGetSymbolNum(); +Xsj3cSymbol Xsj3cGetSymbols(); +wchar *Xsj3cGetSymbol(); +int Xsj3cSetSymbol(); +void Xsj3cEndSymbol(); + +static int _Xsj3cReadSymbol(); + +static Xsj3cSymbol symbollist = NULL; +static int symbolnum = 0; + +/* + * _Xsj3cSymbolInit() + * Decide sjsb file to read, then read it and make table for symbles. + */ +Xsj3cSymbol +_Xsj3cSymbolInit(sjsb, home) + char *sjsb; + char *home; +{ + extern char *getenv(); + register char *p; + char sbfile[BUFSIZ]; + int value; + + if (symbollist) { + return(symbollist); + } + if (sjsb) { + if ((value = _Xsj3cReadSymbol(sjsb)) > 0) + Xsj3cError("can't open sjsb file %s", sjsb); + else if ( value < 0 ) + Xsj3cError("read failed sjsb file %s", sjsb); + } else { + sbfile[0] = '\0'; + if ((p = getenv("SJSB")) && *p != '\0') { + if (*p != '/') { + if (home) + strcpy(sbfile, home); + strcat(sbfile, "/"); + } + strcat(sbfile, p); + } else if (home) { + strcpy(sbfile, home); + strcat(sbfile, "/.sjsb"); + } else { + strcpy(sbfile, SJ3DEFPATH); + strcat(sbfile, DEF_SJSB_FILE); + } + if ((value = _Xsj3cReadSymbol(sbfile)) > 0) { + strcpy(sbfile, SJ3DEFPATH); + strcat(sbfile, DEF_SJSB_FILE); + if ((value = _Xsj3cReadSymbol(sbfile)) > 0) { + Xsj3cError("can't open sjsb file %s", sbfile); + } else if ( value < 0 ) { + Xsj3cError("read failed sjsb file %s", sbfile); + } + } else if ( value < 0 ) { + Xsj3cError("read failed sjsb file %s", sbfile); + } + } + return(symbollist); +} + +/* + * _Xsj3cReadSymbol() + * Read sjsb file that is symbol table file. + * Make symbol table and return it. + */ +static int +_Xsj3cReadSymbol(file) + char *file; +{ + FILE *fp; + unsigned char line[256]; + unsigned char *p; + int len; + wchar data[RBUFSIZ]; + register int i, j; + + if ((fp = fopen(file, "r")) == NULL) { + return (OPEN_FAILED); + } + + i = 0; + while (fgets(line, sizeof(line), fp) != NULL) { + if (line[0] != '#' && line[0] != '\n') + i++; + } + + symbolnum = i; + if ((symbollist = (Xsj3cSymbol)calloc(i, sizeof(Xsj3cSymbolRec))) == NULL) { + return (ALLOC_FAILED); + } + + rewind(fp); + + j = 0; + while (fgets(line, sizeof(line), fp) != NULL && j < i) { + p = line; + while (*p != '\n' && *p != '#') { + p += _Xsj3cmINtowOUT(file, p, data, &len); + SKIP(p); + if (data[0] == '\0') + break; + symbollist[j].data = _Xsj3cStoreWchar(data, len + 1); + symbollist[j].len = len; + if (!symbollist[j].data) + return (ALLOC_FAILED); + j++; + } + } + fclose(fp); + return (OK); +} + +/* + * Xsj3cGetSymbolNum() + * Set the appointed (by 2nd argument) symbol to 3rd argument. + */ +int +Xsj3cGetSymbolNum(buf, cur) + Xsj3cBuf buf; + int *cur; +{ + if (!buf->symbol) { + buf->symbol = _Xsj3cSymbolInit(NULL, NULL); + } + *cur = buf->cursymbol; + return (symbolnum); +} + +/* + * Xsj3cGetSymbols() + * Set the appointed (by 2nd argument) symbol to 3rd argument. + */ +Xsj3cSymbol +Xsj3cGetSymbols(buf) + Xsj3cBuf buf; +{ + if (!buf->symbol) { + buf->symbol = _Xsj3cSymbolInit(NULL, NULL); + } + return (buf->symbol); +} + +/* + * Xsj3cGetSymbol() + * Set the appointed (by 2nd argument) symbol to 3rd argument. + */ +wchar * +Xsj3cGetSymbol(buf, n, len) + Xsj3cBuf buf; + int n; + int *len; +{ + if (!buf->symbol) { + buf->symbol = _Xsj3cSymbolInit(NULL, NULL); + } + *len = buf->symbol[n].len; + return (buf->symbol[n].data); +} + +/* + * Xsj3cSetSymbol() + * Set the selected symbol to the buffers. + */ +int +Xsj3cSetSymbol(buf, sel_symbol, changed, flush) + Xsj3cBuf buf; + int sel_symbol; + int *changed; + int *flush; +{ + Xsj3cSeg seg; + int change_pos; + register int i; + wchar symbol[RBUFSIZ]; + + if (buf->segnum && buf->input[buf->curseg] + && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) { + /* $B8=J8@a$,JQ49:Q$_$N>l9g(B */ + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + /* FlushInConverion on $B$N;~$O3NDj$9$k(B */ + switch (buf->flushiconv) { + case ON: + for (i = 1; i < buf->backsegnum + 1; i++) { + Xsj3cFreeSegment(buf->backup[i]); + buf->backup[i] = NULL; + } + if (!buf->backup) { + if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ, + sizeof(Xsj3cSeg))) == NULL) { + Xsj3cError("Cannot allocate for backup buffers"); + } + } + if (seg = buf->backup[0]) { + Xsj3cClearSegment(buf, seg); + } else + seg = buf->backup[0] = (Xsj3cSeg)Xsj3cCreateSegment(buf); + buf->backsegnum = 1; + *flush = ON; + break; + case EDIT: + if (!(seg = buf->input[buf->curseg])) + seg = buf->input[buf->curseg] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + seg->n_roma = 0; + seg->n_kana = -1; + if (buf->curseg == buf->segnum) + buf->segnum++; + else { + _Xsj3cUnConvSeg(buf, ONE, buf->muhencurlast); + _Xsj3cStoreYomi(buf, seg, 0); + } + *flush = OFF; + break; + case OFF: + if (seg = buf->input[buf->segnum]) { + Xsj3cClearSegment(buf, seg); + } else { + seg = buf->input[buf->segnum] + = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } + buf->curseg = buf->segnum; + buf->segnum++; + *flush = OFF; + break; + case NONE: + default: + *flush = OFF; + *changed = OFF; + return 0; + } + } else { + seg = buf->input[buf->curseg]; + if (buf->curseg == buf->segnum) { + buf->segnum++; + } + if (!seg) { + seg = buf->input[buf->curseg] = (Xsj3cSeg)Xsj3cCreateSegment(buf); + } else { + *seg->str = '\0'; + seg->sp = seg->str; + seg->n_roma = 0; + seg->n_kana = -1; + *seg->oldstr = '\0'; + seg->oldlen = 0; + } + } + seg->edit = SEG_EDIT; + change_pos = seg->cur; + _Xsj3cwOUTtowPS(buf, symbol, buf->symbol[sel_symbol].data); + _Xsj3cInsertWchar(seg, symbol, buf->symbol[sel_symbol].len); + _Xsj3cStoreYomi(buf, seg, change_pos); + buf->cursymbol = sel_symbol; + *changed = ON; + + return 0; +} + +/* + * Xsj3cEndSymbol() + * End symbol input mode(SelectMode) and back to InputMode. + */ +void +Xsj3cEndSymbol(buf) + Xsj3cBuf buf; +{ + buf->convmode = InputModeMask; +}