1 /* # skkinput (Simple Kana-Kanji Input)
2 * skkel.c --- Emacs-lisp -> C
3 * This file is part of skkinput.
4 * Copyright (C) 1997
5 * Takashi SAKAMOTO (sakamoto@yajima.kuis.kyoto-u.ac.jp)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with skkinput; see the file COPYING. If not, write to
19 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21 /*
22 * ���Υ������ϡ�SkkInput.c �ΰ����Ǥ��ꡢSkkInputWidget �ΰ����Ǥ����
23 * ��äơ���Ȥδؿ��ϳ�������Ϸ褷�ƸƤӤ����ʤ��褦�� static��
24 */
25 #include "table.h"
26 #include "skkel.h"
27 #if 0
28 #include "mytime.h"
29 #endif
30
31 /*
32 * �ץ�ȥ����������
33 */
34 /* skkel.c */
35 static int delete_char
36 ( struct SKKInputNode *node, int pos, int count ) ;
37 static int j_insert_str
38 ( struct SKKInputNode *node, int pos, char *str ) ;
39 static void j_n_convert_to_kana( struct SKKInputNode *node ) ;
40 static int j_set_okurigana
41 ( Widget gw, struct SKKInputNode *node, int j_okuri_chara ) ;
42 static void j_set_henkan_point_subr
43 ( Widget gw, struct SKKInputNode *node, int chara ) ;
44 static void j_input_by_code_or_menu_jmp_showCandidate
45 ( struct SKKInputNode *node, int code ) ;
46 static int j_compute_numeric_henkan_key
47 ( unsigned char *dptr, unsigned char *sptr, unsigned char *j_num_list ) ;
48 static int j_insert_word
49 ( Widget gw, struct SKKInputNode *node, int pos, unsigned char *word ) ;
50 static int j_start_henkan_sub( Widget gw, struct SKKInputNode *node ) ;
51 static int j_numeric_convert
52 ( struct SKKInputNode *node, unsigned char *sptr, unsigned char *dptr ) ;
53 static int j_concat
54 ( struct SKKInputNode *node, unsigned char *sptr, unsigned char *dptr ) ;
55 static unsigned char *j_num_exp
56 ( unsigned char *j_num_list_ptr, int type, unsigned char *dptr ) ;
57 static int rom_kana_rule_list_check
58 ( Widget gw, struct SKKInputNode *node, int chara ) ;
59 static int j_self_insert
60 ( Widget gw, struct SKKInputNode *node, int chara ) ;
61 #if 0
62 static struct my_tm my_localtime( unsigned long long int sec ) ;
63 #endif
64 static int j_quote_char( unsigned char *word ) ;
65 static int save_ringbuffer
66 ( unsigned char *buffer, int bufsize, int *startpos, int *endpos,
67 unsigned char *string ) ;
68 static void j_keyboard_quit_henkanrestart
69 ( Widget gw, struct SKKInputNode *node, int flag ) ;
70
71 /* skkmbuf.c */
72 static int j_read_string
73 ( Widget gw, struct SKKInputNode *node, char *string, int minibuff_usage ) ;
74 /* SkkInput.c */
75 static int skkinput_j_henkan_in_minibuff_init
76 ( Widget gw, struct SKKInputNode *node ) ;
77 static void free_Minibuffer
78 ( Widget gw, struct SKKInputNode *node ) ;
79 /* skkwin.c */
80 static void skkinput_ClearMinibuffer( Widget gw ) ;
81 /* skksvect.c */
82 extern int copyCandidate
83 ( char *dest, SkkinpSearchVector *sNode, int position, int length ) ;
84 /* skkmarker.c */
85 static int move_marker_ByInsert
86 ( struct SKKInputNode *node, int startpoint, int effect ) ;
87 static int move_marker_ByDeleteRegion
88 ( struct SKKInputNode *node, int startpoint, int endpoint ) ;
89 static int set_marker_ByGeqPosition
90 ( struct SKKInputNode *node, int startpos, int setpos ) ;
91
92 /*
93 * �����Х��ѿ���
94 */
95 /* ������ִ��������Ȥ��κݤ��Ѥ���٤��ƥ�ݥ��ΥХåե���*/
96 unsigned char temporary_buffer[ TEXTBUFSIZE * 2 ] ;
97 /* ������ʸ���ΥХ��ȿ���*/
98 static const int j_kanji_length = 2 ;
99 static const int j_input_by_code_or_menu_jump_default = 161 ;
100
101 static char *j_input_by_code_menu_keys1 = "asdfghqwerty" ;
102 static char *j_input_by_code_menu_keys2 = "asdfghjklqwertyu" ;
103 static unsigned char j_input_by_code_menu1_codes[] =
104 { 161, 177, 193, 209, 225, 241 } ;
105 static int j_code_n1_min = 161, j_code_n1_max = 244 ;
106 static int j_code_n2_min = 161, j_code_n2_max = 254 ;
107
108 /*
109 * ���顼��ɽ���ؿ���ľ�ˤ⤦����äȤޤ��ʤΤ��Ѳ����뤳�ȤǤ��餦��
110 */
err_msg(struct SKKInputNode * node,char * fmt,...)111 void err_msg( struct SKKInputNode *node, char *fmt, ... )
112 {
113 va_list valist ;
114 va_start( valist, fmt ) ;
115 vsprintf( node->mtextbuffer, fmt, valist ) ;
116 va_end( valist ) ;
117 return ;
118 }
119
120 /*
121 * ʸ����ʸ�����ľ�����֤��ؿ��Ĥäơ����Ǥ���ʤ�ɬ�פʤΡ� �Ȥ�����
122 * �줽����
123 */
charaToString(int chara)124 static char *charaToString( int chara )
125 {
126 static char cbuf[ 4 ] ;
127 const char dispChara[] = "[\\]^_" ;
128
129 /* ��������ʬ�ϡ�������ؾ��ز����ĸ��漼�θ�ƣ��Υѥå��Ǥ���*/
130 /*----- �������� ----- �������� ----- �������� ----- �������� -----*/
131 if( chara == 0x1b ) {/*ESC��"ESC"�Ȥ���*/
132 cbuf[ 0 ] = 'E';
133 cbuf[ 1 ] = 'S';
134 cbuf[ 2 ] = 'C';
135 cbuf[ 3 ] = '\0';
136 } else if( chara < 0x20 || chara == 0x7F ){
137 /*----- �����ޤ� ----- �����ޤ� ----- �����ޤ� ----- �����ޤ� -----*/
138 cbuf[ 0 ] = 'C' ;
139 cbuf[ 1 ] = '-' ;
140 cbuf[ 3 ] = '\0' ;
141 if( chara == 0 ){
142 /* Del key �ξ�硣*/
143 cbuf[ 2 ] = '@' ;
144 } else if( chara == 0x7F ){
145 /* Del key �ξ�硣*/
146 cbuf[ 2 ] = '?' ;
147 } else if( chara >= 0x1b ){
148 /* ����ʳ��Υ���ȥ��륳���ɤξ��ǥ���ե��٥åȤ���ʤ���*/
149 cbuf[ 2 ] = dispChara[ chara - 0x1b ] ;
150 } else {
151 /* ����ե��٥åȤ�ɽ���Ǥ��륳��ȥ��륳���ɤξ�硣*/
152 cbuf[ 2 ] = ( 'a' - 1 ) + chara ;
153 }
154 } else {
155 cbuf[ 0 ] = chara ;
156 cbuf[ 1 ] = '\0' ;
157 }
158 return cbuf ;
159 }
160
j_n_convert_to_kana(struct SKKInputNode * node)161 static void j_n_convert_to_kana( struct SKKInputNode *node )
162 {
163 delete_char( node, node->j_kana_start_point, 1 ) ;
164 if( node->j_katakana_mode ){
165 j_insert_str( node, node->j_kana_start_point, "��" ) ;
166 } else {
167 j_insert_str( node, node->j_kana_start_point, "��" ) ;
168 }
169 return ;
170 }
171
last_character_of(unsigned char * prefix)172 static int last_character_of( unsigned char *prefix )
173 {
174 int length = strlen( prefix ) ;
175 if( length > 0 ){
176 return prefix[ length - 1 ] ;
177 }
178 return '\0' ;
179 }
180
181 /*
182 * ���겾̾�⡼�ɤ˰ܹԤ��Ƥ褤���ɤ���Ƚ�Ǥ���ؿ���
183 */
is_okurigana_start_ok(struct SKKInputNode * node)184 static int is_okurigana_start_ok( struct SKKInputNode *node )
185 {
186 unsigned int pchara, ppchara ;
187 int pos ;
188 /* ����������֤ˤ����ʤ���ʸ�������äƤ��줿�Τʤ��ɤ����ɡ��ǽ� *
189 * ��ʸ��������Ƽ�����ʸ�������겾̾�ʤ�Ƹ���줿���ˤϡ���̾ *
190 * ���ϳ��ϰ��֤��鸫�ʤ������ܤ����顣*/
191 pos = ( node->j_kana_mode )? node->j_kana_start_point : node->cur_pos ;
192 /* ����������֤��Ѵ����ϰ��֤�������������ܤǤ��롣*/
193 if( pos == node->j_henkan_start_point )
194 return False ;
195 if( pos < j_kanji_length )
196 return False ;
197 /* �������Ϥ��줿ʸ�������Ǥ��뤫������ˤʤ롣*/
198 pchara = node->textbuffer[ pos - 1 ] ;
199 if( pchara & 0x80 ){
200 /* �������ʸ���� "��������������������" ����Τɤ줫�ʤ����겾 *
201 * ̾�⡼�ɤˤϤʤ�ʤ���*/
202 ppchara = node->textbuffer[ pos - 2 ] ;
203 if( ppchara == 0xA3 && ( pchara >= 0xB0 && pchara <= 0xB9 ) )
204 return False ;
205 } else {
206 /* �������ʸ���� "0123456789><?" ����Τɤ줫�ʤ����겾̾�⡼��*
207 * �ˤϤʤ�ʤ���*/
208 if( pchara >= '0' && pchara <= '9' )
209 return False ;
210 if( pchara == '>' || pchara == '<' || pchara == '?' )
211 return False ;
212 }
213 return True ;
214 }
215
216 /*
217 * ĶŬ�����Ѵ��롼���Ҥ��ؿ���
218 */
j_assoc_rule(Widget gw,unsigned char * prefix)219 static struct skk_rom_kana_rule *j_assoc_rule
220 ( Widget gw, unsigned char *prefix )
221 {
222 SkkInputWidget w = ( SkkInputWidget )gw ;
223 struct skk_rom_kana_rule *element = w->skkinput.rom_kana_rule_list ;
224 /* �������ꤵ��Ƥʤ��ä��顢�Ҥ��ʤ���*/
225 if( element == NULL )
226 return NULL ;
227 /* ���㤢��õ���ޤ��礦��*/
228 while( element->state != NULL ){
229 if( !strcmp( element->state, prefix ) )
230 return element ;
231 element ++ ;
232 }
233 return NULL ;
234 }
235
236 /*
237 * ���ꤵ�줿ʸ���������ʤΤ��ɤ���Ƚ�Ǥ���ؿ���
238 */
is_hatsuon_ok(unsigned char * j_prefix,int rchara)239 static int is_hatsuon_ok( unsigned char *j_prefix, int rchara )
240 {
241 int lchara, schara ;
242 /* ��ʸ���Ⱦ�ʸ�����Ѵ��������ˤɤ��ʤ�Τ�������Ƥ�����*/
243 lchara = ( rchara >= 'a' && rchara <= 'z' )?
244 rchara + ( 'A' - 'a' ) : rchara ;
245 schara = ( rchara >= 'A' && rchara <= 'Z' )?
246 rchara + ( 'a' - 'A' ) : rchara ;
247 /* ����ե��٥åȤ�³���ʤ��ǡ����������Ǥ�������*/
248 if( schara < 'a' || schara > 'z' )
249 return False ;
250 /* "X" �äƤ������ȤϤʤ��Ȼפ����ɤ͡�*/
251 if( schara == 'x' )
252 return False ;
253 /* ��ʸ������ʤ��ä��顢���ܤǤ��硩 */
254 if( j_prefix[ 1 ] != '\0' )
255 return False ;
256 if( j_prefix[ 0 ] != lchara && j_prefix[ 0 ] != schara )
257 return False ;
258 return True ;
259 }
260
261 /*
262 * ����������֤�ʸ�������������ؿ���
263 */
j_insert_str(struct SKKInputNode * node,int pos,char * str)264 static int j_insert_str( struct SKKInputNode *node, int pos, char *str )
265 {
266 int len_txt = strlen( node->textbuffer ) ;
267 int len_str = strlen( str ) ;
268 int count ;
269 char *sptr, *dptr ;
270
271 /* ����ξ�꤫��ʸ�������������ȡ�����ǥХåե������̤�Ķ�����硣*/
272 if( pos + len_str > TEXTMAXLEN ){
273 strncpy( node->textbuffer + pos, str, TEXTMAXLEN - pos ) ;
274 node->textbuffer[ TEXTMAXLEN ] = '\0' ;
275 /* ���ξ�硢����������֤Ͼ�� \0 �Ǥʤ��Ȥ����ʤ���*/
276 move_marker_ByInsert( node, pos, TEXTMAXLEN - pos ) ;
277 /* cur_pos = TEXTMAXLEN ; */
278 return 0 ;
279 }
280 if( pos != len_txt ){
281 if( len_txt + len_str > TEXTMAXLEN ){
282 /* ��������ʸ����ǥȡ������ʸ������ʸ���Хåե������̤�Ķ�����硣*/
283 count = TEXTMAXLEN - len_str - pos ;
284 sptr = node->textbuffer + TEXTMAXLEN - len_str ;
285 dptr = node->textbuffer + TEXTMAXLEN ; /* = '\0' */
286 } else {
287 /* ��������ʸ�����ʸ���Хåե������դ�ʤ���硣*/
288 count = len_txt - pos ;
289 sptr = node->textbuffer + len_txt ;
290 dptr = node->textbuffer + len_txt + len_str ;
291 }
292 /* �����������ʬ��ʸ������ư�����롣*/
293 while( count >= 0 ){
294 *dptr -- = *sptr -- ;
295 count -- ;
296 }
297 /* ʸ�����������Ԥ���*/
298 dptr = node->textbuffer + pos ;
299 sptr = str ;
300 while( *sptr != '\0' )
301 *dptr ++ = *sptr ++ ;
302 } else {
303 /* ʸ�����������Ԥ���*/
304 dptr = node->textbuffer + pos ;
305 sptr = str ;
306 while( *sptr != '\0' )
307 *dptr ++ = *sptr ++ ;
308 *dptr = '\0' ;
309 }
310 /* ��������ʸ����ʬ�����ޡ��������ư�����롣*/
311 move_marker_ByInsert( node, pos, len_str ) ;
312 return 0 ;
313 }
314
315 /*
316 * ���ꤵ�줿���֤�ʸ�������������ޡ��������ư������ؿ���
317 */
j_insert_chara(struct SKKInputNode * node,int pos,int chara)318 static int j_insert_chara
319 ( struct SKKInputNode *node, int pos, int chara )
320 {
321 int i ;
322 int len = strlen( node->textbuffer ) ;
323 char *ptr ;
324
325 /* ��������ϥƥ����Ȥΰ��ֺǸ��ؤ��Ƥ���Τ��ʡ� */
326 if( node->textbuffer[ pos ] == '\0' ){
327 if( pos < TEXTMAXLEN ){
328 /* ������ʤ�Ǥ���ֺǸ���������餤�Ǥϥޡ������ϰ�ư���ʤ�������*/
329 node->textbuffer[ pos ++ ] = chara ;
330 node->textbuffer[ pos ] = '\0' ;
331 node->cur_pos ++ ;
332 }
333 return 0 ;
334 }
335 if( len >= TEXTMAXLEN ){
336 len = TEXTMAXLEN ;
337 ptr = node->textbuffer + TEXTMAXLEN ;
338 } else {
339 ptr = node->textbuffer + len + 1 ;
340 }
341 *ptr -- = '\0' ;
342 for( i = len ; i > pos ; i -- ){
343 *ptr = *( ptr - 1 ) ;
344 ptr -- ;
345 }
346 *ptr = chara ;
347 /* �ޡ������ΰ�ư��*/
348 move_marker_ByInsert( node, pos, 1 ) ;
349 /* cur_pos ++ ; */
350 return 0 ;
351 }
352
353 /*
354 * ���Ϥ��줿ʸ����¸�ߤ����� prefix �Ǥ���С�True �����Ǥʤ����
355 * False ���֤��ؿ���
356 */
j_kana_prefix_check(unsigned char * str,int chara)357 static int j_kana_prefix_check( unsigned char *str, int chara )
358 {
359 int i, length = strlen( str ) ;
360 #ifdef DEBUG_LV1
361 fprintf( stderr, "Prefix Check : \"%s\".\n", str ) ;
362 #endif
363 for( i = 0 ; skk_prefix_list[ i ] != NULL ; i ++ ){
364 /* �������ץ�ե������ʤΤǤ��礦���� */
365 if( !strncmp( skk_prefix_list[ i ], str, length ) ){
366 /* ���٤��ä��Ǹ�����Ϥ��줿ʸ����������ΤȰ��פ�����ˤ� *
367 * ̵�뤹�롣*/
368 if( ( skk_prefix_list[ i ] )[ length + 0 ] != chara )
369 continue ;
370 /* �������Ϥ��줿ʸ����ä��ơ����٤���ʤ��ä������ܤ����� */
371 if( ( skk_prefix_list[ i ] )[ length + 1 ] != '\0' )
372 continue ;
373 return True ;
374 }
375 }
376 return False ;
377 }
378
379 /*
380 * j_prefix �����Ϥ��줿ʸ�������ؿ���
381 */
j_prefix_add(unsigned char * j_prefix,int chara)382 static int j_prefix_add( unsigned char *j_prefix, int chara )
383 {
384 while( *j_prefix != '\0' )
385 j_prefix ++ ;
386 *j_prefix ++ = chara ;
387 *j_prefix ++ = '\0' ;
388 return True ;
389 }
390
391 /*
392 * ���ꤵ�줿�ΰ��������ؿ���
393 */
j_delete_region(struct SKKInputNode * node,int startpoint,int endpoint)394 static int j_delete_region
395 ( struct SKKInputNode *node, int startpoint, int endpoint )
396 {
397 char *sptr, *dptr ;
398
399 if( startpoint == endpoint || startpoint > endpoint )
400 return 0 ;
401 #ifdef DEBUG_LV1
402 fprintf( stderr, "j-delete-region : \"" ) ;
403 #endif
404 /* �����ΰ�κ����Ԥ���*/
405 dptr = node->textbuffer + startpoint ;
406 sptr = node->textbuffer + endpoint ;
407 while( *sptr != '\0' ){
408 #ifdef DEBUG_LV1
409 fprintf( stderr, "%c", *dptr ) ;
410 #endif
411 *dptr ++ = *sptr ++ ;
412 }
413 *dptr = '\0' ;
414 #ifdef DEBUG_LV1
415 fprintf( stderr, "\"\n" ) ;
416 #endif
417 /* �ޡ�����(���ߡ���������)�ΰ�ư��*/
418 move_marker_ByDeleteRegion( node, startpoint, endpoint ) ;
419 return 0 ;
420 }
421
422 /*
423 * ���ꤵ�줿���֤��饫������̤���ʸ�������ä���ؿ���
424 *-----
425 * delete_region �ޤ����Τ��Ȥ�Ǥ���衣
426 */
delete_char(struct SKKInputNode * node,int pos,int count)427 static int delete_char( struct SKKInputNode *node, int pos, int count )
428 {
429 int i, j ;
430 j = pos ;
431 /* ��������̤���ʸ����ä��Ȥ������ȤϤɤΤ��餤�ΥХ��ȥ������ʤΤ��ʡ�*/
432 for( i = 0 ; i < count ; i ++ ){
433 if( node->textbuffer[ j ] & 0x80 ){
434 /* ���������ɤǤ��ä����ˤ� 2�Х��ȷ���Ǥ���*/
435 if( node->textbuffer[ j ] == '\0' ){
436 /* ����ʾ�ξõ���Բ�ǽ�Ǥ����硣*/
437 node->textbuffer[ pos ] = '\0' ;
438 /* �õ�褦�Ȥ��Ƥ������֤��鱦�Υޡ��������ƾõ���֤ء�*/
439 set_marker_ByGeqPosition( node, pos, pos ) ;
440 return 0 ;
441 }
442 /* �ޤ��ޤ��ä����Ȥ���ǽ�ʾ�硣*/
443 j ++ ;
444 }
445 /* ����ʸ�����åס�*/
446 if( node->textbuffer[ j ] == '\0' ){
447 node->textbuffer[ pos ] = '\0' ;
448 /* �õ�褦�Ȥ��Ƥ������֤��鱦�Υޡ��������ƾõ���֤ء�*/
449 set_marker_ByGeqPosition( node, pos, pos ) ;
450 return 0 ;
451 }
452 j ++ ;
453 }
454 /* ʸ�������á�*/
455 strcpy( temporary_buffer, node->textbuffer + j ) ;
456 strcpy( node->textbuffer + pos, temporary_buffer ) ;
457 /* �ޡ������ΰ�ư��*/
458 move_marker_ByDeleteRegion( node, pos, j ) ;
459 return 0 ;
460 }
461
462 /*
463 * Ϳ����줿���֤��饫������̤�������������ư���������Υ����������
464 * �����ؿ���
465 */
calc_forward_char(struct SKKInputNode * node,int pos,int count)466 static int calc_forward_char( struct SKKInputNode *node, int pos, int count )
467 {
468 int i, j ;
469 /* ����������ư�����롣*/
470 j = pos ;
471 for( i = 0 ; i < count ; i ++ ){
472 if( node->textbuffer[ j ] == '\0' )
473 break ;
474 if( node->textbuffer[ j ] & 0x80 ){
475 j ++ ;
476 if( node->textbuffer[ j ] == '\0' ){
477 err_msg( node, "WARNING : Illegal character in text.\n" ) ;
478 break ;
479 }
480 }
481 j ++ ;
482 }
483 return j ;
484 }
485
486 /*
487 * Emacs-Lisp �� Looking-At ����������ؿ���
488 *-----
489 * ���͡��äˤʤ�����������Ǥ��졣
490 */
looking_at(struct SKKInputNode * node,int pos,char * str)491 static int looking_at( struct SKKInputNode *node, int pos, char *str )
492 {
493 return !strncmp( node->textbuffer + pos, str, strlen( str ) ) ;
494 }
495
j_kakutei_kana_mode(Widget gw,struct SKKInputNode * node,int chara)496 static int j_kakutei_kana_mode
497 ( Widget gw, struct SKKInputNode *node, int chara )
498 {
499 if( !node->j_kana_mode )
500 return False ;
501 /* ���ԥ����ʤɡ�rom-kana-rule-list �����줿���ʤ����˻Ȥ� '\0' */
502 if( chara != '\0' ){
503 if( rom_kana_rule_list_check( gw, node, chara ) ){
504 /* ���겾̾���Ϥ�����ǥҥåȤ����顢��̾�γ���ˤ���Ѵ����� *
505 * ���ʤ���Фʤ�ʤ���*/
506 if( node->j_henkan_mode && !node->j_henkan_on &&
507 node->j_okurigana_mode ){
508 j_set_okurigana( gw, node, node->j_okuri_chara ) ;
509 }
510 return True ;
511 }
512 }
513 /* �Ǹ�� "n" �����äƤ��ơ����줬�Ѥ����Ϥ� "��"�ˤʤä��顩 */
514 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
515 j_n_convert_to_kana( node ) ;
516 node->j_kana_mode = False ;
517 node->j_prefix[ 0 ] = '\0' ;
518 if( node->j_henkan_mode && !node->j_henkan_on &&
519 node->j_okurigana_mode ){
520 j_set_okurigana( gw, node, 'n' ) ;
521 }
522 return False ;
523 }
524 j_delete_region( node, node->j_kana_start_point, node->cur_pos ) ;
525 node->j_kana_mode = False ;
526 node->j_prefix[ 0 ] = '\0' ;
527 return False ;
528 }
529
530 /*
531 * ��̾�����Ѵ��γ����Ȥ�Ԥ��ؿ��ʤΤǤ��롣
532 */
j_kakutei(Widget gw,struct SKKInputNode * node)533 static int j_kakutei
534 ( Widget gw, struct SKKInputNode *node )
535 {
536 int pos ;
537 struct SKKTangoInfo jtango ;
538 unsigned char j_toroku_string[ TEXTBUFSIZE ] ;
539
540 node->j_mode = True ;
541 node->j_zenkaku = False ;
542 node->j_abbrev = False ;
543 node->j_henkan_show_candidate_mode = False ;
544
545 node->j_num_list[ 0 ] = '\0' ;
546
547 /* �Ѵ��⡼�ɤ����äƤ���Τ��ɤ������ǧ���롣���Υ������Ȥ� active �� *
548 * on �β��դˤʤäƤ��롣 */
549 if( node->j_henkan_mode ){
550 if( node->j_henkan_on && ( node->j_henkan_count > 0 ) ){
551 /* �����ǡ�����ι������ʤ���뤬...���ޤ�ư�����ʡ� */
552 if( node->j_current_henkan_vector_index != NULL ){
553 jtango.henkankey = ( node->j_okurigana_mode )?
554 node->j_henkan_key : node->j_search_key ;
555 /* ���Τޤ���Ͽ����Ƥ��ޤ��Ȥޤ�����ã�����뤫�⤷��ʤ��Τ� *
556 * �������롣*/
557 copyCandidate
558 ( j_toroku_string,
559 node->j_current_henkan_vector_index->node,
560 node->j_current_henkan_vector_index->position,
561 node->j_current_henkan_vector_index->length ) ;
562 if( j_quote_char( j_toroku_string ) ){
563 /* ʸ����ν��������ä����顢�����ʤ�����Ĥʤ�������Ͽ���� *
564 * �ʤ���ʸ������Ͽ���롣*/
565 jtango.tangotype = 0 ;
566 jtango.string = j_toroku_string ;
567 } else {
568 /* ʸ����ν������ʤ��ä����ˤϡ����� list �����ΤޤȤ� *
569 * �뤫���list �Ĥʤ�������Ͽ�����롣*/
570 jtango.tangotype = 1 ;
571 jtango.vector = node->j_current_henkan_vector_index ;
572 jtango.vectortop = &node->j_henkan_vector_index_top ;
573 }
574 jtango.okuri = node->j_okurigana_mode ;
575 XtCallCallbacks( gw, XtNjtangotourokuNotify, &jtango ) ;
576 }
577 /* �Ѵ���λ������ƽФ���*/
578 XtCallCallbacks( gw, XtNjhenkanendNotify, node ) ;
579 }
580 pos = node->j_henkan_start_point - j_kanji_length ; /* goto-char */
581 if( node->j_henkan_on ){
582 /* �Ѵ����ϰ��֤ˡ֢��פϤ���Τ��� ̵���ä��顢�ѡ�*/
583 if( looking_at( node, pos, "��" ) ){
584 delete_char( node, pos, 1 ) ;
585 } else {
586 err_msg( node, "It seems that you have deleted ��." ) ;
587 }
588 } else {
589 if( looking_at( node, pos, "��" ) ){
590 delete_char( node, pos, 1 ) ;
591 } else {
592 err_msg( node, "It seems that you have deleted ��." ) ;
593 }
594 }
595 /* �������ư������겾̾�⡼�ɤ��ä����ν�����*/
596 if( node->j_okurigana_mode ){
597 /* ���겾̾���ϰ��֤ˤ� "*" ��¸�ߤ���Ȧ�ʤ�Ǥ����ɡġ�*/
598 pos = node->j_okurigana_start_point ;
599 if( looking_at( node, pos, "*" ) ){
600 delete_char( node, pos, 1 ) ;
601 }
602 /* �Ȥ����櫓�ǡ����겾̾�⡼�ɤ���ߤˤʤ�櫓�Ǥ���*/
603 node->j_okurigana_mode = False ;
604 node->j_okuri_chara = '\0' ;
605 }
606 /* j_abbrev = False ; */
607 }
608 node->j_henkan_mode = False ;
609 node->j_henkan_on = False ;
610 node->j_okurigana_mode = False ;
611 node->j_okuri_chara = '\0' ;
612 node->j_henkan_count = 0 ;
613 return 0 ;
614 }
615
616 /*
617 * skkinput-rom-kana-rule-list ��Ŭ�Ѥ���ؿ���
618 */
rom_kana_rule_list_check(Widget gw,struct SKKInputNode * node,int chara)619 static int rom_kana_rule_list_check
620 ( Widget gw, struct SKKInputNode *node, int chara )
621 {
622 struct skk_rom_kana_rule *element ;
623 int length = strlen( node->j_prefix ) ;
624 /* ���������ʸ����ä��ޤ���*/
625 node->j_prefix[ length + 0 ] = chara ;
626 node->j_prefix[ length + 1 ] = '\0' ;
627 /* �ޤ����ߤΥץ�ե������ǥơ��֥��Ҥ��ޤ���*/
628 element = j_assoc_rule( gw, node->j_prefix ) ;
629 /* �����ҥåȤ��ޤ������� */
630 if( element == NULL ){
631 /* j-prefix �ϸ����ᤷ�Ƥ����ޤ�����*/
632 node->j_prefix[ length + 0 ] = '\0' ;
633 return False ;
634 }
635 /* ��̾�ץ�ե������������롣*/
636 j_delete_region( node, node->j_kana_start_point, node->cur_pos ) ;
637 node->j_prefix[ 0 ] = '\0' ;
638 /* ��̾�⡼�ɤǤϤʤ��ʤ�ġ�*/
639 node->j_kana_mode = False ;
640 /* �ҥåȤ���ʸ������������롣*/
641 if( node->j_katakana_mode ){
642 if( element->koutput != NULL )
643 j_insert_str( node, node->cur_pos, element->koutput ) ;
644 } else {
645 if( element->houtput != NULL )
646 j_insert_str( node, node->cur_pos, element->houtput ) ;
647 }
648 if( element->next != NULL ){
649 /* �����֤�¸�ߤ���ʤ顢������������롣*/
650 node->j_kana_start_point = node->cur_pos ;
651 j_insert_str( node, node->cur_pos, element->next ) ;
652 strcpy( node->j_prefix, element->next ) ;
653 node->j_kana_mode = True ;
654 }
655 /* Ŭ�ѤǤ����Ȥ������Ȥϲ�̾�γ��꤬���ä����顢�Ѵ����Ϥ���¾�� *
656 * ��̣����Ȥ��롣*/
657 return True ;
658 }
659
660 /*
661 * ��ʸ������ե��٥åȤ����Ϥ���褦�Ȥ��Ƥ�����ν�����Ԥ��ؿ���
662 *----
663 * ��ʸ������ե��٥åȤ����ϡ�����ϲ�̾�����Ϥ��褦�Ȥ��Ƥ���ִ֤��̣
664 * ����ΤǤ��롣
665 */
j_kana_input(Widget gw,struct SKKInputNode * node,int chara)666 static int j_kana_input
667 ( Widget gw, struct SKKInputNode *node, int chara )
668 {
669 /* skkinput ���������֤�ȴ���Ф���*/
670 int status = ( node->j_henkan_mode << 3 ) | ( node->j_henkan_on << 2 ) |
671 ( node->j_kana_mode << 1 ) | ( node->j_okurigana_mode ) ;
672 /* int length ;*/
673
674 #ifdef DEBUG_LV0
675 fprintf( stderr, "K( j_henkan_mode, j_henkan_on, j_kana_mode,\
676 j_okurigana_mode ) = (%d,%d,%d,%d)\n", node->j_henkan_mode,
677 node->j_henkan_on, node->j_kana_mode, node->j_okurigana_mode ) ;
678 #endif
679
680 /* ��������ɽ��*/
681 switch( status ){
682 /* �Ѵ����Ԥ��Ƥ�����ǡ���̾�����Ϥ��ʤ������겾̾�����äƤ����硣*/
683 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_ON :
684 /* ���겾̾�Ѵ��ˤ�ä��Ѵ����Ԥ�줿ľ��ˡ�ʸ�������Ϥ����ä���硣*
685 * �ޤ������ꤷ�Ƥ��顢���Ϥ��줿ʸ����ɽ�����롣*/
686 j_kakutei( gw, node ) ;
687 #if 0
688 j_kakutei_kana( node, chara ) ;
689 #endif
690 goto j_kana_input_label1 ;
691
692 /* �Ѵ����Ԥ��Ƥ�����ǡ���̾�����Ϥ��ʤ���硣*/
693 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
694 /* �����Ȥ��Ԥ��롣������� OFF �ξ���Ʊ����*/
695 j_kakutei( gw, node ) ;
696 #if 0
697 j_kakutei_kana( node, chara ) ;
698 #endif
699
700 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_ON :
701
702 /* �������̤˽ФƤ�����β�̾���ϡ��Ǥ⡢�����Ĥ�...�����ȴ���ʤΤ� *
703 * ���顢J_HENKAN_MODE_OFF �λ���Ʊ����J_HENKAN_MODE ���Τ��Ѳ� *
704 * ���ʤ���������פǤ��礦�� */
705 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
706
707 /* �������Ϥ���Ƥ��ʤ����֤���β�̾���ϡ�*/
708 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
709 j_kana_input_label1 : ;
710 /* ����������֤˲�̾�Ѵ����ϥޡ��������ꤹ�롣*/
711 node->j_kana_start_point = node->cur_pos ;
712 /* ���Ϥ�������饯����ɽ�����롣�Ĥ��Ǥˡ�����������ư���Ƥ��*
713 * ����*/
714 j_insert_chara( node, node->cur_pos, chara ) ;
715 /* ��̾�����Ϥ����顢j-prefix ��ͭ���ˤʤ�Ĥ��Υ����ߥ����� *
716 * �ɤ��Ρ� */
717 node->j_prefix[ 0 ] = chara ;
718 node->j_prefix[ 1 ] = '\0' ;
719 /* ��̾�⡼�ɤ�����ˤʤ롣*/
720 node->j_kana_mode = True ;
721 break ;
722
723 /* �֢���*��s�פȤ����褦�ʾ��֤Ǥ��롣�Ѵ��⡼�ɤǤ��ꡢ���겾̾�⡼�� *
724 * �Ǥ��ꡢ��̾�⡼�ɤǤ���Ȥ����Τϡ� */
725 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_ON :
726 #if 0
727 /* �Ѵ����Ԥ��Ƥ�����ǡ���̾prefix���ϡ����겾̾���ϤΤ����硣*/
728 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_ON :
729 /* ���ξ��ϳ��ꤷ�ƤϤ����ʤ������겾̾�⡼�ɤ��Ĥ��Ƥ���Ȥ������Ȥ� *
730 * ���겾̾�����ʤΤ������ꤷ�Ƥ��ʤ��Ȥ������Ȥ����顣 */
731 #endif
732 /* �Ѵ��⡼�ɤǤ��ꡢ���˲�̾�����Ϥ���Ƥ����硣*/
733 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_OFF :
734
735 /* ��̾�����Ϥ��褦�Ȥ��Ƥ����硣*/
736 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_OFF :
737 j_kana_input_label2 :
738 /* �롼��ꥹ�Ȥ�Ҥ��ޤ��������ǡ�j-prefix �Ϲ�������ޤ���*/
739 if( rom_kana_rule_list_check( gw, node, chara ) ){
740 /* ���겾̾�����Ϥ�����Ǥ��ꡢ���� 'n' �����Ϥˤ�ä����� *
741 * ��̾�Ǥ��ä� 'n' �����ꤷ�Ƥ��ޤ����ν�����*/
742 if( node->j_henkan_mode && node->j_okurigana_mode )
743 j_set_okurigana( gw, node, node->j_okuri_chara ) ;
744 break ;
745 }
746 /* �̤����ơ������ prefix ��¸�ߤǤ��ޤ��Ρ� ���䤵��*/
747 if( !j_kana_prefix_check( node->j_prefix, chara ) ){
748 /* ��äѤꡢ¸�ߤǤ��ޤ���Τ͡��פä��̤�Ǥ��*/
749 #if 0
750 /*
751 if( node->textbuffer[ node->j_kana_start_point ] == 'n' &&
752 node->cur_pos == ( node->j_kana_start_point + 1 ) ){
753 */
754 #else
755 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
756 #endif
757 /* ��̾���ϰ��֤�ɽ������Ƥ����n�פ�ä���*/
758 j_n_convert_to_kana( node ) ;
759 /* ��̾���ϳ��ϰ��֤餹��*/
760 node->j_kana_start_point = node->cur_pos ;
761 /* �������Ϥ���ʸ����������֤��������롣*/
762 j_insert_chara( node, node->cur_pos, chara ) ;
763 /* ��̾�����Ϥ����顢j-prefix ��ͭ���ˤʤ�Ĥ��Υ����ߥ� *
764 * �������ɤ��Ρ� */
765 node->j_prefix[ 0 ] = chara ;
766 node->j_prefix[ 1 ] = '\0' ;
767 /* j_kana_mode = True */
768 break ;
769 }
770 /* �������ɤ���������å�����ΤǤ��롣*/
771 if( is_hatsuon_ok( node->j_prefix, chara ) ){
772 /* ������ɽ������Ƥ���ʸ����ä��ޤ��礦��*/
773 delete_char( node, node->j_kana_start_point, 1 ) ;
774 /* ������¥���ؤ��������ޤ��礦��*/
775 /* ���ΤȤ���cur_pos == j_kana_start_point ��Ȧ�Ǥ��롣*/
776 if( node->j_katakana_mode ){
777 j_insert_str( node, node->j_kana_start_point, "��" ) ;
778 } else {
779 j_insert_str( node, node->j_kana_start_point, "��" ) ;
780 }
781 /* ��̾�����ϰ��֤餷�ޤ������ȡ�*/
782 node->j_kana_start_point = node->cur_pos ;
783 /* �������Ϥ���ʸ����������֤��������롣*/
784 j_insert_chara( node, node->cur_pos, chara ) ;
785 node->j_prefix[ 0 ] = chara ;
786 node->j_prefix[ 1 ] = '\0' ;
787 /* j_kana_mode = True */
788 break ;
789 }
790 /* �פ�ʤ� prefix �Ͼõ�ޤ��Ƥ衣*/
791 delete_char( node, node->j_kana_start_point,
792 node->cur_pos - node->j_kana_start_point ) ;
793 /* ��̾���Ѵ����ϰ��֤��ѹ����ޤ�����͡�*/
794 node->j_kana_start_point = node->cur_pos ;
795 /* �������Ϥ���ʸ���˽������ޤ���*/
796 node->j_prefix[ 0 ] = '\0' ;
797 }
798 /* �������Ϥ���ʸ����ɽ����*/
799 j_insert_chara( node, node->cur_pos, chara ) ;
800 j_prefix_add( node->j_prefix, chara ) ;
801 break ;
802
803 /* �������������Ĥɤ����롢�ɤ��ʤ롢���ܿ�
804 * �ɤ���äƲ�褹��Τ����� */
805 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_ON :
806 /* ���겾̾�Ѵ��ˤ�ä��Ѵ����Ԥ�줿ľ��ˡ�ʸ�������Ϥ����ä���硣*
807 * �ޤ������ꤷ�Ƥ��顢���Ϥ��줿ʸ����ɽ�����롣*/
808 /* �ޤ�������ǰ��̾�γ��꤬���ä����ɤ�����Ƚ�Ǥ��ʤ������ܡ�*/
809 if( ( node->j_okurigana_start_point + 1 ) <
810 node->j_kana_start_point ){
811 j_kakutei( gw, node ) ;
812 goto j_kana_input_label2 ;
813 }
814 /* �롼��ꥹ�Ȥ�Ҥ��ޤ��������ǡ�j-prefix �Ϲ�������ޤ���*/
815 if( rom_kana_rule_list_check( gw, node, chara ) ){
816 break ;
817 }
818 /* �����dz����Ȥ�Ԥ���*/
819 j_kakutei( gw, node ) ;
820 /* �̤����ơ������ prefix ��¸�ߤǤ��ޤ��Ρ� ���䤵��*/
821 if( !j_kana_prefix_check( node->j_prefix, chara ) ){
822 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
823 /* ��̾���ϰ��֤�ɽ������Ƥ����n�פ�ä���*/
824 j_n_convert_to_kana( node ) ;
825 /* ��̾���ϳ��ϰ��֤餹��*/
826 node->j_kana_start_point = node->cur_pos ;
827 /* �������Ϥ���ʸ����������֤��������롣*/
828 j_insert_chara( node, node->cur_pos, chara ) ;
829 /* ��̾�����Ϥ����顢j-prefix ��ͭ���ˤʤ�Ĥ��Υ����ߥ� *
830 * �������ɤ��Ρ� */
831 node->j_prefix[ 0 ] = chara ;
832 node->j_prefix[ 1 ] = '\0' ;
833 /* j_kana_mode = True */
834 break ;
835 }
836 /* �������ɤ���������å�����ΤǤ��롣*/
837 if( is_hatsuon_ok( node->j_prefix, chara ) ){
838 /* ������ɽ������Ƥ���ʸ����ä��ޤ��礦��*/
839 delete_char( node, node->j_kana_start_point, 1 ) ;
840 /* ������¥���ؤ��������ޤ��礦��*/
841 /* ���ΤȤ���cur_pos == j_kana_start_point ��Ȧ�Ǥ��롣*/
842 if( node->j_katakana_mode ){
843 j_insert_str( node, node->j_kana_start_point, "��" ) ;
844 } else {
845 j_insert_str( node, node->j_kana_start_point, "��" ) ;
846 }
847 /* ��̾�����ϰ��֤餷�ޤ������ȡ�*/
848 node->j_kana_start_point = node->cur_pos ;
849 /* �������Ϥ���ʸ����������֤��������롣*/
850 j_insert_chara( node, node->cur_pos, chara ) ;
851 node->j_prefix[ 0 ] = chara ;
852 node->j_prefix[ 1 ] = '\0' ;
853 /* j_kana_mode = True */
854 break ;
855 }
856 /* �פ�ʤ� prefix �Ͼõ�ޤ��Ƥ衣*/
857 delete_char( node, node->j_kana_start_point,
858 node->cur_pos - node->j_kana_start_point ) ;
859 /* ��̾���Ѵ����ϰ��֤��ѹ����ޤ�����͡�*/
860 node->j_kana_start_point = node->cur_pos ;
861 /* �������Ϥ���ʸ���˽������ޤ���*/
862 node->j_prefix[ 0 ] = '\0' ;
863 }
864 /* �������Ϥ���ʸ����ɽ����*/
865 j_insert_chara( node, node->cur_pos, chara ) ;
866 j_prefix_add( node->j_prefix, chara ) ;
867 break ;
868
869 /* �ʲ������ä��㤤���ʤ����֤���ʡ� */
870 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_ON :
871 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_ON :
872
873 /* �����ν�ϡ��Ѵ��⡼�ɤˤʤäƤ��ʤ��Τˡ��Ѵ�����Ƥ��뤫�顣*/
874 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
875 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_ON :
876 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_OFF :
877 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_ON :
878
879 default :
880 /* ���λ��֤Ϥ��ꤨ�ʤ��Τǡ����顼��*/
881 err_msg( node, "ERROR : Illegal status %d\n", status ) ;
882 break ;
883 }
884 return 0 ;
885 }
886
887 /*
888 * �ޡ������Ѳ�������ؿ���
889 *-----
890 * ���Ϥϥޡ����ΰ��֤Ǥ��������˥ޡ�����̵���ä��顢���顼���֤��ޤ���
891 */
j_change_marker(struct SKKInputNode * node,int pos)892 static int j_change_marker( struct SKKInputNode *node, int pos )
893 {
894 if( !looking_at( node, pos, "��" ) )
895 return 1 ;
896 node->textbuffer[ pos ++ ] = 0xA2 ;
897 node->textbuffer[ pos ++ ] = 0xA7 ;
898 return 0 ;
899 }
900
901 /*
902 * �ޡ������Ѳ�������ؿ���
903 *-----
904 * ���Ϥϥޡ����ΰ��֤Ǥ��������˥ޡ�����̵���ä��顢���顼���֤��ޤ���
905 */
j_change_marker_to_write(struct SKKInputNode * node,int pos)906 static int j_change_marker_to_write( struct SKKInputNode *node, int pos )
907 {
908 if( !looking_at( node, pos, "��" ) )
909 return 1 ;
910 node->textbuffer[ pos ++ ] = 0xA2 ;
911 node->textbuffer[ pos ++ ] = 0xA6 ;
912 return 0 ;
913 }
914
915 /* Show candidates in the minibuffer */
j_henkan_show_candidates(Widget gw,struct SKKInputNode * node,int * count)916 VectorIndex *j_henkan_show_candidates
917 ( Widget gw, struct SKKInputNode *node, int *count )
918 {
919 SkkInputWidget w = ( SkkInputWidget )gw ;
920 int i, restnum, mojisuu, h_count ;
921 static char *j_henkan_show_candidates_keys[ 7 ] = {
922 "A:", "S:", "D:", "F:", "J:", "K:", "L:",
923 } ;
924 VectorIndex *vNode ;
925 /* ���������ˤ⤳��ʤǤä����Хåե���ɬ�פˤʤä���ä���(;_;) */
926 unsigned char buffer[ TEXTBUFSIZE * 2 ], *rptr ;
927
928 vNode = node->j_current_henkan_vector_index ;
929 h_count = node->j_henkan_count ;
930 node->mtextbuffer[ 0 ] = '\0' ;
931
932 /* ���ĸ��䤬�ĤäƤ���Τ��ʡ� */
933 restnum = node->j_henkan_vector_index_length - h_count + 1 ;
934
935 /* ����ɽ����ǽʸ���������ꡢ����ʾ���ȥХåե������դ�롣*/
936 mojisuu = TEXTMAXLEN ;
937
938 /* �������ޤ�����*/
939 for( i = 0 ; i < 7 && vNode != NULL ; i ++, restnum -- ){
940 /* �������դ��ä��롣*/
941 strncat( node->mtextbuffer, j_henkan_show_candidates_keys[ i ],
942 mojisuu ) ;
943 mojisuu -= 2 ;
944 if( mojisuu <= 0 )
945 break ;
946
947 /* ������դ��ä��롣*/
948 copyCandidate
949 ( temporary_buffer, vNode->node, vNode->position, TEXTMAXLEN ) ;
950 rptr = temporary_buffer ;
951 if( node->j_num_list[ 0 ] != '\0' &&
952 w->skkinput.use_numeric_conversion ){
953 j_numeric_convert( node, temporary_buffer, buffer ) ;
954 rptr = buffer ;
955 }
956 /* ���θ����ؤ��褦�����ꤹ�롣*/
957 vNode = vNode->next ;
958
959 /* �����ܤθ��䤫���ꤹ�롣*/
960 h_count ++ ;
961 strncat( node->mtextbuffer, rptr, mojisuu ) ;
962 mojisuu -= strlen( rptr ) ;
963 if( mojisuu <= 0 )
964 break ;
965 /* �����ä��롣*/
966 strncat( node->mtextbuffer, " ", mojisuu ) ;
967 mojisuu -- ;
968 if( mojisuu <= 0 )
969 break ;
970 }
971 /* �ޤ�ʸ���Хåե���;͵������ޤ����� */
972 if( mojisuu > 0 ){
973 sprintf( temporary_buffer, "[�Ĥ� %d]", restnum ) ;
974 strncat( node->mtextbuffer, temporary_buffer, mojisuu ) ;
975 }
976 /* ʸ����Ȥ��ƽ�ü���롣*/
977 node->mtextbuffer[ TEXTMAXLEN ] = '\0' ;
978 node->j_henkan_show_candidate_mode = True ;
979
980 /* �ºݡ��ɤ��ޤǸ����ɽ���������δ�����֤��ơ� */
981 if( count != NULL )
982 *count = h_count ;
983
984 /* �ݥ����֤���*/
985 return vNode ;
986 }
987
988 /*
989 * �Ѵ�ư���Ԥ��ؿ���
990 *-----
991 * ���δؿ������� j_start_henkan ���ƤФ�Ƥ���ɬ�פ�����ޤ��衣
992 */
j_henkan(Widget gw,struct SKKInputNode * node)993 static int j_henkan( Widget gw, struct SKKInputNode *node )
994 {
995 int found = False ;
996 #if 0
997 SkkInputWidget w = ( SkkInputWidget )gw ;
998 #endif
999
1000 /* ���줬�ǽ���Ѵ����ä����ˤϡ�*/
1001 if( node->j_henkan_on != True ){
1002 /* �֢��פ�֢��פ��Ѵ�����... */
1003 if ( j_change_marker
1004 ( node, node->j_henkan_start_point - j_kanji_length ) ){
1005 err_msg( node, "It seems that you have deleted ��." ) ;
1006 node->j_henkan_mode = False ;
1007 node->j_okurigana_mode = False ;
1008 node->j_kana_mode = False ;
1009 return 0 ;
1010 }
1011 /* �Ѵ���ե饰��Ω�Ƥ�ΤǤ��롣*/
1012 node->j_henkan_on = True ;
1013 node->j_henkan_count = 0 ;
1014 }
1015 /* �Ѵ����������ꤵ��Ƥʤ��Τ��Ѵ����褦�Ȥ����顢���ꤷ�Ƥ��ޤ���*/
1016 if( !strlen( node->j_henkan_key ) ){
1017 j_kakutei( gw, node ) ;
1018 return 0 ;
1019 }
1020 /* ���줬�ǽ���Ѵ����ä����ˤ� �Σ�� */
1021 if( node->j_henkan_count == 0 ){
1022 /* �Ѵ��γ������ȯ�Ԥ��롣*/
1023 XtCallCallbacks( gw, XtNjhenkanNotify, node ) ;
1024
1025 /* ���η�̡�j_henkan_vector ����¾���Ѵ���̤�������ȥꥹ�Ȥˤʤ�*
1026 * ������ΤǤ��롣*/
1027
1028 /* �Ѵ��η�̤Ϥɤ����ä��Τ��ʡ� */
1029 if( node->j_henkan_count ){
1030 found = True ;
1031 } else {
1032 found = False ;
1033 }
1034 } else {
1035 if( node->j_henkan_count < 4 ){
1036 /* �����ϻͲ�ʾ�ˤʤä��顢����ɽ�����ڤ��ؤ��Ȥ����롣*/
1037 if( ( node->j_current_henkan_vector_index )->next != NULL ){
1038 node->j_current_henkan_vector_index =
1039 ( node->j_current_henkan_vector_index )->next ;
1040 node->j_henkan_count ++ ;
1041 found = True ;
1042 }
1043 } else {
1044 /* �Ͳ�ʾ�ˤʤä��顢����ɽ�����ڤ��ؤ�롣*/
1045 if( ( node->j_current_henkan_vector_index )->next != NULL ){
1046 /* �Ͳ�ʾ�ˤʤä��ִ֤� NULL �Ȥ����äơ����䤬�⤦̵�� *
1047 * �ʤäƤ��뤳�Ȥ��ʤ����Ȥ��ǧ���롣*/
1048 node->j_current_henkan_vector_index =
1049 ( node->j_current_henkan_vector_index )->next ;
1050
1051 /* ����ǣ��Ĥ�Ȥ������Ȥˤʤ롣*/
1052 node->j_henkan_count ++ ;
1053
1054 node->j_henkan_show_candidate_mode = True ;
1055 /* �Ѵ����������ä��ޤ���*/
1056 j_delete_region( node,
1057 node->j_henkan_start_point,
1058 node->j_henkan_end_point ) ;
1059 /* ����ΰ�����ɽ�����ޤ����ȡ�*/
1060 j_henkan_show_candidates( gw, node, NULL ) ;
1061 /* �ǡ��������ʤ�ȴ���ޤ���*/
1062 return 0 ;
1063 }
1064 }
1065 }
1066 if( found ){
1067 #if 1
1068 if( node->j_henkan_vector_index_top == NULL ){
1069 fprintf( stderr, "found, but no candidates exist.\n" ) ;
1070 fflush( stderr ) ;
1071 } else {
1072 #endif
1073 /* �Ѵ����������ä��ޤ���*/
1074 node->cur_pos2 = node->j_kana_start_point ;
1075 node->cur_pos3 = node->j_okurigana_start_point ;
1076 j_delete_region
1077 ( node, node->j_henkan_start_point, node->j_henkan_end_point ) ;
1078 copyCandidate
1079 ( temporary_buffer, ( node->j_current_henkan_vector_index )->node,
1080 ( node->j_current_henkan_vector_index )->position,
1081 TEXTMAXLEN ) ;
1082 node->j_kana_start_point = node->cur_pos ;
1083 /* �Ѵ���λ���֤�Ĵ����*/
1084 node->cur_pos_backup = node->cur_pos ;
1085 node->cur_pos = node->j_henkan_start_point ;
1086 /* ʸ�����������*/
1087 #if 0
1088 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
1089 #else
1090 j_insert_word
1091 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
1092 #endif
1093 node->j_henkan_end_point = node->cur_pos ;
1094 node->j_kana_start_point = node->cur_pos2 ;
1095 node->j_okurigana_start_point = node->cur_pos3 ;
1096 node->cur_pos = node->cur_pos_backup ;
1097 }
1098 } else {
1099 /* minibuffer ���Ƥ��Ѵ���Ȥ˰�ư���롣*/
1100 skkinput_j_henkan_in_minibuff_init( gw, node ) ;
1101 }
1102 return 0 ;
1103 }
1104
1105 /*
1106 * ��ʸ���Υ���ե��٥åȤ����Ϥ��줿���Ȥˤ�ꡢ�Ѵ����ϰ��֤����ꤵ��
1107 * �Ѵ��⡼�ɤؤȰܹԤ���Ȥ���������Ԥ��ؿ���
1108 * -----
1109 * ���������첻�����Ϥ������ͤ��Ƥ��ʤ������������Ϥ����ΤϻҲ�������
1110 * ����Ȥ������Ȥ�����ĺ���������첻�����Ϥ��줿���ξ������ܤ���
1111 * �δؿ��˵��Ҥ���뤳�Ȥˤʤ롣
1112 * -----
1113 * �Ҳ������� ....
1114 * 1. ��̾���Ϥ�����Ƥ��� ... ��̾prefix�Υ����å���¥�����֤�פΥ����å�
1115 * 2. ����ɽ���Ȳ�̾����,�Ѵ������������ꤹ�롣
1116 * 3. ���겾̾�⡼�ɤ�ɬ�פ���
1117 */
j_set_henkan_point_ByConsonat(Widget gw,struct SKKInputNode * node,int chara)1118 static int j_set_henkan_point_ByConsonat
1119 ( Widget gw, struct SKKInputNode *node, int chara )
1120 {
1121 /* skkinput ���������֤�ȴ���Ф���*/
1122 int status = ( node->j_henkan_mode << 3 ) | ( node->j_henkan_on << 2 ) |
1123 ( node->j_kana_mode << 1 ) | ( node->j_okurigana_mode ) ;
1124 int rchara, tchara, ret ;
1125
1126 #ifdef DEBUG_LV0
1127 fprintf( stderr, "C( j_henkan_mode, j_henkan_on, j_kana_mode,\
1128 j_okurigana_mode ) = (%d,%d,%d,%d)\n", node->j_henkan_mode,
1129 node->j_henkan_on, node->j_kana_mode, node->j_okurigana_mode ) ;
1130 #endif
1131 /* ����ʸ����Ĥ��Ƥ�����*/
1132 rchara = chara ;
1133 /* ��ʸ������ʸ�����Ѵ���*/
1134 if( chara >= 'A' && chara <='Z' )
1135 chara += 'a' - 'A' ;
1136
1137 /* ��������ɽ��*/
1138 switch( status ){
1139
1140 /* �������Ϥ���Ƥ��ʤ����֤�����Ѵ����ֻ��ꡣ*/
1141 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1142 j_set_henkan_point_label1 : ;
1143 /* ����ɽ�����ơ�*/
1144 j_insert_str( node, node->cur_pos, "��" ) ;
1145 /* �Ѵ����ϰ��֤�������֤˷��ꤷ�ơ�*/
1146 node->j_henkan_start_point = node->cur_pos ;
1147 node->j_kana_start_point = node->cur_pos ;
1148 /* �Ѵ��⡼�ɡ���̾���ϥ⡼�ɤ�ˤ��롣*/
1149 node->j_henkan_mode = node->j_kana_mode = True ;
1150 /* ����������֤˥���饯����ɽ�����롣*/
1151 j_insert_chara( node, node->cur_pos, chara ) ;
1152 node->j_prefix[ 0 ] = chara ;
1153 node->j_prefix[ 1 ] = '\0' ;
1154 break ;
1155
1156 /* �Ѵ���Ǥʤ��Τ����겾̾�⡼�ɤˤʤ뤳�ȤϤʤ���*/
1157 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1158 break ;
1159
1160 /* ���˲�̾�⡼�ɤ�����Ǥ��ä����ν�����*/
1161 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1162 /* �ǽ�˾�ʸ�������äƤ��顢������ʸ�������ä����ĥ롼��ꥹ *
1163 * �Ȥ˥ҥåȤ�����ˤϡ��Ѵ����ϤˤϤʤ�ʤ���*/
1164 if( rom_kana_rule_list_check( gw, node, rchara ) ){
1165 break ;
1166 }
1167 /* ��괺�������Ѵ��⡼�ɤذܹԤ��롣*/
1168 node->j_henkan_mode = True ;
1169 /* ��("sk" "sk" ("". "")) �Ȥ�����§�����ä����ˤϡ�prfix check *
1170 * ��ʤ��äƤϤ����ޤ����ޥ���������*/
1171 if( !rom_kana_rule_list_check( gw, node, chara ) ){
1172 /* ���ξ�硢prefix �Ȥ�¥���ν����Ȥ���ޤ����롣*/
1173 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
1174 /* ��̾���ϰ��֤�ɽ������Ƥ����n�פ�ä���*/
1175 j_n_convert_to_kana( node ) ;
1176 /* ���ޡ�����������*/
1177 j_insert_str( node, node->cur_pos, "��" ) ;
1178 /* �Ѵ����ϰ��֤����ꡣ����ϡ֢��פΰ��֤ˤ��碌�롣*/
1179 node->j_henkan_start_point = node->cur_pos ;
1180 node->j_kana_start_point = node->cur_pos ;
1181 j_insert_chara( node, node->cur_pos, chara ) ;
1182 node->j_prefix[ 0 ] = chara ;
1183 node->j_prefix[ 1 ] = '\0' ;
1184 node->j_kana_mode = True ;
1185 break ;
1186 }
1187 /* ¥�����ɤ���������å�����ΤǤ��롣*/
1188 if( node->textbuffer[ node->j_kana_start_point ] == chara &&
1189 chara != 'x' ){
1190 /* ������ɽ������Ƥ���ʸ����ä��ޤ��礦��*/
1191 delete_char( node, node->j_kana_start_point, 1 ) ;
1192 /* ������¥���ؤ��������ޤ��礦��*/
1193 /* ���ΤȤ���cur_pos == j_kana_start_point ��Ȧ�Ǥ��롣*/
1194 if( node->j_katakana_mode ){
1195 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1196 } else {
1197 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1198 }
1199 /* ���ޡ�����������*/
1200 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1201 node->j_henkan_start_point =
1202 node->j_kana_start_point + j_kanji_length ;
1203 /* ��̾�����ϰ��֤餷�ޤ������ȡ�*/
1204 node->j_kana_start_point = node->cur_pos ;
1205 /* �������Ϥ���ʸ����������֤��������롣*/
1206 j_insert_chara( node, node->cur_pos, chara ) ;
1207 node->j_prefix[ 0 ] = chara ;
1208 node->j_prefix[ 1 ] = '\0' ;
1209 #if 0
1210 fprintf( stderr, "(c,k,h) = ( %d, %d, %d )\n", node->cur_pos,
1211 node->j_kana_start_point, node->j_henkan_start_point ) ;
1212 #endif
1213 /* j_kana_mode = True */
1214 break ;
1215 }
1216 /* �̤����ơ������ prefix ��¸�ߤǤ��ޤ��Ρ� ���䤵��*/
1217 if( !j_kana_prefix_check( node->j_prefix, chara ) ){
1218 /* ��äѤꡢ¸�ߤǤ��ޤ���Τ͡��פä��̤�Ǥ��*/
1219 /* �פ�ʤ� prefix �Ͼõ�ޤ��Ƥ衣*/
1220 delete_char( node, node->j_kana_start_point,
1221 node->cur_pos - node->j_kana_start_point ) ;
1222 /* ��̾���Ѵ����ϰ��֤��ѹ����ޤ�����͡�*/
1223 node->j_kana_start_point = node->cur_pos ;
1224 }
1225 /* �������Ϥ���ʸ����ɽ����*/
1226 j_insert_chara( node, node->cur_pos, chara ) ;
1227 node->j_prefix[ 0 ] = chara ;
1228 node->j_prefix[ 1 ] = '\0' ;
1229 }
1230 /* ���ޡ�����������*/
1231 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1232 /* �Ѵ����ϰ��֤����ꡣ����ϡ֢��פΰ��֤ˤ��碌�롣*/
1233 node->j_henkan_start_point =
1234 node->j_kana_start_point + j_kanji_length ;
1235 node->j_kana_start_point =
1236 node->j_henkan_start_point ; /* 2 == strlen( "��" ) */
1237 break ;
1238
1239 /* �Ѵ���Ǥʤ��Τ����겾̾�⡼�ɤˤʤ뤳�ȤϤʤ���*/
1240 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_ON :
1241
1242 /* �Ѵ��⡼�ɤ˰ܹԤ��Ƥ��ʤ��Τˡ��Ѵ���Ǥ��뤳�ȤϤʤ���*/
1243 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1244 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1245 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1246 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_ON :
1247 break ;
1248
1249 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1250 if( rom_kana_rule_list_check( gw, node, rchara ) ){
1251 break ;
1252 }
1253 /* ���ξ�硢prefix �Ȥ�¥���ν����Ȥ���ޤ����롣*/
1254 if( node->j_prefix[ 0 ] == 'n' &&
1255 node->j_prefix[ 1 ] == '\0' ){
1256 if( node->j_henkan_start_point == node->j_kana_start_point ){
1257 /* ��̾���ϰ��֤�ɽ������Ƥ����n�פ�ä���*/
1258 j_n_convert_to_kana( node ) ;
1259 if( chara == 'n' ){
1260 node->j_kana_mode = False ;
1261 node->j_prefix[ 0 ] = '\0' ;
1262 } else {
1263 /* ����������֤����ꡣ*/
1264 node->j_kana_start_point = node->cur_pos ;
1265 /* ��̾���ϥ⡼�ɤذܹԡ�*/
1266 node->j_kana_mode = True ;
1267 /* �������Ϥ���ʸ����ɽ�����롣*/
1268 j_insert_chara( node, node->cur_pos, chara ) ;
1269 node->j_prefix[ 0 ] = chara ;
1270 node->j_prefix[ 1 ] = '\0' ;
1271 }
1272 } else {
1273 /* ��̾���ϰ��֤�ɽ������Ƥ����n�פ�ä���*/
1274 j_n_convert_to_kana( node ) ;
1275 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1276 node->j_okurigana_start_point = node->cur_pos ;
1277 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1278 j_insert_chara( node, node->cur_pos, '*' ) ;
1279 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1280 node->j_okurigana_mode = True ;
1281 node->j_okuri_chara = chara ;
1282 /* ����������֤����ꡣ*/
1283 node->j_kana_start_point = node->cur_pos ;
1284 /* ��̾���ϥ⡼�ɤذܹԡ�*/
1285 node->j_kana_mode = True ;
1286 /* �������Ϥ���ʸ����ɽ�����롣*/
1287 j_insert_chara( node, node->cur_pos, chara ) ;
1288 node->j_prefix[ 0 ] = chara ;
1289 node->j_prefix[ 1 ] = '\0' ;
1290 }
1291 break ;
1292 }
1293 /* ���Ϥ� "n" �Ǥ��ä����ν�����*/
1294 if( chara == 'n' ){
1295 /*
1296 * ���ξ��ϴ������Ǽ¹Ԥ���Ƥ���Τǡ������ǤϤ���ʤ���
1297 * if( textbuffer[ j_kana_start_point ] == 'n' ){
1298 */
1299 delete_char( node, node->j_kana_start_point, 1 ) ;
1300 /* ����������֤����ꡣ*/
1301 node->j_kana_start_point = node->cur_pos ;
1302 /* ��̾���ϥ⡼�ɤذܹԡ�*/
1303 node->j_kana_mode = True ;
1304 /* �������Ϥ���ʸ����ɽ�����롣*/
1305 j_insert_chara( node, node->cur_pos, chara ) ;
1306 node->j_prefix[ 0 ] = chara ;
1307 node->j_prefix[ 1 ] = '\0' ;
1308 break ;
1309 }
1310 /* ¥�����ɤ���������å�����ΤǤ��롣*/
1311 if( node->textbuffer[ node->j_kana_start_point ] == chara &&
1312 chara != 'x' ){
1313 /* ������ɽ������Ƥ���ʸ����ä��ޤ��礦��*/
1314 delete_char( node, node->j_kana_start_point, 1 ) ;
1315 /* ������¥���ؤ��������ޤ��礦��*/
1316 /* ���ΤȤ���cur_pos == j_kana_start_point ��Ȧ�Ǥ��롣*/
1317 if( node->j_katakana_mode ){
1318 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1319 } else {
1320 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1321 }
1322 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1323 node->j_okurigana_start_point = node->cur_pos ;
1324 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1325 j_insert_chara( node, node->cur_pos, '*' ) ;
1326 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1327 node->j_okurigana_mode = True ;
1328 node->j_okuri_chara = chara ;
1329 /* ����������֤����ꡣ*/
1330 node->j_kana_start_point = node->cur_pos ;
1331 /* �������Ϥ���ʸ����ɽ�����롣*/
1332 j_insert_chara( node, node->cur_pos, chara ) ;
1333 node->j_prefix[ 0 ] = chara ;
1334 node->j_prefix[ 1 ] = '\0' ;
1335 /* j_kana_mode = True */
1336 break ;
1337 }
1338 /* ��rom-kana-rule-list ������Ƥ��ޤä��顢j-prefix �Ͻ������ *
1339 * ��Ƥ��ޤ����⤷��ޤ�����*/
1340 /* �֤Ƥ��äȡ��������ȤϤ��餫����Ф��Ƥ����Ф����äƤ��Ȥ��ʡ�*/
1341 /* �֤�������î���ޡ�*/
1342 tchara = node->j_prefix[ 0 ] ;
1343 /* ��("sk" "sk" ("". "")) �Ȥ�����§�����ä����ˤϡ�prfix check *
1344 * ��ʤ��äƤϤ����ޤ�����*/
1345 if( rom_kana_rule_list_check( gw, node, chara ) ){
1346 /* �ְ�����ã�Ǥ������ʤˤ��ꤤ���ޤ����Τˡġ�QskK �ʤ�� *
1347 * ���Ϥ�ʤ���ʤ�ơġ� */
1348 node->cur_pos_backup = node->cur_pos ;
1349 node->cur_pos = node->j_kana_start_point ;
1350 ret = is_okurigana_start_ok( node ) ;
1351 node->cur_pos = node->cur_pos_backup ;
1352 /* �֤ۤ�ۤ顢�ͤ��ͤ���"QskK" �� "���Ӥ�����������" �äƽФ� *
1353 * �衣���Ƹ��ơġ� */
1354 /* ���餱�ޤ���������(����ϥХ�������) */
1355 if( ret ){
1356 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1357 node->j_okurigana_start_point = node->j_kana_start_point ;
1358 node->cur_pos2 = node->j_kana_start_point ;
1359 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1360 j_insert_chara( node, node->j_okurigana_start_point, '*' ) ;
1361 node->j_kana_start_point = node->cur_pos2 ;
1362 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1363 node->j_okurigana_mode = True ;
1364 node->j_okuri_chara = tchara ;
1365 j_set_okurigana( gw, node, node->j_okuri_chara ) ;
1366 }
1367 break ;
1368 }
1369 /* �̤����ơ������ prefix ��¸�ߤǤ��ޤ��Ρ� ���䤵��*/
1370 if( !j_kana_prefix_check( node->j_prefix, chara ) ){
1371 /* �פ�ʤ� prefix �Ͼõ�ޤ��Ƥ衣*/
1372 delete_char( node, node->j_kana_start_point,
1373 node->cur_pos - node->j_kana_start_point ) ;
1374 /* ��äѤꡢ¸�ߤǤ��ޤ���Τ͡��פä��̤�Ǥ��*/
1375 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
1376 /* ��n�פ�֤�פ��Ѵ����ʤ��Ȥ����ʤ��Τ��ɤ���������å���*/
1377 /* ��̾���ϰ��֤�ɽ������Ƥ����n�פ�ä���*/
1378 j_n_convert_to_kana( node ) ;
1379 /* ��̾���ϳ��ϰ��֤餹��*/
1380 node->j_kana_start_point = node->cur_pos ;
1381 /* �������Ϥ���ʸ����������֤��������롣*/
1382 j_insert_chara( node, node->cur_pos, chara ) ;
1383 node->j_prefix[ 0 ] = chara ;
1384 node->j_prefix[ 1 ] = '\0' ;
1385 /* j_kana_mode = True */
1386 break ;
1387 }
1388 if( is_okurigana_start_ok( node ) ){
1389 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1390 node->j_okurigana_start_point = node->cur_pos ;
1391 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1392 j_insert_chara( node, node->cur_pos, '*' ) ;
1393 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1394 node->j_okurigana_mode = True ;
1395 node->j_okuri_chara = chara ;
1396 }
1397 node->j_kana_start_point = node->cur_pos ;
1398 node->j_prefix[ 0 ] = '\0' ;
1399 } else {
1400 if( node->j_prefix[ 0 ] != '\0' &&
1401 is_okurigana_start_ok( node ) ){
1402 /* �ޤ��������ʸ�����õ�롣*/
1403 j_delete_region
1404 ( node, node->j_kana_start_point, node->cur_pos ) ;
1405 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1406 node->j_okurigana_start_point = node->cur_pos ;
1407 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1408 j_insert_chara( node, node->cur_pos, '*' ) ;
1409 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1410 node->j_okurigana_mode = True ;
1411 /* �ʤ�ȡ��������줿�Τǰ����ߤ����Ĥ�������*/
1412 node->j_okuri_chara = chara ;
1413 node->j_kana_start_point = node->cur_pos ;
1414 }
1415 }
1416 /* ��̾���ϥ⡼�ɤذܹԡ�*/
1417 node->j_kana_mode = True ;
1418 /* �������Ϥ���ʸ����ɽ�����롣*/
1419 j_insert_chara( node, node->cur_pos, chara ) ;
1420 j_prefix_add( node->j_prefix, chara ) ;
1421 break ;
1422
1423 /* �Ѵ��⡼�ɤ���ʸ������ե��٥åȤ����Ϥ��줿���ˤ����겾̾�⡼�ɤ� */
1424 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1425 /* �����ǥ���������֤� 0 ����礭���Ȥ��Ƥ��ޤ����ɡ���������� *
1426 * ������ͳ�ϴ�ñ��������Ƭ���Ѵ��Ϥ��Ƥ⡢2 ����ˤʤ뤫�顣*/
1427 if( is_okurigana_start_ok( node ) ){
1428 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1429 node->j_okurigana_start_point = node->cur_pos ;
1430 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1431 j_insert_chara( node, node->cur_pos, '*' ) ;
1432 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1433 node->j_okurigana_mode = True ;
1434 node->j_okuri_chara = chara ;
1435 }
1436 /* ����������֤����ꡣ*/
1437 node->j_kana_start_point = node->cur_pos ;
1438 /* ��̾���ϥ⡼�ɤذܹԡ�*/
1439 node->j_kana_mode = True ;
1440 /* �������Ϥ���ʸ����ɽ�����롣*/
1441 j_insert_chara( node, node->cur_pos, chara ) ;
1442 node->j_prefix[ 0 ] = chara ;
1443 node->j_prefix[ 1 ] = '\0' ;
1444 break ;
1445
1446 /* �֢���*��s�פȤ����褦�ʾ��֤Ǥ��롣�Ѵ��⡼�ɤǤ��ꡢ���겾̾�⡼�� *
1447 * �Ǥ��ꡢ��̾�⡼�ɤǤ���Ȥ����Τϡ�����������̾�⡼�ɤǤʤ��ʤ�� *
1448 * ���겾̾�⡼�ɤ�����Ȧ�Ϥʤ��Τǡ����ξ��֤�¸�ߤ��ʤ��� */
1449 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1450 break ;
1451
1452 /* �֢���*��s�פȤ����褦�ʾ��֤Ǥ��롣�Ѵ��⡼�ɤǤ��ꡢ���겾̾�⡼�� *
1453 * �Ǥ��ꡢ��̾�⡼�ɤǤ���Ȥ����Τϡ� */
1454 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_ON :
1455 if( rom_kana_rule_list_check( gw, node, rchara ) ){
1456 break ;
1457 }
1458 /* ���ξ�����ʸ�����Ϥ⾮ʸ�����Ϥ�ط����ʤ�����ʸ���λ��ν������롣*/
1459 #if 0
1460 /* if( node->textbuffer[ node->j_kana_start_point ] == 'n' ){ */
1461 #else
1462 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
1463 #endif
1464 /* ��n�פ�֤�פ��Ѵ����ʤ��Ȥ����ʤ��Τ��ɤ���������å���*/
1465 /* ��̾���ϰ��֤�ɽ������Ƥ����n�פ�ä���*/
1466 j_n_convert_to_kana( node ) ;
1467 /* ��̾���ϳ��ϰ��֤餹��*/
1468 node->j_kana_start_point = node->cur_pos ;
1469 /* �������Ϥ���ʸ����������֤��������롣*/
1470 j_insert_chara( node, node->cur_pos, chara ) ;
1471 node->j_prefix[ 0 ] = chara ;
1472 node->j_prefix[ 1 ] = '\0' ;
1473 /* j_kana_mode = True */
1474 /* ���äȡ��֤�פ˳��ꤷ�Ƥ��ޤ��Ȥ������Ȥ��Ѵ���Ȥ�ɬ�פˤʤ롣*/
1475 /* �Ȼפä����ɡ������Ǥ�ʤ��ߤ�����*/
1476 break ;
1477 }
1478 /* ¥�����ɤ���������å�����ΤǤ��롣*/
1479 if( node->textbuffer[ node->j_kana_start_point ] == chara &&
1480 chara != 'x' ){
1481 /* ������ɽ������Ƥ���ʸ����ä��ޤ��礦��*/
1482 delete_char( node, node->j_kana_start_point, 1 ) ;
1483 /* ������¥���ؤ��������ޤ��礦��*/
1484 /* ���ΤȤ���cur_pos == j_kana_start_point ��Ȧ�Ǥ��롣*/
1485 if( node->j_katakana_mode ){
1486 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1487 } else {
1488 j_insert_str( node, node->j_kana_start_point, "��" ) ;
1489 }
1490 /* ��̾�����ϰ��֤餷�ޤ������ȡ�*/
1491 node->j_kana_start_point = node->cur_pos ;
1492 /* �������Ϥ���ʸ����������֤��������롣*/
1493 j_insert_chara( node, node->cur_pos, chara ) ;
1494 node->j_prefix[ 0 ] = chara ;
1495 node->j_prefix[ 1 ] = '\0' ;
1496 /* j_kana_mode = True */
1497 break ;
1498 }
1499 /* �̤����ơ������ prefix ��¸�ߤǤ��ޤ��Ρ� ���䤵��*/
1500 if( !j_kana_prefix_check( node->j_prefix, chara ) ){
1501 /* ��äѤꡢ¸�ߤǤ��ޤ���Τ͡��פä��̤�Ǥ��*/
1502 /* �פ�ʤ� prefix �Ͼõ�ޤ��Ƥ衣*/
1503 delete_char( node, node->j_kana_start_point,
1504 node->cur_pos - node->j_kana_start_point ) ;
1505 /* ��̾���Ѵ����ϰ��֤��ѹ����ޤ�����͡�*/
1506 node->j_kana_start_point = node->cur_pos ;
1507 node->j_prefix[ 0 ] = '\0' ;
1508 }
1509 /* �������Ϥ���ʸ����ɽ����*/
1510 j_insert_chara( node, node->cur_pos, chara ) ;
1511 j_prefix_add( node->j_prefix, chara ) ;
1512 break ;
1513
1514 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1515 /* ���ξ��ˤϳ����Ȥ��Ԥ�줿�塢not_active, henkan_off ��Ʊ��������*/
1516 j_kakutei( gw, node ) ;
1517 #if 0
1518 j_kakutei_kana( node, chara ) ;
1519 #endif
1520 goto j_set_henkan_point_label1 ;
1521
1522 /* �Ѵ����Ԥ��Ƥ�����ǡ���̾prefix���Ϥʤ������겾̾���ϤΤ����硣*/
1523 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1524 /* ���ξ��ˤϳ����Ȥ��Ԥ�줿�塢not_active, henkan_off, okuri_off */
1525 j_kakutei( gw, node ) ;
1526 #if 0
1527 j_kakutei_kana( node, chara ) ;
1528 #endif
1529 goto j_set_henkan_point_label1 ;
1530
1531 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1532 /* �Ѵ���� kana_prefix �����ä��顢���ꤷ�Ƥ��ޤ��Τǡ����ξ����Ϥʤ���*/
1533 break ;
1534
1535 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_ON :
1536 /* �Ѵ��⡼�ɤ������겾̾�����ꤷ�ơ��Ѵ���Ȥʤä����֤Dz�̾prefix �� *
1537 * ���뤳�ȤϤʤ��� */
1538 break ;
1539 }
1540 return 0 ;
1541 }
1542
1543 /*
1544 * ���ʴ����Ѵ��ơ��֥������ơ���̤��֤��ؿ���
1545 */
my_assoc_table_search(struct SKKInputNode * node,struct roma_kana_table * table,char * key)1546 static char *my_assoc_table_search
1547 ( struct SKKInputNode *node, struct roma_kana_table *table, char *key )
1548 {
1549 struct roma_kana_table *ptr = table ;
1550 /* �ơ��֥��Ҥ���*/
1551 while( ptr->prefix != NULL ){
1552 if( !strcmp( ptr->prefix, key ) ){
1553 if( node->j_katakana_mode ){
1554 /* �Ҳ�̾���ä����ν�����*/
1555 return ptr->katakana ;
1556 } else {
1557 /* ʿ��̾���ä����ν�����*/
1558 return ptr->kana ;
1559 }
1560 }
1561 ptr ++ ;
1562 }
1563 return NULL ;
1564 }
1565
1566 /*
1567 * ���겾̾�����ꤷ���Ѵ���ȤؤȰ�ư����ؿ���
1568 *-----
1569 * �Ĥޤꡢ�֢��ߡפξ��֤���ʸ���� "R" �����Ϥ������ˡ��֢���*��פ�
1570 * �ʤä� �֢�����פؤ��Ѳ��������Ȥ�Ԥ���
1571 */
j_set_okurigana(Widget gw,struct SKKInputNode * node,int j_okuri_chara)1572 static int j_set_okurigana
1573 ( Widget gw, struct SKKInputNode *node, int j_okuri_chara )
1574 {
1575 int i, j, stpos, enpos, usage ;
1576 /* �Ѵ���λ���֤����ꡣ*/
1577 node->j_henkan_end_point = node->j_okurigana_start_point ;
1578 /* '*' ��¸�ߤ��뤫�ɤ����Υ����å���*/
1579 if( !looking_at( node, node->j_okurigana_start_point, "*" ) ){
1580 j_insert_chara( node, node->j_okurigana_start_point, '*' ) ;
1581 }
1582 /* ñ����Ͽ�λ���ɽ�������ʸ�������¸���Ƥ�����*/
1583 usage = node->j_okurigana_start_point - node->j_henkan_start_point ;
1584 /* �Хåե��դ�뤳�Ȥʤ��̵���Ȼפ����ɤ͡�*/
1585 if( usage > 0 ){
1586 strncpy( node->j_henkan_key2, node->textbuffer +
1587 node->j_henkan_start_point, usage ) ;
1588 node->j_henkan_key2[ usage ++ ] = '*' ;
1589 } else {
1590 usage = 0 ;
1591 }
1592 node->j_henkan_key2[ usage ] = '\0' ;
1593 /* �������겾̾������ȴ���Ф��Ʋä��롣*/
1594 stpos = ( node->j_okurigana_start_point < TEXTMAXLEN )?
1595 node->j_okurigana_start_point + 1 : node->j_okurigana_start_point ;
1596 if( node->j_kana_mode ){
1597 enpos = node->j_kana_start_point ;
1598 } else {
1599 enpos = node->cur_pos ;
1600 }
1601 /* �ɤΰ̤�ʸ����ȴ���Ф����Ρ� */
1602 j = enpos - stpos ;
1603 /* �羮�ط����դ��ä����ν����Ǥ��͡�*/
1604 if( j < 0 ){
1605 int tmp ;
1606 /* �����羮�ط���Ҥä��꤫�����ޤ���*/
1607 j = -j ;
1608 /* ���ϰ��֤�λ���֤���ޤ���*/
1609 tmp = stpos ;
1610 stpos = enpos ;
1611 enpos = tmp ;
1612 }
1613 /* �����ȡ��Хåե����줵���뤳�Ȥ�̵���褦�����ꤷ�ޤ���*/
1614 if( j + usage > TEXTMAXLEN ){
1615 j = TEXTMAXLEN - usage ;
1616 }
1617 /* �����ȡ�����ʸ�����ä��ޤ���*/
1618 strncat( node->j_henkan_key2, node->textbuffer + stpos, j ) ;
1619 node->j_henkan_key2[ j + usage ] = '\0' ;
1620 #if 0
1621 fprintf( stderr, "j-henkan-key2 : \"%s\"\n", tmpbuf ) ;
1622 #endif
1623 i = node->j_henkan_end_point - node->j_henkan_start_point ;
1624 /* �Ѵ����������ꡣ*/
1625 strncpy( node->j_henkan_key,
1626 node->textbuffer + node->j_henkan_start_point, i ) ;
1627 node->j_okurigana_offset = i ;
1628 node->j_henkan_key[ i ++ ] = j_okuri_chara ;
1629 node->j_henkan_key[ i ++ ] = '\0' ;
1630 #if 0
1631 node->j_prefix[ 0 ] = '\0' ;
1632 #endif
1633 /* `*' ��õ�롣*/
1634 j_delete_region
1635 ( node,
1636 node->j_okurigana_start_point, node->j_okurigana_start_point + 1 ) ;
1637 #if 0
1638 fprintf( stderr, "j-set-okurigana : \"%s\".\n", textbuffer ) ;
1639 fprintf( stderr, "( c, hs, he ) = ( %d, %d, %d )\n",
1640 cur_pos, j_henkan_start_point, j_henkan_end_point ) ;
1641 #endif
1642 /* �Ѵ���Ȥ�Ԥ���*/
1643 j_henkan( gw, node ) ;
1644 #if 0
1645 fprintf( stderr, "j-set-okurigana : \"%s\".\n", textbuffer ) ;
1646 fprintf( stderr, "( c, hs, he ) = ( %d, %d, %d )\n",
1647 cur_pos, j_henkan_start_point, j_henkan_end_point ) ;
1648 /* �����ϰ����¹Ԥ���Ƥ����ߤ����ʤΤ����ľä��Ȥɤ��ʤ롩 */
1649 node->j_okurigana_mode = False ;
1650 node->j_okuri_chara = '\0' ;
1651 #endif
1652 return 0 ;
1653 }
1654
1655 /*
1656 * ���ʤ����ꤹ��ؿ���
1657 *----
1658 * kana inserting functions.
1659 */
j_kanakakutei(Widget gw,struct SKKInputNode * node,struct roma_kana_table * table,int chara)1660 static int j_kanakakutei
1661 ( Widget gw, struct SKKInputNode *node, struct roma_kana_table *table,
1662 int chara )
1663 {
1664 unsigned char *str ;
1665 int j_okuri_chara ;
1666
1667 /* ��̾���Ϥ�����Ǥ����� */
1668 if( !node->j_kana_mode ){
1669 /* ��̾���Ϥ�����Ǥʤ����ν�����*/
1670 #ifdef DEBUG_LV0
1671 fprintf( stderr, "Now not kana input mode\n" ) ;
1672 #endif
1673 /* ��̾���Ϥγ��ϰ��֤������롣*/
1674 node->j_kana_start_point = node->cur_pos ;
1675 /* ��̾ prefix �ϲ�̾�γ���ˤ�äƶ��ˤʤ롣*/
1676 node->j_prefix[ 0 ] = '\0' ;
1677 j_okuri_chara = node->j_okuri_chara ;
1678 } else {
1679 /* ��̾���Ϥ�����ξ��ν����ĤǤ⡢rule-list �⤢�ꡣ*/
1680 if( rom_kana_rule_list_check( gw, node, chara ) )
1681 goto j_kanakakutei_rom_kana_rulelist_hit ;
1682
1683 j_okuri_chara = node->j_okuri_chara ;
1684 }
1685 /* ��̾�� prefix �ơ�������̾�Ѵ���Ԥ���*/
1686 str = my_assoc_table_search( node, table, node->j_prefix ) ;
1687 #ifdef DEBUG_LV1
1688 fprintf( stderr, "j-kanakakutei : prefix is \"%s\".\n",
1689 node->j_prefix ) ;
1690 fprintf( stderr, "j-kanakakutei : ( j-kana-start-point,\
1691 cursor-position ) is ( %d, %d ).\n", node->j_kana_start_point,
1692 node->cur_pos ) ;
1693 #endif
1694 /* ������̾�Ѵ����������ޤ������� */
1695 if( str == NULL ){
1696 /* ������̾�Ѵ��˼��Ԥ������ν�����*/
1697 node->j_prefix[ 0 ] = '\0' ;
1698 /* j_okuri_chara = '\0' ; */
1699 str = my_assoc_table_search( node, table, node->j_prefix ) ;
1700 }
1701 /* ���ꤷ�Ƥ��ޤ���*/
1702 /* if( j_kakutei_early && j_henkan_mode ) */
1703 if( node->j_henkan_on ){
1704 j_kakutei( gw, node ) ;
1705 }
1706 if( node->j_kana_mode ){
1707 /* kana prefix ��Ĺ��ʬ����ʸ����ä���*/
1708 j_delete_region( node, node->j_kana_start_point, node->cur_pos ) ;
1709 node->j_kana_mode = False ;
1710 node->j_prefix[ 0 ] = '\0' ;
1711 }
1712 /* �ä������˲�̾�����Ϥ��롣*/
1713 j_insert_str( node, node->cur_pos, str ) ;
1714 /* ���겾̾�⡼�ɤ��ä����ˤϡ����겾̾�����ꤹ�롣*/
1715 /* �Ĥޤꡢ���겾̾�����ꤷ���Ѵ��˰ܤ��Τ���͡�*/
1716 if( node->j_okurigana_mode ){
1717 j_set_okurigana( gw, node, j_okuri_chara ) ;
1718 }
1719 return 0 ;
1720
1721 j_kanakakutei_rom_kana_rulelist_hit:
1722 if( node->j_henkan_on )
1723 j_kakutei( gw, node ) ;
1724 if( node->j_okurigana_mode )
1725 j_set_okurigana( gw, node, node->j_okuri_chara ) ;
1726 return 0 ;
1727 }
1728
1729 /* �첻�����Ϥ��줿���ˤϡ���̾���Ϥγ���Ȥ������롣*/
j_insert_a(Widget gw,struct SKKInputNode * node,int chara)1730 static int j_insert_a
1731 ( Widget gw, struct SKKInputNode *node, int chara )
1732 {
1733 return j_kanakakutei( gw, node, skk_roma_kana_a, chara ) ;
1734 }
1735
1736 /* �첻�����Ϥ��줿���ˤϡ���̾���Ϥγ���Ȥ������롣*/
j_insert_i(Widget gw,struct SKKInputNode * node,int chara)1737 static int j_insert_i
1738 ( Widget gw, struct SKKInputNode *node, int chara )
1739 {
1740 return j_kanakakutei( gw, node, skk_roma_kana_i, chara ) ;
1741 }
1742
1743 /* �첻�����Ϥ��줿���ˤϡ���̾���Ϥγ���Ȥ������롣*/
j_insert_u(Widget gw,struct SKKInputNode * node,int chara)1744 static int j_insert_u
1745 ( Widget gw, struct SKKInputNode *node, int chara )
1746 {
1747 return j_kanakakutei( gw, node, skk_roma_kana_u, chara ) ;
1748 }
1749
1750 /* �첻�����Ϥ��줿���ˤϡ���̾���Ϥγ���Ȥ������롣*/
j_insert_e(Widget gw,struct SKKInputNode * node,int chara)1751 static int j_insert_e
1752 ( Widget gw, struct SKKInputNode *node, int chara )
1753 {
1754 return j_kanakakutei( gw, node, skk_roma_kana_e, chara ) ;
1755 }
1756
1757 /* �첻�����Ϥ��줿���ˤϡ���̾���Ϥγ���Ȥ������롣*/
j_insert_o(Widget gw,struct SKKInputNode * node,int chara)1758 static int j_insert_o
1759 ( Widget gw, struct SKKInputNode *node, int chara )
1760 {
1761 return j_kanakakutei( gw, node, skk_roma_kana_o, chara ) ;
1762 }
1763
1764 /*
1765 * ��ʸ���Υ���ե��٥åȤ����Ϥ��줿���Ȥˤ�ꡢ�Ѵ����ϰ��֤����ꤵ��
1766 * �Ѵ��⡼�ɤؤȰܹԤ���Ȥ���������Ԥ��ؿ���
1767 * -----
1768 * �첻�����Ϥ��줿���ν�����Ԥ���
1769 * -----
1770 * �첻������ ....
1771 * 1. ��̾���Ϥ�����Ƥ��� ... ������̾���Ѵ���Ԥ���
1772 * 2. ����ɽ���Ȳ�̾����,�Ѵ������������ꤹ�롣
1773 * 3. ���겾̾�⡼�ɤ�ɬ�פ���
1774 */
j_set_henkan_point_ByVowel(Widget gw,struct SKKInputNode * node,struct roma_kana_table * table,int chara)1775 static int j_set_henkan_point_ByVowel
1776 ( Widget gw, struct SKKInputNode *node,
1777 struct roma_kana_table *table, int chara )
1778 {
1779 /* skkinput ���������֤�ȴ���Ф���*/
1780 int status = ( node->j_henkan_mode << 3 ) | ( node->j_henkan_on << 2 ) |
1781 ( node->j_kana_mode << 1 ) | ( node->j_okurigana_mode ) ;
1782 int pos, rchara, pchara ;
1783
1784 #ifdef DEBUG
1785 fprintf( stderr, "V( j_henkan_mode, j_henkan_on, j_kana_mode,\
1786 j_okurigana_mode ) = (%d,%d,%d,%d)\n", node->j_henkan_mode,
1787 node->j_henkan_on, node->j_kana_mode,
1788 node->j_okurigana_mode ) ;
1789 #endif
1790
1791 /* ��ʸ������ʸ�����Ѵ���*/
1792 rchara = chara ;
1793 if( chara >= 'A' && chara <='Z' )
1794 chara += 'a' - 'A' ;
1795
1796 /* ��������ɽ��*/
1797 switch( status ){
1798
1799 /* �������Ϥ���Ƥ��ʤ����֤�����Ѵ����ֻ��ꡣ*/
1800 /* ���ξ����첻���餤���ʤ겾̾���Ѵ������ɤ��Τǡ���̾�⡼�ɤϥ��� *
1801 * �ΤޤޤʤΤǤ��롣 */
1802 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1803 j_set_henkan_point_label1 : ;
1804 /* ����ɽ�����ơ�*/
1805 j_insert_str( node, node->cur_pos, "��" ) ;
1806 /* �Ѵ����ϰ��֤�������֤˷��ꤷ�ơ�*/
1807 node->j_henkan_start_point = node->cur_pos ;
1808 /* �Ѵ��⡼�ɤ�ˤ��롣*/
1809 node->j_henkan_mode = True ;
1810 /* ������̾�Ѵ���Ԥ���*/
1811 j_kanakakutei( gw, node, table, chara ) ;
1812 #if 0
1813 /* �����ʤ��顢��̾�⡼�ɤϥ��ա�*/
1814 node->j_kana_mode = False ;
1815 #endif
1816 break ;
1817
1818 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1819 pchara = last_character_of( node->j_prefix ) ;
1820 /* �롼��ꥹ�Ȥ�Ҥ���*/
1821 if( rom_kana_rule_list_check( gw, node, rchara ) ){
1822 break ;
1823 }
1824 /* ���겾̾�Ѵ��ˤ�������פʤΤ��ʡ� */
1825 if( is_okurigana_start_ok( node ) ){
1826 node->cur_pos_backup = node->cur_pos ;
1827 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1828 node->cur_pos = node->j_okurigana_start_point =
1829 node->j_kana_start_point ;
1830 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1831 j_insert_chara( node, node->j_okurigana_start_point, '*' ) ;
1832 /* ��̾���ϰ��֤ν�����*/
1833 node->j_kana_start_point = node->cur_pos ;
1834 /* ����������֤��᤹��*/
1835 node->cur_pos = node->cur_pos_backup ;
1836 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1837 node->j_okurigana_mode = True ;
1838 node->j_okuri_chara = pchara ;
1839 }
1840 /* ������̾�Ѵ���Ԥ���*/
1841 j_kanakakutei( gw, node, table, chara ) ;
1842 /* �����ʤ��顢��̾�⡼�ɤϥ��ա�*/
1843 #if 0
1844 node->j_kana_mode = False ;
1845 node->j_prefix[ 0 ] = '\0' ;
1846 #endif
1847 break ;
1848
1849 /* ���˲�̾�⡼�ɤ�����Ǥ��ä����ν�����*/
1850 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1851 /* �롼��ꥹ�Ȥ�Ҥ���*/
1852 if( rom_kana_rule_list_check( gw, node, rchara ) ){
1853 break ;
1854 }
1855 /* �����β�̾���ϰ��֤����Ƥ�����*/
1856 pos = node->j_kana_start_point ;
1857 #if 0
1858 /* if( node->textbuffer[ pos ] == 'n' ){*/
1859 #else
1860 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
1861 #endif
1862 j_n_convert_to_kana( node ) ;
1863 node->j_kana_mode = False ;
1864 node->j_prefix[ 0 ] = '\0' ;
1865 pos = node->cur_pos ;
1866 }
1867 /* ������̾�Ѵ���Ԥ���*/
1868 j_kanakakutei( gw, node, table, chara ) ;
1869 /* ����ɽ�����ơ�*/
1870 j_insert_str( node, pos, "��" ) ;
1871 /* �Ѵ��⡼�ɤ�ˤ��롣*/
1872 node->j_henkan_mode = True ;
1873 /* �Ѵ����ϰ��֤���ꤷ�ơ�*/
1874 node->j_henkan_start_point = pos + j_kanji_length ;
1875 #if 0
1876 /* �����ʤ��顢��̾�⡼�ɤϥ��ա�*/
1877 node->j_kana_mode = False ;
1878 #endif
1879 break ;
1880
1881 /* �Ѵ���Ǥʤ��Τ����겾̾�⡼�ɤˤʤ뤳�ȤϤʤ���*/
1882 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1883 case J_HENKAN_MODE_OFF | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_ON :
1884 break ;
1885
1886 /* �Ѵ��⡼�ɤ˰ܹԤ��Ƥ��ʤ��Τˡ��Ѵ���Ǥ��뤳�ȤϤʤ���*/
1887 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1888 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1889 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1890 case J_HENKAN_MODE_OFF | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_ON :
1891 break ;
1892
1893 /* �Ѵ��⡼�ɤ���ʸ������ե��٥åȤ����Ϥ��줿���ˤ����겾̾�⡼�ɤ� */
1894 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1895 if( is_okurigana_start_ok( node ) ){
1896 /* ����������֤����겾̾�γ��ϥݥ���ȡ�*/
1897 node->j_okurigana_start_point = node->cur_pos ;
1898 /* ���겾̾�γ��ϥݥ���Ȥˡ�*�פ��������롣*/
1899 j_insert_chara( node, node->cur_pos, '*' ) ;
1900 /* ���겾̾�⡼�ɤذܹԤ��롣*/
1901 node->j_okurigana_mode = True ;
1902 node->j_okuri_chara = chara ;
1903 }
1904 /* �������Ϥ����첻�ˤĤ��ƥ�����̾�Ѵ���Ԥ���*/
1905 j_kanakakutei( gw, node, table, chara ) ;
1906 break ;
1907
1908 /* �֢���*��s�פȤ����褦�ʾ��֤Ǥ��롣�Ѵ��⡼�ɤǤ��ꡢ���겾̾�⡼�� *
1909 * �Ǥ��ꡢ��̾�⡼�ɤǤ���Ȥ����Τϡ�����������̾�⡼�ɤǤʤ��ʤ�� *
1910 * ���겾̾�⡼�ɤ�����Ȧ�Ϥʤ��Τǡ����ξ��֤�¸�ߤ��ʤ��� */
1911 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1912 break ;
1913
1914 /* �֢���*��s�פȤ����褦�ʾ��֤Ǥ��롣�Ѵ��⡼�ɤǤ��ꡢ���겾̾�⡼�� *
1915 * �Ǥ��ꡢ��̾�⡼�ɤǤ���Ȥ����Τϡ� */
1916 case J_HENKAN_MODE_ON | J_HENKAN_OFF | J_KANA_MODE_ON | J_OKURIGANA_ON :
1917 /* �롼��ꥹ�Ȥ�Ҥ���*/
1918 if( rom_kana_rule_list_check( gw, node, rchara ) ){
1919 break ;
1920 }
1921 /* ���ξ�����ʸ�����Ϥ⾮ʸ�����Ϥ�ط����ʤ�����ʸ���λ��ν������롣*/
1922 /* ������̾�Ѵ���Ԥ���*/
1923 j_kanakakutei( gw, node, table, chara ) ;
1924 #if 0
1925 /* ��̾�⡼�ɤϽ�λ���롣*/
1926 node->j_kana_mode = False ;
1927 node->j_prefix[ 0 ] = '\0' ;
1928 #endif
1929 break ;
1930
1931 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_OFF :
1932 /* ���ξ��ˤϳ����Ȥ��Ԥ�줿�塢not_active, henkan_off ��Ʊ��������*/
1933 j_kakutei( gw, node ) ;
1934 #if 0
1935 j_kakutei_kana( node, chara ) ;
1936 #endif
1937 goto j_set_henkan_point_label1 ;
1938
1939 /* �Ѵ����Ԥ��Ƥ�����ǡ���̾prefix���Ϥʤ������겾̾���ϤΤ����硣*/
1940 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_OFF | J_OKURIGANA_ON :
1941 /* ���ξ��ˤϳ����Ȥ��Ԥ�줿�塢not_active, henkan_off, okuri_off */
1942 j_kakutei( gw, node ) ;
1943 #if 0
1944 j_kakutei_kana( node, chara ) ;
1945 #endif
1946 goto j_set_henkan_point_label1 ;
1947
1948 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_OFF :
1949 /* �Ѵ���� kana_prefix �����ä��顢���ꤷ�Ƥ��ޤ��Τǡ����ξ����Ϥʤ���*/
1950 break ;
1951
1952 case J_HENKAN_MODE_ON | J_HENKAN_ON | J_KANA_MODE_ON | J_OKURIGANA_ON :
1953 /* �Ѵ��⡼�ɤ������겾̾�����ꤷ�ơ��Ѵ���Ȥʤä����֤Dz�̾prefix �� *
1954 * ���뤳�ȤϤʤ��� */
1955 break ;
1956 }
1957 return 0 ;
1958 }
1959
1960 /*
1961 * �ü�ʸ��Ф�ʸ���ˤ�ä��Ѵ����ϰ��֤����ꤹ����ν�����
1962 */
j_set_henkan_point_by_special_midashi_char(Widget gw,struct SKKInputNode * node,int chara)1963 static int j_set_henkan_point_by_special_midashi_char
1964 ( Widget gw, struct SKKInputNode *node, int chara )
1965 {
1966 /* ��̾�����椫��"n"�ʤ�"��"�ˤ��Ƥ��ޤ���*/
1967 if( node->j_kana_mode ){
1968 /* �롼��ꥹ�Ȥ�Ҥ���*/
1969 if( rom_kana_rule_list_check( gw, node, chara ) ){
1970 return 0 ;
1971 }
1972 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
1973 j_n_convert_to_kana( node ) ;
1974 } else {
1975 delete_char( node, node->j_kana_start_point,
1976 node->cur_pos - node->j_kana_start_point ) ;
1977 }
1978 /* ��̾������ʤ饭��뤷�Ƥ��ޤ���*/
1979 node->j_kana_mode = False ;
1980 node->j_prefix[ 0 ] = '\0' ;
1981 }
1982 /* ���ơ��Ѵ��⡼�ɤ��Ѵ�ư����ʤΤ��ʤ��� */
1983 if( node->j_henkan_mode == False || node->j_henkan_on == True ){
1984 if( node->j_henkan_mode ){
1985 /* �Ѵ����ϰ��֤�����Ǥ��뤽���ʡ�*/
1986 j_set_henkan_point_subr( gw, node, chara ) ;
1987 /* �������Τ��� ����ϡġ�*/
1988 j_insert_chara( node, node->cur_pos, chara ) ;
1989 } else if( node->j_henkan_on ){
1990 /* ���ꥸ�ʥ�Υޥåפߥ�졼�Ȥ��뤽���ʡ�*/
1991 #if 0
1992 j_insert_chara( node, node->cur_pos, chara ) ;
1993 #else
1994 j_self_insert( gw, node, chara ) ;
1995 #endif
1996 } else {
1997 /* ����ʸ�������뤽���ʡ�*/
1998 #if 0
1999 j_insert_chara( node, node->cur_pos, chara ) ;
2000 #else
2001 j_self_insert( gw, node, chara ) ;
2002 #endif
2003 }
2004 } else {
2005 /* �Ѵ��������ν�����*/
2006 j_start_henkan_sub( gw, node ) ;
2007 /* �ü�ʸ�����������롣*/
2008 j_insert_chara( node, node->cur_pos, chara ) ;
2009 /* �Ѵ���λ���֤����ꤹ�롣*/
2010 node->j_henkan_end_point = node->cur_pos ;
2011 /* �Ѵ��������ڤ�Ф���*/
2012 strncpy( node->j_henkan_key,
2013 node->textbuffer + node->j_henkan_start_point,
2014 node->j_henkan_end_point - node->j_henkan_start_point ) ;
2015 node->j_henkan_key[ node->j_henkan_end_point -
2016 node->j_henkan_start_point ] = '\0' ;
2017 /*
2018 *�֤⤷�����ơ����겾̾�⡼�ɤȤ������ȤϤ������ޤ���Ǥ��礦������
2019 */
2020 if( node->j_okurigana_mode ){
2021 /* �Թ��ˤ��Ƥ���ʤ����ȤäƤ���Τ����ġ�*/
2022 if( node->j_okurigana_start_point > node->j_henkan_start_point ){
2023 node->j_okurigana_offset =
2024 node->j_okurigana_start_point - node->j_henkan_start_point ;
2025 } else {
2026 node->j_okurigana_offset =
2027 node->j_henkan_end_point - node->j_henkan_start_point ;
2028 }
2029 } else {
2030 node->j_okurigana_offset =
2031 node->j_henkan_end_point - node->j_henkan_start_point ;
2032 }
2033 /* ñ����Ͽ�λ��˻Ȥ���������¸���Ƥ�����*/
2034 strcpy( node->j_henkan_key2, node->j_henkan_key ) ;
2035 strcpy( node->j_search_key, node->j_henkan_key ) ;
2036 /* ���ơ��Ѵ���Ԥ��ޤ���*/
2037 j_henkan( gw, node ) ;
2038 }
2039 return 0 ;
2040 }
2041
2042
2043 /*
2044 * ����������֤�ʸ������������ؿ���
2045 * ----
2046 * ��������skkή��ʸ������������ΤǤ��ꡢ���줬 j_insert �ȰۤʤäƤ��롣
2047 * j_insert �� emacs-lisp �� insert ��ǰƬ���֤��ƺ�ä��ؿ��ʤΤǤ��롣
2048 */
j_self_insert(Widget gw,struct SKKInputNode * node,int chara)2049 static int j_self_insert
2050 ( Widget gw, struct SKKInputNode *node, int chara )
2051 {
2052 SkkInputWidget w = ( SkkInputWidget )gw ;
2053
2054 if( chara < 0 || chara > 128 || w->skkinput.skk_input_vector == NULL )
2055 return 1 ;
2056
2057 /* �Ѵ�ư����ʤ���ꤹ�롣*/
2058 if( node->j_henkan_on == True )
2059 j_kakutei( gw, node ) ;
2060 /* ���������Ϥˤ�겾̾prefix�γ���Ȥ������Ȥ������롣*/
2061 if( j_kakutei_kana_mode( gw, node, chara ) )
2062 return 0 ;
2063
2064 /* ���Ѵ��ơ��֥���˵��Ҥ�����ʤ�С���������Ѥ��롣*/
2065 if( w->skkinput.skk_input_vector[ chara ] != NULL ){
2066 j_insert_str( node, node->cur_pos,
2067 w->skkinput.skk_input_vector[ chara ] ) ;
2068 } else {
2069 /* ����ʳ��� default �� keymap �˽����ȤΤ��ȤǤ��롣*/
2070 j_insert_chara( node, node->cur_pos, chara ) ;
2071 }
2072 return 0 ;
2073 }
2074
j_insert_zenkaku(Widget gw,struct SKKInputNode * node,int pos,int chara)2075 static int j_insert_zenkaku
2076 ( Widget gw, struct SKKInputNode *node, int pos, int chara )
2077 {
2078 SkkInputWidget w = ( SkkInputWidget )gw ;
2079
2080 if( chara < 0 || chara > 128 || w->skkinput.skk_zenkaku_vector == NULL )
2081 return 1 ;
2082 /* ���Ѵ��ơ��֥���˵��Ҥ�����ʤ�С���������Ѥ��롣*/
2083 if( w->skkinput.skk_zenkaku_vector[ chara ] != NULL ){
2084 j_insert_str( node, node->cur_pos,
2085 w->skkinput.skk_zenkaku_vector[ chara ] ) ;
2086 }
2087 return 0 ;
2088 }
2089
2090 /*
2091 * ���������Ϥ� client ������Ĥ����Ȥ�Ԥ���( = ���ԡ� )
2092 */
j_newline(Widget gw,struct SKKInputNode * node)2093 static int j_newline( Widget gw, struct SKKInputNode *node )
2094 {
2095 SkkInputWidget w = ( SkkInputWidget )gw ;
2096 struct SKKInputNode *pNode = node->parentbuffer ;
2097 int len ;
2098 unsigned char buffer[ 3 ] ;
2099 unsigned char j_toroku_string[ TEXTBUFSIZE ] ;
2100 struct SKKTangoInfo jtango ;
2101
2102 /* �Ѵ�������⤷���ϲ�̾���Ϥ�����Ǥ���ʤ�С����ꤹ�롣���� *
2103 * ��������������Х��ȷϥ����ɤ����ϥ⡼�ɤʤ顢����ư��Ϥʤ���*/
2104 if( node->j_mode ){
2105 int flag = node->j_henkan_mode ;
2106 j_kakutei( gw, node ) ;
2107 /* ����� "n" �ʤ�ƤΤ����äƤ����顢"��"�˳��ꤷ�ʤ����ܡ� *
2108 * �Ǥ⡢"nn" �Ȥ� rom-kana-rule-list ��Ҥ�ɬ�פϤʤ���¿ʬ�� *
2109 * ��äơ������� "\0" �ˤʤäƤ��롣*/
2110 j_kakutei_kana_mode( gw, node, '\0' ) ;
2111 /* ����Τߤ� j_newline ��¸�ߤ�����Τʤ顢�Ѵ��⡼�ɤˤϤ��ä� *
2112 * �����顢�Ƥ˳Ѥޤ����ꤹ��Ĥäơ�����äƿƤ����Ǥ�ä��ߤ� *
2113 * ���� */
2114 if( flag && w->skkinput.egg_like_newline )
2115 return 0 ;
2116 }
2117 /* ���� newline �ϰ��ֿƤΥΡ��ɤǼ¹Ԥ��줿�ΤǤ������� */
2118 if( pNode == NULL ){
2119 /* Window �� Active �Ǥ��ä���硣*/
2120
2121 /* ��������ʸ��������Ƥ��������פʲ��Ԥ��ղä����Τ��˻ߤ� */
2122 /* �뤿��ˤ� chatadapter mode ��Ƚ�����˹Ԥ���*/
2123 save_ringbuffer
2124 ( w->skkinput.historybuffer, TEXTBUFSIZE,
2125 &w->skkinput.hist_start, &w->skkinput.hist_end,
2126 node->textbuffer ) ;
2127 w->skkinput.hist_cur = -1 ;
2128
2129 /* ʸ�����������Ϥ���Ƥ��ʤ����֤Ǥβ��ԥ����Ǥ��뤫���⤷���� *
2130 * ����åȥ����ץ��⡼�ɤʤ�С����ԥ����ɤ��ղä���롣*/
2131 if( strlen( node->textbuffer ) <= 0 || w->skkinput.chat_adapter ){
2132 strcat( node->textbuffer, "\n" ) ;
2133 }
2134 #if 1
2135 /* ʸ������������롣����������ʤ��Τǡ�������callback ��Ȥ���*/
2136 XtCallCallbacks( gw, XtNfixNotify, ( XtPointer )node->textbuffer ) ;
2137 #endif
2138 /* �ƥ����ȥХåե����������롣*/
2139 node->textbuffer[ 0 ] = '\0' ;
2140 /* �����������Ƭ�ؤȰ�ư�����롣*/
2141 node->cur_pos = 0 ;
2142 node->j_okurigana_start_point = -1 ;
2143 node->j_kana_start_point = -1 ;
2144 node->j_henkan_start_point = -1 ;
2145 node->j_henkan_end_point = -1 ;
2146 return 0 ;
2147 }
2148
2149 /* ���� newline �ϲ��褾�Υߥ˥Хåե��Ǽ¹Ԥ��줿�ΤǤ�����(�羸) */
2150
2151 switch( node->j_minibuff_usage ){
2152 /* �ߥ˥Хåե��Ǥ��Ѵ��˰ܤäƤ������ġ�*/
2153 case J_HENKAN_IN_MINIBUFF_MODE :
2154 /* �ߥ˥Хåե���Dz���ʸ�������Ϥ���Ƥ����Τʤ顢�����Ƥؤ� *
2155 * �֤��ʤ���Фʤ�ʤ����⤷�������Ϥ���Ƥ��ʤ��Τʤ顢�������� *
2156 * �Ϥ�Ĥ��Ƥ��ʤ��Ȥ����ʤ���*/
2157 if( node->textbuffer[ node->cur_pos_top ] != '\0' ){
2158 j_delete_region( pNode,
2159 pNode->j_henkan_start_point,
2160 pNode->j_henkan_end_point ) ;
2161 /* mini-buffer ��Ρ֢��������礦 �װʲ���ʸ����ä���ơ��� *
2162 * �ؤ��֤���*/
2163 strcpy( temporary_buffer, node->textbuffer + node->cur_pos_top ) ;
2164 #if 0
2165 j_insert_str( pNode, pNode->j_henkan_start_point,
2166 node->textbuffer + node->cur_pos_top ) ;
2167 #else
2168 j_insert_word
2169 ( gw, pNode, pNode->j_henkan_start_point, temporary_buffer ) ;
2170 #endif
2171 pNode->j_henkan_end_point = pNode->cur_pos ;
2172
2173 /* �����ǡ�����ι������ʤ���뤬...���ޤ�ư�����ʡ� */
2174 jtango.tangotype = 0 ;
2175 jtango.henkankey = ( pNode->j_okurigana_mode )?
2176 pNode->j_henkan_key : pNode->j_search_key ;
2177 /* ���Τޤ���Ͽ����Ƥ��ޤ��Ȥޤ�����ã�����뤫�⤷��ʤ��Τǽ� *
2178 * �����롣*/
2179 strcpy( j_toroku_string, node->textbuffer + node->cur_pos_top ) ;
2180 j_quote_char( j_toroku_string ) ;
2181 jtango.string = j_toroku_string ;
2182 jtango.okuri = pNode->j_okurigana_mode ;
2183 XtCallCallbacks( gw, XtNjtangotourokuNotify, &jtango ) ;
2184 pNode->j_current_henkan_vector_index = NULL ;
2185 /* �Ƹ椵��ϳ��ꤷ�ޤ���*/
2186 j_kakutei( gw, pNode ) ;
2187 } else {
2188 /* �ߥ˥Хåե��Ǥ��Ѵ��⡼�ɤ����äƤ��ʤ��顢���äȤ�ҥå� *
2189 * �����Τ�̵���ä����ν�����*/
2190 if( pNode->j_henkan_count == 0 && pNode->j_henkan_mode &&
2191 pNode->j_henkan_on ){
2192 /* ���ΤޤޤǤϤʤ����ؤȾ������ܤ����롣*/
2193 j_keyboard_quit_henkanrestart
2194 ( gw, pNode, pNode->j_okurigana_mode ) ;
2195 }
2196 }
2197 break ;
2198 case J_INPUT_BY_CODE_OR_MENU_MODE :
2199 len = strlen( node->textbuffer + node->cur_pos_top ) ;
2200 /* ʸ��������ʤ���С�������ȴ���롣*/
2201 if( len && len < 4 ){
2202 pNode->j_input_by_code_or_menu_mode = False ;
2203 break ;
2204 }
2205 /* ���ԥ����ɤ����ʤ��˥塼�����ϳμ¡�*/
2206 if( len ){
2207 unsigned char *ptr = node->textbuffer + node->cur_pos_top ;
2208 /* ���Ϥ��줿�Τ����֤ʤΤ���Ĵ�٤롣*/
2209 buffer[ 0 ] = j_char_to_hex( ptr[ 0 ] ) * 0x10
2210 + j_char_to_hex( ptr[ 1 ] ) ;
2211 buffer[ 1 ] = j_char_to_hex( ptr[ 2 ] ) * 0x10
2212 + j_char_to_hex( ptr[ 3 ] ) ;
2213 buffer[ 2 ] = '\0' ;
2214
2215 /* ����ʸ������̵�����¿���Ƥ�̵�뤷�Ƥ뤫��͡� */
2216 if( buffer[ 0 ] ){
2217 /* EUC ���������ɤ��Ѵ����롣*/
2218 buffer[ 0 ] |= 0x80 ;
2219 buffer[ 1 ] |= 0x80 ;
2220 /* ���ξ���ʸ��������Ƥ��ޤ��ġ�*/
2221 pNode->j_input_by_code_or_menu_mode = False ;
2222 j_insert_str( pNode, pNode->j_input_by_code_or_menu_point,
2223 buffer ) ;
2224 break ;
2225 }
2226 /* ����ϡ����� '00nn' ����������Τǥ�˥塼�⡼�ɤˤʤ롣*/
2227 buffer[ 1 ] |= 0x80 ;
2228 if( buffer[ 1 ] < j_code_n1_min )
2229 buffer[ 1 ] = j_code_n1_min ;
2230 if( buffer[ 1 ] > j_code_n1_max )
2231 buffer[ 1 ] = j_code_n1_max ;
2232 } else {
2233 buffer[ 1 ] = j_code_n1_min ;
2234 }
2235 pNode->j_input_by_code_or_menu_mode = True ;
2236 pNode->j_input_by_code_current_code = buffer[ 1 ] ;
2237 j_input_by_code_or_menu_jmp_showCandidate
2238 ( pNode, buffer[ 1 ] ) ;
2239 goto j_newline_exit1 ;
2240 case J_PURGE_YES_OR_NO_P :
2241 if( !strcmp( node->textbuffer + node->cur_pos_top, "yes" ) ){
2242 /* �Ƥθ������ܤ��Ƥ����Ѵ���������ä��롣*/
2243 XtCallCallbacks( gw, XtNjtangosakujoNotify, pNode ) ;
2244
2245 /* ɽ������Ƥ���֢�����פ�õ�롣*/
2246 j_delete_region
2247 ( pNode, pNode->j_henkan_start_point, pNode->j_henkan_end_point ) ;
2248 pNode->j_henkan_end_point = pNode->cur_pos ;
2249 pNode->j_current_henkan_vector_index = NULL ;
2250 /* �Ƹ椵��ϳ��ꤷ�ޤ���*/
2251 j_kakutei( gw, pNode ) ;
2252 }
2253 /* ���οͤ� purge �� no ���ä����ˤϲ��⤷�ޤ���*/
2254 break ;
2255 default :
2256 break ;
2257 }
2258 pNode->mtextbuffer[ 0 ] = '\0' ;
2259 j_newline_exit1:
2260 /* �ߥ˥Хåե������Ѥ���ߤ����Τǡ����ꥢ���롣*/
2261 skkinput_ClearMinibuffer( gw ) ;
2262 /* ���Υߥ˥Хåե������פˤʤä��Τǡ��������ޤ�����*/
2263 free_Minibuffer( gw, node ) ;
2264 /* �Ƥ˥���������֤��ޤ��礦��*/
2265 pNode->cur_exist = True ;
2266 return 0 ;
2267 }
2268
2269 /*
2270 * ��̾���Ϥ�������ä����ˡ����β�̾�ץ�ե������������������ؿ���
2271 */
j_delete_kanaprefix(struct SKKInputNode * node)2272 static void j_delete_kanaprefix( struct SKKInputNode *node )
2273 {
2274 /* �Ѵ���ʤ����ˤ��Ƥ��ޤ���*/
2275 if( node->j_kana_mode ){
2276 /* ��̾���Ϥ������ 'n' �ν������ĤäƤ�����硣*/
2277 /* ��̾���Ϥ� 'n' �Ǥ��äƤ⡢������*��n �Ȥ������֤�¸�ߤǤ� *
2278 * ��Τ���ա� */
2279 if( node->j_prefix[ 0 ] == 'n' && node->j_prefix[ 1 ] == '\0' ){
2280 j_n_convert_to_kana( node ) ;
2281 } else {
2282 delete_char( node, node->j_kana_start_point,
2283 node->cur_pos - node->j_kana_start_point ) ;
2284 }
2285 /* ��̾������ʤ饭��뤷�Ƥ��ޤ���*/
2286 node->j_kana_mode = False ;
2287 node->j_prefix[ 0 ] = '\0' ;
2288 }
2289 return ;
2290 }
2291
2292 /*
2293 * �����䴰�ײ���ߤ�ؿ��ǤϤʤ��ơ�ʸ������䴰��Ԥ��ؿ���
2294 */
j_try_completion(Widget gw,struct SKKInputNode * node)2295 static int j_try_completion( Widget gw, struct SKKInputNode *node )
2296 {
2297 int length, startpos, endpos ;
2298 SkkInputWidget w = ( SkkInputWidget )gw ;
2299
2300 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
2301 j_delete_kanaprefix( node ) ;
2302
2303 /* �Ѵ�����ư���Ԥä���Ǥ��ꡢ�ºݤ��Ѵ������ڹԤ��Ƥ��ʤ��� *
2304 * �ʤ顢completion �����Ϥ��롣*/
2305 if( node->j_henkan_mode && !node->j_henkan_on ){
2306 if( node->cur_pos < node->j_henkan_start_point ){
2307 startpos = node->cur_pos ;
2308 endpos = node->j_henkan_start_point ;
2309 } else {
2310 startpos = node->j_henkan_start_point ;
2311 endpos = node->cur_pos ;
2312 }
2313 length = endpos - startpos ;
2314 /* �䴰���褦�Ȥ���ʸ����Ĺ������ä��顣*/
2315 if( length <= 0 ){
2316 err_msg( node, "Cannot complete an empty string!" ) ;
2317 return 1 ;
2318 }
2319 /* ��괺����������������֤��Ѵ����ϰ��֤δ֤�ʸ�����ȴ���Ф���*/
2320 strncpy( node->j_henkan_key,
2321 node->textbuffer + startpos, length ) ;
2322 node->j_henkan_key[ length ] = '\0' ;
2323 /* completion �ˤ����Ƥߤ�Ĥ��Υ��르�ꥺ��Ϸ빽��äƤ��롣*
2324 * (^^;; */
2325 XtCallCallbacks( gw, XtNjcompletionNotify, node ) ;
2326 /* ��Ĥ�ҥåȤ��ޤ���Ǥ�����(^^;;; */
2327 if( !node->j_completion_mode ){
2328 err_msg( node, "No completions for \"%s\"", node->j_henkan_key ) ;
2329 return 1 ;
2330 }
2331 /* ��괺�����Ѵ����ϰ��֤��饫��������֤ޤǤ�ɽ������Ƥ���ʸ *
2332 * �����õ�롣*/
2333 j_delete_region( node, startpos, endpos ) ;
2334 /* �䴰�Ǥ���ʸ�����ȴ���Ф���*/
2335 copyCandidate( temporary_buffer,
2336 ( node->j_current_completion_vector_index )->node,
2337 ( node->j_current_completion_vector_index )->position,
2338 TEXTMAXLEN ) ;
2339 j_insert_str( node, startpos, temporary_buffer ) ;
2340 } else {
2341 /* �������������������롣*/
2342 for( length = 0 ; length < w->skkinput.tab_width ; length ++ )
2343 j_insert_chara( node, node->cur_pos, ' ' ) ;
2344 }
2345 return 0 ;
2346 }
2347
2348 /*
2349 * ����������֤Υ����ɤ�ɽ������ؿ���
2350 *-----
2351 */
j_display_code_for_char_at_point(struct SKKInputNode * node)2352 static int j_display_code_for_char_at_point( struct SKKInputNode *node )
2353 {
2354 j_delete_kanaprefix( node ) ;
2355 /* �����Ǥʤ��줿��硣*/
2356 if( node->textbuffer[ node->cur_pos ] == '\0' ){
2357 err_msg( node, "Cursor is at the end of the buffer." ) ;
2358 return 1 ;
2359 }
2360 /* ����ʤ��Ȥ�̵���Ȼפ����ɡ�����Ϥͤ롣*/
2361 if( node->cur_pos < node->cur_pos_top ){
2362 node->cur_pos = node->cur_pos_top ;
2363 return 0 ;
2364 }
2365 /* ���������ɤʤΤ��ʤ��� �����ʤΤ��ʤ��� �ۤ�Ȥ��ΤȤ���Ϥɤ� *
2366 * �ʤΤ��ʤ��� */
2367 if( node->textbuffer[ node->cur_pos ] & 0x80 ){
2368 unsigned int c1, c2, c11, c12 ;
2369 c1 = node->textbuffer[ node->cur_pos ] ;
2370 c2 = node->textbuffer[ node->cur_pos + 1 ] ;
2371 c11 = c1 & (~0x80) ;
2372 c12 = c2 & (~0x80) ;
2373 sprintf
2374 ( node->mtextbuffer,
2375 "��%c%c�� EUC: %02x%02x (%3d, %3d), JIS: %02x%02x (%3d, %3d)",
2376 c1, c2, c1, c2, c1, c2, c11, c12, c11, c12 ) ;
2377 } else {
2378 unsigned int c = node->textbuffer[ node->cur_pos ] ;
2379 sprintf( node->mtextbuffer, "\"%c\" %02x (%3d)", c, c, c ) ;
2380 }
2381 return 0 ;
2382 }
2383
2384 /*
2385 * ľ�ܥ��������Ϥ�Ԥ��ؿ���
2386 */
j_input_by_code_or_menu_start(Widget gw,struct SKKInputNode * node)2387 static int j_input_by_code_or_menu_start
2388 ( Widget gw, struct SKKInputNode *node )
2389 {
2390 j_delete_kanaprefix( node ) ;
2391 /* ���ߤΥ���������֤����롣*/
2392 node->j_input_by_code_or_menu_point = node->cur_pos ;
2393 /* �ߥ˥Хåե������Ѥ��ơ�ʸ��������Ϥ����롣*/
2394 j_read_string( gw, node,
2395 "JIS or EUC code (00nn or CR for Jump Menu): ",
2396 J_INPUT_BY_CODE_OR_MENU_MODE ) ;
2397 return 0 ;
2398 }
2399
2400 /*
2401 * "/" �ˤ���Ѵ���
2402 */
j_abbrev_input(Widget gw,struct SKKInputNode * node,int rchara)2403 static int j_abbrev_input
2404 ( Widget gw, struct SKKInputNode *node, int rchara )
2405 {
2406 if( node->j_henkan_mode && !node->j_henkan_on ){
2407 err_msg( node, "Already in �� mode" ) ;
2408 return 1 ;
2409 }
2410 j_kakutei( gw, node ) ;
2411 j_set_henkan_point_subr( gw, node, rchara ) ;
2412 node->j_abbrev = True ;
2413 return 0 ;
2414 }
2415
2416 /*
2417 * Ϳ����줿���֤��饫������̤�������������ư������ؿ���
2418 * ---------
2419 * ���Τޤޡ�Control-F �ν������б����Ƥ��롣
2420 */
j_forward_char(struct SKKInputNode * node)2421 static int j_forward_char( struct SKKInputNode *node )
2422 {
2423 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
2424 j_delete_kanaprefix( node ) ;
2425 /* ����������ư�����롣*/
2426 node->cur_pos = calc_forward_char( node, node->cur_pos, 1 ) ;
2427 return 0 ;
2428 }
2429
2430 /*
2431 * Ϳ����줿���֤��饫������̤�������������᤹�ؿ���
2432 * ---------
2433 * ���Τޤޡ�Control-B �ν������б����Ƥ��롣
2434 */
j_backward_char(struct SKKInputNode * node)2435 static int j_backward_char( struct SKKInputNode *node )
2436 {
2437 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
2438 j_delete_kanaprefix( node ) ;
2439 /* ����������ư�����롣*/
2440 if( node->cur_pos > node->cur_pos_top ){
2441 node->cur_pos -- ;
2442 if( ( node->textbuffer[ node->cur_pos ] & 0x80 ) &&
2443 node->cur_pos > node->cur_pos_top )
2444 node->cur_pos -- ;
2445 }
2446 return 0 ;
2447 }
2448
2449 /*
2450 * ����������֤�ʸ�������ä���ؿ���
2451 *----
2452 * ���͡��äˤʤ���
2453 */
j_delete_char(struct SKKInputNode * node)2454 static int j_delete_char( struct SKKInputNode *node )
2455 {
2456 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
2457 j_delete_kanaprefix( node ) ;
2458 delete_char( node, node->cur_pos, 1 ) ;
2459 return 0 ;
2460 }
2461
2462 /*
2463 * ������������Υ��������ä���ؿ���
2464 */
delete_backward_char(Widget gw,struct SKKInputNode * node)2465 static int delete_backward_char( Widget gw, struct SKKInputNode *node )
2466 {
2467 /* ��������ϥХåե�����Ƭ�ޤ���Ƥ���ΤǤ����� */
2468 if( node->cur_pos > node->cur_pos_top ){
2469 /* �Хåե�����Ƭ�ޤǤ���Ƥ��ޤ���Τǡ���������᤻�ޤ���*/
2470 node->cur_pos -- ;
2471 if( node->cur_pos > node->cur_pos_top &&
2472 ( node->textbuffer[ node->cur_pos ] & 0x80 ) )
2473 node->cur_pos -- ;
2474 /* �ᤷ���Ȥ���ǡ����ξ���ɽ������Ƥ���ʸ����ä��ޤ���*/
2475 delete_char( node, node->cur_pos, 1 ) ;
2476 } else {
2477 /* ���ֿƤ��ä��ꤷ�����ˤϡ��Хå����ڡ������᤹��*/
2478 if( node->parentbuffer == NULL ){
2479 /* �����������ᤷ�ޤ��礦��*/
2480 SKIW_SendbackKeyPress( gw ) ;
2481 }
2482 }
2483 return 0 ;
2484 }
2485
2486 /*
2487 * comma ����������ؿ���
2488 *-----
2489 * j_completion ��������������ʽ���������Τ����������ε�ǽ��
2490 * ����ͽ��Ϥʤ��Τǡ��ڡ�
2491 */
j_insert_comma(Widget gw,struct SKKInputNode * node)2492 static int j_insert_comma( Widget gw, struct SKKInputNode *node )
2493 {
2494 int startpos ;
2495 /* �����䴰�ײ�¹���ʤ�Сġ�*/
2496 if( node->j_completion_mode ){
2497 /* ��Ϥ䤳��ʾ����Ϥʤ���*/
2498 if( node->j_current_completion_vector_index == NULL ){
2499 err_msg( node, "No previous completions." ) ;
2500 return 1 ;
2501 }
2502 /* ������θ�������ơġ�*/
2503 node->j_current_completion_vector_index =
2504 node->j_current_completion_vector_index->prev ;
2505 startpos = ( node->j_henkan_start_point < node->cur_pos )?
2506 node->j_henkan_start_point : node->cur_pos ;
2507 if( node->j_current_completion_vector_index != NULL ){
2508 j_delete_region
2509 ( node, node->j_henkan_start_point, node->cur_pos ) ;
2510 /* �䴰�Ǥ���ʸ�����ȴ���Ф���*/
2511 copyCandidate( temporary_buffer,
2512 ( node->j_current_completion_vector_index )->node,
2513 ( node->j_current_completion_vector_index )->position,
2514 TEXTMAXLEN ) ;
2515 j_insert_str( node, startpos, temporary_buffer ) ;
2516 return 0 ;
2517 } else {
2518 /* �䴰���������ʸ�����ɽ������ġ��¤Ϥ���Ǥ��Խ�ʬ�ʤΤ�����*/
2519 j_delete_region
2520 ( node, node->j_henkan_start_point, node->cur_pos ) ;
2521 j_insert_str( node, startpos, node->j_henkan_key ) ;
2522 return 0 ;
2523 }
2524 }
2525 return j_self_insert( gw, node, ',' ) ;
2526 }
2527
j_abbrev_comma(Widget gw,struct SKKInputNode * node)2528 static int j_abbrev_comma( Widget gw, struct SKKInputNode *node )
2529 {
2530 int startpos ;
2531 /* �����䴰�ײ�¹���ʤ�Сġ�*/
2532 if( node->j_completion_mode ){
2533 /* ��Ϥ䤳��ʾ����Ϥʤ���*/
2534 if( node->j_current_completion_vector_index == NULL ){
2535 err_msg( node, "No previous completions." ) ;
2536 return 1 ;
2537 }
2538 /* ������θ�������ơġ�*/
2539 node->j_current_completion_vector_index =
2540 node->j_current_completion_vector_index->prev ;
2541 startpos = ( node->j_henkan_start_point < node->cur_pos )?
2542 node->j_henkan_start_point : node->cur_pos ;
2543 if( node->j_current_completion_vector_index != NULL ){
2544 j_delete_region
2545 ( node, node->j_henkan_start_point, node->cur_pos ) ;
2546 /* �䴰�Ǥ���ʸ�����ȴ���Ф���*/
2547 copyCandidate( temporary_buffer,
2548 ( node->j_current_completion_vector_index )->node,
2549 ( node->j_current_completion_vector_index )->position,
2550 TEXTMAXLEN ) ;
2551 j_insert_str( node, startpos, temporary_buffer ) ;
2552 return 0 ;
2553 } else {
2554 /* �䴰���������ʸ�����ɽ������ġ��¤Ϥ���Ǥ��Խ�ʬ�ʤΤ�����*/
2555 j_delete_region
2556 ( node, node->j_henkan_start_point, node->cur_pos ) ;
2557 j_insert_str( node, startpos, node->j_henkan_key ) ;
2558 return 0 ;
2559 }
2560 }
2561 return j_insert_chara( node, node->cur_pos, ',' ) ;
2562 }
2563
2564 /*
2565 * period ����������ؿ���
2566 *-----
2567 * j_completion ��������������ʽ���������Τ����������ε�ǽ��
2568 * ����ͽ��Ϥʤ��Τǡ��ڡ�
2569 */
j_insert_period(Widget gw,struct SKKInputNode * node)2570 static int j_insert_period( Widget gw, struct SKKInputNode *node )
2571 {
2572 int startpos ;
2573 /* �����䴰�ײ�¹���ʤ�Сġ�*/
2574 if( node->j_completion_mode ){
2575 /* ������Ƭ����Ƭ��ؤ��Ƥ���Τʤ顢�ǽ���䴰��̤ˤ��碌�롣*/
2576 if( node->j_current_completion_vector_index == NULL ){
2577 node->j_current_completion_vector_index =
2578 node->j_completion_vector_index_top ;
2579 } else {
2580 /* ����ʾ弡�θ����ɽ�����뤳�Ȥϲ�ǽ�Ǥ����� */
2581 if( node->j_current_completion_vector_index->next == NULL ){
2582 err_msg( node, "No more completions." ) ;
2583 return 1 ;
2584 }
2585 /* �����䴰��̤˰�ư���ޤ��礦��*/
2586 node->j_current_completion_vector_index =
2587 node->j_current_completion_vector_index->next ;
2588 }
2589 j_delete_region
2590 ( node, node->j_henkan_start_point, node->cur_pos ) ;
2591 /* �䴰�Ǥ���ʸ�����ȴ���Ф���*/
2592 copyCandidate( temporary_buffer,
2593 ( node->j_current_completion_vector_index )->node,
2594 ( node->j_current_completion_vector_index )->position,
2595 TEXTMAXLEN ) ;
2596 startpos = ( node->j_henkan_start_point < node->cur_pos )?
2597 node->j_henkan_start_point : node->cur_pos ;
2598 j_insert_str( node, startpos, temporary_buffer ) ;
2599 return 0 ;
2600 }
2601 return j_self_insert( gw, node, '.' ) ;
2602 }
2603
j_abbrev_period(Widget gw,struct SKKInputNode * node)2604 static int j_abbrev_period( Widget gw, struct SKKInputNode *node )
2605 {
2606 int startpos ;
2607 /* �����䴰�ײ�¹���ʤ�Сġ�*/
2608 if( node->j_completion_mode ){
2609 /* ������Ƭ����Ƭ��ؤ��Ƥ���Τʤ顢�ǽ���䴰��̤ˤ��碌�롣*/
2610 if( node->j_current_completion_vector_index == NULL ){
2611 node->j_current_completion_vector_index =
2612 node->j_completion_vector_index_top ;
2613 } else {
2614 /* ����ʾ弡�θ����ɽ�����뤳�Ȥϲ�ǽ�Ǥ����� */
2615 if( node->j_current_completion_vector_index->next == NULL ){
2616 err_msg( node, "No more completions." ) ;
2617 return 1 ;
2618 }
2619 /* �����䴰��̤˰�ư���ޤ��礦��*/
2620 node->j_current_completion_vector_index =
2621 node->j_current_completion_vector_index->next ;
2622 }
2623 j_delete_region
2624 ( node, node->j_henkan_start_point, node->cur_pos ) ;
2625 /* �䴰�Ǥ���ʸ�����ȴ���Ф���*/
2626 copyCandidate( temporary_buffer,
2627 ( node->j_current_completion_vector_index )->node,
2628 ( node->j_current_completion_vector_index )->position,
2629 TEXTMAXLEN ) ;
2630 startpos = ( node->j_henkan_start_point < node->cur_pos )?
2631 node->j_henkan_start_point : node->cur_pos ;
2632 j_insert_str( node, startpos, temporary_buffer ) ;
2633 return 0 ;
2634 }
2635 return j_insert_chara( node, node->cur_pos, '.' ) ;
2636 }
2637
2638 /*
2639 * �����������դ����Ϥ���ؿ���
2640 */
j_today(Widget gw,struct SKKInputNode * node)2641 static int j_today( Widget gw, struct SKKInputNode *node )
2642 {
2643 SkkInputWidget w = ( SkkInputWidget )gw ;
2644 static char *skk_week_alist[] = {
2645 "��", "��", "��", "��", "��", "��", "��",
2646 } ;
2647 time_t tval ;
2648 int year ;
2649 unsigned char buffer[ TEXTBUFSIZE ] ;
2650 unsigned char *sptr, *dptr ;
2651 #if 0
2652 struct my_tm lt ;
2653 #else
2654 struct tm *lt ;
2655 #endif
2656
2657 j_delete_kanaprefix( node ) ;
2658
2659 /* 1970/1/1����ηв��������롣*/
2660 if( time( &tval ) == -1 )
2661 return 1 ;
2662
2663 /* time_t ���� struct tm * ���Ѵ����롣*/
2664 #if 0
2665 lt = my_localtime( ( unsigned long long int )tval ) ;
2666 #else
2667 lt = localtime( &tval ) ;
2668 #endif
2669 /* ����ǯ�β�����������Ǥ��뤫�����롣*/
2670 #if 0
2671 sprintf( temporary_buffer, "%d", lt.year ) ;
2672 year = lt.year ;
2673 #else
2674 sprintf( temporary_buffer, "%d", lt->tm_year + 1900 ) ;
2675 year = lt->tm_year + 1900 ;
2676 #endif
2677 if( !w->skkinput.date_ad ){
2678 /* ǯ�����롣*/
2679 if( year <= 1867 ){
2680 strcpy( buffer, "����" ) ;
2681 } else if( year < 1911 ){
2682 year -= 1867 ;
2683 strcpy( buffer, "����" ) ;
2684 } else if( year < 1925 ){
2685 year -= 1911 ;
2686 strcpy( buffer, "����" ) ;
2687 } else if( year < 1988 ){
2688 year -= 1925 ;
2689 strcpy( buffer, "����" ) ;
2690 } else {
2691 year -= 1988 ;
2692 strcpy( buffer, "ʿ��" ) ;
2693 }
2694 dptr = buffer + j_kanji_length * 2 ;
2695 sprintf( temporary_buffer, "%d", year ) ;
2696 } else {
2697 /* ǯ���̵���ˤʤ롣*/
2698 buffer[ 0 ] = '\0' ;
2699 dptr = buffer ;
2700 }
2701 if( year == 1 && w->skkinput.date_ad ){
2702 strcat( dptr, "��ǯ" ) ;
2703 } else {
2704 /* ǯ��Ÿ�����롣*/
2705 j_num_exp
2706 ( temporary_buffer, w->skkinput.number_style + '0', dptr ) ;
2707 strcat( dptr, "ǯ" ) ;
2708 /* �դ����줿ʸ����ΰ��ֺǸ�ؤȰ�ư���롣*/
2709 while( *dptr != '\0' )
2710 dptr ++ ;
2711 }
2712 /* ����ǯ�β�����������Ǥ��뤫�����롣*/
2713 #if 0
2714 sprintf( temporary_buffer, "%d", lt.month + 1 ) ;
2715 #else
2716 sprintf( temporary_buffer, "%d", lt->tm_mon + 1 ) ;
2717 #endif
2718 sptr = temporary_buffer ;
2719 while( *sptr == 0x20 && *sptr != '\0' )
2720 sptr ++ ;
2721 /* ���Ÿ�����롣*/
2722 j_num_exp( sptr, w->skkinput.number_style + '0', dptr ) ;
2723 strcat( dptr, "��" ) ;
2724 /* �դ����줿ʸ����ΰ��ֺǸ�ؤȰ�ư���롣*/
2725 while( *dptr != '\0' )
2726 dptr ++ ;
2727 #if 0
2728 sprintf( temporary_buffer, "%d", lt.day + 1 ) ;
2729 #else
2730 sprintf( temporary_buffer, "%d", lt->tm_mday ) ;
2731 #endif
2732 sptr = temporary_buffer ;
2733 while( *sptr == 0x20 && *sptr != '\0' )
2734 sptr ++ ;
2735 /* ����Ÿ�����롣*/
2736 j_num_exp( sptr, w->skkinput.number_style + '0', dptr ) ;
2737 strcat( dptr, "��" ) ;
2738 /* �դ����줿ʸ����ΰ��ֺǸ�ؤȰ�ư���롣*/
2739 while( *dptr != '\0' )
2740 dptr ++ ;
2741 /* ��������*/
2742 strcat( buffer, "(" ) ;
2743 #if 0
2744 strcat( buffer, skk_week_alist[ lt.week ] ) ;
2745 #else
2746 strcat( buffer, skk_week_alist[ lt->tm_wday ] ) ;
2747 #endif
2748 strcat( buffer, ")" ) ;
2749 /* ����ʸ������������롣*/
2750 j_insert_str( node, node->cur_pos, buffer ) ;
2751 return 0 ;
2752 }
2753
2754 /*
2755 * ���ꤵ�줿�ϰ����ʸ�����Ⱦ�Ѥ������Ѥ��Ѵ�����ؿ���
2756 */
j_zenkaku_region(struct SKKInputNode * node,int startpoint,int endpoint)2757 static int j_zenkaku_region
2758 ( struct SKKInputNode *node, int startpoint, int endpoint )
2759 {
2760 char *sptr, *ptr ;
2761 int pos ;
2762
2763 if( startpoint > endpoint ){
2764 err_msg( node, "Henkan end point must be after henkan start point." ) ;
2765 return 0 ;
2766 }
2767 sptr = node->textbuffer + startpoint ;
2768 ptr = temporary_buffer ;
2769 for( pos = startpoint ; pos < endpoint ; pos ++ ){
2770 if( *sptr == '\0' )
2771 break ;
2772 if( *sptr >= 'a' && *sptr <= 'z' ){
2773 *ptr ++ = 0xA3 ;
2774 *ptr ++ = ( *sptr ++ ) - 'a' + 0xE1 ;
2775 continue ;
2776 } else if( *sptr >= 'A' && *sptr <= 'Z' ){
2777 *ptr ++ = 0xA3 ;
2778 *ptr ++ = ( *sptr ++ ) - 'A' + 0xC1 ;
2779 continue ;
2780 }
2781 *ptr ++ = *sptr ++ ;
2782 }
2783 *ptr = '\0' ;
2784 j_delete_region( node, startpoint, endpoint ) ;
2785 j_insert_str( node, startpoint, temporary_buffer ) ;
2786 return 0 ;
2787 }
2788
j_zenkaku_henkan(Widget gw,struct SKKInputNode * node)2789 int j_zenkaku_henkan( Widget gw, struct SKKInputNode *node )
2790 {
2791 if( node->j_henkan_mode && !node->j_henkan_on ){
2792 node->j_mode = True ;
2793 if( node->j_henkan_start_point > node->cur_pos ){
2794 err_msg( node, "Henkan end point must be after henkan start point." ) ;
2795 return 1 ;
2796 }
2797 j_zenkaku_region( node, node->j_henkan_start_point, node->cur_pos ) ;
2798 j_kakutei( gw, node ) ;
2799 }
2800 return 0 ;
2801 }
2802
2803 /*
2804 * ���ꤵ�줿�ΰ��ʿ��̾���Ҳ�̾���Ѵ�����ؿ��Ǥ��롣
2805 * ----
2806 * arg �����Ϥ��줿�����ο��Ȥ������Τ� emacs-lisp ���ä����ˤ����äƤ����
2807 * �Ǥ�����ɡ����ε�ǽ�Υ��ݡ��Ȥ���ʬ��Ǥ���Τǡ�̵�뤷�ƺ��ޤ���
2808 */
j_katakana_region(struct SKKInputNode * node,int startpoint,int endpoint,int flag)2809 static int j_katakana_region
2810 ( struct SKKInputNode *node, int startpoint, int endpoint, int flag )
2811 {
2812 const unsigned short diff = 256 ;
2813 char *sptr, *ptr ;
2814 int pos ;
2815 unsigned short prev_chara = 0, kanji_code ;
2816 int kanji_flag ;
2817
2818 #ifdef DEBUG_AGAIN
2819 fprintf( stderr, "j-katakana-region ( %d, %d )\n", startpoint, endpoint ) ;
2820 #endif
2821
2822 if( startpoint > endpoint ){
2823 err_msg( node, "Henkan end point must be after henkan start point." ) ;
2824 return 0 ;
2825 }
2826
2827 sptr = node->textbuffer + startpoint ;
2828 ptr = temporary_buffer ;
2829 kanji_flag = False ;
2830 for( pos = startpoint ; pos < endpoint ; pos ++ ){
2831 /* �������ä����ˤ�...*/
2832 if( 0x80 & ( *sptr ) ){
2833 if( kanji_flag ){
2834 kanji_code = ( ( unsigned char )*sptr ) | ( prev_chara << 8 ) ;
2835 if( kanji_code >= 0xA4A1 && kanji_code <= 0xA4F3 ){
2836 kanji_code += ( unsigned short )diff ;
2837 *ptr ++ = ( kanji_code >> 8 ) ;
2838 *ptr ++ = ( kanji_code & 0x00FF ) ;
2839 sptr ++ ;
2840 } else {
2841 *ptr ++ = prev_chara ;
2842 *ptr ++ = *sptr ++ ;
2843 }
2844 kanji_flag = False ;
2845 } else {
2846 prev_chara = ( unsigned char )*sptr ++ ;
2847 kanji_flag = True ;
2848 }
2849 } else {
2850 *ptr ++ = *sptr ++ ;
2851 kanji_flag = False ;
2852 }
2853 }
2854 *ptr = '\0' ;
2855
2856 #ifdef DEBUG_AGAIN
2857 fprintf( stderr, "j-katakana-region : tmp_buffer = \"%s\".\n",
2858 temporary_buffer ) ;
2859 #endif
2860
2861 if( flag == False ){
2862
2863 /* �����Ǥϡ��֤����פ���֥��פ��Ѵ����Ԥ��ʤ����ᡢʸ�����Ĺ������ *
2864 * �����ʤ��Ȥ������꤬��Ω���롣��äơ������ʤ��ִ���������ס� */
2865 ptr = node->textbuffer + startpoint ;
2866 sptr = temporary_buffer ;
2867 while( *sptr != '\0' )
2868 *ptr ++ = *sptr ++ ;
2869
2870 } else {
2871 ptr = node->textbuffer + startpoint ;
2872 sptr = temporary_buffer ;
2873 kanji_flag = False ;
2874
2875 pos = 0 ;
2876 while( *sptr != '\0' ){
2877 if( ( 0x80 & ( *sptr ) ) && kanji_flag == False ){
2878 /* �������ä����ˤ���դ�ɬ�פǤ��롣*/
2879 if( !strncmp( sptr, "����", 4 ) ){
2880 *ptr ++ = 0xA5 ;
2881 *ptr ++ = 0xF4 ;
2882 sptr += strlen( "����" ) ;
2883 pos ++ ;
2884 pos ++ ;
2885 continue ;
2886 }
2887 *ptr ++ = *sptr ++ ;
2888 kanji_flag = True ;
2889
2890 } else {
2891 /* ������2�Х����ܡ��⤷���Ϥ���ʳ���ʸ����*/
2892 *ptr ++ = *sptr ++ ;
2893 kanji_flag = False ;
2894 }
2895 }
2896 /* �ºݤ�û���ʤä��Τ��ɤ������ǧ���롣*/
2897 if( pos == 0 )
2898 return 0 ;
2899
2900 sptr = node->textbuffer + endpoint ;
2901 while( *sptr != '\0' )
2902 *ptr ++ = *sptr ++ ;
2903 *ptr = '\0' ;
2904
2905 move_marker_ByDeleteRegion( node, startpoint, startpoint + pos ) ;
2906 }
2907 return 0 ;
2908 }
2909
2910 /*
2911 * ��̾�⡼�ɤ��Ҳ�̾�⡼�ɤ��ڤ��ؤ���ؿ���
2912 *-----
2913 * �����ΰ����ˤϡ�ESC �����פˤ�륳�ޥ�ɤ����Ϥ��줿�������ä���롣
2914 * �Ǥ⡢���ߤ��ε�ǽ�ݡ��Ȥ���ͽ��Ϥʤ��Τǡ������ˤ� NULL ����
2915 * �ä����äƤ��뤳�ȤǤ��餦��
2916 */
j_toggle_kana(Widget gw,struct SKKInputNode * node,int arg,int chara)2917 static int j_toggle_kana
2918 ( Widget gw, struct SKKInputNode *node, int arg, int chara )
2919 {
2920 /* "q" �˳������� rule-list ��̵�����ͤ��롣*/
2921 if( j_kakutei_kana_mode( gw, node, chara ) )
2922 return 0 ;
2923 if( node->j_henkan_mode && !node->j_henkan_on ){
2924 /* �Ѵ������ʤ�С��Ҳ�̾���Ѵ������֤������겾̾�⡼�ɤʤ��̵�롣*/
2925 if( !node->j_katakana_mode ){
2926 j_katakana_region
2927 ( node, node->j_henkan_start_point, node->cur_pos, True ) ;
2928 j_kakutei( gw, node ) ;
2929 }
2930 } else {
2931 /* ����ʳ��ξ����ä��顢�Ҳ�̾�⡼�ɤȲ�̾�⡼�ɤ��ڤ��ؤ��롣*/
2932 j_kakutei( gw, node ) ;
2933 node->j_katakana_mode = !node->j_katakana_mode ;
2934 /* �⡼�ɥ饤��(�����ˡݥ��ʡݤȤ�ɽ������)���ѹ��Ϥޤ�̵����*/
2935 /* j_change_mode_line() ; */
2936 }
2937 return 0 ;
2938 }
2939
2940 /*
2941 * �Ѵ�������⤷���ϲ�̾���Ϥ�����ʤ�г���ε�ǽ��Ԥ����ѿ��⡼�ɤʤ�
2942 * ������̾���ϥ⡼�ɤؤȰܹԤ�����ؿ���
2943 */
j_kanainput_mode_on(Widget gw,struct SKKInputNode * node)2944 static int j_kanainput_mode_on( Widget gw, struct SKKInputNode *node )
2945 {
2946 /* �Ѵ�������⤷���ϲ�̾���Ϥ�����Ǥ���ʤ�С����ꤹ�롣*/
2947 j_kakutei( gw, node ) ;
2948 j_kakutei_kana_mode( gw, node, '\0' ) ;
2949 /* �ѿ��⡼�ɤϤޤ���θ���Ƥ��ʤ��Τǡ����ν����Ϥʤ���*/
2950 return 0 ;
2951 }
2952
j_mode_off(Widget gw,struct SKKInputNode * node,int chara)2953 static int j_mode_off( Widget gw, struct SKKInputNode *node, int chara )
2954 {
2955 if( j_kakutei_kana_mode( gw, node, chara ) )
2956 return 0 ;
2957 j_kakutei( gw, node ) ;
2958 node->j_mode = False ;
2959 node->j_zenkaku = False ;
2960 return 0 ;
2961 }
2962
2963 /*
2964 * ����������ϥ⡼�ɤؤȰܹԤ����������Ԥ��ؿ��Ǥ��롣
2965 */
j_zenkaku_eiji(Widget gw,struct SKKInputNode * node,int chara)2966 static int j_zenkaku_eiji
2967 ( Widget gw, struct SKKInputNode *node, int chara )
2968 {
2969 if( j_kakutei_kana_mode( gw, node, chara ) )
2970 return 0 ;
2971 j_kakutei( gw, node ) ;
2972 node->j_mode = False ;
2973 node->j_zenkaku = True ;
2974 return 0 ;
2975 }
2976
j_start_henkan_sub(Widget gw,struct SKKInputNode * node)2977 static int j_start_henkan_sub( Widget gw, struct SKKInputNode *node )
2978 {
2979 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
2980 j_delete_kanaprefix( node ) ;
2981 /* �Ѵ����褦�Ȥ��Ƥ�����֤��������ΤǤ����� */
2982 if( node->j_henkan_start_point > node->cur_pos ){
2983 err_msg( node, "Henkan end point must be after henkan start point." ) ;
2984 return 1 ;
2985 }
2986 return 0 ;
2987 }
2988
2989 /*
2990 * �Ѵ����ϴؿ���
2991 *----
2992 * �Ѵ����ˤ�ɬ�����ϸƤФ���ͽ�ۤ����ؿ��Ǥ��롣
2993 */
j_start_henkan(Widget gw,struct SKKInputNode * node)2994 static int j_start_henkan
2995 ( Widget gw, struct SKKInputNode *node )
2996 {
2997 SkkInputWidget w = ( SkkInputWidget )gw ;
2998
2999 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
3000 j_delete_kanaprefix( node ) ;
3001
3002 if( !node->j_henkan_mode ){
3003 /* �Ѵ���ǽ�ʾ��֤Ǥʤ��ä��顢�����������������ν������� *
3004 * ���ʤ���*/
3005 j_insert_chara( node, node->cur_pos, ' ' ) ;
3006 return 0 ;
3007 }
3008 /* �Ѵ���ǽ�ʾ��֤ˤʤäƤ���Τʤ�С��Ѵ������롣*/
3009 node->j_mode = True ;
3010 /* ���˰��ʾ��Ѵ����Ԥ��Ƥ���ΤǤ���С����θ����õ����*/
3011 if( node->j_henkan_on ){
3012 /* ���ơ��Ѵ���Ԥ��ޤ���*/
3013 j_henkan( gw, node ) ;
3014 } else {
3015 /* �Ѵ��������ν�����*/
3016 if( j_start_henkan_sub( gw, node ) )
3017 return 1 ;
3018 /* ���ߤΥ���������֤��Ѵ���λ���֤Ȥʤ꿽����*/
3019 node->j_henkan_end_point = node->cur_pos ;
3020 /* �Ѵ��������ڤ�Ф���*/
3021 strncpy( node->j_henkan_key,
3022 node->textbuffer + node->j_henkan_start_point,
3023 node->j_henkan_end_point - node->j_henkan_start_point ) ;
3024 node->j_henkan_key[ node->j_henkan_end_point -
3025 node->j_henkan_start_point ] = '\0' ;
3026 /* ñ����Ͽ�λ��˻Ȥ���������¸���Ƥ�����*/
3027
3028 strcpy( node->j_henkan_key2, node->j_henkan_key ) ;
3029 /* #ʸ���Ѵ��Τ���ν�����*/
3030 if( w->skkinput.use_numeric_conversion ){
3031 j_compute_numeric_henkan_key
3032 ( node->j_search_key, node->j_henkan_key, node->j_num_list ) ;
3033 } else {
3034 strcpy( node->j_search_key, node->j_henkan_key ) ;
3035 node->j_num_list[ 0 ] = '\0' ;
3036 }
3037 /* ���ơ��Ѵ���Ԥ��ޤ���*/
3038 j_henkan( gw, node ) ;
3039 }
3040 return 0 ;
3041 }
3042
3043 /*
3044 * ������θ���ؤ��Ѵ����᤹�ؿ���
3045 *----
3046 * �ܲ��ܸ��� skk ��Ʊ̾�δؿ���ư������ʬ����ʤ��Ȥ��⤢��ޤ����ɡ�
3047 * �ޤ��ɤ��Ǥ���͡���ä��Ȥ���ʬ���äƤ���ľ���ޤ���
3048 */
j_previous_candidate(Widget gw,struct SKKInputNode * node)3049 static int j_previous_candidate
3050 ( Widget gw, struct SKKInputNode *node )
3051 {
3052 int pos ;
3053
3054 if( node->j_henkan_mode && node->j_henkan_on ){
3055 if( node->j_henkan_count == 0 ){
3056 /* �����ξ��֤ˤʤꤦ��Τ������� */
3057 /* j_henkan_count = 0 �Ȥ��Ƥ��ޤ��ȡ�j_henkan_on �� off �ˤʤäƤ� *
3058 * �ޤ��Ȼפ��Τ���...��������ޤ��������Ϥ���Ȳ��ꤹ�뤱�ɡ� */
3059 return 0 ;
3060 } else if( node->j_henkan_count == 1 ){
3061 /* �Ѵ����Ƥ��ʤ����֤ذܹԤ��롣*/
3062 node->j_henkan_on = False ;
3063 node->j_henkan_count = 0 ;
3064 node->j_num_list[ 0 ] = '\0' ;
3065 /* �Ѵ���λ������ƽФ���*/
3066 XtCallCallbacks( gw, XtNjhenkanendNotify, node ) ;
3067
3068 /* �Ѵ��ˤ�äƽ�Ƥ���ʸ�����õ�롣*/
3069 j_delete_region( node,
3070 node->j_henkan_start_point,
3071 node->j_henkan_end_point ) ;
3072 node->cur_pos = node->j_henkan_end_point ;
3073 /* ��Ȥ�ʸ������᤹��*/
3074 pos = strlen( node->j_henkan_key ) - 1 ;
3075 if( node->j_henkan_key[ pos ] >='a' &&
3076 node->j_henkan_key[ pos ] <= 'z' &&
3077 !node->j_abbrev )
3078 node->j_henkan_key[ pos ] = '\0' ;
3079 #ifdef DEBUG_LV0
3080 fprintf( stderr, "j_henkan_key : \"%s\".\n", node->j_henkan_key ) ;
3081 #endif
3082 j_insert_str( node, node->cur_pos, node->j_henkan_key ) ;
3083 /* �Ѵ���λ���֤��᤹��*/
3084 node->j_henkan_end_point = node->cur_pos ;
3085 /* �֢��פ�֢��פ��᤹��*/
3086 j_change_marker_to_write( node,
3087 node->j_henkan_start_point -
3088 j_kanji_length ) ;
3089 } else {
3090 /* ������θ������Ф���*/
3091 if( ( node->j_current_henkan_vector_index )->prev != NULL ){
3092 node->j_current_henkan_vector_index =
3093 ( node->j_current_henkan_vector_index )->prev ;
3094 node->j_henkan_count -- ;
3095 }
3096 /* ���ߤθ����ä���*/
3097 j_delete_region( node,
3098 node->j_henkan_start_point,
3099 node->j_henkan_end_point ) ;
3100 /* ���Ф��������Хåե��ˤ��Ĥ���*/
3101 copyCandidate( temporary_buffer,
3102 ( node->j_current_henkan_vector_index )->node,
3103 ( node->j_current_henkan_vector_index )->position,
3104 TEXTMAXLEN ) ;
3105 node->cur_pos_backup = node->cur_pos ;
3106 node->cur_pos = node->j_henkan_start_point ;
3107 /* �������ࡣ*/
3108 #if 0
3109 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3110 #else
3111 j_insert_word
3112 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3113 #endif
3114 node->j_henkan_end_point = node->cur_pos ;
3115 node->cur_pos = node->cur_pos_backup ;
3116 }
3117 } else {
3118 j_kana_input( gw, node, 'x' ) ;
3119 }
3120 return 0 ;
3121 }
3122
3123 /*
3124 * �����ܡ��ɤ���� Control-H �ν�����Ԥ��ؿ���
3125 */
j_backward_delete_char(Widget gw,struct SKKInputNode * node)3126 static int j_backward_delete_char
3127 ( Widget gw, struct SKKInputNode *node )
3128 {
3129 SkkInputWidget w = ( SkkInputWidget )gw ;
3130
3131 if( node->j_henkan_mode &&
3132 node->cur_pos == node->j_henkan_start_point ){
3133 /* �Ѵ��⡼�ɤǤ��ꡢ�Ѵ����ϰ��֤ˤ�����ˤϡ�����ä��Ƥ��ޤ� *
3134 * ���ȤˤʤäƤ��ޤ��Τǡ����ꤹ�뤳�Ȥˤʤ롣 */
3135 node->j_henkan_count = 0 ;
3136 j_kakutei( gw, node ) ;
3137 } else if( node->j_henkan_on ){
3138 /* �Ѵ��⡼�ɤǤ��ꡢ���ʾ�ºݤ��Ѵ����Ԥ��Ƥ�����ˤϡ� *
3139 * ���θ����Ф��⡼�ɤ����롣 */
3140 if( node->cur_pos == node->j_henkan_end_point &&
3141 !w->skkinput.delete_implies_kakutei ){
3142 j_previous_candidate( gw, node ) ;
3143 } else {
3144 int p = node->j_henkan_end_point ;
3145 /* ���� delete_backward_char �� end_point ����ư���Ƥ��ޤ����� *
3146 * cur_pos == end_point ���ä����ˤϡ����ܤˤʤäƤ��ޤ��ͤ� */
3147 delete_backward_char( gw, node ) ;
3148 if( node->cur_pos < p )
3149 j_kakutei( gw, node ) ;
3150 }
3151 } else {
3152 /* ���겾̾�����Ϥ��Ƥ���������ä��顢�����̵���ˤ��롣*/
3153 if( node->j_okurigana_mode ){
3154 node->j_okurigana_mode = False ;
3155 node->j_okuri_chara = '\0' ;
3156 if( node->textbuffer[ node->j_okurigana_start_point ] == '*' ){
3157 /* �����ȡ�"����*�ääää�t" �� C-h ���Ȥ��äѤ��ä���� *
3158 * ����*/
3159 if( node->j_kana_mode == True &&
3160 node->j_kana_start_point > node->j_okurigana_start_point ){
3161 j_delete_region( node, node->j_okurigana_start_point,
3162 node->j_kana_start_point ) ;
3163 } else {
3164 delete_char( node, node->j_okurigana_start_point, 1 ) ;
3165 }
3166 }
3167 }
3168 /* ��̾���Ϥκ���ʤ�С����β�̾�ץ�ե����������ƺ�����롣*/
3169 if( node->j_kana_mode ){
3170 node->j_kana_mode = False ;
3171 node->j_prefix[ 0 ] = '\0' ;
3172 /* ��̾�ץ�ե������γ��ϰ��֤��饫��������֤ޤǤ������롣*/
3173 j_delete_region( node, node->j_kana_start_point, node->cur_pos ) ;
3174 } else {
3175 delete_backward_char( gw, node ) ;
3176 }
3177 }
3178 return 0 ;
3179 }
3180
3181 /*
3182 * ���������Ԥ���Ƭ�ذ�ư������ؿ���
3183 */
j_beginning_of_line(struct SKKInputNode * node)3184 static int j_beginning_of_line( struct SKKInputNode *node )
3185 {
3186 /* ��̾���Ϥ�����ʤ顢���Υץ�ե������������롣*/
3187 j_delete_kanaprefix( node ) ;
3188 /* ��Ƭ�ء�*/
3189 node->cur_pos = node->cur_pos_top ;
3190 return 0 ;
3191 }
3192
3193 /*
3194 * ���������ԤκǸ�ذ�ư������ؿ���
3195 */
j_end_of_line(struct SKKInputNode * node)3196 static int j_end_of_line( struct SKKInputNode *node )
3197 {
3198 /* ��̾���Ϥ�����ʤ顢���Υץ�ե������������롣*/
3199 j_delete_kanaprefix( node ) ;
3200 /* �����ء�*/
3201 node->cur_pos = strlen( node->textbuffer ) ;
3202 return 0 ;
3203 }
3204
3205 /*
3206 * ����������ְʹߤ�ʸ���åȥХåե��˰�ư������ؿ���
3207 */
j_kill_line(Widget gw,struct SKKInputNode * node)3208 static int j_kill_line( Widget gw, struct SKKInputNode *node )
3209 {
3210 SkkInputWidget w = ( SkkInputWidget )gw ;
3211 int last_pos ;
3212 /* ��̾���Ϥ�����ʤ顢���Υץ�ե������������롣*/
3213 j_delete_kanaprefix( node ) ;
3214 last_pos = strlen( node->textbuffer ) ;
3215 /* ���åȥХåե��˥��ԡ����롣*/
3216 strcpy( w->skkinput.cutbuffer, node->textbuffer + node->cur_pos ) ;
3217 /* ��������ʹߤ�ʸ����õ�롣*/
3218 j_delete_region( node, node->cur_pos, last_pos ) ;
3219 return 0 ;
3220 }
3221
3222 /*
3223 * ���åȥХåե������äƤ���ʸ�����Ž���դ���ؿ���
3224 */
j_yank(Widget gw,struct SKKInputNode * node)3225 static int j_yank( Widget gw, struct SKKInputNode *node )
3226 {
3227 SkkInputWidget w = ( SkkInputWidget )gw ;
3228 j_insert_str( node, node->cur_pos, w->skkinput.cutbuffer ) ;
3229 return 0 ;
3230 }
3231
3232 /*
3233 * ����������֤ΰ�����Υ����ȥ���������֤Υ�������ƥ�����
3234 * ����Ŀʤ�������Ԥ��ؿ���
3235 *-----
3236 * ���������������뤬�������ä����ˤϥ�������ΰ�ư�Ϥʤ�������
3237 * �륭���ϥ�������ΰ�����Ȥ⤦������Ǥ��롣
3238 *(���)
3239 * EUC-3byte �����ɤ�̵�뤷�Ƥޤ���
3240 */
j_transpose_chars(struct SKKInputNode * node)3241 static int j_transpose_chars( struct SKKInputNode *node )
3242 {
3243 int spos, epos, i ;
3244 /* 5 = j_kanji_length * 2 + 1 */
3245 unsigned char transpose_buffer[ 5 ] ;
3246
3247 /* ��Ƭ�ʤ鲿�⤷�ʤ���ȴ���롣��Ƭ�Dz�̾�ץ�ե�������¸�ߤ���� *
3248 * �������֤Ϥ���äȹͤ����ʤ��Ǥ���*/
3249 if( node->cur_pos == node->cur_pos_top ){
3250 err_msg( node, "Beginning of buffer" ) ;
3251 return 0 ;
3252 }
3253
3254 /* ��̾���Ϥ�����ʤ顢���Υץ�ե������������롣*/
3255 j_delete_kanaprefix( node ) ;
3256
3257 /* ����륭�����⡢��������˶ᤤ�����ܤ��ޤ������λ����� *
3258 * �ʤ��Ȥ� node->cur_pos != node->cur_pos_top �ʤΤǤ����顢-1 *
3259 * ���Ƥ�����פʤ櫓�Ǥ���*/
3260 if( node->textbuffer[ node->cur_pos ] == '\0' ){
3261 spos = node->cur_pos - 1 ;
3262 if( node->textbuffer[ spos ] & 0x80 ){
3263 /* EUC �������ä����ˤϡ���Х��ȷ�ᤦ���ʤΤǤ⤦������� *
3264 * ��ư���ޤ���*/
3265 spos = node->cur_pos - j_kanji_length ;
3266 /* ���������ɤ�ȴ���Ф��ޤ���*/
3267 strncpy( transpose_buffer, node->textbuffer + spos,
3268 j_kanji_length ) ;
3269 i = j_kanji_length ;
3270 } else {
3271 transpose_buffer[ 0 ] = node->textbuffer[ spos ] ;
3272 i = 1 ;
3273 }
3274 /* �õ�����֤����Ƥ�����*/
3275 epos = node->cur_pos ;
3276 /* �����ʤ顢����뤳�Ȥˤʤ�ʸ���κǽ餫�饫��������֤ޤ� *
3277 * �ξõ�ˤʤ롣*/
3278 } else {
3279 spos = node->cur_pos ;
3280 if( node->textbuffer[ spos ] & 0x80 ){
3281 /* ���������ɤ�ȴ���Ф��ޤ���*/
3282 strncpy( transpose_buffer, node->textbuffer + spos,
3283 j_kanji_length ) ;
3284 /* �õ�����֤����Ƥ�����*/
3285 epos = node->cur_pos + j_kanji_length ;
3286 i = j_kanji_length ;
3287 } else {
3288 transpose_buffer[ 0 ] = node->textbuffer[ spos ] ;
3289 /* �õ�����֤����Ƥ�����*/
3290 epos = node->cur_pos + 1 ;
3291 i = 1 ;
3292 }
3293 /* �����Ǥʤ��Τʤ顢���ߥ������뤬�������ʸ����ä��ʤ��Ȥ� *
3294 * ���ʤ� */
3295 }
3296 /* ����륭�����⡢��������˶ᤤ��(�Ĥޤ����¦)���� *
3297 * ���ǹ�Ƭ����Ƥ��ޤä��Ȥ������Ȥϡ��⤦�����ι�Ƭ¦�Υ���� *
3298 * ��̵���Ȥ������Ȥˤʤ�ޤ���*/
3299 if( spos <= node->cur_pos_top )
3300 return 0 ;
3301 /* ��������ʤ��ä���⤦��ĤΥ���餬¸�ߤ���Τǡ����ä����� *
3302 * ���ޤ���*/
3303 if( node->textbuffer[ spos - 1 ] & 0x80 ){
3304 spos -= j_kanji_length ;
3305 /* ���������ɤ�ȴ���Ф��ޤ���*/
3306 strncpy( transpose_buffer + i, node->textbuffer + spos,
3307 j_kanji_length ) ;
3308 i += j_kanji_length ;
3309 } else {
3310 spos -- ;
3311 transpose_buffer[ i ] = node->textbuffer[ spos ] ;
3312 i ++ ;
3313 }
3314 /* ʸ�����ü���롣*/
3315 transpose_buffer[ i ] = '\0' ;
3316 /* ����ʸ����õ�롣*/
3317 j_delete_region( node, spos, epos ) ;
3318 /* ���ʸ������������롣*/
3319 j_insert_str( node, node->cur_pos, transpose_buffer ) ;
3320 return 0 ;
3321 }
3322
3323 /*
3324 * ���ιԤ����Ĥäơ����ǥ�������ʤ��������������Ϥ��ĤäƤ����
3325 * �������ɽ������ؿ���
3326 *-----
3327 * �Ȥ����櫓�ǡ���������Τ�Τϳ��ꤵ��Ƥ��ޤ����ҥ��ȥ�ΰ��ֺǸ�
3328 * ����¸����롣( �ʤ��ʤäƤ��ޤä��顢����äȺ��������顣)
3329 */
j_previous_line(Widget gw,struct SKKInputNode * node)3330 static int j_previous_line( Widget gw, struct SKKInputNode *node )
3331 {
3332 SkkInputWidget w = ( SkkInputWidget )gw ;
3333 unsigned char *ptr ;
3334 int pos, length ;
3335 /* ���ֿƤΥХåե��Ǥ���ͭ���Ǥʤ��Ȥ��롣*/
3336 if( node->parentbuffer != NULL )
3337 return 1 ;
3338 /* �ҥ��ȥ�Хåե��������ä��顢¨ȴ���롣*/
3339 if( w->skkinput.hist_start == w->skkinput.hist_end )
3340 return 1 ;
3341 /* ���ꤹ�롣�������ʤ����ˤʤ롣*/
3342 j_kakutei( gw, node ) ;
3343 j_kakutei_kana_mode( gw, node, '\0' ) ;
3344 /* ����θ����Ѥ��ǽ���ä����Ǥ���*/
3345 if( w->skkinput.hist_cur < 0 ){
3346 /* ���ߤ��������ʸ�������¸���Ƥ�����*/
3347 strcpy( w->skkinput.histcurbackbuffer, node->textbuffer ) ;
3348 w->skkinput.hist_cur = w->skkinput.hist_end ;
3349 }
3350 /* ����ʾ����θ���Ϥʤ��Τǡ����⤷�ʤ��ǵ��롣*/
3351 if( w->skkinput.hist_cur == w->skkinput.hist_start )
3352 return 0 ;
3353 /* ������θ������롣*/
3354 pos = w->skkinput.hist_cur - 1 ; /* ���ΰ��֤� '\0' */
3355 do {
3356 pos -- ;
3357 if( pos < 0 ){
3358 pos += TEXTBUFSIZE ;
3359 }
3360 } while( w->skkinput.historybuffer[ pos ] != '\0' &&
3361 pos != w->skkinput.hist_start ) ;
3362 /* ������θ���γ��ϰ��֡�*/
3363 if( pos != w->skkinput.hist_start )
3364 pos = ( pos + 1 ) % TEXTBUFSIZE ;
3365 /* ���߸��Ƥ�����֤ν�����*/
3366 w->skkinput.hist_cur = pos ;
3367 /* �����ȴ���Ф���*/
3368 ptr = node->textbuffer ;
3369 length = 0 ;
3370 while( w->skkinput.historybuffer[ pos ] != '\0' ){
3371 *ptr ++ = w->skkinput.historybuffer[ pos ++ ] ;
3372 length ++ ;
3373 if( pos >= TEXTBUFSIZE )
3374 pos = 0 ;
3375 }
3376 *ptr = '\0' ;
3377 /* ����������֤ν�����*/
3378 node->cur_pos = length ;
3379 return 0 ;
3380 }
3381
j_next_line(Widget gw,struct SKKInputNode * node)3382 static int j_next_line( Widget gw, struct SKKInputNode *node )
3383 {
3384 SkkInputWidget w = ( SkkInputWidget )gw ;
3385 unsigned char *sptr, *dptr ;
3386 int pos, length ;
3387 /* ���ֿƤΥХåե��Ǥ���ͭ���Ǥʤ��Ȥ��롣*/
3388 if( node->parentbuffer != NULL )
3389 return 1 ;
3390 /* ���⤿�ɤäƤʤ��Τˡ����μ��˹Ԥ��ʤ��̤��ͽ¬�ϤǤ��ʤ���*/
3391 if( w->skkinput.hist_cur < 0 ){
3392 return 1 ;
3393 }
3394 /* ������ֺǸ��ؤ��Ƥ���äƤ��Ȥϡ� */
3395 if( w->skkinput.hist_cur == w->skkinput.hist_end ){
3396 strcpy( node->textbuffer, w->skkinput.histcurbackbuffer ) ;
3397 node->cur_pos = strlen( node->textbuffer ) ;
3398 w->skkinput.hist_cur = -1 ;
3399 return 0 ;
3400 }
3401 /* ���ꤹ�롣�������ʤ����ˤʤ롣*/
3402 j_kakutei( gw, node ) ;
3403 j_kakutei_kana_mode( gw, node, '\0' ) ;
3404 /* ���θ������롣*/
3405 sptr = w->skkinput.historybuffer + w->skkinput.hist_cur ;
3406 pos = w->skkinput.hist_cur ;
3407 while( *sptr != '\0' ){
3408 sptr ++ ;
3409 pos ++ ;
3410 if( pos >= TEXTBUFSIZE ){
3411 pos = 0 ;
3412 sptr = w->skkinput.historybuffer ;
3413 }
3414 }
3415 /* �����Ǥ� '\0' �Ǥ����顢�⤦��Ŀʤࡣ*/
3416 sptr ++ ;
3417 pos ++ ;
3418 if( pos >= TEXTBUFSIZE ){
3419 pos = 0 ;
3420 sptr = w->skkinput.historybuffer ;
3421 }
3422 /* �Ǹ�ޤ���Ƥ��ޤ��顣*/
3423 if( pos == w->skkinput.hist_end ){
3424 strcpy( node->textbuffer, w->skkinput.histcurbackbuffer ) ;
3425 node->cur_pos = strlen( node->textbuffer ) ;
3426 w->skkinput.hist_cur = -1 ;
3427 return 0 ;
3428 }
3429 /* ���θ�������ؤ��ơ�*/
3430 w->skkinput.hist_cur = pos ;
3431
3432 /* �����ȴ���Ф���*/
3433 dptr = node->textbuffer ;
3434 length = 0 ;
3435 while( *sptr != '\0' ){
3436 *dptr ++ = *sptr ++ ;
3437 pos ++ ;
3438 length ++ ;
3439 if( pos >= TEXTBUFSIZE ){
3440 sptr = w->skkinput.historybuffer ;
3441 pos = 0 ;
3442 }
3443 }
3444 /* �Ǹ����Ƚ�ü���ơ�*/
3445 *dptr = '\0' ;
3446 /* ����������֤�����*/
3447 node->cur_pos = length ;
3448 return 0 ;
3449 }
3450
3451 /*
3452 * �Ѵ����ϰ��֤����ꤹ��ؿ���
3453 *----
3454 * ��ʸ�������Ϥˤ���Ѵ����ϰ��֤����ꤵ��뤳�Ȥ˥ǥե���ȤǤϤʤ�
3455 * �Ƥ��롣
3456 */
j_set_henkan_point(Widget gw,struct SKKInputNode * node,int chara)3457 static void j_set_henkan_point
3458 ( Widget gw, struct SKKInputNode *node, int chara )
3459 {
3460 switch( chara ){
3461 case 'A' :
3462 /* �첻�����Ϥ��뤳�Ȥˤ���Ѵ����ϰ��֤����ꤵ�����ν�����*/
3463 j_set_henkan_point_ByVowel( gw, node, skk_roma_kana_a, chara ) ;
3464 break ;
3465 case 'E' :
3466 /* �첻�����Ϥ��뤳�Ȥˤ���Ѵ����ϰ��֤����ꤵ�����ν�����*/
3467 j_set_henkan_point_ByVowel( gw, node, skk_roma_kana_e, chara ) ;
3468 break ;
3469 case 'I' :
3470 /* �첻�����Ϥ��뤳�Ȥˤ���Ѵ����ϰ��֤����ꤵ�����ν�����*/
3471 j_set_henkan_point_ByVowel( gw, node, skk_roma_kana_i, chara ) ;
3472 break ;
3473 case 'O' :
3474 /* �첻�����Ϥ��뤳�Ȥˤ���Ѵ����ϰ��֤����ꤵ�����ν�����*/
3475 j_set_henkan_point_ByVowel( gw, node, skk_roma_kana_o, chara ) ;
3476 break ;
3477 case 'U' :
3478 /* �첻�����Ϥ��뤳�Ȥˤ���Ѵ����ϰ��֤����ꤵ�����ν�����*/
3479 j_set_henkan_point_ByVowel( gw, node, skk_roma_kana_u, chara ) ;
3480 break ;
3481 /* �ü�ʸ��Ф�ʸ���ˤ�ä��Ѵ��γ��ϰ��֤����ꤵ����硣*/
3482 case '<' :
3483 case '>' :
3484 case '?' :
3485 j_set_henkan_point_by_special_midashi_char
3486 ( gw, node, chara ) ;
3487 break ;
3488 default :
3489 j_set_henkan_point_ByConsonat( gw, node, chara ) ;
3490 break ;
3491 }
3492 return ;
3493 }
3494
j_set_henkan_point_subr(Widget gw,struct SKKInputNode * node,int rchara)3495 static void j_set_henkan_point_subr
3496 ( Widget gw, struct SKKInputNode *node, int rchara )
3497 {
3498 /* ��̾�����椫��"n"�ʤ�"��"�ˤ��Ƥ��ޤ���*/
3499 if( j_kakutei_kana_mode( gw, node, rchara ) )
3500 return ;
3501 /* �������ºݤȰ㤦�褦�����ɡ��������Ƥ�������ǽ������褦��*/
3502 if( node->j_henkan_mode )
3503 j_kakutei( gw, node ) ;
3504 /* ����ɽ�����ơ�*/
3505 j_insert_str( node, node->cur_pos, "��" ) ;
3506 /* �Ѵ����ϰ��֤�������֤˷��ꤷ�ơ�*/
3507 node->j_henkan_start_point = node->cur_pos ;
3508 node->j_henkan_mode = True ;
3509 node->j_henkan_on = False ;
3510 return ;
3511 }
3512
3513 /*
3514 * C-g �ˤ�ä��Ѵ��֢��פξ��֤��֢��פξ��֤ؤ����ܤ�����ν�����
3515 * �Ԥ��ؿ���
3516 */
j_keyboard_quit_henkanrestart(Widget gw,struct SKKInputNode * node,int flag)3517 static void j_keyboard_quit_henkanrestart
3518 ( Widget gw, struct SKKInputNode *node, int flag )
3519 {
3520 /* �Ѵ����Ƥ��ʤ����֤ذܹԤ��롣*/
3521 node->j_henkan_on = False ;
3522 node->j_henkan_count = 0 ;
3523 node->j_henkan_show_candidate_mode = False ;
3524 /* �Ѵ���λ������ƽФ���*/
3525 XtCallCallbacks( gw, XtNjhenkanendNotify, node ) ;
3526 /* �Ѵ����������ä��ޤ���*/
3527 node->cur_pos2 = node->j_kana_start_point ;
3528 node->cur_pos3 = node->j_okurigana_start_point ;
3529
3530 /*
3531 * �֤ͤ��ͤ����ɤ����Ƥ��������겾̾�⡼�ɤ��ɤ������Ƥ�Ρ���
3532 * �֤����������ĤϤʡĥ�������ɤ��������Ȥʤ������
3533 * �����겾̾�γ��ϰ��֤��������Ĥ�����Ǥ����î�͡�
3534 * �֤Ƥ��櫓����ʬ���ä������饤�ࡩ��
3535 */
3536 if( node->j_okurigana_mode ){
3537 /* �ɤ����ɤ�ʬ����ʤ����ɡĥ��ɥۥå����б������ɡġ�*/
3538 if( node->textbuffer[ node->j_okurigana_start_point ] != '*' )
3539 node->j_okurigana_mode = False ;
3540 node->j_henkan_key[ node->j_okurigana_offset ] = '\0' ;
3541 j_delete_region
3542 ( node, node->j_henkan_start_point, node->j_okurigana_start_point ) ;
3543 } else {
3544 #if 0
3545 pos = strlen( node->j_henkan_key ) ;
3546 node->j_henkan_key[ pos ] = '\0' ;
3547 #endif
3548 j_delete_region
3549 ( node, node->j_henkan_start_point, node->j_henkan_end_point ) ;
3550 }
3551 #ifdef DEBUG_LV0
3552 fprintf( stderr, "j_henkan_key : \"%s\".\n", node->j_henkan_key ) ;
3553 #endif
3554 if( !flag ){
3555 node->cur_pos = node->j_henkan_end_point ;
3556 j_insert_str( node, node->cur_pos, node->j_henkan_key ) ;
3557 /* �Ѵ���λ���֤��᤹��*/
3558 node->j_henkan_end_point = node->cur_pos ;
3559 } else {
3560 j_insert_str( node, node->j_henkan_start_point, node->j_henkan_key ) ;
3561 }
3562 node->j_kana_start_point = node->cur_pos2 ;
3563 node->j_okurigana_start_point = node->cur_pos3 ;
3564 /* �֢��פ�֢��פ��᤹��*/
3565 j_change_marker_to_write
3566 ( node, node->j_henkan_start_point - j_kanji_length ) ;
3567 return ;
3568 }
3569
3570 /*
3571 * C-g �ˤ�ä��Ѵ��֢��פξ��֤���λ������ν�����Ԥ��ؿ���
3572 */
j_keyboard_quit_henkanclose(Widget gw,struct SKKInputNode * node)3573 static void j_keyboard_quit_henkanclose
3574 ( Widget gw, struct SKKInputNode *node )
3575 {
3576 int pos ;
3577
3578 /* �Ѵ��⡼�ɤ���ȴ���Ф���*/
3579 node->j_henkan_mode = False ;
3580 node->j_henkan_on = False ;
3581 node->j_abbrev = False ;
3582 node->j_henkan_show_candidate_mode = False ;
3583 pos = node->j_henkan_start_point - j_kanji_length ;
3584 /* �Ѵ����ϰ��֤ˡ֢��פϤ���Τ��� ̵���ä��顢�ѡ�*/
3585 if( looking_at( node, pos, "��" ) ){
3586 delete_char( node, pos, 1 ) ;
3587 } else {
3588 err_msg( node, "It seems that you have deleted ��." ) ;
3589 }
3590 /* ���겾̾�⡼�ɤ��ä������н襳���ɡ�*/
3591 if( node->j_okurigana_mode &&
3592 node->textbuffer[ node->j_okurigana_start_point ] == '*' )
3593 delete_char( node, node->j_okurigana_start_point, 1 ) ;
3594 /* �Ѵ����ϰ��֤��饫��������֤ޤǤ�õ�롣*/
3595 j_delete_region
3596 ( node, node->j_henkan_start_point, node->cur_pos ) ;
3597 node->j_okurigana_mode = False ;
3598 return ;
3599 }
3600
3601 /*
3602 * Control-G �����������
3603 */
j_keyboard_quit(Widget gw,struct SKKInputNode * node)3604 static void j_keyboard_quit
3605 ( Widget gw, struct SKKInputNode *node )
3606 {
3607 /* ��̾������ʤ�������Υץ�ե�������뤷�Ƥ��ޤ���*/
3608 if( node->j_kana_mode ){
3609 /* ������β�̾�ץ�ե����������ä��롣*/
3610 delete_char( node, node->j_kana_start_point,
3611 node->cur_pos - node->j_kana_start_point ) ;
3612 node->j_kana_mode = False ;
3613 node->j_prefix[ 0 ] = '\0' ;
3614 return ;
3615 }
3616 /* �Ѵ��⡼�ɤ˰�ư���Ƥ���ΤǤ����� */
3617 if( node->j_henkan_mode ){
3618 /* �ºݤ��Ѵ��ϰ��ٰʾ�Ԥ��Ƥ���ΤǤ����� */
3619 if( node->j_henkan_on ){
3620 /* �֢��פ���֢��פؤȾ������ܤ��ơ��Ѵ��κǽ�ؤ��᤹��*/
3621 j_keyboard_quit_henkanrestart( gw, node, False ) ;
3622 node->j_okurigana_mode = False ;
3623 } else {
3624 /* �֢��פ�õ���Ѵ���λ���롣*/
3625 j_keyboard_quit_henkanclose( gw, node ) ;
3626 }
3627 return ;
3628 }
3629
3630 /* ľ�ܥ��������ϥ⡼�ɤ��ä����ν�����*/
3631 if( node->j_input_by_code_or_menu_mode ){
3632 node->j_input_by_code_or_menu_mode = False ;
3633 node->mtextbuffer[ 0 ] = '\0' ;
3634 return ;
3635 }
3636
3637 /* �ʾ�Τɤ�Ǥ�ʤ��ä��顢mini-buffer mode �ˤ��ʤ��ä����ɤ��� *
3638 * Ƚ�ꤹ�롣*/
3639 if( node->parentbuffer != NULL ){
3640 struct SKKInputNode *pNode = node->parentbuffer ;
3641 int usage = node->j_minibuff_usage ;
3642 /* �ߥ˥Хåե������Ѥ���ߤ����Τǡ����ꥢ���롣*/
3643 skkinput_ClearMinibuffer( gw ) ;
3644 /* �����Ȥ������Ȥǡ����ΥΡ��ɤϲ�������Ƥ��ޤ��ޤ���*/
3645 free_Minibuffer( gw, node ) ;
3646 /* �Ƥ˥���������֤��ޤ��礦��*/
3647 pNode->cur_exist = True ;
3648
3649 /* �����ǡĿƤ����Ƥ����Τ���Ƚ�Ǥ���Ŭ�ڤʽ�����Ƥˤ�¹Ԥ��롣*/
3650 switch( usage ){
3651 /* �ߥ˥Хåե��Ǥ��Ѵ��˰ܤäƤ������ġ�*/
3652 case J_HENKAN_IN_MINIBUFF_MODE :
3653 /* �ߥ˥Хåե��Ǥ��Ѵ��⡼�ɤ����äƤ��ʤ��顢���äȤ�ҥå� *
3654 * �����Τ�̵���ä����ν�����*/
3655 if( pNode->j_henkan_count == 0 && pNode->j_henkan_mode &&
3656 pNode->j_henkan_on ){
3657 /* ���ΤޤޤǤϤʤ����ؤȾ������ܤ����롣*/
3658 j_keyboard_quit_henkanrestart
3659 ( gw, pNode, pNode->j_okurigana_mode ) ;
3660 }
3661 break ;
3662 case J_INPUT_BY_CODE_OR_MENU_MODE :
3663 pNode->j_input_by_code_or_menu_mode = False ;
3664 pNode->mtextbuffer[ 0 ] = '\0' ;
3665 break ;
3666 /* �ѡ������ʤ��ä����ˤ�̵���Ƥ������Ǥ��ʤ���ʤ��ġ��� *
3667 * ��Ȥ����������ܡĤ���Ǥɤ��ˤ��ʤ�Τ��ͤ���*/
3668 case J_PURGE_YES_OR_NO_P :
3669 pNode->mtextbuffer[ 0 ] = '\0' ;
3670 break ;
3671 default :
3672 break ;
3673 }
3674 /* �Ƥ��Ѵ������ɽ���⡼�ɤǤʤ��ä��顢���ˤ��Ƥ�����*/
3675 if( !pNode->j_henkan_show_candidate_mode )
3676 pNode->mtextbuffer[ 0 ] = '\0' ;
3677 return ;
3678 }
3679 #if 0
3680 XBell( XtDisplay( gw ), 5 ) ;
3681 #endif
3682 err_msg( node, "Quit" ) ;
3683 return ;
3684 }
3685
3686 /*
3687 * ��������ν�����ԤäƤ�����Υ������٥�Ȥν����ؿ���
3688 *----
3689 * �����ϥ����Х���ɤ��ѹ����뤳�ȤϤǤ��ʤ������� skk.el �Ǥ⤽���ʤ�
3690 * �Ƥ���Ȧ���̤��ѹ��Ǥ���褦�ˤ��Ƥ��ʤ����ɤ͡�
3691 */
do_Function_jhenkanShowCandidateMode(Widget gw,struct SKKInputNode * node)3692 static int do_Function_jhenkanShowCandidateMode
3693 ( Widget gw, struct SKKInputNode *node )
3694 {
3695 SkkInputWidget w = ( SkkInputWidget )gw ;
3696 VectorIndex *vNode ;
3697 int h_count, kouho_num, i ;
3698
3699 /* ���顼��ɽ���Ǿä���Ƥ��ޤäƤ��뤫�⤷��ʤ�������ɽ������ */
3700 /* ��������Emacs �ϼ�ư�������Ƥ���ߤ��������ɡġ� */
3701 vNode = j_henkan_show_candidates( gw, node, &h_count ) ;
3702 kouho_num = h_count - node->j_henkan_count ;
3703
3704 switch( w->skkinput.keybuf[ 0 ] ){
3705
3706 /* ���ֺ��θ�������롣*/
3707 case 'a' :
3708 /* �����ȴ���Ф��ơġ�*/
3709 copyCandidate( temporary_buffer,
3710 ( node->j_current_henkan_vector_index )->node,
3711 ( node->j_current_henkan_vector_index )->position,
3712 TEXTMAXLEN ) ;
3713 /* �Ѵ���λ���֤�Ĵ����*/
3714 node->cur_pos_backup = node->cur_pos ;
3715 node->cur_pos = node->j_henkan_start_point ;
3716 /* ʸ�����������*/
3717 #if 0
3718 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3719 #else
3720 j_insert_word
3721 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3722 #endif
3723 node->j_henkan_end_point = node->cur_pos ;
3724 node->cur_pos = node->cur_pos_backup ;
3725 /* ���Υ⡼�ɤν�λ��*/
3726 j_kakutei( gw, node ) ;
3727 node->mtextbuffer[ 0 ] = '\0' ;
3728 break ;
3729
3730 /* �����飲���ܤθ�������롣*/
3731 case 's' :
3732 if( kouho_num < 2 )
3733 break ;
3734
3735 node->j_current_henkan_vector_index =
3736 node->j_current_henkan_vector_index->next ;
3737
3738 /* �����ȴ���Ф��ơġ�*/
3739 copyCandidate( temporary_buffer,
3740 ( node->j_current_henkan_vector_index )->node,
3741 ( node->j_current_henkan_vector_index )->position,
3742 TEXTMAXLEN ) ;
3743 /* �Ѵ���λ���֤�Ĵ����*/
3744 node->cur_pos_backup = node->cur_pos ;
3745 node->cur_pos = node->j_henkan_start_point ;
3746 /* ʸ�����������*/
3747 #if 0
3748 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3749 #else
3750 j_insert_word
3751 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3752 #endif
3753 node->j_henkan_end_point = node->cur_pos ;
3754 node->cur_pos = node->cur_pos_backup ;
3755 /* ���Υ⡼�ɤν�λ��*/
3756 j_kakutei( gw, node ) ;
3757 node->mtextbuffer[ 0 ] = '\0' ;
3758 break ;
3759
3760 /* �����飳���ܤθ�������롣*/
3761 case 'd' :
3762 if( kouho_num < 3 )
3763 break ;
3764
3765 node->j_current_henkan_vector_index =
3766 node->j_current_henkan_vector_index->next->next ;
3767
3768 /* �����ȴ���Ф��ơġ�*/
3769 copyCandidate( temporary_buffer,
3770 ( node->j_current_henkan_vector_index )->node,
3771 ( node->j_current_henkan_vector_index )->position,
3772 TEXTMAXLEN ) ;
3773 /* �Ѵ���λ���֤�Ĵ����*/
3774 node->cur_pos_backup = node->cur_pos ;
3775 node->cur_pos = node->j_henkan_start_point ;
3776 /* ʸ�����������*/
3777 #if 0
3778 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3779 #else
3780 j_insert_word
3781 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3782 #endif
3783 node->j_henkan_end_point = node->cur_pos ;
3784 node->cur_pos = node->cur_pos_backup ;
3785 /* ���Υ⡼�ɤν�λ��*/
3786 j_kakutei( gw, node ) ;
3787 node->mtextbuffer[ 0 ] = '\0' ;
3788 break ;
3789
3790 /* �����飴���ܤθ�������롣*/
3791 case 'f' :
3792 if( kouho_num < 4 )
3793 break ;
3794
3795 node->j_current_henkan_vector_index =
3796 node->j_current_henkan_vector_index->next->next->next ;
3797
3798 /* �����ȴ���Ф��ơġ�*/
3799 copyCandidate( temporary_buffer,
3800 ( node->j_current_henkan_vector_index )->node,
3801 ( node->j_current_henkan_vector_index )->position,
3802 TEXTMAXLEN ) ;
3803 /* �Ѵ���λ���֤�Ĵ����*/
3804 node->cur_pos_backup = node->cur_pos ;
3805 node->cur_pos = node->j_henkan_start_point ;
3806 /* ʸ�����������*/
3807 #if 0
3808 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3809 #else
3810 j_insert_word
3811 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3812 #endif
3813 node->j_henkan_end_point = node->cur_pos ;
3814 node->cur_pos = node->cur_pos_backup ;
3815 /* ���Υ⡼�ɤν�λ��*/
3816 j_kakutei( gw, node ) ;
3817 node->mtextbuffer[ 0 ] = '\0' ;
3818 break ;
3819
3820 /* �����飵���ܤθ�������롣*/
3821 case 'j' :
3822 if( kouho_num < 5 )
3823 break ;
3824
3825 node->j_current_henkan_vector_index =
3826 node->j_current_henkan_vector_index->next->next->next->next ;
3827
3828 /* �����ȴ���Ф��ơġ�*/
3829 copyCandidate( temporary_buffer,
3830 ( node->j_current_henkan_vector_index )->node,
3831 ( node->j_current_henkan_vector_index )->position,
3832 TEXTMAXLEN ) ;
3833 /* �Ѵ���λ���֤�Ĵ����*/
3834 node->cur_pos_backup = node->cur_pos ;
3835 node->cur_pos = node->j_henkan_start_point ;
3836 /* ʸ�����������*/
3837 #if 0
3838 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3839 #else
3840 j_insert_word
3841 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3842 #endif
3843 node->j_henkan_end_point = node->cur_pos ;
3844 node->cur_pos = node->cur_pos_backup ;
3845 /* ���Υ⡼�ɤν�λ��*/
3846 j_kakutei( gw, node ) ;
3847 node->mtextbuffer[ 0 ] = '\0' ;
3848 break ;
3849
3850 /* �����飶���ܤθ�������롣*/
3851 case 'k' :
3852 if( kouho_num < 6 )
3853 break ;
3854
3855 node->j_current_henkan_vector_index =
3856 node->j_current_henkan_vector_index->next->next->next->next->next ;
3857
3858 /* �����ȴ���Ф��ơġ�*/
3859 copyCandidate( temporary_buffer,
3860 ( node->j_current_henkan_vector_index )->node,
3861 ( node->j_current_henkan_vector_index )->position,
3862 TEXTMAXLEN ) ;
3863 /* �Ѵ���λ���֤�Ĵ����*/
3864 node->cur_pos_backup = node->cur_pos ;
3865 node->cur_pos = node->j_henkan_start_point ;
3866 /* ʸ�����������*/
3867 #if 0
3868 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3869 #else
3870 j_insert_word
3871 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3872 #endif
3873 node->j_henkan_end_point = node->cur_pos ;
3874 node->cur_pos = node->cur_pos_backup ;
3875 /* ���Υ⡼�ɤν�λ��*/
3876 j_kakutei( gw, node ) ;
3877 node->mtextbuffer[ 0 ] = '\0' ;
3878 break ;
3879
3880 /* �����飷���ܤθ�������롣*/
3881 case 'l' :
3882 if( kouho_num < 7 )
3883 break ;
3884
3885 node->j_current_henkan_vector_index =
3886 node->j_current_henkan_vector_index->next->next->next->next->next->next ;
3887
3888 /* �����ȴ���Ф��ơġ�*/
3889 copyCandidate( temporary_buffer,
3890 ( node->j_current_henkan_vector_index )->node,
3891 ( node->j_current_henkan_vector_index )->position,
3892 TEXTMAXLEN ) ;
3893 /* �Ѵ���λ���֤�Ĵ����*/
3894 node->cur_pos_backup = node->cur_pos ;
3895 node->cur_pos = node->j_henkan_start_point ;
3896 /* ʸ�����������*/
3897 #if 0
3898 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3899 #else
3900 j_insert_word
3901 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3902 #endif
3903 node->j_henkan_end_point = node->cur_pos ;
3904 node->cur_pos = node->cur_pos_backup ;
3905 /* ���Υ⡼�ɤν�λ��*/
3906 j_kakutei( gw, node ) ;
3907 node->mtextbuffer[ 0 ] = '\0' ;
3908 break ;
3909
3910 /* ������θ����ɽ�����롣*/
3911 case 'x' :
3912 /* ��������⡼�ɤ�λ���ʤ���Фʤ�ʤ��Τ��� */
3913 if( node->j_henkan_count == 5 ){
3914 /* �Ϥ�����λ���ʤ��ƤϤʤ�ޤ���*/
3915 node->j_current_henkan_vector_index =
3916 ( node->j_current_henkan_vector_index )->prev ;
3917 node->j_henkan_count -- ;
3918 /* �����ȴ���Ф��ơġ�*/
3919 copyCandidate( temporary_buffer,
3920 ( node->j_current_henkan_vector_index )->node,
3921 ( node->j_current_henkan_vector_index )->position,
3922 TEXTMAXLEN ) ;
3923 /* �Ѵ���λ���֤�Ĵ����*/
3924 node->cur_pos_backup = node->cur_pos ;
3925 node->cur_pos = node->j_henkan_start_point ;
3926 /* ʸ�����������*/
3927 #if 0
3928 j_insert_str( node, node->j_henkan_start_point, temporary_buffer ) ;
3929 #else
3930 j_insert_word
3931 ( gw, node, node->j_henkan_start_point, temporary_buffer ) ;
3932 #endif
3933 node->j_henkan_end_point = node->cur_pos ;
3934 node->cur_pos = node->cur_pos_backup ;
3935 /* ���Υ⡼�ɤν�λ��*/
3936 node->j_henkan_show_candidate_mode = False ;
3937 node->mtextbuffer[ 0 ] = '\0' ;
3938 } else {
3939 /* ����������λ���ʤ��Ƥ��ʤ��Ǥ���*/
3940 node->j_henkan_count -= 7 ;
3941 /* �������θ����ɽ�����٤��᤹��*/
3942 for( i = 0 ; i < 7 ; i ++ )
3943 node->j_current_henkan_vector_index =
3944 ( node->j_current_henkan_vector_index )->prev ;
3945 /* ɽ����ľ����*/
3946 j_henkan_show_candidates( gw, node, NULL ) ;
3947 }
3948 break ;
3949 /* ���θ����ɽ�����롣*/
3950 case ' ' :
3951 if( vNode != NULL ){
3952 /* ������Ƭ�θ����ؤ��Ƥ���ݥ����ư�����롣*/
3953 node->j_current_henkan_vector_index = vNode ;
3954 node->j_henkan_count = h_count ;
3955 /* ɽ����ľ����*/
3956 j_henkan_show_candidates( gw, node, NULL ) ;
3957 } else {
3958 /* minibuffer ���Ƥ��Ѵ���Ȥ˰�ư���롣*/
3959 skkinput_j_henkan_in_minibuff_init( gw, node ) ;
3960 }
3961 break ;
3962 /* Keyboard-Quit �����ä����ν�����*/
3963 case 0x07 :
3964 j_keyboard_quit( gw, node ) ;
3965 node->mtextbuffer[ 0 ] = '\0' ;
3966 break ;
3967 /* ���̤ν�ľ����*/
3968 case 0x0c :
3969 /* ɽ����ľ����*/
3970 j_henkan_show_candidates( gw, node, NULL ) ;
3971 /* �ޤ������������褵���Ȥ��ޤ���*/
3972 skkinput_RedrawScreen( gw ) ;
3973 break ;
3974 /* �����ʥ������Ϥ����ä���硣*/
3975 default :
3976 err_msg( node, "`%s' is not valid here!",
3977 charaToString( w->skkinput.keybuf[ 0 ] ) ) ;
3978 break ;
3979 }
3980 w->skkinput.keybuf_use = 0 ;
3981 w->skkinput.keybuf[ 0 ] = '\0' ;
3982 return 0 ;
3983 }
3984
lookup_at_string(char * string,int chara)3985 static int lookup_at_string( char *string, int chara )
3986 {
3987 char *ptr = string ;
3988 int i ;
3989
3990 for( i = 0 ; *ptr != '\0' ; ptr ++, i ++ ){
3991 if( *ptr == chara )
3992 return i ;
3993 }
3994 return (-1) ;
3995 }
3996
3997 #define upcase_char(ch) (((ch)>='a' && (ch)<='z')? ((ch)+('A'-'a')) : (ch))
3998
3999 /*
4000 * ľ�ܥ��������Ϥλ��Υߥ˥Хåե���ɽ������ؿ���
4001 */
j_input_by_code_or_menu_jmp_showCandidate(struct SKKInputNode * node,int code)4002 static void j_input_by_code_or_menu_jmp_showCandidate
4003 ( struct SKKInputNode *node, int code )
4004 {
4005 char buffer[ 4 ] ;
4006 int i ;
4007
4008 /* ��������¹Ԥ���ɬ�פ�����Τ��ɤ����ϵ��䡣initialize �Ǥ�� *
4009 * �Ƥ��ޤ��٤���*/
4010 j_input_by_code_menu1_codes[ 0 ] = j_code_n1_min ;
4011
4012 temporary_buffer[ 0 ] = '\0' ;
4013 buffer[ 3 ] = '\0' ;
4014
4015 /* �������ϰ���ˤ��뤫�ɤ�����Ƚ�Ǥ��롣*/
4016 if( code < j_code_n1_min )
4017 code = j_code_n1_min ;
4018 buffer[ 1 ] = code ;
4019 /* ��˥塼��Ĥ��롣*/
4020 for( i = 0 ; i < 6 ; i ++ ){
4021 buffer[ 0 ] = upcase_char( j_input_by_code_menu_keys1[ i ] ) ;
4022 buffer[ 2 ] = j_input_by_code_menu1_codes[ i ] ;
4023 strcat( temporary_buffer, buffer ) ;
4024 strcat( temporary_buffer, " " ) ;
4025 }
4026 code ++ ;
4027 /* �������ϰ���ˤ��뤫�ɤ�����Ƚ�Ǥ��롣*/
4028 buffer[ 1 ] = ( code < j_code_n1_max )? code : j_code_n1_min ;
4029 /* ��˥塼��Ĥ��롣(�ĤŤ�)*/
4030 for( i = 0 ; i < 6 ; i ++ ){
4031 buffer[ 0 ] = upcase_char( j_input_by_code_menu_keys1[ i + 6 ] ) ;
4032 buffer[ 2 ] = j_input_by_code_menu1_codes[ i ] ;
4033 strcat( temporary_buffer + 1, buffer ) ;
4034 strcat( temporary_buffer, " " ) ;
4035 }
4036 strcpy( node->mtextbuffer, temporary_buffer ) ;
4037 return ;
4038 }
4039
j_input_by_code_or_menu_1_jmp_showCandidate(struct SKKInputNode * node,int code)4040 static void j_input_by_code_or_menu_1_jmp_showCandidate
4041 ( struct SKKInputNode *node, int code )
4042 {
4043 unsigned int n1, n2, i ;
4044 unsigned char buffer[ 4 ] ;
4045
4046 n1 = ( code >> 8 ) ;
4047 n2 = ( code & 0x00FF ) ;
4048
4049 #if 0
4050 fprintf( stderr, "code, n1, n2 = %x, %x, %x\n", code, n1, n2 ) ;
4051 #endif
4052 temporary_buffer[ 0 ] = '\0' ;
4053 buffer[ 3 ] = '\0' ;
4054
4055 for( i = 0 ; i < 16 ; i ++ ){
4056 buffer[ 0 ] = upcase_char( j_input_by_code_menu_keys2[ i ] ) ;
4057 buffer[ 1 ] = n1 ;
4058 buffer[ 2 ] = n2 ;
4059
4060 strcat( temporary_buffer, buffer ) ;
4061 strcat( temporary_buffer, " " ) ;
4062
4063 n2 ++ ;
4064 if( n2 > j_code_n2_max )
4065 n2 = j_code_n2_min ;
4066 if( n2 == j_code_n2_min ){
4067 n1 ++ ;
4068 if( n1 > j_code_n1_max )
4069 n1 = j_code_n1_min ;
4070 }
4071 }
4072 strcpy( node->mtextbuffer, temporary_buffer ) ;
4073 return ;
4074 }
4075
do_function_j_input_by_code_or_menu_jump(Widget gw,struct SKKInputNode * node)4076 int do_function_j_input_by_code_or_menu_jump( Widget gw,
4077 struct SKKInputNode *node )
4078 {
4079 SkkInputWidget w = ( SkkInputWidget )gw ;
4080 unsigned char buffer[ 3 ] ;
4081 int func_no ;
4082
4083 /* ���顼��ɽ���Ǿä���Ƥ��ޤäƤ��뤫�⤷��ʤ�������ɽ������ */
4084 /* ��������Emacs �ϼ�ư�������Ƥ���ߤ��������ɡġ� */
4085 j_input_by_code_or_menu_jmp_showCandidate
4086 ( node, node->j_input_by_code_current_code ) ;
4087
4088 func_no = lookup_at_string( j_input_by_code_menu_keys1,
4089 w->skkinput.keybuf[ 0 ] ) ;
4090
4091 if( func_no < 0 ){
4092 switch( w->skkinput.keybuf[ 0 ] ){
4093 /* ������θ����ɽ�����롣*/
4094 case 'x' :
4095 node->j_input_by_code_current_code -= 2 ;
4096 if( node->j_input_by_code_current_code < j_code_n1_min )
4097 node->j_input_by_code_current_code = j_code_n1_max ;
4098 break ;
4099 /* ���ļ��θ����ɽ�����롣*/
4100 case ' ' :
4101 node->j_input_by_code_current_code += 2 ;
4102 if( node->j_input_by_code_current_code > j_code_n1_max )
4103 node->j_input_by_code_current_code = j_code_n1_min ;
4104 break ;
4105 /* C-g �ˤ�� Quit */
4106 case 0x07 :
4107 j_keyboard_quit( gw, node ) ;
4108 goto exit_menu ;
4109 /* ���̤�ɽ�����ʤ�����*/
4110 case 0x0c :
4111 node->mtextbuffer[ 0 ] = '\0' ;
4112 j_input_by_code_or_menu_jmp_showCandidate
4113 ( node, node->j_input_by_code_current_code ) ;
4114 /* �ޤ������������褵���Ȥ��ޤ���*/
4115 skkinput_RedrawScreen( gw ) ;
4116 goto exit_menu ;
4117 /* ����ʳ��Υ�����̵����*/
4118 default :
4119 err_msg( node, "`%s' is not valid here!",
4120 charaToString( w->skkinput.keybuf[ 0 ] ) ) ;
4121 goto exit_menu ;
4122 }
4123 /* ����ɽ����*/
4124 j_input_by_code_or_menu_jmp_showCandidate
4125 ( node, node->j_input_by_code_current_code ) ;
4126 } else {
4127 /* ���䤬���줿���ν�����*/
4128 buffer[ 0 ] = node->j_input_by_code_current_code + ( func_no / 6 ) ;
4129 buffer[ 1 ] = j_input_by_code_menu1_codes[ func_no % 6 ] ;
4130 buffer[ 2 ] = '\0' ;
4131
4132 node->j_input_by_code_current_code = buffer[ 0 ] << 8 | buffer[ 1 ] ;
4133 node->j_input_by_code_or_menu_mode ++ ;
4134
4135 /* ��ö�ߥ˥Хåե��ؤ�ɽ���ꥢ���롣*/
4136 skkinput_ClearMinibuffer( gw ) ;
4137 /* �������ɽ���������Ƥ�Ϳ���롣*/
4138 j_input_by_code_or_menu_1_jmp_showCandidate
4139 ( node, node->j_input_by_code_current_code ) ;
4140 }
4141 exit_menu:
4142 /* ����ʸ���ΥХåե���õ�롣*/
4143 w->skkinput.keybuf_use = 0 ;
4144 w->skkinput.keybuf[ 0 ] = '\0' ;
4145 return 0 ;
4146 }
4147
do_function_j_input_by_code_or_menu_1_jump(Widget gw,struct SKKInputNode * node)4148 int do_function_j_input_by_code_or_menu_1_jump( Widget gw,
4149 struct SKKInputNode *node )
4150 {
4151 SkkInputWidget w = ( SkkInputWidget )gw ;
4152 #if 0
4153 unsigned char buffer[ 3 ] ;
4154 #endif
4155 int func_no ;
4156 unsigned int n1, n2 ;
4157
4158 /* ���顼��ɽ���Ǿä���Ƥ��ޤäƤ��뤫�⤷��ʤ�������ɽ������ */
4159 /* ��������Emacs �ϼ�ư�������Ƥ���ߤ��������ɡġ� */
4160 j_input_by_code_or_menu_1_jmp_showCandidate
4161 ( node, node->j_input_by_code_current_code ) ;
4162
4163 func_no = lookup_at_string( j_input_by_code_menu_keys2,
4164 w->skkinput.keybuf[ 0 ] ) ;
4165 if( func_no < 0 ){
4166 /* 'a','s',�ĤǤʤ��ä����ν�����*/
4167 n1 = ( node->j_input_by_code_current_code ) >> 8 ;
4168 n2 = ( node->j_input_by_code_current_code ) & 0x00FF ;
4169 switch( w->skkinput.keybuf[ 0 ] ){
4170 /* ������θ���ؤ���롣*/
4171 case 'x' :
4172 n2 -= 15 ;
4173 if( n2 < j_code_n2_min ){
4174 n2 = j_code_n2_max - ( j_code_n2_min - n2 ) ;
4175 n1 -- ;
4176 if( n1 < j_code_n1_min )
4177 n1 = j_code_n1_max ;
4178 }
4179 break ;
4180 /* ���θ����õ����*/
4181 case ' ' :
4182 n2 += 17 ;
4183 if( n2 > j_code_n2_max ){
4184 n2 = ( n2 - j_code_n2_max ) + j_code_n2_min ;
4185 n1 ++ ;
4186 if( n1 > j_code_n1_max )
4187 n1 = j_code_n1_min ;
4188 }
4189 break ;
4190 /* j_keyboard quit �ξ��ν����ġ�*/
4191 case 0x07 :
4192 j_keyboard_quit( gw, node ) ;
4193 goto exit_menu_1 ;
4194 /* ���̤��ɽ�����롣*/
4195 case 0x0c :
4196 node->mtextbuffer[ 0 ] = '\0' ;
4197 j_input_by_code_or_menu_1_jmp_showCandidate
4198 ( node, node->j_input_by_code_current_code ) ;
4199 /* �ޤ������������褵���Ȥ��ޤ���*/
4200 skkinput_RedrawScreen( gw ) ;
4201 goto exit_menu_1 ;
4202 /* ����ʳ��Υ����ϥ��顼�ˤʤ롣*/
4203 default :
4204 err_msg( node, "`%s' is not valid here!",
4205 charaToString( w->skkinput.keybuf[ 0 ] ) ) ;
4206 goto exit_menu_1 ;
4207 }
4208 node->j_input_by_code_current_code = ( n1 << 8 ) | ( n2 & 0x00FF ) ;
4209 j_input_by_code_or_menu_1_jmp_showCandidate
4210 ( node, node->j_input_by_code_current_code ) ;
4211 } else {
4212 node->mtextbuffer[ 4 * func_no + 3 ] = '\0' ;
4213 j_insert_str( node, node->j_input_by_code_or_menu_point,
4214 node->mtextbuffer + 4 * func_no + 1 ) ;
4215 node->j_input_by_code_or_menu_mode = False ;
4216 node->mtextbuffer[ 0 ] = '\0' ;
4217 }
4218 exit_menu_1:
4219 /* ����ʸ���ΥХåե���õ�롣*/
4220 w->skkinput.keybuf_use = 0 ;
4221 w->skkinput.keybuf[ 0 ] = '\0' ;
4222 return 0 ;
4223 }
4224
4225 /*
4226 * ����ñ��(����)��������ؿ��ľ�꤯ư�����ɤ����档
4227 */
j_purge_from_jisyo(Widget gw,struct SKKInputNode * node)4228 int j_purge_from_jisyo( Widget gw, struct SKKInputNode *node )
4229 {
4230 if( node->j_henkan_on && node->j_henkan_key[ 0 ] != '\0' ){
4231 /* �ߥ˥Хåե������Ѥ��ơ�ʸ��������Ϥ����롣*/
4232 j_read_string( gw, node,
4233 "Really purge? (yes or no) ",
4234 J_PURGE_YES_OR_NO_P ) ;
4235 /* �Ƶ��� Widget ����Ǥ�ä�������ˤʤä��Τǡ���Ϥ�Ȥ��ʤ��ġ�*/
4236 }
4237 return 0 ;
4238 }
4239
4240 /*
4241 * �ޡ����åȤ���ؿ���
4242 */
j_set_mark_command(struct SKKInputNode * node)4243 int j_set_mark_command( struct SKKInputNode *node )
4244 {
4245 node->mark_pos = node->cur_pos ;
4246 err_msg( node, "Mark set" ) ;
4247 return 0 ;
4248 }
4249
4250 /*
4251 * ���ꤵ�줿�ϰϤ�ʸ�����ȴ���Ф���cutbuffer�ˤ��ޤ��ؿ���
4252 * �õ�뤫�ɤ����� flag ���ͤˤ�롣
4253 */
j_kill_region_sub(Widget gw,struct SKKInputNode * node,int flag)4254 static int j_kill_region_sub
4255 ( Widget gw, struct SKKInputNode *node, int flag )
4256 {
4257 int startpos, cutlen ;
4258 #if 0
4259 int length ;
4260 #endif
4261 SkkInputWidget w = ( SkkInputWidget )gw ;
4262
4263 /* �ޡ��������åȤ���Ƥ��ʤ��ä������ܡ�*/
4264 if( node->mark_pos < 0 ){
4265 err_msg( node, "The mark is not set now" ) ;
4266 return 1 ;
4267 }
4268 #if 0
4269 /* �ޡ������֤����������ˤ��ä���硣*/
4270 length = strlen( node->textbuffer ) ;
4271 if( node->mark_pos > length ){
4272 node->mark_pos = length ;
4273 }
4274 #endif
4275 if( node->mark_pos < node->cur_pos ){
4276 startpos = node->mark_pos ;
4277 cutlen = node->cur_pos - node->mark_pos ;
4278 } else {
4279 startpos = node->cur_pos ;
4280 cutlen = node->mark_pos - node->cur_pos ;
4281 }
4282 /* �ڤ�Ф���̣���ʤ��ä��顢¨ȴ���롣*/
4283 if( cutlen <= 0 )
4284 return 1 ;
4285 /* ������Ȼ��ꤵ�줿�̤���ȴ���Ф���*/
4286 strncpy( w->skkinput.cutbuffer, node->textbuffer + startpos, cutlen ) ;
4287 w->skkinput.cutbuffer[ cutlen ] = '\0' ;
4288
4289 if( flag )
4290 /* ��������ʹߤ�ʸ����õ�롣*/
4291 j_delete_region( node, startpos, startpos + cutlen ) ;
4292 return 0 ;
4293 }
4294
j_kill_region(Widget gw,struct SKKInputNode * node)4295 static int j_kill_region( Widget gw, struct SKKInputNode *node )
4296 {
4297 j_delete_kanaprefix( node ) ;
4298 return j_kill_region_sub( gw, node, True ) ;
4299 }
4300
j_kill_ring_save(Widget gw,struct SKKInputNode * node)4301 static int j_kill_ring_save( Widget gw, struct SKKInputNode *node )
4302 {
4303 j_delete_kanaprefix( node ) ;
4304 return j_kill_region_sub( gw, node, False ) ;
4305 }
4306
j_exchange_point_and_mark(struct SKKInputNode * node)4307 static int j_exchange_point_and_mark( struct SKKInputNode *node )
4308 {
4309 int tmp, length ;
4310 j_delete_kanaprefix( node ) ;
4311 if( node->mark_pos < 0 ){
4312 err_msg( node, "No mark set in this buffer" ) ;
4313 return 1 ;
4314 }
4315 /* �ޡ������֤����������ˤ��ä���硣*/
4316 length = strlen( node->textbuffer ) ;
4317 if( node->mark_pos > length ){
4318 node->mark_pos = length ;
4319 }
4320 tmp = node->cur_pos ;
4321 node->cur_pos = node->mark_pos ;
4322 node->mark_pos = tmp ;
4323 return 0 ;
4324 }
4325
4326 /*
4327 * ���ͤ��ڤ�Ф��ؿ���
4328 */
j_skip_numeric_character(unsigned char * ptr,unsigned char ** j_num_list_top)4329 static char *j_skip_numeric_character
4330 ( unsigned char *ptr, unsigned char **j_num_list_top )
4331 {
4332 int kanji_flag = False ;
4333 unsigned char *j_num_list = *j_num_list_top ;
4334
4335 /* ʸ����ü�����ޤ�³����*/
4336 while( *ptr != '\0' ){
4337 if( *ptr & 0x80 ){
4338 /* ���������ɤΣ��Х����ܤν�����*/
4339 if( *ptr != 0xA3 && kanji_flag == False )
4340 break ;
4341 /* ���������ɤΣ��Х����ܤν�����*/
4342 if( ( *ptr < 0xB0 || *ptr > 0xB9 ) && kanji_flag == True ){
4343 ptr -- ;
4344 break ;
4345 }
4346 *j_num_list ++ = '0' + *ptr - 0xB0 ;
4347 /* ���������ɤβ��Х����ܤǤ��뤫�åȤ��Ƥ�����*/
4348 kanji_flag = ( kanji_flag )? False : True ;
4349 } else if( *ptr < '0' || *ptr > '9' ){
4350 break ;
4351 } else {
4352 /* 0 ���� 9 �δ֤��ä����ġ�*/
4353 *j_num_list ++ = *ptr ;
4354 kanji_flag = False ;
4355 }
4356 ptr ++ ;
4357 }
4358 /* �ɤ��ޤ����Ѥ�����������Ƥ�����*/
4359 *j_num_list_top = j_num_list ;
4360 return ptr ;
4361 }
4362
j_identity(unsigned char * sptr,unsigned char * dptr)4363 static unsigned char *j_identity
4364 ( unsigned char *sptr, unsigned char *dptr )
4365 {
4366 while( *sptr != '\0' && *sptr != '/' ){
4367 *dptr ++ = *sptr ++ ;
4368 }
4369 *dptr = '\0' ;
4370 return sptr ;
4371 }
4372
j_zenkaku_num_str(unsigned char * sptr,unsigned char * dptr)4373 static unsigned char *j_zenkaku_num_str
4374 ( unsigned char *sptr, unsigned char *dptr )
4375 {
4376 while( *sptr != '\0' && *sptr != '/' ){
4377 *dptr ++ = 0xA3 ;
4378 *dptr ++ = ( *sptr ++ ) + 0xB0 - '0' ;
4379 }
4380 *dptr = '\0' ;
4381 return sptr ;
4382 }
4383
4384 static unsigned char *kanji_num_list = "������ϻ��Ȭ��" ;
4385
j_kanji_num_str(unsigned char * sptr,unsigned char * dptr)4386 static unsigned char *j_kanji_num_str
4387 ( unsigned char *sptr, unsigned char *dptr )
4388 {
4389 while( *sptr != '\0' && *sptr != '/' ){
4390 *dptr ++ = kanji_num_list[ ( ( *sptr ) - '0' ) * 2 + 0 ] ;
4391 *dptr ++ = kanji_num_list[ ( ( *sptr ) - '0' ) * 2 + 1 ] ;
4392 sptr ++ ;
4393 }
4394 *dptr = '\0' ;
4395 return sptr ;
4396 }
4397
j_kanji_num_str2(unsigned char * sptr,unsigned char * dptr)4398 static unsigned char *j_kanji_num_str2
4399 ( unsigned char *sptr, unsigned char *dptr )
4400 {
4401 int len = 0, silent, num ;
4402 static unsigned char *kazu_no_tanni[ 17 ] = {
4403 "��", "��", "��", "��", "Զ", "ٳ", "��", "��", "��", "��",
4404 "��", "��", "���Ϻ�", "���ε�", "��ͳ¾", "�ԲĻ�", "̵�����",
4405 } ;
4406 unsigned char *ptr ;
4407
4408 /* �ޤ�Ĺ����Ƚ�̤��롣*/
4409 while( sptr[ len ] != '\0' && sptr[ len ] != '/' )
4410 len ++ ;
4411 /* Ƭ�����ɽ������ʤ��Τ�̵�뤵��������ɡġ�*/
4412 while( *sptr == '0' ){
4413 len -- ;
4414 sptr ++ ;
4415 }
4416 if( len == 0 ){
4417 *dptr ++ = kanji_num_list[ 0 ] ;
4418 *dptr ++ = kanji_num_list[ 1 ] ;
4419 } else {
4420 num = ( ( len - 1 ) / 4 ) - 1 ;
4421 /* �礭�����Ǥ����� */
4422 if( num >= 17 ){
4423 /* ����ʤǤ������ͤ�̵�뤹�롣*/
4424 while( *sptr != '/' && *sptr != '\0' )
4425 sptr ++ ;
4426 goto exit_j_kanji_num_str2 ;
4427 }
4428 silent = True ;
4429 while( len > 0 ){
4430 if( *sptr > '1' || ( *sptr != '0' && ( len % 4 ) == 1 ) ){
4431 *dptr ++ = kanji_num_list[ ( ( *sptr ) - '0' ) * 2 + 0 ] ;
4432 *dptr ++ = kanji_num_list[ ( ( *sptr ) - '0' ) * 2 + 1 ] ;
4433 }
4434 if( *sptr != '0' ){
4435 /* ����ɴ����ΰ̤˰�ĤǤ⡻�Ǥʤ���Τ�����С��ۤäƤ��� *
4436 * ���ġ������ǡ��ۤäƤ��ʤ��äƤΤϡ����Ȥ����Ȥ�ɽ���� *
4437 * ��äư�̣�����ʤߤˡ���ΰ̤λ������Ǥʤ��ä��顢��Ȥ� *
4438 * ��ɽ������Ĥ��ʤ������Ĥͤ���*/
4439 if( len % 4 == 2 ){
4440 *dptr ++ = 0xBD ;
4441 *dptr ++ = 0xBD ;
4442 } else if( len % 4 == 3 ){
4443 *dptr ++ = 0xC9 ;
4444 *dptr ++ = 0xB4 ;
4445 } else if( len % 4 == 0 ){
4446 *dptr ++ = 0xC0 ;
4447 *dptr ++ = 0xE9 ;
4448 }
4449 silent = False ;
4450 }
4451 if( !silent || *sptr != '0' ){
4452 num = len - 1 ;
4453 if( num % 4 == 0 ){
4454 num = num / 4 - 1 ;
4455 /* ���Ȥ����Ȥ����Ȥ����������Τ�ɽ�����롩 */
4456 if( num >= 0 ){
4457 /* ñ�̤ԡ����롣*/
4458 ptr = kazu_no_tanni[ num ] ;
4459 while( *ptr != '\0' )
4460 *dptr ++ = *ptr ++ ;
4461 /* ɽ���������ۤ뤳�Ȥˤ��롣*/
4462 silent = True ;
4463 }
4464 }
4465 }
4466 len -- ;
4467 sptr ++ ;
4468 }
4469 }
4470 exit_j_kanji_num_str2:
4471 *dptr = '\0' ;
4472 return sptr ;
4473 }
4474
j_shogi_num_str(unsigned char * sptr,unsigned char * dptr)4475 static unsigned char *j_shogi_num_str
4476 ( unsigned char *sptr, unsigned char *dptr )
4477 {
4478 /* ��ʸ���ܤϱѿ����ʤ�����ɡġ�*/
4479 if( *sptr != '/' && *sptr != '\0' ){
4480 *dptr ++ = 0xA3 ;
4481 *dptr ++ = 0xB0 + ( *sptr ) - '0' ;
4482 *dptr = '\0' ;
4483 sptr ++ ;
4484 } else {
4485 return sptr ;
4486 }
4487 /* ��ʸ���ܤϴ����ˤʤ롣*/
4488 if( *sptr != '/' && *sptr != '\0' ){
4489 *dptr ++ = kanji_num_list[ ( ( *sptr ) - '0' ) * 2 + 0 ] ;
4490 *dptr ++ = kanji_num_list[ ( ( *sptr ) - '0' ) * 2 + 1 ] ;
4491 *dptr = '\0' ;
4492 sptr ++ ;
4493 } else {
4494 return sptr ;
4495 }
4496 /* ���ڤ�ʸ���ޤ����ʤ��롣*/
4497 while( *sptr != '/' && *sptr != '\0' )
4498 sptr ++ ;
4499 return sptr ;
4500 }
4501
4502 /*
4503 * # �������Ÿ������ؿ���
4504 */
j_num_exp(unsigned char * j_num_list_ptr,int type,unsigned char * dptr)4505 static unsigned char *j_num_exp
4506 ( unsigned char *j_num_list_ptr, int type, unsigned char *dptr )
4507 {
4508 switch( type ){
4509 case '0' :
4510 return j_identity( j_num_list_ptr, dptr ) ;
4511 case '1' :
4512 return j_zenkaku_num_str( j_num_list_ptr, dptr ) ;
4513 case '2' :
4514 return j_kanji_num_str( j_num_list_ptr, dptr ) ;
4515 case '3' :
4516 return j_kanji_num_str2( j_num_list_ptr, dptr ) ;
4517 case '9' :
4518 return j_shogi_num_str( j_num_list_ptr, dptr ) ;
4519 default:
4520 break ;
4521 }
4522 return j_num_list_ptr ;
4523 }
4524
j_numeric_convert(struct SKKInputNode * node,unsigned char * sptr,unsigned char * dptr)4525 static int j_numeric_convert
4526 ( struct SKKInputNode *node, unsigned char *sptr, unsigned char *dptr )
4527 {
4528 unsigned char *nptr = node->j_num_list ;
4529
4530 while( *sptr != '\0' ){
4531 if( *sptr == '#' ){
4532 sptr ++ ;
4533 /* # �������Ÿ�����롣*/
4534 nptr = j_num_exp( nptr, *sptr, dptr ) ;
4535 /* �դ����줿ʸ����ΰ��ֺǸ�ؤȰ�ư���롣*/
4536 while( *dptr != '\0' )
4537 dptr ++ ;
4538 /* ���ڤ�ʸ�������Ф���*/
4539 if( *nptr == '/' )
4540 nptr ++ ;
4541 sptr ++ ;
4542 } else {
4543 *dptr ++ = *sptr ++ ;
4544 }
4545 }
4546 *dptr = '\0' ;
4547 return 0 ;
4548 }
4549
4550 /*
4551 * �Ѵ������ʸ������Ѵ������פ���ο������ڤ�Ф��� "#" ���֤�������
4552 * �ؿ���
4553 */
j_compute_numeric_henkan_key(unsigned char * dptr,unsigned char * sptr,unsigned char * j_num_list)4554 static int j_compute_numeric_henkan_key
4555 ( unsigned char *dptr, unsigned char *sptr, unsigned char *j_num_list )
4556 {
4557 int kanji_flag = False ;
4558 while( *sptr != '\0' ){
4559 /* ���������ɤβ��Х����ܤ���Ƚ�Ǥ��롣*/
4560 if( *sptr & 0x80 ){
4561 kanji_flag = ( kanji_flag )? False : True ;
4562 } else {
4563 kanji_flag = False ;
4564 }
4565 /* �ɤ��ʸ�����ʡ� */
4566 if( *sptr >= '0' && *sptr <= '9' ){
4567 /* ������������饯������� 0 ���� 9 �δ֤��ä���� */
4568 *dptr ++ = '#' ;
4569 sptr = j_skip_numeric_character( sptr, &j_num_list ) ;
4570 /* ���ڤ국�������Ƥ�����*/
4571 *j_num_list ++ = '/' ;
4572 continue ;
4573 } else if( *sptr == 0xA3 && kanji_flag == True ){
4574 /* EUC ���������ɤ���� �� ���� �� ���ä���ġ�*/
4575 sptr ++ ;
4576 if( *sptr >= 0xB0 && *sptr <= 0xB9 ){
4577 *dptr ++ = '#' ;
4578 *j_num_list ++ = *sptr + '0' - 0xB0 ;
4579 sptr ++ ;
4580 /* ������³���¤ꥹ���åפ��롣*/
4581 sptr = j_skip_numeric_character( sptr, &j_num_list ) ;
4582 /* ���ڤ국�������Ƥ�����*/
4583 *j_num_list ++ = '/' ;
4584 } else {
4585 /* ��������ʤ��ä���ġ�*/
4586 *dptr ++ = 0xA3 ;
4587 *dptr ++ = *sptr ;
4588 }
4589 continue ;
4590 }
4591 *dptr ++ = *sptr ++ ;
4592 }
4593 *dptr = '\0' ;
4594 *j_num_list = '\0' ;
4595 return 0 ;
4596 }
4597
4598 /*
4599 * ������֤��ͤ��ᤷ��ʸ�������������ؿ���
4600 */
j_insert_word(Widget gw,struct SKKInputNode * node,int pos,unsigned char * word)4601 static int j_insert_word
4602 ( Widget gw, struct SKKInputNode *node, int pos, unsigned char *word )
4603 {
4604 int len = strlen( word ) ;
4605 SkkInputWidget w = ( SkkInputWidget )gw ;
4606
4607 /* �����ΥХåե��Ͼ����礭�ܤˤȤäƤ��������ĥХ����Ǥʤ��褦�ˡ�*/
4608 /* �㤨�С�"������ɴ����̵�����������ɴ�����ԲĻ�������ɴ�� *
4609 * ������ͳ¾������ɴ�����ε�������ɴ���Ϻ�������ɴ����*
4610 * ��������ɴ�����������ɴ������������ɴ�����������ɴ����*
4611 * ��������ɴ�����������ɴ���� ������ɴ����Զ������ɴ����*
4612 * ��������ɴ������������ɴ����������ɴ������������ɴ����*
4613 * "�����꤭��ʤ��Ȥ����ʤ����Ĥޤꡢ155 * 2 = 310 bytes */
4614 unsigned char buffer[ TEXTBUFSIZE * 5 ] ;
4615
4616 if( node->j_num_list[ 0 ] != '\0' &&
4617 w->skkinput.use_numeric_conversion ){
4618 j_numeric_convert( node, word, buffer ) ;
4619 word = buffer ;
4620 }
4621 if( word[ 0 ] == '(' && word[ len - 1 ] == ')' ){
4622 /* �������¹ԤäƤʤ櫓�ʤ�����ɤ͡Ĥ���ʤΤǤ��ޤ���ͤ�
4623 */
4624 if( !strncmp( word, "(concat ", 8 ) ){
4625 j_concat( node, word, buffer ) ;
4626 word = buffer ;
4627 }
4628 }
4629 j_insert_str( node, pos, word ) ;
4630 return 0 ;
4631 }
4632
4633 /*
4634 * ���椬 16�ʿ���ɽ������ˤդ��路�����ɤ������֤��ؿ���
4635 */
chara_to_hex(int chara)4636 static int chara_to_hex( int chara )
4637 {
4638 if( chara >= '0' && chara <= '9' )
4639 return ( chara - '0' ) ;
4640 if( chara >= 'a' && chara <= 'f' )
4641 return ( chara - 'a' + 10 ) ;
4642 if( chara >= 'A' && chara <= 'F' )
4643 return ( chara - 'A' + 10 ) ;
4644 return ( -1 ) ;
4645 }
4646
4647 /*
4648 * concat �ν����Ƥ����Ȧ�Ĥδؿ���
4649 */
j_concat(struct SKKInputNode * node,unsigned char * sptr,unsigned char * dptr)4650 static int j_concat
4651 ( struct SKKInputNode *node, unsigned char *sptr, unsigned char *dptr )
4652 {
4653 int num1, num2 ;
4654 char *s_top = sptr, *d_top = dptr ;
4655
4656 /* ʸ����γ��ϰ��֤���롣*/
4657 while( *sptr != 0x22 && *sptr != '\0' )
4658 sptr ++ ;
4659 /* �����ʤ꽪��ä��顢������ȴ���롣*/
4660 if( *sptr == '\0' )
4661 goto err_jconcat ;
4662 sptr ++ ;
4663 /* ʸ����Υ��ԡ��Ϥ��롣*/
4664 while( *sptr != '\0' && *sptr != 0x22 ){
4665 /* �ü쵭��Ǥ��� "\\" ���褿������ա��������� */
4666 if( *sptr == '\\' ){
4667 sptr ++ ;
4668 /* ����ȥ��륳���ɤϤϤͤ�Ȥ������Ȥ�˺��ʤ�������ȥ� *
4669 * �륳���ɤ�ľ�����äƤ��ޤ��ȶ줷�����ȤˤʤäƤ��ޤ���*/
4670 if( *sptr == 'x' ){
4671 /* 16 �ʿ��ˤ��ľ�����Ϥߤ����ġ�*/
4672 sptr ++ ;
4673 /* ����ʤȤ����ʸ�����ڤ��Τϥ��顼��*/
4674 if( *sptr == '\0' )
4675 goto err_jconcat ;
4676 /* ����� 16 �ʿ�ɽ���Ȥ���������ʸ���ʤΡ� */
4677 if( ( num1 = chara_to_hex( *sptr ) ) < 0 ){
4678 /* �������ʤ�ʸ�����ä��Τǡ�ľ�����Ϥ��롣*/
4679 *dptr ++ = *sptr ++ ;
4680 continue ;
4681 }
4682 sptr ++ ;
4683 /* ����ʤȤ����ʸ�����ڤ��Τϥ��顼��������Ĥ����� *
4684 * ���Ĥ�����֥륯�������Ȥ��ʤ����顣*/
4685 if( *sptr == '\0' )
4686 goto err_jconcat ;
4687 /* ����� 16 �ʿ�ɽ���Ȥ���������ʸ���ʤΡ� */
4688 if( ( num2 = chara_to_hex( *sptr ) ) < 0 ){
4689 /* �������ʤ�ʸ�����ä��Τǡ�ľ�����Ϥ��롣*/
4690 /* ���λ����������ʸ���ϥ���ȥ��륳���ɤʤΤǼΤƤ롣*/
4691 *dptr ++ = *sptr ++ ;
4692 continue ;
4693 }
4694 sptr ++ ;
4695 num1 = ( num1 << 4 ) | num2 ;
4696 /* ��ɥ���ȥ��륳���ɤ��ä��Ρ� ���äȡ����줫��͡�ľ�� *
4697 * ���ϤǴ����äƤΤϤ��Ƥ͡�*/
4698 if( num1 < 0x20 || num1 >= 0x7F )
4699 continue ;
4700 /* ����ȥ��륳���ɤ���ʤ��ä��ߤ����ʤΤǡġ�*/
4701 *dptr ++ = num1 ;
4702 continue ;
4703 } else if( *sptr == '0' ){
4704 /* 8 �ʿ��ˤ��ľ�����Ϥߤ����ġ�*/
4705 sptr ++ ;
4706 /* ����ʤȤ����ʸ�����ڤ��Τϥ��顼��*/
4707 if( *sptr == '\0' )
4708 goto err_jconcat ;
4709 /* ����� 8 �ʿ�ɽ���Ȥ���������ʸ���ʤΡ� */
4710 if( *sptr < '0' || *sptr > '7' ){
4711 /* �������ʤ�ʸ�����ä��Τǡ�ľ�����Ϥ��롣*/
4712 *dptr ++ = *sptr ++ ;
4713 continue ;
4714 } else {
4715 num1 = *sptr - '0' ;
4716 }
4717 sptr ++ ;
4718 /* ����ʤȤ����ʸ�����ڤ��Τϥ��顼��������Ĥ����� *
4719 * ���Ĥ�����֥륯�������Ȥ��ʤ����顣*/
4720 if( *sptr == '\0' )
4721 goto err_jconcat ;
4722 /* ����� 16 �ʿ�ɽ���Ȥ���������ʸ���ʤΡ� */
4723 if( *sptr < '0' || *sptr > '7' ){
4724 /* �������ʤ�ʸ�����ä��Τǡ�ľ�����Ϥ��롣*/
4725 /* ���λ����������ʸ���ϥ���ȥ��륳���ɤʤΤǼΤƤ롣*/
4726 *dptr ++ = *sptr ++ ;
4727 continue ;
4728 } else {
4729 num2 = *sptr - '0' ;
4730 }
4731 sptr ++ ;
4732 num1 = ( num1 << 3 ) | num2 ;
4733 /* ��ɥ���ȥ��륳���ɤ��ä��Ρ� ���äȡ����줫��͡�ľ�� *
4734 * ���ϤǴ����äƤΤϤ��Ƥ͡�*/
4735 if( num1 < 0x20 || num1 >= 0x7F )
4736 continue ;
4737 /* ����ȥ��륳���ɤ���ʤ��ä��ߤ����ʤΤǡġ�*/
4738 *dptr ++ = num1 ;
4739 continue ;
4740 } else if( ( *sptr >= '1' && *sptr <= '9' ) ||
4741 ( *sptr >= 'a' && *sptr <= 'f' ) ||
4742 ( *sptr >= 'A' && *sptr <= 'F' ) ){
4743 /* ����ȥ��륳���ɤ�ľ�������Ȥ��Ƥ���Τ�̵�롣*/
4744 sptr ++ ;
4745 continue ;
4746 } else {
4747 /* ����ʳ��ξ��ˤ�³��ʸ���������Ϥ��롣*/
4748 if( *sptr == '\0' )
4749 goto err_jconcat ;
4750 switch( *sptr ){
4751 case 't' :
4752 *dptr ++ = 0x20 ;
4753 sptr ++ ;
4754 break ;
4755 case 'n' :
4756 case 'r' :
4757 sptr ++ ;
4758 break ;
4759 default :
4760 *dptr ++ = *sptr ++ ;
4761 break ;
4762 }
4763 }
4764 } else {
4765 *dptr ++ = *sptr ++ ;
4766 }
4767 }
4768 /* ���֥륯�������Ȥ���ȸ��Ф��ƽ�λ�������ɤ�����Ƚ�Ǥ��롣*/
4769 if( *sptr == '\0' )
4770 goto err_jconcat ;
4771 /* �������Ĥ���̤θ��Ф��ʤ��͡ġ�*/
4772 *dptr = '\0' ;
4773 return True ;
4774
4775 err_jconcat:
4776 /* ǧ���˼��Ԥ��ޤ����ΤǡĽ�λ������ĺ���ޤ���*/
4777 strcpy( d_top, s_top ) ;
4778 return False ;
4779 }
4780
4781 #if 0
4782 /*
4783 * 1970 ǯ����ηв���֤���ñ�̤����Ϥ��롣
4784 */
4785 static struct my_tm my_localtime( unsigned long long int sec )
4786 {
4787 struct my_tm tmp ;
4788 /* ��ǯ�� 4 �dz��ڤ��ǯ����������100 �dz��ڤ줿���ˤϡ���ǯ���� *
4789 * �ʤ����Ǥ⡢400 �dz��ڤ����ˤϡ��ޤ���ǯ��*/
4790 unsigned long long int day ;
4791 int year, month ;
4792 int month_days[] = {
4793 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
4794 } ;
4795
4796 /* ���줬�в�������*/
4797 day = sec / ( 24 * 60 * 60 ) ;
4798 /* ��������롣*/
4799 tmp.week = ( day % 7 + 4 ) % 7 ;
4800 /* ǯ����롣*/
4801 for( year = 1970 ; day > 0 ; year ++ ){
4802 if( is_uruudoshi( year ) ){
4803 if( day < 366 )
4804 break ;
4805 day -= 366 ;
4806 } else {
4807 if( day < 365 )
4808 break ;
4809 day -= 365 ;
4810 }
4811 }
4812 tmp.year = year ;
4813 /* �����롣*/
4814 if( is_uruudoshi( year ) )
4815 month_days[ 1 ] = 29 ;
4816 for( month = 0 ; day >= month_days[ month ] ; month ++ ){
4817 day -= month_days[ month ] ;
4818 }
4819 tmp.day = ( int )day ;
4820 tmp.month = month ;
4821 return tmp ;
4822 }
4823 #endif
4824
4825 #define is_alphabetic(c) \
4826 ( ( ( (c) >= 'a' && (c) <= 'z' ) || ( (c) >= 'A' && (c) <= 'Z' ) || \
4827 ( (c) >= '0' && (c) <= '9' ) )? 1 : 0 )
4828
4829 /*
4830 * Ϳ����줿��ɸ����ʹ������˰�ñ���ư����Ȳ���ޤǹԤ��Τ����
4831 * ����ؿ���
4832 * �֤ͤ����ɤ����Ƥ���ʴؿ���ɬ�פʤΡ� �����ꤵ���
4833 * �֤���������� upcase-word �� downcase-word, capitalize-word �ˤ��
4834 * ����������
4835 * �֤ա������ʤ�����ܥ���ʬ���ä��衪��
4836 */
j_calc_forward_word(struct SKKInputNode * node,int pos)4837 static int j_calc_forward_word( struct SKKInputNode *node, int pos )
4838 {
4839 /* ����������ư�����롣*/
4840 if( !is_alphabetic( node->textbuffer[ pos ] ) ) {
4841 /* ����ե��٥åȤ��������ʤ��֤Ϥ���ʤࡣ*/
4842 while( node->textbuffer[ pos ] != '\0' &&
4843 !is_alphabetic( node->textbuffer[ pos ] ) ){
4844 pos = calc_forward_char( node, pos, 1 ) ;
4845 }
4846 }
4847 /* �⤦����ʾ奫������ϰ�ư�Ǥ��ʤ��Τǽ�λ���롣*/
4848 if( node->textbuffer[ pos ] == '\0' )
4849 return pos ;
4850 /* ����ե��٥åȤ�����δ֤Ϥ���ʤࡣ*/
4851 while( node->textbuffer[ pos ] != '\0' &&
4852 is_alphabetic( node->textbuffer[ pos ] ) ){
4853 pos = calc_forward_char( node, pos, 1 ) ;
4854 }
4855 return pos ;
4856 }
4857
4858 /*
4859 * ��ñ���������������ư������ؿ���
4860 */
j_forward_word(struct SKKInputNode * node)4861 static int j_forward_word( struct SKKInputNode *node )
4862 {
4863 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
4864 j_delete_kanaprefix( node ) ;
4865 /* ����������ư�����롣*/
4866 node->cur_pos = j_calc_forward_word( node, node->cur_pos ) ;
4867 return 0 ;
4868 }
4869
4870 /*
4871 *
4872 */
j_caseword(struct SKKInputNode * node,int pattern)4873 static int j_caseword( struct SKKInputNode *node, int pattern )
4874 {
4875 int pos ;
4876 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
4877 j_delete_kanaprefix( node ) ;
4878
4879 /* ���ߤΥ���������֤�Ф��Ƥ�����*/
4880 pos = node->cur_pos ;
4881 /* ����ޤǥ�������ϰ�ư����Τ��ʡ� */
4882 node->cur_pos = j_calc_forward_word( node, pos ) ;
4883
4884 /* �������뤬��ư�Ǥ��ʤ��ä��Ȥ������Ȥϡ���������Ϲ��������顢*
4885 * ��ʸ�����Ѵ����ʤ��Ȥ����ʤ�ʸ��������ˤ�ʤ��Ȥ������Ȥˤʤ�*/
4886 if( pos < node->cur_pos ){
4887 if( pattern == 'c' ){
4888 /* capitilaize �ξ�硣*/
4889 while( pos < node->cur_pos ){
4890 /* ���ֺǽ�˸��դ��ä�����ե��٥åȤ���ʸ�����Ѵ����ơ��� *
4891 * ��ʹߤϾ�ʸ�����Ѵ����롣*/
4892 if( ( node->textbuffer[ pos ] >= 'a' &&
4893 node->textbuffer[ pos ] <= 'z' ) ){
4894 node->textbuffer[ pos ] += ( 'A' - 'a' ) ;
4895 pos ++ ;
4896 break ;
4897 }
4898 /* ���ֺǽ�˸��դ��ä�����ե��٥åȤ���ʸ���ʤ��Ѵ������� */
4899 if( ( node->textbuffer[ pos ] >= 'A' &&
4900 node->textbuffer[ pos] <= 'Z' ) ){
4901 pos ++ ;
4902 break ;
4903 }
4904 pos ++ ;
4905 }
4906 /* ��� downcase �ξ���Ʊ�������ˤʤ롣*/
4907 pattern = 'd' ;
4908 }
4909 while( pos < node->cur_pos ){
4910 /* ��ʸ�����Ѵ����롣*/
4911 if( node->textbuffer[ pos ] >= 'a' &&
4912 node->textbuffer[ pos ] <= 'z' &&
4913 pattern == 'u' ){
4914 node->textbuffer[ pos ] += ( 'A' - 'a' ) ;
4915 } else if( node->textbuffer[ pos ] >= 'A' &&
4916 node->textbuffer[ pos ] <= 'Z' &&
4917 pattern == 'd' ){
4918 node->textbuffer[ pos ] += ( 'a' - 'A' ) ;
4919 }
4920 pos ++ ;
4921 }
4922 }
4923 return 0 ;
4924 }
4925
4926 /*
4927 * ��ñ���������������ư������ؿ���
4928 */
j_backward_word(struct SKKInputNode * node)4929 static int j_backward_word( struct SKKInputNode *node )
4930 {
4931 /* ��̾��������ʤ����ˤ��Ƥ��ޤ���*/
4932 j_delete_kanaprefix( node ) ;
4933 /* ����������ư�����롣*/
4934 if( !is_alphabetic( node->textbuffer[ node->cur_pos ] ) ) {
4935 /* ����ե��٥åȤ��������ʤ��֤Ϥ���ʤࡣ*/
4936 while( node->cur_pos > node->cur_pos_top &&
4937 !is_alphabetic( node->textbuffer[ node->cur_pos ] ) ){
4938 /* ��ʸ�����˰�ư���롣*/
4939 node->cur_pos -- ;
4940 if( ( node->textbuffer[ node->cur_pos ] & 0x80 ) &&
4941 node->cur_pos > node->cur_pos_top )
4942 node->cur_pos -- ;
4943 }
4944 }
4945 /* �⤦����ʾ奫������ϰ�ư�Ǥ��ʤ��Τǽ�λ���롣*/
4946 if( node->cur_pos == node->cur_pos_top )
4947 return 0 ;
4948 /* ����ե��٥åȤ�����δ֤Ϥ���ʤࡣ*/
4949 while( node->cur_pos > node->cur_pos_top &&
4950 is_alphabetic( node->textbuffer[ node->cur_pos ] ) ){
4951 /* ��ʸ�����˰�ư���롣*/
4952 node->cur_pos -- ;
4953 if( ( node->textbuffer[ node->cur_pos ] & 0x80 ) &&
4954 node->cur_pos > node->cur_pos_top )
4955 node->cur_pos -- ;
4956 }
4957 return 0 ;
4958 }
4959
4960 /*
4961 * ���Τޤ�����Ͽ����Ƥ��ޤ��Ȥޤ�����ã���Ѵ�����ؿ���
4962 *----
4963 * �Υ��֤����ɡ�
4964 */
j_quote_char_sub(unsigned char * word)4965 static int j_quote_char_sub( unsigned char *word )
4966 {
4967 unsigned char *dptr, *sptr ;
4968 int len, kanji_flag ;
4969 /* ���Τޤ�¸�ߤ�����ޤ�����ã����Ƥ��롣*/
4970 struct chara_string_pair conv_pattern[] = {
4971 { '\r', "\\r" }, { '\n', "\\n" }, { '/', "\\057" },
4972 { '\\', "\\\\" }, { '[', "\[" }, { '\"', "\\\"" },
4973 { '\0', NULL },
4974 } ;
4975 struct chara_string_pair *cptr ;
4976 /* �ޤ��Ϥ��ޤ��ʤ����Ѱդ��롣*/
4977 strcpy( temporary_buffer, "(concat \"" ) ;
4978 len = strlen( temporary_buffer ) ;
4979 dptr = temporary_buffer + len ;
4980 sptr = word ;
4981 /* �Ѵ��롼�ס�*/
4982 kanji_flag = False ;
4983 while( *sptr != '\0' && len < ( TEXTMAXLEN - 2 ) ){
4984 /* ���������ɤ��ɤ�����Ƚ�ꤹ��Ĥ����ϸ�˽�������뤱�ɤ͡�*/
4985 if( is_euc_kanji( *sptr ) ){
4986 if( kanji_flag ){
4987 *dptr ++ = *sptr ++ ;
4988 len ++ ;
4989 kanji_flag = False ;
4990 } else {
4991 /* ����������������;͵���ĤäƤ��ʤ����ν�����*/
4992 if( len + j_kanji_length >= ( TEXTMAXLEN - 2 ) ){
4993 break ;
4994 }
4995 *dptr ++ = *sptr ++ ;
4996 len ++ ;
4997 kanji_flag = True ;
4998 }
4999 } else {
5000 /* ��������ʤ��ä���硢�Ĥޤꥳ��ȥ��륳���ɤȤ������ä��� *
5001 * �Ȥ������ǽ��������櫓��*/
5002 cptr = conv_pattern ;
5003 while( cptr->chara != '\0' ){
5004 if( *sptr == cptr->chara ){
5005 int tmplen = strlen( cptr->string ) ;
5006 if( ( len + tmplen ) >= ( TEXTMAXLEN - 2 ) )
5007 goto exit_j_quote_sub ;
5008 strcpy( dptr, cptr->string ) ;
5009 dptr += tmplen ;
5010 len += tmplen ;
5011 sptr ++ ;
5012 break ;
5013 }
5014 cptr ++ ;
5015 }
5016 /* �����ȡ����ˤ�ҥåȤ��ʤ��ä����Ĥޤ꽤�����פ��ä���硣*/
5017 if( cptr->chara == '\0' ){
5018 *dptr ++ = *sptr ++ ;
5019 len ++ ;
5020 }
5021 }
5022 }
5023 exit_j_quote_sub:
5024 /* �Ǹ��Ĥ��Ƥ�������ν���������ʸ��������뤿��� -2 �ʤ�ƤΤ��� *
5025 * ���Ƥ����櫓����*/
5026 *dptr ++ = '\"' ;
5027 *dptr ++ = ')' ;
5028 *dptr ++ = '\0' ;
5029 /* �Ǹ�˽������ʸ������֤���*/
5030 strcpy( word, temporary_buffer ) ;
5031 return True ;
5032 }
5033
5034 /*
5035 * ���Τޤ�����Ͽ����Ƥ��ޤ��Ȥޤ�����ã���Ѵ�����ؿ���
5036 *----
5037 * (���) temporary_buffer �����Ѥ��롣
5038 */
j_quote_char(unsigned char * word)5039 static int j_quote_char( unsigned char *word )
5040 {
5041 unsigned char *ptr ;
5042 int len ;
5043 /* �����ȡ�lisp ��̿����ä����ˤϽ������ʤ����Ǥ⡢skkinput ���� *
5044 * ��Ǥ��� lisp ��̿��äƾ��ʤ�����ġ�*/
5045 len = strlen( word ) ;
5046 if( len > 2 && word[ 0 ] == '(' && word[ 1 ] < 128 &&
5047 word[ len - 1 ] == ')' ){
5048 return False ;
5049 }
5050 /* �����˽������ʤ��Ȥ����ʤ�ʸ�������äƤ��뤫�ɤ��������å����롣*/
5051 for( ptr = word ; *ptr != '\0' ; ptr ++ ){
5052 switch( *ptr ){
5053 case '/' :
5054 case '\n' :
5055 case '\r' :
5056 case '\\' :
5057 case '[' :
5058 case ']' :
5059 return j_quote_char_sub( word ) ;
5060 default :
5061 break ;
5062 }
5063 }
5064 return False ;
5065 }
5066
save_ringbuffer(unsigned char * buffer,int bufsize,int * startpos,int * endpos,unsigned char * string)5067 static int save_ringbuffer
5068 ( unsigned char *buffer, int bufsize, int *startpos, int *endpos,
5069 unsigned char *string )
5070 {
5071 int spos ;
5072 unsigned char *ptr ;
5073
5074 /* ����ʸ������ä��ꡢ��Ƭ���ԥ����ɤ��ä��ꤷ�����ˤ���Ͽ���ʤ���*/
5075 if( string[ 0 ] == '\n' || string[ 0 ] == '\r' ||
5076 string[ 0 ] == '\0' )
5077 return 0 ;
5078 /* �������� ring buffer �ؤ� save */
5079 ptr = buffer + *endpos ;
5080 spos = *endpos ;
5081 do {
5082 /* ʸ����� ring buffer �ؤȤ��롣*/
5083 *ptr ++ = *string ++ ;
5084 spos ++ ;
5085 /* �Хåե��κǸ�ޤ���ã���Ƥ��ޤä�����Ƭ���᤹��*/
5086 if( spos >= bufsize ){
5087 spos = 0 ;
5088 ptr = buffer ;
5089 }
5090 } while( *string != '\0' ) ;
5091
5092 *ptr ++ = '\0' ;
5093 spos ++ ;
5094 if( spos >= bufsize ){
5095 spos = 0 ;
5096 ptr = buffer ;
5097 }
5098
5099 /* ��������Ͽ�������ä���������Ƥ��ޤä��� */
5100 /* ���Υ����å��ǺѤ�Τϡ�ring buffer �������μ¤���Ͽ�����ʸ���� */
5101 /* �����礭�����Ȥ�����ˤʤ롣���ξ�����������Ƥ��롣*/
5102 if( ( ( *startpos < *endpos ) && ( spos < *endpos ) ) ||
5103 ( ( *startpos > *endpos ) && ( spos > *startpos ) ) ){
5104 /* ��괺���������ߤΰ��֤ϼ��θ��䤬��Ͽ�������ˤʤ롣*/
5105 *endpos = spos ;
5106 /* ���θ���γ��ϰ��֤ޤǥ����åפ��롣*/
5107 do {
5108 ptr ++ ;
5109 spos ++ ;
5110 /* �Хåե��κǸ�ޤ���ã���Ƥ��ޤä�����Ƭ���᤹��*/
5111 if( spos >= bufsize ){
5112 spos = 0 ;
5113 ptr = buffer ;
5114 }
5115 } while( *ptr != '\0' ) ;
5116 /* '\0' �μ����餬������*/
5117 *startpos = ( spos + 1 ) % bufsize ;
5118 } else {
5119 *endpos = spos ;
5120 }
5121 return 0 ;
5122 }
5123