--- source/input.c.orig	Sat Sep 23 01:07:16 2000
+++ source/input.c	Mon Dec  4 03:49:56 2000
@@ -31,6 +31,7 @@
 #include "vars.h"
 #include "window.h"
 #include "output.h"
+#include "kanji.h"
 #include <sys/ioctl.h>		/* XXX ugh */
 
 /*
@@ -70,7 +71,6 @@
 #define INPUT_LINE 		current_screen->input_line
 #define CUT_BUFFER		cut_buffer
 #define SET_CUT_BUFFER(x)	malloc_strcpy(&CUT_BUFFER, x);
-
 #define BUILT_IN_KEYBINDING(x) void x (char key, char *string)
 
 
@@ -81,9 +81,19 @@
 
 	while (*str && i < len)
 	{
-		term_putchar(*str);
-		str++, i++;
+	        if (ISKANJI(*str) && ISKANJI(*(str+1))) {
+		  if (i < len - 1) {
+		    term_putchar(*str, *(str+1));
+		    str += 2; i += 2;
+		  } else {
+		    break; /* goto END */
+		  }
+		} else {
+		  term_putchar(*str, '\0');
+		  str++, i++;
+		}
 	}
+	/* END: */
 	return i;
 }
 
@@ -321,9 +331,16 @@
 	 */
 	if (START_ZONE == WIDTH)
 		INPUT_ONSCREEN = 0;
-	else
+	else {
+	        int pos = THIS_POS;
 		INPUT_ONSCREEN = START_ZONE - WIDTH - INPUT_PROMPT_LEN;
-
+		/* adjust kanji */
+		while (pos > INPUT_ONSCREEN) {
+		  ISKANJI(INPUT_BUFFER[pos - 1]) ? pos -= 2 : pos--;
+		}
+		INPUT_ONSCREEN = pos;
+	}
+		
 	/*
 	 * And the cursor is simply how many characters away THIS_POS is
 	 * from the first column on the screen.
@@ -468,16 +485,28 @@
 	{
 		if (THIS_CHAR)
 		{
-			THIS_POS++;
-			term_cursor_right();
+		        if (ISKANJI (THIS_CHAR)) {
+			  THIS_POS+=2;
+			  term_right(2);
+			}else{
+			  THIS_POS++;
+			  term_cursor_right();
+			}
 		}
 	}
 	else
 	{
 		if (THIS_POS > MIN_POS)
 		{
-			THIS_POS--;
-			term_cursor_left();
+		  	if (THIS_POS > MIN_POS - 1
+			    && ISKANJI(PREV_CHAR)
+			    && ISKANJI(INPUT_BUFFER[THIS_POS-2])) {
+			  THIS_POS -= 2;
+			  term_left(2);
+			}else{
+			  THIS_POS--;
+			  term_cursor_left();
+			}
 		}
 	}
 	update_input(NO_UPDATE);
@@ -590,7 +619,7 @@
 	update_input(UPDATE_JUST_CURSOR);
 }
 
-static void	input_delete_char_from_screen (void)
+static void	input_delete_char_from_screen (int count)
 {
 	/*
 	 * Remove the current character from the screen's display.
@@ -607,7 +636,7 @@
 		/*
 		 * Delete the character.  This is the simple part.
 		 */
-		term_delete(1);
+		term_delete(count);
 
 		/*
 		 * So right now we have a blank space at the right of the
@@ -615,14 +644,14 @@
 		 * is out in that position, we need to find it and display it.
 		 */
 		if (INPUT_ONSCREEN == 0)		/* UGH! */
-			pos = last_input_screen->co - INPUT_PROMPT_LEN - 1;
+			pos = last_input_screen->co - INPUT_PROMPT_LEN - count;
 		else
-			pos = INPUT_ONSCREEN + last_input_screen->co - 1;
+			pos = INPUT_ONSCREEN + last_input_screen->co - count;
 
 		if (pos < strlen(INPUT_BUFFER))
 		{
-			term_move_cursor(last_input_screen->co - 1, INPUT_LINE);
-			term_putchar(INPUT_BUFFER[pos]);
+			term_move_cursor(last_input_screen->co - count, INPUT_LINE);
+			term_putchar(INPUT_BUFFER[pos], '\0');
 			term_move_cursor(INPUT_CURSOR, INPUT_LINE);
 		}
 
@@ -637,6 +666,7 @@
  */
 BUILT_IN_KEYBINDING(input_delete_character)
 {
+        int count;
 	cursor_to_input();
 
 	/*
@@ -646,12 +676,14 @@
 	if (!THIS_CHAR)
 		return;
 
+	count = ISKANJI(THIS_CHAR) ? 2 : 1;
+	
 	/* 
 	 * Remove the current character from the logical buffer
 	 * and also from the screen.
 	 */
-	ov_strcpy(&THIS_CHAR, &NEXT_CHAR);
-	input_delete_char_from_screen();
+	ov_strcpy(&THIS_CHAR, &INPUT_BUFFER[THIS_POS+count]);
+	input_delete_char_from_screen(count);
 }
 
 
@@ -804,7 +836,24 @@
  */
 BUILT_IN_KEYBINDING(input_add_character)
 {
+        static u_char c1 = '\0', c2;
 	int	display_flag = NO_UPDATE;
+	int     length;
+
+	/* add by atsushi */
+	if (ISKANJI(key)) {
+	  if (c1 == '\0') { /* kanji 1st char */
+	    c1 = key;
+	    return;
+	  }else{ /* kanji 2nd char */
+	    c2 = key;
+	    length  = 2;
+	  }
+	}else{
+	  c1 = key;
+	  length = 1;
+	}
+	/* end add */
 
 	cursor_to_input();
 
@@ -812,7 +861,7 @@
 		term_echo(last_input_screen->promptlist->echo);
 
 	/* Don't permit the input buffer to get too big. */
-	if (THIS_POS >= INPUT_BUFFER_SIZE)
+	if (THIS_POS + length > INPUT_BUFFER_SIZE) /* change */
 	{
 		term_echo(1);
 		return;
@@ -832,7 +881,12 @@
 			 * Add to logical buffer
 			 */
 			ptr = LOCAL_COPY(&(THIS_CHAR));
-			THIS_CHAR = key;
+			/* add */
+			THIS_CHAR = c1;
+			if (length > 1) {
+			  THIS_POS++;
+			  THIS_CHAR = c2;
+			} /* end add */
 			NEXT_CHAR = 0;
 			ADD_TO_INPUT(ptr);
 
@@ -843,7 +897,7 @@
 				term_insert(key);
 			else
 			{
-				term_putchar(key);
+				term_putchar(c1, c2);
 				if (NEXT_CHAR)
 					display_flag = UPDATE_FROM_CURSOR;
 				else
@@ -855,26 +909,41 @@
 			/*
 			 * Add to logical buffer
 			 */
-			THIS_CHAR = key;
+		        /* add */
+			THIS_CHAR = c1;
+		        if (length > 1) {
+			  THIS_POS++;
+			  THIS_CHAR = c2;
+			} /* end add */
 			NEXT_CHAR = 0;
 
 			/* Add to display screen */
-			term_putchar(key);
+			term_putchar(c1, c2);
 		}
 	}
 
 	/* Overstrike mode.  Much simpler. */
+	/* Maybe we must change here (atsushi) */
 	else
 	{
-		if (THIS_CHAR == 0)
+	        if (THIS_CHAR == 0)
 			NEXT_CHAR = 0;
-		THIS_CHAR = key;
-		term_putchar(key);
+		THIS_CHAR = c1;
+		/* add */
+		 if (length > 1) {
+		   THIS_POS++;
+		   if (THIS_CHAR == 0)
+		         NEXT_CHAR = 0;
+		   THIS_CHAR = c2;
+		 } /* end add */
+
+		term_putchar(c1, c2);
 	}
 
 	THIS_POS++;
 	update_input(display_flag);
 	term_echo(1);
+        c1 = '\0';
 }
 
 /* input_clear_to_eol: erases from the cursor to the end of the input buffer */
@@ -935,8 +1004,8 @@
 	cursor_to_input();
 	if (last_input_screen->buffer_pos > MIN_POS)
 	{
-		u_char	c1, c2;
-		int	pos, end_of_line = 0;
+		u_char	c1[2], c2[2];
+		int	pos, ptr, end_of_line = 0;
 
 		/*
 		 * If we're in the middle of the input buffer,
@@ -956,6 +1025,9 @@
 		{
 			pos = THIS_POS - 1;
 			end_of_line = 1;
+			if (ISKANJI(INPUT_BUFFER[pos])) {
+			  pos--;
+			}
 		}
 
 		/*
@@ -968,25 +1040,49 @@
 		/*
 		 * Swap the two characters
 		 */
-		c1 = INPUT_BUFFER[pos];
-		c2 = INPUT_BUFFER[pos] = INPUT_BUFFER[pos - 1];
-		INPUT_BUFFER[pos - 1] = c1;
+		if (pos > 1 &&
+		    ISKANJI(INPUT_BUFFER[pos - 1]) &&
+		    ISKANJI(INPUT_BUFFER[pos - 2])) {
+		  c2[0] = INPUT_BUFFER[pos - 2];
+		  c2[1] = INPUT_BUFFER[pos - 1];
+		  ptr = pos - 2;
+		} else {
+		  c2[0] = INPUT_BUFFER[pos - 1];
+		  c2[1] = '\0';
+		  ptr = pos - 1;
+		}
 
+		if (ISKANJI(INPUT_BUFFER[pos])) {
+		  c1[0] = INPUT_BUFFER[ptr++] = INPUT_BUFFER[pos];
+		  c1[1] = INPUT_BUFFER[ptr++] = INPUT_BUFFER[pos + 1];
+		} else {
+		  c1[0] = INPUT_BUFFER[ptr++] = INPUT_BUFFER[pos];
+		  c1[1] = '\0';
+		}
+		/* adjust THIS_POS */
+		if (!end_of_line)
+		  THIS_POS = ptr;
+		
+		INPUT_BUFFER[ptr++] = c2[0];
+		if (c2[1]) {
+		  INPUT_BUFFER[ptr] = c2[1];
+		}
+		
 		/*
 		 * Adjust the cursor and output the new chars.
 		 */
-		term_cursor_left();
 		if (end_of_line)
-			term_cursor_left();
-		term_putchar(c1);
-		term_putchar(c2);
+		  c1[1] ? term_left(2) : term_cursor_left();
+		c2[1] ? term_left(2) : term_cursor_left();
+		term_putchar(c1[0], c1[1]);
+		term_putchar(c2[0], c2[1]);
 
 		/*
 		 * Move the cursor back onto 'c2', if we're not at
 		 * the end of the input line.
 		 */
 		if (!end_of_line)
-			term_cursor_left();
+		  c2[1] ? term_left(2) : term_cursor_left();
 
 		/*
 		 * Reset the internal cursor.
@@ -1232,7 +1328,6 @@
 
 	if (xxx_return)
 		return;
-
 	/* If the high bit is set, mangle it as neccesary. */
 	if (key & 0x80)
 	{
@@ -1242,9 +1337,8 @@
 			key &= ~0x80;
 		}
 		else if (!term_eight_bit())
-			key &= ~0x80;
+		  key &= ~0x80;
 	}
-
 	extended_key = key;
 
 	/* If we just hit the quote character, add this character literally */


syntax highlighted by Code2HTML, v. 0.9.1