comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:bbc77ca4def5
1 /*
2 * $Id: write.c,v 1.2 2001/06/14 18:16:18 ura Exp $
3 */
4
5 /*
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
7 * This file is part of FreeWnn.
8 *
9 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
10 * Copyright 1991, 1992 by Massachusetts Institute of Technology
11 *
12 * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2, or (at your option)
17 * any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with GNU Emacs; see the file COPYING. If not, write to the
26 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 *
28 * Commentary:
29 *
30 * Change log:
31 *
32 * Last modified date: 8,Feb.1999
33 *
34 * Code:
35 *
36 */
37 /* Version 4.0
38 */
39 #include <stdio.h>
40 #include "commonhd.h"
41 #include "sdefine.h"
42 #include "xim.h"
43 #include "sheader.h"
44 #include "proto.h"
45 #include "ext.h"
46
47 #if !defined(X11R5) && defined(BC_X11R5)
48 extern XIMCmblk *cur_cblk;
49 #define IS_XIMR5_CLIENT() (cur_cblk->ximr5)
50 #endif /* !defined(X11R5) && defined(BC_X11R5) */
51
52 static int
53 send_returnend ()
54 {
55 ximReturnReply reply;
56
57 reply.type = 0;
58 reply.length = 0;
59 reply.keysym = 0;
60 if (need_byteswap () == True)
61 {
62 byteswap_ReturnReply (&reply);
63 }
64 if (_WriteToClient (&reply, sz_ximReturnReply) == -1)
65 return (-1);
66 return (0);
67 }
68
69 static int
70 send_ct (ct, ct_len)
71 register char *ct;
72 register int ct_len;
73 {
74 ximReturnReply reply;
75
76 reply.type = XIM_STRING;
77 reply.length = ct_len;
78 reply.keysym = 0;
79 if (need_byteswap () == True)
80 {
81 byteswap_ReturnReply (&reply);
82 }
83 if (_WriteToClient (&reply, sz_ximReturnReply) == -1)
84 return (-1);
85 if (ct_len > 0)
86 {
87 if (_WriteToClient (ct, ct_len) == -1)
88 return (-1);
89 }
90 return (0);
91 }
92
93 static int
94 send_keysym (keysym, str)
95 KeySym keysym;
96 char str;
97 {
98 ximReturnReply reply;
99 char buf[2];
100 int tmp_length;
101
102 reply.type = XIM_KEYSYM;
103 if (keysym < 0x20)
104 {
105 keysym |= 0xff00;
106 reply.length = 0;
107 }
108 else
109 {
110 reply.length = 1;
111 buf[0] = str & 0xff;
112 buf[1] = '\0';
113 }
114 reply.keysym = keysym;
115 tmp_length = reply.length;
116 if (need_byteswap () == True)
117 {
118 byteswap_ReturnReply (&reply);
119 }
120 if (_WriteToClient (&reply, sz_ximReturnReply) == -1)
121 return (-1);
122 if (tmp_length > 0)
123 {
124 if (_WriteToClient (buf, tmp_length) == -1)
125 return (-1);
126 }
127 return (0);
128 }
129
130 int
131 return_eventreply (state, mode, num)
132 short state;
133 short mode;
134 short num;
135 {
136 ximEventReply reply;
137
138 reply.state = state;
139 reply.detail = mode;
140 reply.number = num;
141 if (need_byteswap () == True)
142 {
143 byteswap_EventReply (&reply);
144 }
145 if (_WriteToClient (&reply, sz_ximEventReply) == -1)
146 return (-1);
147 return (0);
148 }
149
150 int
151 send_nofilter ()
152 {
153 #ifndef X11R5
154 #ifdef BC_X11R5
155 if (IS_XIMR5_CLIENT ())
156 {
157 if (return_eventreply (0, XIM_NOFILTER, 0) == -1)
158 return (-1);
159 }
160 else
161 #endif /* BC_X11R5 */
162 return xim_send_nofilter ();
163 #else
164 if (return_eventreply (0, XIM_NOFILTER, 0) == -1)
165 return (-1);
166 #endif /* !X11R5 */
167 return (0);
168 }
169
170 static int
171 send_ch_locale (locale)
172 char *locale;
173 {
174 return_eventreply (0, XIM_CH_LOCALE, strlen (locale));
175 if (_WriteToClient (locale, strlen (locale)) == -1)
176 return (-1);
177 return (0);
178 }
179
180 int
181 send_end ()
182 {
183 if (cur_p && cur_p->ch_lc_flg)
184 {
185 send_ch_locale (cur_p->cur_xl->cur_lc->lc_name);
186 cur_p->ch_lc_flg = 0;
187 }
188 if (return_eventreply (0, 0, 0) == -1)
189 return (-1);
190 if (_Send_Flush () == -1)
191 return (-1);
192 return (0);
193 }
194
195 int
196 return_cl_it ()
197 {
198 #ifdef XJPLIB
199 if (cur_x && cur_x->xjp)
200 {
201 XJp_return_cl_it ();
202 return (0);
203 }
204 #endif /* XJPLIB */
205 if (cur_input != 0)
206 {
207 if (send_nofilter () == -1)
208 return (-1);
209 }
210 return (0);
211 }
212
213 void
214 xw_write (w_buf, size)
215 register w_char *w_buf;
216 register int size;
217 {
218 register XIMLangRec *xl;
219 w_char w_c;
220 w_char *start;
221 register int cnt;
222 int conv_len, send_len;
223 KeySym keysym;
224
225 if (!size)
226 {
227 return;
228 }
229 #ifdef XJPLIB
230 if (cur_x && cur_x->xjp)
231 {
232 XJp_xw_write (w_buf, size);
233 return;
234 }
235 #endif /* XJPLIB */
236
237 if (henkan_off_flag)
238 {
239 return_cl_it ();
240 return;
241 }
242 #ifdef BC_X11R5
243 if (IS_XIMR5_CLIENT ())
244 #endif /* BC_X11R5 */
245 #if defined(X11R5) || defined(BC_X11R5)
246 return_eventreply (0, XIM_RETURN, 0);
247 #endif /* defined(X11R5) || defined(BC_X11R5) */
248
249 xl = cur_p->cur_xl;
250
251 if (IsPreeditPosition (cur_x) && cur_p->cur_xl->del_x >= cur_p->cur_xl->max_pos)
252 {
253 JWMline_clear1 ();
254 }
255
256 conv_len = 0;
257 start = w_buf;
258 for (cnt = 0; cnt < size; cnt++, w_buf++)
259 {
260 if (!((w_c = *w_buf) & 0xff80))
261 {
262 if (conv_len)
263 {
264 while (1)
265 {
266 send_len = w_char_to_ct (xl->xlc, start, ct_buf, conv_len, ct_buf_max);
267 if (send_len < -1)
268 {
269 break;
270 }
271 else if (send_len == -1)
272 {
273 if (realloc_ct_buf () < 0)
274 break;
275 }
276 else if (send_len > 0)
277 {
278 #ifndef X11R5
279 #ifdef BC_X11R5
280 if (IS_XIMR5_CLIENT ())
281 send_ct (ct_buf, send_len);
282 else
283 #endif /* BC_X11R5 */
284 xim_send_ct (ct_buf, send_len);
285 #else
286 send_ct (ct_buf, send_len);
287 #endif /* !X11R5 */
288 break;
289 }
290 }
291 conv_len = 0;
292 }
293 keysym = (int) w_c;
294 #ifndef X11R5
295 #ifdef BC_X11R5
296 if (IS_XIMR5_CLIENT ())
297 send_keysym (keysym, w_c);
298 else
299 #endif /* BC_X11R5 */
300 xim_send_keysym (keysym, w_c);
301 #else
302 send_keysym (keysym, w_c);
303 #endif /* !X11R5 */
304 }
305 else
306 {
307 if (conv_len == 0)
308 {
309 start = w_buf;
310 }
311 conv_len++;
312 }
313 }
314 if (conv_len)
315 {
316 while (1)
317 {
318 send_len = w_char_to_ct (xl->xlc, start, ct_buf, conv_len, ct_buf_max);
319 if (send_len < -1)
320 {
321 break;
322 }
323 else if (send_len == -1)
324 {
325 if (realloc_ct_buf () < 0)
326 break;
327 }
328 else if (send_len > 0)
329 {
330 #ifndef X11R5
331 #ifdef BC_X11R5
332 if (IS_XIMR5_CLIENT ())
333 send_ct (ct_buf, send_len);
334 else
335 #endif /* BC_X11R5 */
336 xim_send_ct (ct_buf, send_len);
337 #else
338 send_ct (ct_buf, send_len);
339 #endif /* !X11R5 */
340 break;
341 }
342 }
343 conv_len = 0;
344 }
345 #ifdef BC_X11R5
346 if (IS_XIMR5_CLIENT ())
347 #endif /* BC_X11R5 */
348 #if defined(X11R5) || defined(BC_X11R5)
349 send_returnend ();
350 #endif /* defined(X11R5) || defined(BC_X11R5) */
351 return;
352 }