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