Mercurial > kinput2.yaz
diff lib/Xsj3clib/segment.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/segment.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,301 @@ +#ifndef lint +static char *rcsid = "$Id: segment.c,v 2.0 1992/02/13 18:33:33 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 "common.h" +#include "util.h" + +Xsj3cSeg Xsj3cCreateSegment(); +void Xsj3cFreeSegment(); +void Xsj3cResizeSegment(); +void Xsj3cClearSegment(); + +int Xsj3cGetSegNum(); +int Xsj3cGetPosition(); +wchar *Xsj3cGetModeStr(); +wchar *Xsj3cGetSeg(); +wchar *Xsj3cGetConvertedStr(); +int Xsj3cGetConvertedLength(); + +/* + * Xsj3cCreateSegment() + * Allocate Xsj3cSeg type structure and initialize all flags and buffers. + */ +Xsj3cSeg +Xsj3cCreateSegment(buf) + Xsj3cBuf buf; +{ + Xsj3cSeg seg; + + if (!(seg = (Xsj3cSeg)malloc(sizeof(Xsj3cSegRec)))) { + return (Xsj3cSeg)NULL; + } + bzero (seg, sizeof(Xsj3cSegRec)); + if (!(seg->str = (unsigned char *)malloc(RBUFSIZ))) { + return (Xsj3cSeg)NULL; + } + *seg->str = '\0'; + seg->sp = seg->str; + if (!(seg->oldstr = (unsigned char *)malloc(RBUFSIZ))) { + return (Xsj3cSeg)NULL; + } + *seg->oldstr = '\0'; + seg->size = 0; + seg->yomi = NULL; + seg->disp = NULL; + Xsj3cResizeSegment(seg, KANABUFSIZ); + seg->n_roma = 0; + seg->n_kana = -1; + seg->value = 0; + seg->oldlen = 0; + seg->num = 0; + seg->cur = 0; + seg->status = SEG_NOCONV; + seg->cursegmode = buf->inputmode; + seg->change = OFF; + seg->edit = SEG_NOEDIT; + bzero(&seg->dcid, sizeof(seg->dcid)); + return(seg); +} + +/* + * Xsj3cFreeSegment() + * Free Xsj3cSeg type structure. + */ +void +Xsj3cFreeSegment(seg) + Xsj3cSeg seg; +{ + if (!seg) + return; + if (seg->str) + free(seg->str); + seg->str = NULL; + if (seg->oldstr) + free(seg->oldstr); + seg->oldstr = NULL; + if (seg->yomi) { + free(seg->yomi); + seg->yomi = NULL; + } + if (seg->disp) { + free(seg->disp); + seg->disp = NULL; + } + seg->size = 0; + free(seg); +} + +/* + * Xsj3cResizeSegment() + * Allocate segment buffers. + */ +void +Xsj3cResizeSegment(seg, size) + Xsj3cSeg seg; + int size; +{ + if (seg->size != size) { + if (seg->yomi) { + if (!(seg->yomi = (wchar *)realloc(seg->yomi, + seg->size * sizeof(wchar)))) { + Xsj3cError("Failed to reallocate yomi buffer"); + } + } else { + if (!(seg->yomi = (wchar *)calloc(KANABUFSIZ, sizeof(wchar)))) { + Xsj3cError("Failed to allocate yomi buffer"); + } + } + if (seg->disp) { + if (!(seg->disp = (wchar *)realloc(seg->disp, + seg->size * sizeof(wchar)))) { + Xsj3cError("Failed to reallocate display buffer"); + } + } else { + if (!(seg->disp = (wchar *)calloc(KANABUFSIZ, sizeof(wchar)))) { + Xsj3cError("Failed to allocate display buffer"); + } + } + seg->size = size; + } +} + +/* + * Xsj3cClearSegment() + * Clear segment. + */ +void +Xsj3cClearSegment(buf, seg) + Xsj3cBuf buf; + Xsj3cSeg seg; +{ + *seg->str = '\0'; + seg->sp = seg->str; + *seg->oldstr = '\0'; + seg->oldlen = 0; + Xsj3cResizeSegment(seg, KANABUFSIZ); + *seg->yomi = '\0'; + *seg->disp = '\0'; + seg->cur = 0; + seg->num = 0; + seg->value = 0; + seg->n_roma = 0; + seg->n_kana = -1; + seg->dnum = 0; + seg->status = SEG_NOCONV; + seg->cursegmode = buf->inputmode; + seg->change = OFF; + seg->edit = SEG_NOEDIT; + bzero(&seg->dcid, sizeof(seg->dcid)); +} + +/* + * Xsj3cGetModeStr() + * Return the strings of current mode guide. + */ +wchar * +Xsj3cGetModeStr(buf, len) + Xsj3cBuf buf; + int *len; +{ + *len = buf->modelen[buf->dispmode]; + return(buf->modestr[buf->dispmode]); +} + +#define CURSOR_VISIBLE 1 +#define CURSOR_UNVISIBLE 0 + +/* + * Xsj3cGetPosition() + * Set current segment number to 2nd argument + * and cursor position to 3rd argument. + */ +int +Xsj3cGetPosition(buf, curseg, pos) + Xsj3cBuf buf; + int *curseg; + int *pos; +{ + if (buf->curseg < buf->segnum) { + *curseg = buf->curseg; + *pos = buf->input[buf->curseg]->cur; + if (buf->input[buf->curseg]->status & SEG_CONVED) + return CURSOR_UNVISIBLE; + else + return CURSOR_VISIBLE; + } else if (buf->curseg > 0) { + *curseg = buf->curseg - 1; + *pos = buf->input[buf->curseg - 1]->dnum; + return CURSOR_VISIBLE; + } else { + *curseg = 0; + *pos = 0; + return CURSOR_UNVISIBLE; + } +} + +/* + * Xsj3cGetSegNum() + * Return the number of segments. + */ +int +Xsj3cGetSegNum(buf) + Xsj3cBuf buf; +{ + return(buf->segnum); +} + +/* + * Xsj3cGetSeg() + * Return the appointed segment in buffers. + */ +wchar * +Xsj3cGetSeg(buf, n, len, attr) + Xsj3cBuf buf; + int n; + int *len; + int *attr; +{ + if (buf->convmode & DictModeMask) { + if (n >= buf->curseg && n <= buf->curseg + buf->dict->n_dict) + *attr = SEG_REVERSED; + else if (buf->convedunderline) + *attr = SEG_UNDER_LINE; + else + *attr = SEG_NORMAL; + } else { + if (n == buf->curseg) { + if (SEG_NOEDIT & buf->input[n]->edit) { + *attr = SEG_REVERSED; + } else { + *attr = SEG_UNDER_LINE; + } + } else { + if (buf->input[n]->status & SEG_NOCONV || buf->convedunderline) { + *attr = SEG_UNDER_LINE; + } else { + *attr = SEG_NORMAL; + } + } + } + *len = buf->input[n]->dnum; + return (buf->input[n]->disp); +} + +/* + * Xsj3cGetConvertedStr() + * Set converted strings in buffer. + */ +wchar * +Xsj3cGetConvertedStr(buf, data) + Xsj3cBuf buf; + wchar *data; +{ + register int i; + + _Xsj3cFlushDcid(buf); + if (buf->candidate) + Xsj3cEndCandidate(buf, ON); + *data = '\0'; + for (i = 0; i < buf->segnum ; i++) + _Xsj3cWcat(data, buf->input[i]->disp); + return (data); +} + +/* + * Xsj3cGetConvertedLength() + * Return length of converted strings. + */ +int +Xsj3cGetConvertedLength(buf) + Xsj3cBuf buf; +{ + register int i, len; + + for (i = 0, len = 0; i < buf->segnum ; i++) + len += buf->input[i]->dnum; + return len; +}