To: vim-dev@vim.org Subject: Patch 6.1a.035 Fcc: outbox From: Bram Moolenaar MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 6.1a.035 Problem: multi-byte: When using ":sh" in the GUI, typed and displayed multi-byte characters are not handled correctly. Solution: Deal with multi-byte characters to and from the shell. (Yasuhiro Matsumoto) Also handle UTF-8 composing characters. Files: src/os_unix.c *** ../vim61a.034/src/os_unix.c Thu Feb 21 19:07:10 2002 --- src/os_unix.c Wed Mar 6 21:24:14 2002 *************** *** 3328,3335 **** { #define BUFLEN 100 /* length for buffer, pseudo tty limit is 128 */ char_u buffer[BUFLEN + 1]; char_u ta_buf[BUFLEN + 1]; /* TypeAHead */ ! int ta_len = 0; /* valid chars in ta_buf[] */ int len; int p_more_save; int old_State; --- 3328,3338 ---- { #define BUFLEN 100 /* length for buffer, pseudo tty limit is 128 */ char_u buffer[BUFLEN + 1]; + #ifdef FEAT_MBYTE + int buffer_off = 0; /* valid bytes in buffer[] */ + #endif char_u ta_buf[BUFLEN + 1]; /* TypeAHead */ ! int ta_len = 0; /* valid bytes in ta_buf[] */ int len; int p_more_save; int old_State; *************** *** 3432,3437 **** --- 3435,3444 ---- } else if (ta_buf[i] == '\r') ta_buf[i] = '\n'; + #ifdef FEAT_MBYTE + if (has_mbyte) + i += (*mb_ptr2len_check)(ta_buf + i) - 1; + #endif } /* *************** *** 3441,3450 **** --- 3448,3468 ---- if (pty_master_fd < 0) { for (i = ta_len; i < ta_len + len; ++i) + { if (ta_buf[i] == '\n' || ta_buf[i] == '\b') msg_putchar(ta_buf[i]); + #ifdef FEAT_MBYTE + else if (has_mbyte) + { + int l = (*mb_ptr2len_check)(ta_buf + i); + + msg_outtrans_len(ta_buf + i, l); + i += l - 1; + } + #endif else msg_outtrans_len(ta_buf + i, 1); + } windgoto(msg_row, msg_col); out_flush(); } *************** *** 3478,3489 **** */ while (RealWaitForChar(fromshell_fd, 10L, NULL)) { ! len = read(fromshell_fd, (char *)buffer, ! (size_t)BUFLEN); if (len <= 0) /* end of file or error */ goto finished; buffer[len] = NUL; ! msg_puts(buffer); windgoto(msg_row, msg_col); cursor_on(); out_flush(); --- 3496,3562 ---- */ while (RealWaitForChar(fromshell_fd, 10L, NULL)) { ! len = read(fromshell_fd, (char *)buffer ! #ifdef FEAT_MBYTE ! + buffer_off, (size_t)(BUFLEN - buffer_off) ! #else ! , (size_t)BUFLEN ! #endif ! ); if (len <= 0) /* end of file or error */ goto finished; + #ifdef FEAT_MBYTE + len += buffer_off; buffer[len] = NUL; ! if (has_mbyte) ! { ! int l; ! char_u *p; ! ! /* Check if the last character in buffer[] is ! * incomplete, keep these bytes for the next ! * round. */ ! for (p = buffer; p < buffer + len; p += l) ! { ! if (enc_utf8) /* exclude composing chars */ ! l = utf_ptr2len_check(p); ! else ! l = (*mb_ptr2len_check)(p); ! if (l == 0) ! l = 1; /* NUL byte? */ ! else if (MB_BYTE2LEN(*p) != l) ! break; ! } ! if (p == buffer) /* no complete character */ ! { ! /* avoid getting stuck at an illegal byte */ ! if (len >= 12) ! ++p; ! else ! { ! buffer_off = len; ! continue; ! } ! } ! c = *p; ! *p = NUL; ! msg_puts(buffer); ! if (p < buffer + len) ! { ! *p = c; ! buffer_off = (buffer + len) - p; ! mch_memmove(buffer, p, buffer_off); ! continue; ! } ! buffer_off = 0; ! } ! else ! #endif ! { ! buffer[len] = NUL; ! msg_puts(buffer); ! } ! windgoto(msg_row, msg_col); cursor_on(); out_flush(); *** ../vim61a.034/src/version.c Thu Mar 7 20:12:24 2002 --- src/version.c Thu Mar 7 20:13:29 2002 *************** *** 608,609 **** --- 608,611 ---- { /* Add new patch number below this line */ + /**/ + 35, /**/ -- hundred-and-one symptoms of being an internet addict: 182. You may not know what is happening in the world, but you know every bit of net-gossip there is. /// Bram Moolenaar -- Bram@moolenaar.net -- http://www.moolenaar.net \\\ /// Creator of Vim -- http://vim.sf.net -- ftp://ftp.vim.org/pub/vim \\\ \\\ Project leader for A-A-P -- http://www.a-a-p.org /// \\\ Help me helping AIDS orphans in Uganda - http://iccf-holland.org ///