The branch main has been updated by bapt:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=62fba0054d9eb2303116f54be1f9bc0e7b75cc15

commit 62fba0054d9eb2303116f54be1f9bc0e7b75cc15
Author:     Baptiste Daroussin <[email protected]>
AuthorDate: 2026-02-14 05:44:54 +0000
Commit:     Baptiste Daroussin <[email protected]>
CommitDate: 2026-02-17 11:50:16 +0000

    ee: add unicode support
    
    - Add native support for unicode everywhere.
    - Remove Big5 specific code (and the menu entry)
    
    PR:             291279
    MFC After:      1 month
    Tested by:       Marek Zarychta
    Differential Revision:  https://reviews.freebsd.org/D55303
---
 contrib/ee/ee.c | 639 ++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 408 insertions(+), 231 deletions(-)

diff --git a/contrib/ee/ee.c b/contrib/ee/ee.c
index a14f9c0ead13..13a554bf0146 100644
--- a/contrib/ee/ee.c
+++ b/contrib/ee/ee.c
@@ -64,13 +64,17 @@ char *version = "@(#) ee, version "  EE_VERSION  " 
$Revision: 1.104 $";
 #ifdef NCURSE
 #include "new_curse.h"
 #elif HAS_NCURSES
+#define _XOPEN_SOURCE_EXTENDED
 #include <ncurses.h>
 #else
 #include <curses.h>
 #endif
 
 #include <ctype.h>
+#include <limits.h>
 #include <signal.h>
+#include <wchar.h>
+#include <wctype.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -181,10 +185,6 @@ int local_LINES = 0;               /* copy of LINES, to 
detect when win resizes */
 int local_COLS = 0;            /* copy of COLS, to detect when win resizes  */
 int curses_initialized = FALSE;        /* flag indicating if curses has been 
started*/
 int emacs_keys_mode = FALSE;   /* mode for if emacs key binings are used    */
-int ee_chinese = FALSE;                /* allows handling of multi-byte 
characters  */
-                               /* by checking for high bit in a byte the    */
-                               /* code recognizes a two-byte character      */
-                               /* sequence                                  */
 
 unsigned char *point;          /* points to current position in line   */
 unsigned char *srch_str;       /* pointer for search string            */
@@ -216,6 +216,53 @@ WINDOW *text_win;
 WINDOW *help_win;
 WINDOW *info_win;
 
+/*
+ |     UTF-8 utility functions.
+ */
+
+/* Return the number of bytes in the UTF-8 character starting at s. */
+static int
+utf8_len(const unsigned char *s)
+{
+       if (*s < 0x80)
+               return 1;
+       if ((*s & 0xE0) == 0xC0)
+               return 2;
+       if ((*s & 0xF0) == 0xE0)
+               return 3;
+       if ((*s & 0xF8) == 0xF0)
+               return 4;
+       return 1;       /* invalid byte: treat as single byte */
+}
+
+/* Return a pointer to the start of the previous UTF-8 character. */
+static unsigned char *
+utf8_prev(const unsigned char *start, const unsigned char *ptr)
+{
+       if (ptr <= start)
+               return (unsigned char *)start;
+       ptr--;
+       while (ptr > start && (*ptr & 0xC0) == 0x80)
+               ptr--;
+       return (unsigned char *)ptr;
+}
+
+/* Return the display width of the UTF-8 character starting at s. */
+static int
+utf8_width(const unsigned char *s)
+{
+       wchar_t wc;
+       mbstate_t mbs;
+       int w;
+
+       if (*s < 0x80)
+               return 1;
+       memset(&mbs, 0, sizeof(mbs));
+       if (mbrtowc(&wc, (const char *)s, utf8_len(s), &mbs) == (size_t)-1)
+               return 1;
+       w = wcwidth(wc);
+       return (w >= 0) ? w : 1;
+}
 
 /*
  |     The following structure allows menu items to be flexibly declared.
@@ -247,6 +294,7 @@ struct menu_entries {
 
 unsigned char *resiz_line(int factor, struct text *rline, int rpos);
 void insert(int character);
+void insert_utf8(const unsigned char *mb, int len);
 void delete(int disp);
 void scanline(unsigned char *pos);
 int tabshift(int temp_int);
@@ -345,14 +393,13 @@ struct menu_entries modes_menu[] = {
        {"", NULL, NULL, NULL, NULL, -1},       /* 6. info window       */
        {"", NULL, NULL, NULL, NULL, -1},       /* 7. emacs key bindings*/
        {"", NULL, NULL, NULL, NULL, -1},       /* 8. right margin      */
-       {"", NULL, NULL, NULL, NULL, -1},       /* 9. chinese text      */
-       {"", NULL, NULL, NULL, dump_ee_conf, -1}, /* 10. save editor config */
+       {"", NULL, NULL, NULL, dump_ee_conf, -1}, /* 9. save editor config */
        {NULL, NULL, NULL, NULL, NULL, -1}      /* terminator           */
        };
 
-char *mode_strings[11]; 
+char *mode_strings[10];
 
-#define NUM_MODES_ITEMS 10
+#define NUM_MODES_ITEMS 9
 
 struct menu_entries config_dump_menu[] = {
        {"", NULL, NULL, NULL, NULL, 0}, 
@@ -422,8 +469,8 @@ char *emacs_help_text[22];
 char *emacs_control_keys[5];
 
 char *command_strings[5];
-char *commands[32];
-char *init_strings[22];
+char *commands[30];
+char *init_strings[20];
 
 #define MENU_WARN 1
 
@@ -523,8 +570,6 @@ char *menu_too_lrg_msg;
 char *more_above_str, *more_below_str;
 char *separator = 
"===============================================================================";
 
-char *chinese_cmd, *nochinese_cmd;
-
 #ifndef __STDC__
 #ifndef HAS_STDLIB
 extern char *malloc();
@@ -553,7 +598,7 @@ main(int argc, char *argv[])
        signal(SIGCHLD, SIG_DFL);
        signal(SIGSEGV, SIG_DFL);
        signal(SIGINT, edit_abort);
-       d_char = malloc(3);     /* provide a buffer for multi-byte chars */
+       d_char = malloc(5);     /* UTF-8 chars can be up to 4 bytes + NUL */
        d_word = malloc(150);
        *d_word = '\0';
        d_line = NULL;
@@ -624,41 +669,59 @@ main(int argc, char *argv[])
                }
 
                wrefresh(text_win);
-               in = wgetch(text_win);
-               if (in == -1)
-                       exit(0);  /* without this exit ee will go into an 
-                                    infinite loop if the network 
-                                    session detaches */
+               {
+                       wint_t win;
+                       int wret = wget_wch(text_win, &win);
+                       /*
+                        * ERR if the undersneath terminal is closed (like 
network failure on a ssh
+                        * session)
+                        * Normal exit as this is not an editor's error, but a 
network connection
+                        * issue
+                        */
+                       if (wret == ERR)
+                               exit(0);
+                       in = (int)win;
 
-               resize_check();
+                       resize_check();
 
-               if (clear_com_win)
-               {
-                       clear_com_win = FALSE;
-                       wmove(com_win, 0, 0);
-                       werase(com_win);
-                       if (!info_window)
+                       if (clear_com_win)
                        {
-                               wprintw(com_win, "%s", com_win_message);
+                               clear_com_win = FALSE;
+                               wmove(com_win, 0, 0);
+                               werase(com_win);
+                               if (!info_window)
+                               {
+                                       wprintw(com_win, "%s", com_win_message);
+                               }
+                               wrefresh(com_win);
                        }
-                       wrefresh(com_win);
-               }
 
-               if (in > 255)
-                       function_key();
-               else if ((in == '\10') || (in == 127))
-               {
-                       in = 8;         /* make sure key is set to backspace */
-                       delete(TRUE);
-               }
-               else if ((in > 31) || (in == 9))
-                       insert(in);
-               else if ((in >= 0) && (in <= 31))
-               {
-                       if (emacs_keys_mode)
-                               emacs_control();
-                       else
-                               control();
+                       if (wret == KEY_CODE_YES)
+                               function_key();
+                       else if ((in == '\10') || (in == 127))
+                       {
+                               in = 8;
+                               delete(TRUE);
+                       }
+                       else if (in >= 0x80)
+                       {
+                               unsigned char mb[MB_LEN_MAX + 1];
+                               mbstate_t mbs;
+                               memset(&mbs, 0, sizeof(mbs));
+                               size_t n = wcrtomb((char *)mb, (wchar_t)win,
+                                   &mbs);
+                               if (n != (size_t)-1)
+                                       insert_utf8(mb, (int)n);
+                       }
+                       else if ((in > 31) || (in == 9))
+                               insert(in);
+                       else if ((in >= 0) && (in <= 31))
+                       {
+                               if (emacs_keys_mode)
+                                       emacs_control();
+                               else
+                                       control();
+                       }
                }
        }
        return(0);
@@ -716,7 +779,7 @@ insert(int character)
        }
        *point = character;     /* insert new character                 */
        wclrtoeol(text_win);
-       if (!isprint((unsigned char)character)) /* check for TAB character*/
+       if (!isprint((unsigned char)character))
        {
                scr_pos = scr_horz += out_char(text_win, character, scr_horz);
                point++;
@@ -763,6 +826,85 @@ insert(int character)
        draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
 }
 
+/* insert a complete multi-byte UTF-8 character into line      */
+void
+insert_utf8(const unsigned char *mb, int len)
+{
+       int counter;
+       unsigned char *temp;
+       unsigned char *temp2;
+       int i;
+
+       text_changes = TRUE;
+       if ((curr_line->max_length - curr_line->line_length) < (len + 5))
+               point = resiz_line(len + 10, curr_line, position);
+
+       /* shift the tail of the line right by len bytes */
+       curr_line->line_length += len;
+       temp = point;
+       counter = position;
+       while (counter < curr_line->line_length)
+       {
+               counter++;
+               temp++;
+       }
+       temp++;
+       while (point < temp)
+       {
+               temp2 = temp - len;
+               *temp = *temp2;
+               temp--;
+       }
+
+       /* copy all bytes of the UTF-8 character */
+       for (i = 0; i < len; i++)
+               point[i] = mb[i];
+
+       /* display the character before advancing past it */
+       wclrtoeol(text_win);
+       {
+               char buf[5];
+               memcpy(buf, point, len);
+               buf[len] = '\0';
+               waddstr(text_win, buf);
+       }
+
+       point += len;
+       position += len;
+
+       scanline(point);
+       scr_pos = scr_horz;
+
+       if ((observ_margins) && (right_margin < scr_pos))
+       {
+               counter = position;
+               while (scr_pos > right_margin)
+                       prev_word();
+               if (scr_pos == 0)
+               {
+                       while (position < counter)
+                               right(TRUE);
+               }
+               else
+               {
+                       counter -= position;
+                       insert_line(TRUE);
+                       for (i = 0; i < counter; i++)
+                               right(TRUE);
+               }
+       }
+
+       if ((scr_horz - horiz_offset) > last_col)
+       {
+               horiz_offset += 8;
+               midscreen(scr_vert, point);
+       }
+
+       formatted = FALSE;
+
+       draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
+}
+
 /* delete character            */
 void 
 delete(int disp)
@@ -778,29 +920,18 @@ delete(int disp)
        {
                text_changes = TRUE;
                temp2 = tp = point;
-               if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127))
-               {
-                       del_width = 2;
-               }
+               unsigned char *prev = utf8_prev(curr_line->line, point);
+               del_width = point - prev;
                tp -= del_width;
                point -= del_width;
                position -= del_width;
                temp_pos = position;
                curr_line->line_length -= del_width;
-               if ((*tp < ' ') || (*tp >= 127))        /* check for TAB */
-                       scanline(tp);
-               else
-                       scr_horz -= del_width;
+               scanline(point);
                scr_pos = scr_horz;
                if (in == 8)
                {
-                       if (del_width == 1)
-                               *d_char = *point; /* save deleted character  */
-                       else
-                       {
-                               d_char[0] = *point;
-                               d_char[1] = *(point + 1);
-                       }
+                       memcpy(d_char, point, del_width);
                        d_char[del_width] = '\0';
                }
                while (temp_pos <= curr_line->line_length)
@@ -891,8 +1022,12 @@ scanline(unsigned char *pos)
                        temp++;
                else if (*ptr == 127)
                        temp += 2;
-               else if (!eightbit)
-                       temp += 5;
+               else if (*ptr >= 0x80)
+               {
+                       temp += utf8_width(ptr);
+                       ptr += utf8_len(ptr);
+                       continue;
+               }
                else
                        temp++;
                ptr++;
@@ -1016,29 +1151,55 @@ draw_line(int vertical, int horiz, unsigned char *ptr, 
int t_pos, int length)
        }
        while (column < 0)
        {
-               d = len_char(*temp, abs_column);
-               abs_column += d;
-               column += d;
-               posit++;
-               temp++;
+               if (*temp >= 0x80)
+               {
+                       d = utf8_width(temp);
+                       abs_column += d;
+                       column += d;
+                       posit += utf8_len(temp);
+                       temp += utf8_len(temp);
+               }
+               else
+               {
+                       d = len_char(*temp, abs_column);
+                       abs_column += d;
+                       column += d;
+                       posit++;
+                       temp++;
+               }
        }
        wmove(text_win, row, column);
        wclrtoeol(text_win);
        while ((posit < length) && (column <= last_col))
        {
-               if (!isprint(*temp))
+               if (*temp >= 0x80)
+               {
+                       int clen = utf8_len(temp);
+                       int dw = utf8_width(temp);
+                       char buf[5];
+                       memcpy(buf, temp, clen);
+                       buf[clen] = '\0';
+                       waddstr(text_win, buf);
+                       abs_column += dw;
+                       column += dw;
+                       posit += clen;
+                       temp += clen;
+               }
+               else if (!isprint(*temp))
                {
                        column += len_char(*temp, abs_column);
                        abs_column += out_char(text_win, *temp, abs_column);
+                       posit++;
+                       temp++;
                }
                else
                {
                        abs_column++;
                        column++;
                        waddch(text_win, *temp);
+                       posit++;
+                       temp++;
                }
-               posit++;
-               temp++;
        }
        if (column < last_col)
                wclrtoeol(text_win);
@@ -1404,13 +1565,10 @@ left(int disp)
 {
        if (point != curr_line->line)   /* if not at begin of line      */
        {
-               if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127))
-               {
-                       point--;
-                       position--;
-               }
-               point--;
-               position--;
+               unsigned char *prev = utf8_prev(curr_line->line, point);
+               int char_bytes = point - prev;
+               point = prev;
+               position -= char_bytes;
                scanline(point);
                wmove(text_win, scr_vert, (scr_horz - horiz_offset));
                scr_pos = scr_horz;
@@ -1439,14 +1597,11 @@ right(int disp)
 {
        if (position < curr_line->line_length)
        {
-               if ((ee_chinese) && (*point > 127) && 
-                   ((curr_line->line_length - position) >= 2))
-               {
-                       point++;
-                       position++;
-               }
-               point++;
-               position++;
+               int char_bytes = utf8_len(point);
+               if (position + char_bytes > curr_line->line_length)
+                       char_bytes = curr_line->line_length - position;
+               point += char_bytes;
+               position += char_bytes;
                scanline(point);
                wmove(text_win, scr_vert, (scr_horz - horiz_offset));
                scr_pos = scr_horz;
@@ -1485,12 +1640,16 @@ find_pos(void)
                        scr_horz += tabshift(scr_horz);
                else if (*point < ' ')
                        scr_horz += 2;
-               else if ((ee_chinese) && (*point > 127) && 
-                   ((curr_line->line_length - position) >= 2))
+               else if (*point >= 0x80)
                {
-                       scr_horz += 2;
-                       point++;
-                       position++;
+                       int clen = utf8_len(point);
+                       int dw = utf8_width(point);
+                       if (scr_horz + dw > scr_pos)
+                               break;
+                       scr_horz += dw;
+                       point += clen;
+                       position += clen;
+                       continue;
                }
                else
                        scr_horz++;
@@ -1789,20 +1948,6 @@ command(char *cmd_str1)
                expand_tabs = FALSE;
        else if (compare(cmd_str, Exit_string, FALSE))
                finish();
-       else if (compare(cmd_str, chinese_cmd, FALSE))
-       {
-               ee_chinese = TRUE;
-#ifdef NCURSE
-               nc_setattrib(A_NC_BIG5);
-#endif /* NCURSE */
-       }
-       else if (compare(cmd_str, nochinese_cmd, FALSE))
-       {
-               ee_chinese = FALSE;
-#ifdef NCURSE
-               nc_clearattrib(A_NC_BIG5);
-#endif /* NCURSE */
-       }
        else if (compare(cmd_str, QUIT_string, FALSE))
                quit(0);
        else if (*cmd_str == '!')
@@ -1855,9 +2000,19 @@ scan(char *line, int offset, int column)
        j = column;
        while (i < offset)
        {
-               i++;
-               j += len_char(*stemp, j);
-               stemp++;
+               if (*(unsigned char *)stemp >= 0x80)
+               {
+                       int clen = utf8_len((const unsigned char *)stemp);
+                       j += utf8_width((const unsigned char *)stemp);
+                       stemp += clen;
+                       i += clen;
+               }
+               else
+               {
+                       j += len_char(*stemp, j);
+                       stemp++;
+                       i++;
+               }
        }
        return(j);
 }
@@ -1885,14 +2040,25 @@ get_string(char *prompt, int advance)
        g_pos = 0;
        do
        {
+               wint_t win;
+               int wret;
+
                esc_flag = FALSE;
-               in = wgetch(com_win);
-               if (in == -1)
+               wret = wget_wch(com_win, &win);
+               if (wret == ERR)
                        exit(0);
-               if (((in == 8) || (in == 127) || (in == KEY_BACKSPACE)) && 
(g_pos > 0))
+               in = (int)win;
+               if (wret == KEY_CODE_YES && win == KEY_BACKSPACE)
+                       in = 8;
+               if (((in == 8) || (in == 127)) && (g_pos > 0))
                {
+                       unsigned char *prev = utf8_prev(
+                               (const unsigned char *)g_point,
+                               (const unsigned char *)nam_str);
+                       int char_bytes = (unsigned char *)nam_str - prev;
                        tmp_int = g_horz;
-                       g_pos--;
+                       g_pos -= char_bytes;
+                       nam_str -= char_bytes;
                        g_horz = scan(g_point, g_pos, g_position);
                        tmp_int = tmp_int - g_horz;
                        for (; 0 < tmp_int; tmp_int--)
@@ -1904,28 +2070,65 @@ get_string(char *prompt, int advance)
                                        waddch(com_win, '\010');
                                }
                        }
-                       nam_str--;
                }
-               else if ((in != 8) && (in != 127) && (in != '\n') && (in != 
'\r') && (in < 256))
+               else if (wret == KEY_CODE_YES)
                {
-                       if (in == '\026')       /* control-v, accept next 
character verbatim    */
-                       {                       /* allows entry of ^m, ^j, and 
^h       */
+                       /* ignore other function keys in string input */
+               }
+               else if ((in != 8) && (in != 127) && (in != '\n') && (in != 
'\r'))
+               {
+                       if (in == '\026')       /* control-v */
+                       {
                                esc_flag = TRUE;
-                               in = wgetch(com_win);
-                               if (in == -1)
+                               wret = wget_wch(com_win, &win);
+                               if (wret == ERR)
                                        exit(0);
+                               in = (int)win;
+                       }
+                       if (in >= 0x80)
+                       {
+                               char mb[MB_LEN_MAX + 1];
+                               mbstate_t mbs;
+                               memset(&mbs, 0, sizeof(mbs));
+                               size_t n = wcrtomb(mb, (wchar_t)win, &mbs);
+                               if (n != (size_t)-1)
+                               {
+                                       size_t i;
+                                       for (i = 0; i < n; i++)
+                                       {
+                                               *nam_str = mb[i];
+                                               nam_str++;
+                                               g_pos++;
+                                       }
+                                       if (g_horz < (last_col - 1))
+                                       {
+                                               char buf[5];
+                                               memcpy(buf, mb, n);
+                                               buf[n] = '\0';
+                                               waddstr(com_win, buf);
+                                       }
+                                       g_horz += utf8_width(
+                                               (const unsigned char *)
+                                               (nam_str - n));
+                               }
                        }
-                       *nam_str = in;
-                       g_pos++;
-                       if (!isprint((unsigned char)in) && (g_horz < (last_col 
- 1)))
-                               g_horz += out_char(com_win, in, g_horz);
                        else
                        {
-                               g_horz++;
-                               if (g_horz < (last_col - 1))
-                                       waddch(com_win, (unsigned char)in);
+                               *nam_str = in;
+                               g_pos++;
+                               if (!isprint((unsigned char)in) &&
+                                   (g_horz < (last_col - 1)))
+                                       g_horz += out_char(com_win, in,
+                                           g_horz);
+                               else
+                               {
+                                       g_horz++;
+                                       if (g_horz < (last_col - 1))
+                                               waddch(com_win,
+                                                   (unsigned char)in);
+                               }
+                               nam_str++;
                        }
-                       nam_str++;
                }
                wrefresh(com_win);
                if (esc_flag)
@@ -2606,11 +2809,26 @@ search(int display_message)
                        else            /* if not case sensitive        */
                        {
                                srch_3 = u_srch_str;
-                       while ((toupper(*srch_2) == *srch_3) && (*srch_3 != 
'\0'))
+                       while (*srch_3 != '\0')
                                {
+                                       wchar_t wc_text, wc_srch;
+                                       mbstate_t mbs;
+                                       int len_text, len_srch;
+                                       memset(&mbs, 0, sizeof(mbs));
+                                       len_text = (int)mbrtowc(&wc_text,
+                                           (char *)srch_2,
+                                           MB_CUR_MAX, &mbs);
+                                       if (len_text <= 0) len_text = 1;
+                                       memset(&mbs, 0, sizeof(mbs));
+                                       len_srch = (int)mbrtowc(&wc_srch,
+                                           (char *)srch_3,
+                                           MB_CUR_MAX, &mbs);
+                                       if (len_srch <= 0) len_srch = 1;
+                                       if (towupper(wc_text) != 
towupper(wc_srch))
+                                               break;
                                        found = TRUE;
-                                       srch_2++;
-                                       srch_3++;
+                                       srch_2 += len_text;
+                                       srch_3 += len_srch;
                                }
                        }       /* end else     */
                        if (!((*srch_3 == '\0') && (found)))
@@ -2688,12 +2906,38 @@ search_prompt(void)
        srch_str = get_string(search_prompt_str, FALSE);
        gold = FALSE;
        srch_3 = srch_str;
-       srch_1 = u_srch_str = malloc(strlen(srch_str) + 1);
+       srch_1 = u_srch_str = malloc(strlen((char *)srch_str) * 4 + 1);
        while (*srch_3 != '\0')
        {
-               *srch_1 = toupper(*srch_3);
-               srch_1++;
-               srch_3++;
+               if (*srch_3 >= 0x80)
+               {
+                       wchar_t wc;
+                       mbstate_t mbs;
+                       int clen;
+                       memset(&mbs, 0, sizeof(mbs));
+                       clen = (int)mbrtowc(&wc, (char *)srch_3,
+                           utf8_len(srch_3), &mbs);
+                       if (clen > 0)
+                       {
+                               wc = towupper(wc);
+                               memset(&mbs, 0, sizeof(mbs));
+                               size_t n = wcrtomb((char *)srch_1,
+                                   wc, &mbs);
+                               if (n != (size_t)-1)
+                                       srch_1 += n;
+                               srch_3 += clen;
+                       }
+                       else
+                       {
+                               *srch_1++ = *srch_3++;
+                       }
+               }
+               else
+               {
+                       *srch_1 = toupper(*srch_3);
+                       srch_1++;
+                       srch_3++;
+               }
        }
        *srch_1 = '\0';
        search(TRUE);
@@ -2706,14 +2950,11 @@ del_char(void)
        in = 8;  /* backspace */
        if (position < curr_line->line_length)  /* if not end of line   */
        {
-               if ((ee_chinese) && (*point > 127) && 
-                   ((curr_line->line_length - position) >= 2))
-               {
-                       point++;
-                       position++;
-               }
-               position++;
-               point++;
+               int clen = utf8_len(point);
+               if (position + clen > curr_line->line_length)
+                       clen = curr_line->line_length - position;
+               point += clen;
+               position += clen;
                scanline(point);
                delete(TRUE);
        }
@@ -2730,15 +2971,12 @@ undel_char(void)
 {
        if (d_char[0] == '\n')  /* insert line if last del_char deleted eol */
                insert_line(TRUE);
+       else if ((unsigned char)d_char[0] >= 0x80)
+               insert_utf8(d_char, strlen((char *)d_char));
        else
        {
                in = d_char[0];
                insert(in);
-               if (d_char[1] != '\0')
-               {
-                       in = d_char[1];
-                       insert(in);
-               }
        }
 }
 
@@ -2750,14 +2988,12 @@ del_word(void)
        int difference;
        unsigned char *d_word2;
        unsigned char *d_word3;
-       unsigned char tmp_char[3];
+       unsigned char tmp_char[5];
 
        if (d_word != NULL)
                free(d_word);
        d_word = malloc(curr_line->line_length);
-       tmp_char[0] = d_char[0];
-       tmp_char[1] = d_char[1];
-       tmp_char[2] = d_char[2];
+       memcpy(tmp_char, d_char, 5);
        d_word3 = point;
        d_word2 = d_word;
        tposit = position;
@@ -2790,9 +3026,7 @@ del_word(void)
        curr_line->line_length -= difference;
        *d_word2 = '\0';
        draw_line(scr_vert, scr_horz,point,position,curr_line->line_length);
-       d_char[0] = tmp_char[0];
-       d_char[1] = tmp_char[1];
-       d_char[2] = tmp_char[2];
+       memcpy(d_char, tmp_char, 5);
        text_changes = TRUE;
        formatted = FALSE;
 }
@@ -3310,11 +3544,6 @@ set_up_term(void)
        local_LINES = LINES;
        local_COLS = COLS;
 
-#ifdef NCURSE
-       if (ee_chinese)
-               nc_setattrib(A_NC_BIG5);
-#endif /* NCURSE */
-
 }
 
 void 
@@ -3424,10 +3653,12 @@ menu_op(struct menu_entries menu_list[])
                        wmove(temp_win, (counter + top_offset - off_start), 3);
 
                wrefresh(temp_win);
-               in = wgetch(temp_win);
-               input = in;
-               if (input == -1)
-                       exit(0);
+               {
+                       wint_t win;
+                       if (wget_wch(temp_win, &win) == ERR)
+                               exit(0);
+                       in = input = (int)win;
+               }
 
                if (isascii(input) && isalnum(input))
                {
@@ -3665,9 +3896,12 @@ help(void)
        wmove(com_win, 0, 0);
        wprintw(com_win, "%s", press_any_key_msg);
        wrefresh(com_win);
-       counter = wgetch(com_win);
-       if (counter == -1)
-               exit(0);
+       {
+               wint_t win;
+               if (wget_wch(com_win, &win) == ERR)
+                       exit(0);
+               counter = (int)win;
+       }
        werase(com_win);
        wmove(com_win, 0, 0);
        werase(help_win);
@@ -3905,14 +4139,12 @@ Format(void)
        unsigned char *tmp_srchstr;
        unsigned char *temp1, *temp2;
        unsigned char *temp_dword;
-       unsigned char temp_d_char[3];
+       unsigned char temp_d_char[5];
 
-       temp_d_char[0] = d_char[0];
-       temp_d_char[1] = d_char[1];
-       temp_d_char[2] = d_char[2];
+       memcpy(temp_d_char, d_char, 5);
 
 /*
- |     if observ_margins is not set, or the current line is blank, 
+ |     if observ_margins is not set, or the current line is blank,
  |     do not format the current paragraph
  */
 
@@ -4104,9 +4336,7 @@ Format(void)
        case_sen = temp_case;
        free(srch_str);
        srch_str = tmp_srchstr;
-       d_char[0] = temp_d_char[0];
-       d_char[1] = temp_d_char[1];
-       d_char[2] = temp_d_char[2];
+       memcpy(d_char, temp_d_char, 5);
        auto_format = tmp_af;
 
        midscreen(scr_vert, point);
@@ -4210,19 +4440,11 @@ ee_init(void)
                                else if (compare(str1, NOEIGHTBIT, FALSE))
                                {
                                        eightbit = FALSE;
-                                       ee_chinese = FALSE;
                                }
                                else if (compare(str1, EMACS_string, FALSE))
                                        emacs_keys_mode = TRUE;
                                else if (compare(str1, NOEMACS_string, FALSE))
                                        emacs_keys_mode = FALSE;
-                               else if (compare(str1, chinese_cmd, FALSE))
-                               {
-                                       ee_chinese = TRUE;
-                                       eightbit = TRUE;
-                               }
-                               else if (compare(str1, nochinese_cmd, FALSE))
-                                       ee_chinese = FALSE;
                        }
                        fclose(init_file);
                }
@@ -4230,15 +4452,6 @@ ee_init(void)
        free(string);
        free(home);
 
-       string = getenv("LANG");
-       if (string != NULL)
-       {
-               if (strcmp(string, "zh_TW.big5") == 0)
-               {
-                       ee_chinese = TRUE;
-                       eightbit = TRUE;
-               }
-       }
 }
 
 /*
@@ -4332,7 +4545,6 @@ dump_ee_conf(void)
        fprintf(init_file, "%s\n", nohighlight ? NOHIGHLIGHT : HIGHLIGHT );
        fprintf(init_file, "%s\n", eightbit ? EIGHTBIT : NOEIGHTBIT );
        fprintf(init_file, "%s\n", emacs_keys_mode ? EMACS_string : 
NOEMACS_string );
-       fprintf(init_file, "%s\n", ee_chinese ? chinese_cmd : nochinese_cmd );
 
        fclose(init_file);
 
@@ -4505,13 +4717,10 @@ Auto_Format(void)
        unsigned char *tmp_srchstr;
        unsigned char *temp1, *temp2;
        unsigned char *temp_dword;
-       unsigned char temp_d_char[3];
+       unsigned char temp_d_char[5];
        unsigned char *tmp_d_line;
 
-
-       temp_d_char[0] = d_char[0];
-       temp_d_char[1] = d_char[1];
-       temp_d_char[2] = d_char[2];
+       memcpy(temp_d_char, d_char, 5);
 
 /*
  |     if observ_margins is not set, or the current line is blank, 
@@ -4737,9 +4946,7 @@ Auto_Format(void)
        case_sen = temp_case;
        free(srch_str);
        srch_str = tmp_srchstr;
-       d_char[0] = temp_d_char[0];
-       d_char[1] = temp_d_char[1];
-       d_char[2] = temp_d_char[2];
+       memcpy(d_char, temp_d_char, 5);
        auto_format = TRUE;
        dlt_line->line_length = tmp_d_line_length;
        d_line = tmp_d_line;
@@ -4771,10 +4978,8 @@ modes_op(void)
                                        (info_window ? ON : OFF));
                sprintf(modes_menu[7].item_string, "%s %s", mode_strings[7], 
                                        (emacs_keys_mode ? ON : OFF));
-               sprintf(modes_menu[8].item_string, "%s %d", mode_strings[8], 
+               sprintf(modes_menu[8].item_string, "%s %d", mode_strings[8],
                                        right_margin);
-               sprintf(modes_menu[9].item_string, "%s %s", mode_strings[9], 
-                                       (ee_chinese ? ON : OFF));
 
                ret_value = menu_op(modes_menu);
 
@@ -4796,15 +5001,6 @@ modes_op(void)
                                break;
                        case 5:
                                eightbit = !eightbit;
-                               if (!eightbit)
-                                       ee_chinese = FALSE;
-#ifdef NCURSE
-                               if (ee_chinese)
-                                       nc_setattrib(A_NC_BIG5);
-                               else
-                                       nc_clearattrib(A_NC_BIG5);
-#endif /* NCURSE */
-
                                redraw();
*** 62 LINES SKIPPED ***

Reply via email to