Mercurial > freewnn
diff Xwnmo/xwnmo/write.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Xwnmo/xwnmo/write.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,352 @@ +/* + * $Id: write.c,v 1.2 2001/06/14 18:16:18 ura Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright 1991, 1992 by Massachusetts Institute of Technology + * + * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Emacs; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Commentary: + * + * Change log: + * + * Last modified date: 8,Feb.1999 + * + * Code: + * + */ +/* Version 4.0 + */ +#include <stdio.h> +#include "commonhd.h" +#include "sdefine.h" +#include "xim.h" +#include "sheader.h" +#include "proto.h" +#include "ext.h" + +#if !defined(X11R5) && defined(BC_X11R5) +extern XIMCmblk *cur_cblk; +#define IS_XIMR5_CLIENT() (cur_cblk->ximr5) +#endif /* !defined(X11R5) && defined(BC_X11R5) */ + +static int +send_returnend () +{ + ximReturnReply reply; + + reply.type = 0; + reply.length = 0; + reply.keysym = 0; + if (need_byteswap () == True) + { + byteswap_ReturnReply (&reply); + } + if (_WriteToClient (&reply, sz_ximReturnReply) == -1) + return (-1); + return (0); +} + +static int +send_ct (ct, ct_len) + register char *ct; + register int ct_len; +{ + ximReturnReply reply; + + reply.type = XIM_STRING; + reply.length = ct_len; + reply.keysym = 0; + if (need_byteswap () == True) + { + byteswap_ReturnReply (&reply); + } + if (_WriteToClient (&reply, sz_ximReturnReply) == -1) + return (-1); + if (ct_len > 0) + { + if (_WriteToClient (ct, ct_len) == -1) + return (-1); + } + return (0); +} + +static int +send_keysym (keysym, str) + KeySym keysym; + char str; +{ + ximReturnReply reply; + char buf[2]; + int tmp_length; + + reply.type = XIM_KEYSYM; + if (keysym < 0x20) + { + keysym |= 0xff00; + reply.length = 0; + } + else + { + reply.length = 1; + buf[0] = str & 0xff; + buf[1] = '\0'; + } + reply.keysym = keysym; + tmp_length = reply.length; + if (need_byteswap () == True) + { + byteswap_ReturnReply (&reply); + } + if (_WriteToClient (&reply, sz_ximReturnReply) == -1) + return (-1); + if (tmp_length > 0) + { + if (_WriteToClient (buf, tmp_length) == -1) + return (-1); + } + return (0); +} + +int +return_eventreply (state, mode, num) + short state; + short mode; + short num; +{ + ximEventReply reply; + + reply.state = state; + reply.detail = mode; + reply.number = num; + if (need_byteswap () == True) + { + byteswap_EventReply (&reply); + } + if (_WriteToClient (&reply, sz_ximEventReply) == -1) + return (-1); + return (0); +} + +int +send_nofilter () +{ +#ifndef X11R5 +#ifdef BC_X11R5 + if (IS_XIMR5_CLIENT ()) + { + if (return_eventreply (0, XIM_NOFILTER, 0) == -1) + return (-1); + } + else +#endif /* BC_X11R5 */ + return xim_send_nofilter (); +#else + if (return_eventreply (0, XIM_NOFILTER, 0) == -1) + return (-1); +#endif /* !X11R5 */ + return (0); +} + +static int +send_ch_locale (locale) + char *locale; +{ + return_eventreply (0, XIM_CH_LOCALE, strlen (locale)); + if (_WriteToClient (locale, strlen (locale)) == -1) + return (-1); + return (0); +} + +int +send_end () +{ + if (cur_p && cur_p->ch_lc_flg) + { + send_ch_locale (cur_p->cur_xl->cur_lc->lc_name); + cur_p->ch_lc_flg = 0; + } + if (return_eventreply (0, 0, 0) == -1) + return (-1); + if (_Send_Flush () == -1) + return (-1); + return (0); +} + +int +return_cl_it () +{ +#ifdef XJPLIB + if (cur_x && cur_x->xjp) + { + XJp_return_cl_it (); + return (0); + } +#endif /* XJPLIB */ + if (cur_input != 0) + { + if (send_nofilter () == -1) + return (-1); + } + return (0); +} + +void +xw_write (w_buf, size) + register w_char *w_buf; + register int size; +{ + register XIMLangRec *xl; + w_char w_c; + w_char *start; + register int cnt; + int conv_len, send_len; + KeySym keysym; + + if (!size) + { + return; + } +#ifdef XJPLIB + if (cur_x && cur_x->xjp) + { + XJp_xw_write (w_buf, size); + return; + } +#endif /* XJPLIB */ + + if (henkan_off_flag) + { + return_cl_it (); + return; + } +#ifdef BC_X11R5 + if (IS_XIMR5_CLIENT ()) +#endif /* BC_X11R5 */ +#if defined(X11R5) || defined(BC_X11R5) + return_eventreply (0, XIM_RETURN, 0); +#endif /* defined(X11R5) || defined(BC_X11R5) */ + + xl = cur_p->cur_xl; + + if (IsPreeditPosition (cur_x) && cur_p->cur_xl->del_x >= cur_p->cur_xl->max_pos) + { + JWMline_clear1 (); + } + + conv_len = 0; + start = w_buf; + for (cnt = 0; cnt < size; cnt++, w_buf++) + { + if (!((w_c = *w_buf) & 0xff80)) + { + if (conv_len) + { + while (1) + { + send_len = w_char_to_ct (xl->xlc, start, ct_buf, conv_len, ct_buf_max); + if (send_len < -1) + { + break; + } + else if (send_len == -1) + { + if (realloc_ct_buf () < 0) + break; + } + else if (send_len > 0) + { +#ifndef X11R5 +#ifdef BC_X11R5 + if (IS_XIMR5_CLIENT ()) + send_ct (ct_buf, send_len); + else +#endif /* BC_X11R5 */ + xim_send_ct (ct_buf, send_len); +#else + send_ct (ct_buf, send_len); +#endif /* !X11R5 */ + break; + } + } + conv_len = 0; + } + keysym = (int) w_c; +#ifndef X11R5 +#ifdef BC_X11R5 + if (IS_XIMR5_CLIENT ()) + send_keysym (keysym, w_c); + else +#endif /* BC_X11R5 */ + xim_send_keysym (keysym, w_c); +#else + send_keysym (keysym, w_c); +#endif /* !X11R5 */ + } + else + { + if (conv_len == 0) + { + start = w_buf; + } + conv_len++; + } + } + if (conv_len) + { + while (1) + { + send_len = w_char_to_ct (xl->xlc, start, ct_buf, conv_len, ct_buf_max); + if (send_len < -1) + { + break; + } + else if (send_len == -1) + { + if (realloc_ct_buf () < 0) + break; + } + else if (send_len > 0) + { +#ifndef X11R5 +#ifdef BC_X11R5 + if (IS_XIMR5_CLIENT ()) + send_ct (ct_buf, send_len); + else +#endif /* BC_X11R5 */ + xim_send_ct (ct_buf, send_len); +#else + send_ct (ct_buf, send_len); +#endif /* !X11R5 */ + break; + } + } + conv_len = 0; + } +#ifdef BC_X11R5 + if (IS_XIMR5_CLIENT ()) +#endif /* BC_X11R5 */ +#if defined(X11R5) || defined(BC_X11R5) + send_returnend (); +#endif /* defined(X11R5) || defined(BC_X11R5) */ + return; +}