--- 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