diff options
Diffstat (limited to 'data/vim/patches/8.1.0809')
-rw-r--r-- | data/vim/patches/8.1.0809 | 5622 |
1 files changed, 5622 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0809 b/data/vim/patches/8.1.0809 new file mode 100644 index 000000000..f637051d0 --- /dev/null +++ b/data/vim/patches/8.1.0809 @@ -0,0 +1,5622 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0809 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.0809 +Problem: Too many #ifdefs. +Solution: Graduate FEAT_MBYTE, part 3. +Files: src/os_amiga.c, src/os_mswin.c, src/os_unix.c, src/os_w32exe.c, + src/os_win32.c, src/quickfix.c, src/regexp.c, src/regexp_nfa.c, + src/screen.c + + +*** ../vim-8.1.0808/src/os_amiga.c 2019-01-19 17:43:03.421449119 +0100 +--- src/os_amiga.c 2019-01-24 15:59:24.928700732 +0100 +*************** +*** 165,182 **** + + for (;;) /* repeat until we got a character */ + { +- # ifdef FEAT_MBYTE + len = Read(raw_in, (char *)buf, (long)maxlen / input_conv.vc_factor); +- # else +- len = Read(raw_in, (char *)buf, (long)maxlen); +- # endif + if (len > 0) + { +- #ifdef FEAT_MBYTE + /* Convert from 'termencoding' to 'encoding'. */ + if (input_conv.vc_type != CONV_NONE) + len = convert_input(buf, len, maxlen); +- #endif + return len; + } + } +--- 165,176 ---- +*** ../vim-8.1.0808/src/os_mswin.c 2019-01-13 23:38:33.403773217 +0100 +--- src/os_mswin.c 2019-01-24 16:01:16.035931440 +0100 +*************** +*** 282,288 **** + # else + if (title != NULL) + { +- # ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + /* Convert the title from 'encoding' to the active codepage. */ +--- 282,287 ---- +*************** +*** 295,301 **** + return; + } + } +- # endif + SetConsoleTitle((LPCSTR)title); + } + # endif +--- 294,299 ---- +*************** +*** 361,367 **** + else + #endif + { +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *wname; +--- 359,364 ---- +*************** +*** 387,393 **** + vim_free(cname); + } + if (nResult == FAIL) /* fall back to non-wide function */ +- #endif + { + if (_fullpath((char *)buf, (const char *)fname, len - 1) == NULL) + { +--- 384,389 ---- +*************** +*** 415,428 **** + int + mch_isFullName(char_u *fname) + { +- #ifdef FEAT_MBYTE + /* WinNT and later can use _MAX_PATH wide characters for a pathname, which + * means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is + * UTF-8. */ + char szName[_MAX_PATH * 3 + 1]; +- #else +- char szName[_MAX_PATH + 1]; +- #endif + + /* A name like "d:/foo" and "//server/share" is absolute */ + if ((fname[0] && fname[1] == ':' && (fname[2] == '/' || fname[2] == '\\')) +--- 411,420 ---- +*************** +*** 538,548 **** + return stat(name, stp); + } + +- #ifdef FEAT_MBYTE + static int + wstat_symlink_aware(const WCHAR *name, stat_T *stp) + { +! # if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__) + /* Work around for VC12 or earlier (and MinGW). _wstat() can't handle + * symlinks properly. + * VC9 or earlier: _wstat() doesn't support a symlink at all. It retrieves +--- 530,539 ---- + return stat(name, stp); + } + + static int + wstat_symlink_aware(const WCHAR *name, stat_T *stp) + { +! #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__) + /* Work around for VC12 or earlier (and MinGW). _wstat() can't handle + * symlinks properly. + * VC9 or earlier: _wstat() doesn't support a symlink at all. It retrieves +*************** +*** 587,596 **** + return n; + } + } +! # endif + return _wstat(name, (struct _stat *)stp); + } +- #endif + + /* + * stat() can't handle a trailing '/' or '\', remove it first. +--- 578,586 ---- + return n; + } + } +! #endif + return _wstat(name, (struct _stat *)stp); + } + + /* + * stat() can't handle a trailing '/' or '\', remove it first. +*************** +*** 598,611 **** + int + vim_stat(const char *name, stat_T *stp) + { +- #ifdef FEAT_MBYTE + /* WinNT and later can use _MAX_PATH wide characters for a pathname, which + * means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is + * UTF-8. */ + char_u buf[_MAX_PATH * 3 + 1]; +- #else +- char_u buf[_MAX_PATH + 1]; +- #endif + char_u *p; + + vim_strncpy((char_u *)buf, (char_u *)name, sizeof(buf) - 1); +--- 588,597 ---- +*************** +*** 628,634 **** + STRCAT(buf, "\\"); + } + } +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *wp = enc_to_utf16(buf, NULL); +--- 614,619 ---- +*************** +*** 641,647 **** + return n; + } + } +- #endif + return stat_symlink_aware((char *)buf, stp); + } + +--- 626,631 ---- +*************** +*** 791,797 **** + if (*path == NUL) /* drive name only */ + return 0; + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *p = enc_to_utf16((char_u *)path, NULL); +--- 775,780 ---- +*************** +*** 804,810 **** + return n; + } + } +- #endif + + return chdir(path); /* let the normal chdir() do the rest */ + } +--- 787,792 ---- +*************** +*** 1145,1153 **** + #define IDC_PRINTTEXT2 402 + #define IDC_PROGRESS 403 + +- #if !defined(FEAT_MBYTE) +- # define vimSetDlgItemText(h, i, s) SetDlgItemText(h, i, s) +- #else + static BOOL + vimSetDlgItemText(HWND hDlg, int nIDDlgItem, char_u *s) + { +--- 1127,1132 ---- +*************** +*** 1166,1172 **** + } + return SetDlgItemText(hDlg, nIDDlgItem, (LPCSTR)s); + } +- #endif + + /* + * Convert BGR to RGB for Windows GDI calls +--- 1145,1150 ---- +*************** +*** 1563,1569 **** + char_u *printer_name = (char_u *)devname + devname->wDeviceOffset; + char_u *port_name = (char_u *)devname +devname->wOutputOffset; + char_u *text = (char_u *)_("to %s on %s"); +- #ifdef FEAT_MBYTE + char_u *printer_name_orig = printer_name; + char_u *port_name_orig = port_name; + +--- 1541,1546 ---- +*************** +*** 1580,1597 **** + if (to_free != NULL) + port_name = to_free; + } +- #endif + prt_name = alloc((unsigned)(STRLEN(printer_name) + STRLEN(port_name) + + STRLEN(text))); + if (prt_name != NULL) + wsprintf((char *)prt_name, (const char *)text, + printer_name, port_name); +- #ifdef FEAT_MBYTE + if (printer_name != printer_name_orig) + vim_free(printer_name); + if (port_name != port_name_orig) + vim_free(port_name); +- #endif + } + GlobalUnlock(prt_dlg.hDevNames); + +--- 1557,1571 ---- +*************** +*** 1680,1688 **** + { + int ret; + char szBuffer[300]; +- #if defined(FEAT_MBYTE) + WCHAR *wp = NULL; +- #endif + + hDlgPrint = CreateDialog(GetModuleHandle(NULL), TEXT("PrintDlgBox"), + prt_dlg.hwndOwner, PrintDlgProc); +--- 1654,1660 ---- +*************** +*** 1690,1696 **** + wsprintf(szBuffer, _("Printing '%s'"), gettail(psettings->jobname)); + vimSetDlgItemText(hDlgPrint, IDC_PRINTTEXT1, (char_u *)szBuffer); + +- #if defined(FEAT_MBYTE) + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + wp = enc_to_utf16(psettings->jobname, NULL); + if (wp != NULL) +--- 1662,1667 ---- +*************** +*** 1704,1710 **** + vim_free(wp); + } + else +- #endif + { + DOCINFO di; + +--- 1675,1680 ---- +*************** +*** 1767,1776 **** + int + mch_print_text_out(char_u *p, int len) + { +- #if defined(FEAT_PROPORTIONAL_FONTS) || defined(FEAT_MBYTE) + SIZE sz; +- #endif +- #if defined(FEAT_MBYTE) + WCHAR *wp = NULL; + int wlen = len; + +--- 1737,1743 ---- +*************** +*** 1801,1807 **** + } + return ret; + } +- #endif + TextOut(prt_dlg.hDC, prt_pos_x + prt_left_margin, + prt_pos_y + prt_top_margin, + (LPCSTR)p, len); +--- 1768,1773 ---- +*************** +*** 1873,1882 **** + CHAR buf[MAX_PATH]; // could have simply reused 'wsz'... + char_u *rfname = NULL; + int len; +- # ifdef FEAT_MBYTE + IShellLinkW *pslw = NULL; + WIN32_FIND_DATAW ffdw; // we get those free of charge +- # endif + + /* Check if the file name ends in ".lnk". Avoid calling + * CoCreateInstance(), it's quite slow. */ +--- 1839,1846 ---- +*************** +*** 1888,1894 **** + + CoInitialize(NULL); + +- # ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + // create a link manager object and request its interface +--- 1852,1857 ---- +*************** +*** 1930,1936 **** + } + goto shortcut_end; + } +- # endif + // create a link manager object and request its interface + hr = CoCreateInstance( + &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, +--- 1893,1898 ---- +*************** +*** 1969,1978 **** + ppf->lpVtbl->Release(ppf); + if (psl != NULL) + psl->lpVtbl->Release(psl); +- # ifdef FEAT_MBYTE + if (pslw != NULL) + pslw->lpVtbl->Release(pslw); +- # endif + + CoUninitialize(); + return rfname; +--- 1931,1938 ---- +*************** +*** 2042,2054 **** + COPYDATASTRUCT data; + + data.dwData = COPYDATA_ENCODING; +- #ifdef FEAT_MBYTE + data.cbData = (DWORD)STRLEN(p_enc) + 1; + data.lpData = p_enc; +- #else +- data.cbData = (DWORD)STRLEN("latin1") + 1; +- data.lpData = "latin1"; +- #endif + (void)SendMessage(target, WM_COPYDATA, (WPARAM)message_window, + (LPARAM)(&data)); + } +--- 2002,2009 ---- +*************** +*** 2118,2128 **** + switch (data->dwData) + { + case COPYDATA_ENCODING: +- # ifdef FEAT_MBYTE + /* Remember the encoding that the client uses. */ + vim_free(client_enc); + client_enc = enc_canonize((char_u *)data->lpData); +- # endif + return 1; + + case COPYDATA_KEYS: +--- 2073,2081 ---- +*************** +*** 2954,2968 **** + int i; + int ret = FAIL; + static LOGFONT *lastlf = NULL; +- #ifdef FEAT_MBYTE + char_u *acpname = NULL; +- #endif + + *lf = s_lfDefault; + if (name == NULL) + return OK; + +- #ifdef FEAT_MBYTE + /* Convert 'name' from 'encoding' to the current codepage, because + * lf->lfFaceName uses the current codepage. + * TODO: Use Wide APIs instead of ANSI APIs. */ +--- 2907,2918 ---- +*************** +*** 2972,2978 **** + enc_to_acp(name, (int)STRLEN(name), &acpname, &len); + name = acpname; + } +- #endif + if (STRCMP(name, "*") == 0) + { + #if defined(FEAT_GUI_W32) +--- 2922,2927 ---- +*************** +*** 3112,3120 **** + if (lastlf != NULL) + mch_memmove(lastlf, lf, sizeof(LOGFONT)); + } +- #ifdef FEAT_MBYTE + vim_free(acpname); +- #endif + + return ret; + } +--- 3061,3067 ---- +*** ../vim-8.1.0808/src/os_unix.c 2019-01-22 21:45:36.553678901 +0100 +--- src/os_unix.c 2019-01-24 16:02:08.167571433 +0100 +*************** +*** 2054,2072 **** + retval = TRUE; + if (!test_only) + { +! #if defined(FEAT_XFONTSET) || defined(FEAT_MBYTE) +! if (text_prop.encoding == XA_STRING +! # ifdef FEAT_MBYTE +! && !has_mbyte +! # endif +! ) + { +- #endif + if (get_title) + oldtitle = vim_strsave((char_u *)text_prop.value); + else + oldicon = vim_strsave((char_u *)text_prop.value); +- #if defined(FEAT_XFONTSET) || defined(FEAT_MBYTE) + } + else + { +--- 2054,2065 ---- + retval = TRUE; + if (!test_only) + { +! if (text_prop.encoding == XA_STRING && !has_mbyte) + { + if (get_title) + oldtitle = vim_strsave((char_u *)text_prop.value); + else + oldicon = vim_strsave((char_u *)text_prop.value); + } + else + { +*************** +*** 2093,2099 **** + oldicon = vim_strsave((char_u *)text_prop.value); + } + } +- #endif + } + XFree((void *)text_prop.value); + } +--- 2086,2091 ---- +*************** +*** 2105,2111 **** + * systems X_HAVE_UTF8_STRING may be defined in a header file but + * Xutf8SetWMProperties() is not in the X11 library. Configure checks for + * that and defines HAVE_XUTF8SETWMPROPERTIES. */ +! #if defined(X_HAVE_UTF8_STRING) && defined(FEAT_MBYTE) + # if X_HAVE_UTF8_STRING && HAVE_XUTF8SETWMPROPERTIES + # define USE_UTF8_STRING + # endif +--- 2097,2103 ---- + * systems X_HAVE_UTF8_STRING may be defined in a header file but + * Xutf8SetWMProperties() is not in the X11 library. Configure checks for + * that and defines HAVE_XUTF8SETWMPROPERTIES. */ +! #if defined(X_HAVE_UTF8_STRING) + # if X_HAVE_UTF8_STRING && HAVE_XUTF8SETWMPROPERTIES + # define USE_UTF8_STRING + # endif +*************** +*** 4823,4831 **** + { + # 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; +--- 4815,4821 ---- +*************** +*** 5031,5041 **** + } + else if (ta_buf[i] == '\r') + ta_buf[i] = '\n'; +- # ifdef FEAT_MBYTE + if (has_mbyte) + i += (*mb_ptr2len_len)(ta_buf + i, + ta_len + len - i) - 1; +- # endif + } + + /* +--- 5021,5029 ---- +*************** +*** 5048,5054 **** + { + 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)(ta_buf + i); +--- 5036,5041 ---- +*************** +*** 5056,5062 **** + msg_outtrans_len(ta_buf + i, l); + i += l - 1; + } +- # endif + else + msg_outtrans_len(ta_buf + i, 1); + } +--- 5043,5048 ---- +*************** +*** 5114,5124 **** + while (RealWaitForChar(fromshell_fd, 10L, NULL, NULL)) + { + len = read_eintr(fromshell_fd, 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; +--- 5100,5106 ---- +*************** +*** 5138,5144 **** + ga_append(&ga, buffer[i]); + } + } +- # ifdef FEAT_MBYTE + else if (has_mbyte) + { + int l; +--- 5120,5125 ---- +*************** +*** 5181,5187 **** + } + buffer_off = 0; + } +- # endif /* FEAT_MBYTE */ + else + { + buffer[len] = NUL; +--- 5162,5167 ---- +*** ../vim-8.1.0808/src/os_w32exe.c 2017-02-01 13:42:23.000000000 +0100 +--- src/os_w32exe.c 2019-01-24 16:02:23.907462844 +0100 +*************** +*** 130,138 **** + free(argv); + if (tofree != NULL) + free(tofree); +- #ifdef FEAT_MBYTE + free_cmd_argsW(); +- #endif + + return 0; + } +--- 130,136 ---- +*** ../vim-8.1.0808/src/os_win32.c 2019-01-19 21:12:21.561634437 +0100 +--- src/os_win32.c 2019-01-24 16:05:55.678005815 +0100 +*************** +*** 452,462 **** + { + if (*p == '^' && vim_strchr(escaped, p[1]) != NULL) + mch_memmove(p, p + 1, l--); +- #ifdef FEAT_MBYTE + n = (*mb_ptr2len)(p); +- #else +- n = 1; +- #endif + p += n; + l -= n; + } +--- 452,458 ---- +*************** +*** 1890,1896 **** + { + int n = 1; + +- #ifdef FEAT_MBYTE + if (ch2 == NUL) + { + int i; +--- 1886,1891 ---- +*************** +*** 1912,1918 **** + } + } + else +- #endif + typeahead[typeaheadlen] = c; + if (ch2 != NUL) + { +--- 1907,1912 ---- +*************** +*** 1950,1966 **** + if ((modifiers & MOD_MASK_ALT) + && n == 1 + && (typeahead[typeaheadlen] & 0x80) == 0 +- #ifdef FEAT_MBYTE + && !enc_dbcs +- #endif + ) + { +- #ifdef FEAT_MBYTE + n = (*mb_char2bytes)(typeahead[typeaheadlen] | 0x80, + typeahead + typeaheadlen); +- #else +- typeahead[typeaheadlen] |= 0x80; +- #endif + modifiers &= ~MOD_MASK_ALT; + } + +--- 1944,1954 ---- +*************** +*** 2044,2050 **** + return FALSE; + } + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *p = enc_to_utf16((char_u *)name, NULL); +--- 2032,2037 ---- +*************** +*** 2073,2079 **** + return TRUE; + } + } +- #endif + + curpath = getenv("PATH"); + newpath = (char*)alloc((unsigned)(STRLEN(curpath) + 3)); +--- 2060,2065 ---- +*************** +*** 2768,2774 **** + } + + +- #ifdef FEAT_MBYTE + /* + * fname_casew(): Wide version of fname_case(). Set the case of the file name, + * if it already exists. When "len" is > 0, also expand short to long +--- 2754,2759 ---- +*************** +*** 2878,2884 **** + wcscpy(name, szTrueName); + return OK; + } +- #endif + + /* + * fname_case(): Set the case of the file name, if it already exists. +--- 2863,2868 ---- +*************** +*** 2906,2912 **** + + slash_adjust(name); + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *p = enc_to_utf16(name, NULL); +--- 2890,2895 ---- +*************** +*** 2933,2939 **** + } + return; + } +- #endif + + /* If 'enc' is utf-8, flen can be larger than _MAX_PATH. + * So we should check this after calling wide function. */ +--- 2916,2921 ---- +*************** +*** 2962,2968 **** + porigPrev = porig; + while (*porig != NUL && *porig != psepc) + { +- #ifdef FEAT_MBYTE + int l; + + if (enc_dbcs) +--- 2944,2949 ---- +*************** +*** 2972,2978 **** + *ptrue++ = *porig++; + } + else +- #endif + *ptrue++ = *porig++; + } + *ptrue = NUL; +--- 2953,2958 ---- +*************** +*** 3044,3050 **** + char szUserName[256 + 1]; /* UNLEN is 256 */ + DWORD cch = sizeof szUserName; + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR wszUserName[256 + 1]; /* UNLEN is 256 */ +--- 3024,3029 ---- +*************** +*** 3062,3068 **** + } + } + } +- #endif + if (GetUserName(szUserName, &cch)) + { + vim_strncpy(s, (char_u *)szUserName, len - 1); +--- 3041,3046 ---- +*************** +*** 3083,3089 **** + { + DWORD cch = len; + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR wszHostName[256 + 1]; +--- 3061,3066 ---- +*************** +*** 3101,3107 **** + } + } + } +- #endif + if (!GetComputerName((LPSTR)s, &cch)) + vim_strncpy(s, (char_u *)"PC (Win32 Vim)", len - 1); + } +--- 3078,3083 ---- +*************** +*** 3135,3141 **** + * But the Win32s known bug list says that getcwd() doesn't work + * so use the Win32 system call instead. <Negri> + */ +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR wbuf[_MAX_PATH + 1]; +--- 3111,3116 ---- +*************** +*** 3167,3173 **** + } + return FAIL; + } +- #endif + if (GetCurrentDirectory(len, (LPSTR)buf) == 0) + return FAIL; + lfnlen = GetLongPathNameA((LPCSTR)buf, (LPSTR)abuf, _MAX_PATH); +--- 3142,3147 ---- +*************** +*** 3205,3211 **** + { + long n = -1; + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *p = enc_to_utf16(name, NULL); +--- 3179,3184 ---- +*************** +*** 3219,3225 **** + } + } + if (n == -1) +- #endif + n = _chmod((const char *)name, perm); + if (n == -1) + return FAIL; +--- 3192,3197 ---- +*************** +*** 3290,3296 **** + int + mch_mkdir(char_u *name) + { +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *p; +--- 3262,3267 ---- +*************** +*** 3303,3309 **** + vim_free(p); + return retval; + } +- #endif + return _mkdir((const char *)name); + } + +--- 3274,3279 ---- +*************** +*** 3314,3320 **** + int + mch_rmdir(char_u *name) + { +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *p; +--- 3284,3289 ---- +*************** +*** 3327,3333 **** + vim_free(p); + return retval; + } +- #endif + return _rmdir((const char *)name); + } + +--- 3296,3301 ---- +*************** +*** 3353,3359 **** + int res = FALSE; + WIN32_FIND_DATAA findDataA; + DWORD fileFlags = 0, reparseTag = 0; +- #ifdef FEAT_MBYTE + WCHAR *wn = NULL; + WIN32_FIND_DATAW findDataW; + +--- 3321,3326 ---- +*************** +*** 3370,3376 **** + } + } + else +- #endif + { + hFind = FindFirstFile((LPCSTR)name, &findDataA); + if (hFind != INVALID_HANDLE_VALUE) +--- 3337,3342 ---- +*************** +*** 3415,3421 **** + { + HANDLE hFile; + int res = FILEINFO_READ_FAIL; +- #ifdef FEAT_MBYTE + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +--- 3381,3386 ---- +*************** +*** 3436,3442 **** + vim_free(wn); + } + else +- #endif + hFile = CreateFile((LPCSTR)fname, /* file name */ + GENERIC_READ, /* access mode */ + FILE_SHARE_READ | FILE_SHARE_WRITE, /* share mode */ +--- 3401,3406 ---- +*************** +*** 3466,3472 **** + win32_getattrs(char_u *name) + { + int attr; +- #ifdef FEAT_MBYTE + WCHAR *p = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +--- 3430,3435 ---- +*************** +*** 3478,3484 **** + vim_free(p); + } + else +- #endif + attr = GetFileAttributes((char *)name); + + return attr; +--- 3441,3446 ---- +*************** +*** 3493,3499 **** + win32_setattrs(char_u *name, int attrs) + { + int res; +- #ifdef FEAT_MBYTE + WCHAR *p = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +--- 3455,3460 ---- +*************** +*** 3505,3511 **** + vim_free(p); + } + else +- #endif + res = SetFileAttributes((char *)name, attrs); + + return res ? 0 : -1; +--- 3466,3471 ---- +*************** +*** 3621,3629 **** + { + HANDLE hFile; + int type; +- #ifdef FEAT_MBYTE + WCHAR *wn = NULL; +- #endif + + /* We can't open a file with a name "\\.\con" or "\\.\prn" and trying to + * read from it later will cause Vim to hang. Thus return NODE_WRITABLE +--- 3581,3587 ---- +*************** +*** 3631,3637 **** + if (STRNCMP(name, "\\\\.\\", 4) == 0) + return NODE_WRITABLE; + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + wn = enc_to_utf16(name, NULL); + +--- 3589,3594 ---- +*************** +*** 3647,3653 **** + vim_free(wn); + } + else +- #endif + hFile = CreateFile((LPCSTR)name, /* file name */ + GENERIC_WRITE, /* access mode */ + 0, /* share mode */ +--- 3604,3609 ---- +*************** +*** 3695,3701 **** + p = (struct my_acl *)alloc_clear((unsigned)sizeof(struct my_acl)); + if (p != NULL) + { +- # ifdef FEAT_MBYTE + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +--- 3651,3656 ---- +*************** +*** 3737,3743 **** + vim_free(wn); + } + else +- # endif + { + /* Try to retrieve the entire security descriptor. */ + err = GetNamedSecurityInfo( +--- 3692,3697 ---- +*************** +*** 3815,3823 **** + + if (p != NULL) + { +- # ifdef FEAT_MBYTE + WCHAR *wn = NULL; +- # endif + + /* Set security flags */ + if (p->pSidOwner) +--- 3769,3775 ---- +*************** +*** 3836,3842 **** + if (p->pSacl) + sec_info |= SACL_SECURITY_INFORMATION; + +- # ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + wn = enc_to_utf16(fname, NULL); + if (wn != NULL) +--- 3788,3793 ---- +*************** +*** 3853,3859 **** + vim_free(wn); + } + else +- # endif + { + (void)SetNamedSecurityInfo( + (LPSTR)fname, // Abstract filename +--- 3804,3809 ---- +*************** +*** 4211,4217 **** + LPVOID *env, + char *cwd) + { +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + BOOL ret; +--- 4161,4166 ---- +*************** +*** 4247,4253 **** + return ret; + } + fallback: +- #endif + return CreateProcess( + NULL, /* Executable name */ + cmd, /* Command to execute */ +--- 4196,4201 ---- +*************** +*** 4267,4273 **** + char *cmd, + INT n_show_cmd) + { +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *wcmd = enc_to_utf16((char_u *)cmd, NULL); +--- 4215,4220 ---- +*************** +*** 4279,4285 **** + return ret; + } + } +- #endif + return ShellExecute(NULL, NULL, cmd, NULL, NULL, n_show_cmd); + } + +--- 4226,4231 ---- +*************** +*** 4466,4485 **** + while (ret != 0 && availableBytes > 0) + { + repeatCount++; +! toRead = +! # ifdef FEAT_MBYTE +! (DWORD)(BUFLEN - *buffer_off); +! # else +! (DWORD)BUFLEN; +! # endif + toRead = availableBytes < toRead ? availableBytes : toRead; +! ReadFile(g_hChildStd_OUT_Rd, buffer +! # ifdef FEAT_MBYTE +! + *buffer_off, toRead +! # else +! , toRead +! # endif +! , &len, NULL); + + /* If we haven't read anything, there is a problem */ + if (len == 0) +--- 4412,4420 ---- + while (ret != 0 && availableBytes > 0) + { + repeatCount++; +! toRead = (DWORD)(BUFLEN - *buffer_off); + toRead = availableBytes < toRead ? availableBytes : toRead; +! ReadFile(g_hChildStd_OUT_Rd, buffer + *buffer_off, toRead , &len, NULL); + + /* If we haven't read anything, there is a problem */ + if (len == 0) +*************** +*** 4501,4507 **** + ga_append(ga, buffer[i]); + } + } +- # ifdef FEAT_MBYTE + else if (has_mbyte) + { + int l; +--- 4436,4441 ---- +*************** +*** 4545,4551 **** + } + *buffer_off = 0; + } +- # endif /* FEAT_MBYTE */ + else + { + buffer[len] = NUL; +--- 4479,4484 ---- +*************** +*** 4740,4750 **** + } + else if (ta_buf[i] == '\r') + ta_buf[i] = '\n'; +- # ifdef FEAT_MBYTE + if (has_mbyte) + i += (*mb_ptr2len_len)(ta_buf + i, + ta_len + len - i) - 1; +- # endif + } + + /* +--- 4673,4681 ---- +*************** +*** 4755,4761 **** + { + 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)(ta_buf + i); +--- 4686,4691 ---- +*************** +*** 4763,4769 **** + msg_outtrans_len(ta_buf + i, l); + i += l - 1; + } +- # endif + else + msg_outtrans_len(ta_buf + i, 1); + } +--- 4693,4698 ---- +*************** +*** 4857,4863 **** + } + #else + +- # ifdef FEAT_MBYTE + static int + mch_system(char *cmd, int options) + { +--- 4786,4791 ---- +*************** +*** 4873,4881 **** + } + return system(cmd); + } +- # else +- # define mch_system(c, o) system(c) +- # endif + + #endif + +--- 4801,4806 ---- +*************** +*** 4972,4978 **** + int tmode = cur_tmode; + #ifdef FEAT_TITLE + char szShellTitle[512]; +- # ifdef FEAT_MBYTE + int did_set_title = FALSE; + + /* Change the title to reflect that we are in a subshell. */ +--- 4897,4902 ---- +*************** +*** 5003,5009 **** + } + } + if (!did_set_title) +- # endif + /* Change the title to reflect that we are in a subshell. */ + if (GetConsoleTitle(szShellTitle, sizeof(szShellTitle) - 4) > 0) + { +--- 4927,4932 ---- +*************** +*** 5217,5223 **** + "External commands will not pause after completion.\n" + "See :help win32-vimrun for more information."); + char *title = _("Vim Warning"); +- # ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *wmsg = enc_to_utf16((char_u *)msg, NULL); +--- 5140,5145 ---- +*************** +*** 5229,5235 **** + vim_free(wtitle); + } + else +- # endif + MessageBox(NULL, msg, title, MB_ICONWARNING); + need_vimrun_warning = FALSE; + } +--- 5151,5156 ---- +*************** +*** 5294,5301 **** + DWORD dwFlagsAndAttributes) + { + HANDLE h; +- # ifdef FEAT_MBYTE + WCHAR *wn = NULL; + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + wn = enc_to_utf16(fname, NULL); +--- 5215,5222 ---- + DWORD dwFlagsAndAttributes) + { + HANDLE h; + WCHAR *wn = NULL; ++ + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + wn = enc_to_utf16(fname, NULL); +*************** +*** 5308,5314 **** + } + } + if (wn == NULL) +- # endif + h = CreateFile((LPCSTR)fname, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, + dwFlagsAndAttributes, NULL); +--- 5229,5234 ---- +*************** +*** 6339,6345 **** + COORD coord = g_coord; + DWORD written; + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + static WCHAR *unicodebuf = NULL; +--- 6259,6264 ---- +*************** +*** 6392,6398 **** + } + } + else +- #endif + { + if (!USE_VTP) + { +--- 6311,6316 ---- +*************** +*** 6763,6772 **** + int + mch_remove(char_u *name) + { +- #ifdef FEAT_MBYTE + WCHAR *wn = NULL; + int n; +- #endif + + /* + * On Windows, deleting a directory's symbolic link is done by +--- 6681,6688 ---- +*************** +*** 6777,6783 **** + + win32_setattrs(name, FILE_ATTRIBUTE_NORMAL); + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + wn = enc_to_utf16(name, NULL); +--- 6693,6698 ---- +*************** +*** 6788,6794 **** + return n; + } + } +- #endif + return DeleteFile((LPCSTR)name) ? 0 : -1; + } + +--- 6703,6708 ---- +*************** +*** 6839,6845 **** + return (long_u)((ms.ullTotalPhys - WINNT_RESERVE_BYTES) / 1024); + } + +- #ifdef FEAT_MBYTE + /* + * Same code as below, but with wide functions and no comments. + * Return 0 for success, non-zero for failure. +--- 6753,6758 ---- +*************** +*** 6893,6899 **** + + return 0; + } +- #endif + + + /* +--- 6806,6811 ---- +*************** +*** 6924,6930 **** + char szNewPath[_MAX_PATH+1]; + char *pszFilePart; + HANDLE hf; +- #ifdef FEAT_MBYTE + WCHAR *wold = NULL; + WCHAR *wnew = NULL; + int retval = -1; +--- 6836,6841 ---- +*************** +*** 6939,6945 **** + vim_free(wnew); + return retval; + } +- #endif + + /* + * No need to play tricks unless the file name contains a "~" as the +--- 6850,6855 ---- +*************** +*** 7024,7048 **** + { + HANDLE hFile; + int retval = -1; /* default: fail */ +- #ifdef FEAT_MBYTE + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + wn = enc_to_utf16((char_u *)n, NULL); +- #endif + + if (mch_isdir((char_u *)n)) + { + char TempName[_MAX_PATH + 16] = ""; +- #ifdef FEAT_MBYTE + WCHAR TempNameW[_MAX_PATH + 16] = L""; +- #endif + + if (p & R_OK) + { + /* Read check is performed by seeing if we can do a find file on + * the directory for any file. */ +- #ifdef FEAT_MBYTE + if (wn != NULL) + { + int i; +--- 6934,6953 ---- +*************** +*** 7062,7068 **** + (void)FindClose(hFile); + } + else +- #endif + { + char *pch; + WIN32_FIND_DATA d; +--- 6967,6972 ---- +*************** +*** 7087,7093 **** + * directories on read-only network shares. However, in + * directories whose ACL allows writes but denies deletes will end + * up keeping the temporary file :-(. */ +- #ifdef FEAT_MBYTE + if (wn != NULL) + { + if (!GetTempFileNameW(wn, L"VIM", 0, TempNameW)) +--- 6991,6996 ---- +*************** +*** 7096,7102 **** + DeleteFileW(TempNameW); + } + else +- #endif + { + if (!GetTempFileName(n, "VIM", 0, TempName)) + goto getout; +--- 6999,7004 ---- +*************** +*** 7114,7125 **** + DWORD access_mode = ((p & W_OK) ? GENERIC_WRITE : 0) + | ((p & R_OK) ? GENERIC_READ : 0); + +- #ifdef FEAT_MBYTE + if (wn != NULL) + hFile = CreateFileW(wn, access_mode, share_mode, + NULL, OPEN_EXISTING, 0, NULL); + else +- #endif + hFile = CreateFile(n, access_mode, share_mode, + NULL, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) +--- 7016,7025 ---- +*************** +*** 7129,7141 **** + + retval = 0; /* success */ + getout: +- #ifdef FEAT_MBYTE + vim_free(wn); +- #endif + return retval; + } + +- #if defined(FEAT_MBYTE) || defined(PROTO) + /* + * Version of open() that may use UTF-16 file name. + */ +--- 7029,7038 ---- +*************** +*** 7143,7149 **** + mch_open(const char *name, int flags, int mode) + { + /* _wopen() does not work with Borland C 5.5: creates a read-only file. */ +! # ifndef __BORLANDC__ + WCHAR *wn; + int f; + +--- 7040,7046 ---- + mch_open(const char *name, int flags, int mode) + { + /* _wopen() does not work with Borland C 5.5: creates a read-only file. */ +! #ifndef __BORLANDC__ + WCHAR *wn; + int f; + +*************** +*** 7157,7163 **** + return f; + } + } +! # endif + + /* open() can open a file which name is longer than _MAX_PATH bytes + * and shorter than _MAX_PATH characters successfully, but sometimes it +--- 7054,7060 ---- + return f; + } + } +! #endif + + /* open() can open a file which name is longer than _MAX_PATH bytes + * and shorter than _MAX_PATH characters successfully, but sometimes it +*************** +*** 7180,7186 **** + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! # if defined(DEBUG) && _MSC_VER >= 1400 + /* Work around an annoying assertion in the Microsoft debug CRT + * when mode's text/binary setting doesn't match _get_fmode(). */ + char newMode = mode[strlen(mode) - 1]; +--- 7077,7083 ---- + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! #if defined(DEBUG) && _MSC_VER >= 1400 + /* Work around an annoying assertion in the Microsoft debug CRT + * when mode's text/binary setting doesn't match _get_fmode(). */ + char newMode = mode[strlen(mode) - 1]; +*************** +*** 7191,7197 **** + _set_fmode(_O_TEXT); + else if (newMode == 'b') + _set_fmode(_O_BINARY); +! # endif + wn = enc_to_utf16((char_u *)name, NULL); + wm = enc_to_utf16((char_u *)mode, NULL); + if (wn != NULL && wm != NULL) +--- 7088,7094 ---- + _set_fmode(_O_TEXT); + else if (newMode == 'b') + _set_fmode(_O_BINARY); +! #endif + wn = enc_to_utf16((char_u *)name, NULL); + wm = enc_to_utf16((char_u *)mode, NULL); + if (wn != NULL && wm != NULL) +*************** +*** 7199,7207 **** + vim_free(wn); + vim_free(wm); + +! # if defined(DEBUG) && _MSC_VER >= 1400 + _set_fmode(oldMode); +! # endif + return f; + } + +--- 7096,7104 ---- + vim_free(wn); + vim_free(wm); + +! #if defined(DEBUG) && _MSC_VER >= 1400 + _set_fmode(oldMode); +! #endif + return f; + } + +*************** +*** 7214,7222 **** + + return fopen(name, mode); + } +- #endif + +- #ifdef FEAT_MBYTE + /* + * SUB STREAM (aka info stream) handling: + * +--- 7111,7117 ---- +*************** +*** 7360,7366 **** + vim_free(fromw); + vim_free(tow); + } +- #endif + + /* + * Copy file attributes from file "from" to file "to". +--- 7255,7260 ---- +*************** +*** 7370,7380 **** + int + mch_copy_file_attribute(char_u *from, char_u *to) + { +- #ifdef FEAT_MBYTE + /* File streams only work on Windows NT and later. */ + PlatformId(); + copy_infostreams(from, to); +- #endif + return 0; + } + +--- 7264,7272 ---- +*************** +*** 7464,7470 **** + #endif + + +- #if defined(FEAT_MBYTE) || defined(PROTO) + /* + * The command line arguments in UCS2 + */ +--- 7356,7361 ---- +*************** +*** 7691,7697 **** + + set_alist_count(); + } +- #endif + + int + mch_setenv(char *var, char *value, int x) +--- 7582,7587 ---- +*************** +*** 7704,7710 **** + + sprintf((char *)envbuf, "%s=%s", var, value); + +- #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + WCHAR *p = enc_to_utf16(envbuf, NULL); +--- 7594,7599 ---- +*************** +*** 7713,7726 **** + if (p == NULL) + return -1; + _wputenv(p); +! # ifdef libintl_wputenv + libintl_wputenv(p); +! # endif + /* Unlike Un*x systems, we can free the string for _wputenv(). */ + vim_free(p); + } + else +- #endif + { + _putenv((char *)envbuf); + #ifdef libintl_putenv +--- 7602,7614 ---- + if (p == NULL) + return -1; + _wputenv(p); +! #ifdef libintl_wputenv + libintl_wputenv(p); +! #endif + /* Unlike Un*x systems, we can free the string for _wputenv(). */ + vim_free(p); + } + else + { + _putenv((char *)envbuf); + #ifdef libintl_putenv +*** ../vim-8.1.0808/src/quickfix.c 2019-01-19 17:43:03.425449092 +0100 +--- src/quickfix.c 2019-01-24 16:07:06.165522202 +0100 +*************** +*** 804,810 **** + else + state->linebuf = IObuff; + +- #ifdef FEAT_MBYTE + // Convert a line if it contains a non-ASCII character. + if (state->vc.vc_type != CONV_NONE && has_non_ascii(state->linebuf)) + { +--- 804,809 ---- +*************** +*** 827,833 **** + } + } + } +- #endif + + return QF_OK; + } +--- 826,831 ---- +*************** +*** 872,880 **** + #endif + } + +- #ifdef FEAT_MBYTE + remove_bom(state->linebuf); +- #endif + + return QF_OK; + } +--- 870,876 ---- +*************** +*** 1538,1548 **** + linenr_T lnumfirst, + linenr_T lnumlast) + { +- #ifdef FEAT_MBYTE + pstate->vc.vc_type = CONV_NONE; + if (enc != NULL && *enc != NUL) + convert_setup(&pstate->vc, enc, p_enc); +- #endif + + if (efile != NULL && (pstate->fd = mch_fopen((char *)efile, "r")) == NULL) + { +--- 1534,1542 ---- +*************** +*** 1576,1585 **** + fclose(pstate->fd); + + vim_free(pstate->growbuf); +- #ifdef FEAT_MBYTE + if (pstate->vc.vc_type != CONV_NONE) + convert_setup(&pstate->vc, NULL, NULL); +- #endif + } + + /* +--- 1570,1577 ---- +*************** +*** 4690,4698 **** + return; + #endif + } +- #ifdef FEAT_MBYTE + enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc; +- #endif + + if (is_loclist_cmd(eap->cmdidx)) + wp = curwin; +--- 4682,4688 ---- +*************** +*** 5032,5040 **** + } + if (au_name != NULL) + apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, FALSE, curbuf); +- #ifdef FEAT_MBYTE + enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc; +- #endif + #ifdef FEAT_BROWSE + if (cmdmod.browse) + { +--- 5022,5028 ---- +*************** +*** 7035,7043 **** + hgr_search_file( + qf_info_T *qi, + char_u *fname, +- #ifdef FEAT_MBYTE + vimconv_T *p_vc, +- #endif + regmatch_T *p_regmatch) + { + FILE *fd; +--- 7023,7029 ---- +*************** +*** 7051,7057 **** + while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) + { + char_u *line = IObuff; +! #ifdef FEAT_MBYTE + // Convert a line if 'encoding' is not utf-8 and + // the line contains a non-ASCII character. + if (p_vc->vc_type != CONV_NONE +--- 7037,7043 ---- + while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) + { + char_u *line = IObuff; +! + // Convert a line if 'encoding' is not utf-8 and + // the line contains a non-ASCII character. + if (p_vc->vc_type != CONV_NONE +*************** +*** 7061,7067 **** + if (line == NULL) + line = IObuff; + } +- #endif + + if (vim_regexec(p_regmatch, line, (colnr_T)0)) + { +--- 7047,7052 ---- +*************** +*** 7089,7105 **** + ) == FAIL) + { + got_int = TRUE; +- #ifdef FEAT_MBYTE + if (line != IObuff) + vim_free(line); +- #endif + break; + } + } +- #ifdef FEAT_MBYTE + if (line != IObuff) + vim_free(line); +- #endif + ++lnum; + line_breakcheck(); + } +--- 7074,7086 ---- +*************** +*** 7114,7123 **** + hgr_search_files_in_dir( + qf_info_T *qi, + char_u *dirname, +! regmatch_T *p_regmatch +! #ifdef FEAT_MBYTE +! , vimconv_T *p_vc +! #endif + #ifdef FEAT_MULTI_LANG + , char_u *lang + #endif +--- 7095,7102 ---- + hgr_search_files_in_dir( + qf_info_T *qi, + char_u *dirname, +! regmatch_T *p_regmatch, +! vimconv_T *p_vc + #ifdef FEAT_MULTI_LANG + , char_u *lang + #endif +*************** +*** 7147,7157 **** + continue; + #endif + +! hgr_search_file(qi, fnames[fi], +! #ifdef FEAT_MBYTE +! p_vc, +! #endif +! p_regmatch); + } + FreeWild(fcount, fnames); + } +--- 7126,7132 ---- + continue; + #endif + +! hgr_search_file(qi, fnames[fi], p_vc, p_regmatch); + } + FreeWild(fcount, fnames); + } +*************** +*** 7168,7174 **** + { + char_u *p; + +- #ifdef FEAT_MBYTE + vimconv_T vc; + + // Help files are in utf-8 or latin1, convert lines when 'encoding' +--- 7143,7148 ---- +*************** +*** 7176,7182 **** + vc.vc_type = CONV_NONE; + if (!enc_utf8) + convert_setup(&vc, (char_u *)"utf-8", p_enc); +- #endif + + // Go through all the directories in 'runtimepath' + p = p_rtp; +--- 7150,7155 ---- +*************** +*** 7184,7203 **** + { + copy_option_part(&p, NameBuff, MAXPATHL, ","); + +! hgr_search_files_in_dir(qi, NameBuff, p_regmatch +! #ifdef FEAT_MBYTE +! , &vc +! #endif + #ifdef FEAT_MULTI_LANG + , lang + #endif + ); + } + +- #ifdef FEAT_MBYTE + if (vc.vc_type != CONV_NONE) + convert_setup(&vc, NULL, NULL); +- #endif + } + + /* +--- 7157,7171 ---- + { + copy_option_part(&p, NameBuff, MAXPATHL, ","); + +! hgr_search_files_in_dir(qi, NameBuff, p_regmatch, &vc + #ifdef FEAT_MULTI_LANG + , lang + #endif + ); + } + + if (vc.vc_type != CONV_NONE) + convert_setup(&vc, NULL, NULL); + } + + /* +*** ../vim-8.1.0808/src/regexp.c 2019-01-20 15:30:36.893328693 +0100 +--- src/regexp.c 2019-01-24 16:11:49.839580685 +0100 +*************** +*** 359,367 **** + + static char_u e_missingbracket[] = N_("E769: Missing ] after %s["); + static char_u e_reverse_range[] = N_("E944: Reverse range in character class"); +- #ifdef FEAT_MBYTE + static char_u e_large_class[] = N_("E945: Range too large in character class"); +- #endif + static char_u e_unmatchedpp[] = N_("E53: Unmatched %s%%("); + static char_u e_unmatchedp[] = N_("E54: Unmatched %s("); + static char_u e_unmatchedpar[] = N_("E55: Unmatched %s)"); +--- 359,365 ---- +*************** +*** 561,587 **** + done = TRUE; + } + +! #ifdef FEAT_MBYTE +! # define ri_digit(c) (c < 0x100 && (class_tab[c] & RI_DIGIT)) +! # define ri_hex(c) (c < 0x100 && (class_tab[c] & RI_HEX)) +! # define ri_octal(c) (c < 0x100 && (class_tab[c] & RI_OCTAL)) +! # define ri_word(c) (c < 0x100 && (class_tab[c] & RI_WORD)) +! # define ri_head(c) (c < 0x100 && (class_tab[c] & RI_HEAD)) +! # define ri_alpha(c) (c < 0x100 && (class_tab[c] & RI_ALPHA)) +! # define ri_lower(c) (c < 0x100 && (class_tab[c] & RI_LOWER)) +! # define ri_upper(c) (c < 0x100 && (class_tab[c] & RI_UPPER)) +! # define ri_white(c) (c < 0x100 && (class_tab[c] & RI_WHITE)) +! #else +! # define ri_digit(c) (class_tab[c] & RI_DIGIT) +! # define ri_hex(c) (class_tab[c] & RI_HEX) +! # define ri_octal(c) (class_tab[c] & RI_OCTAL) +! # define ri_word(c) (class_tab[c] & RI_WORD) +! # define ri_head(c) (class_tab[c] & RI_HEAD) +! # define ri_alpha(c) (class_tab[c] & RI_ALPHA) +! # define ri_lower(c) (class_tab[c] & RI_LOWER) +! # define ri_upper(c) (class_tab[c] & RI_UPPER) +! # define ri_white(c) (class_tab[c] & RI_WHITE) +! #endif + + /* flags for regflags */ + #define RF_ICASE 1 /* ignore case */ +--- 559,573 ---- + done = TRUE; + } + +! #define ri_digit(c) (c < 0x100 && (class_tab[c] & RI_DIGIT)) +! #define ri_hex(c) (c < 0x100 && (class_tab[c] & RI_HEX)) +! #define ri_octal(c) (c < 0x100 && (class_tab[c] & RI_OCTAL)) +! #define ri_word(c) (c < 0x100 && (class_tab[c] & RI_WORD)) +! #define ri_head(c) (c < 0x100 && (class_tab[c] & RI_HEAD)) +! #define ri_alpha(c) (c < 0x100 && (class_tab[c] & RI_ALPHA)) +! #define ri_lower(c) (c < 0x100 && (class_tab[c] & RI_LOWER)) +! #define ri_upper(c) (c < 0x100 && (class_tab[c] & RI_UPPER)) +! #define ri_white(c) (c < 0x100 && (class_tab[c] & RI_WHITE)) + + /* flags for regflags */ + #define RF_ICASE 1 /* ignore case */ +*************** +*** 698,718 **** + static char_u *regpiece(int *); + static char_u *regatom(int *); + static char_u *regnode(int); +- #ifdef FEAT_MBYTE + static int use_multibytecode(int c); +- #endif + static int prog_magic_wrong(void); + static char_u *regnext(char_u *); + static void regc(int b); +- #ifdef FEAT_MBYTE + static void regmbc(int c); +! # define REGMBC(x) regmbc(x); +! # define CASEMBC(x) case x: +! #else +! # define regmbc(c) regc(c) +! # define REGMBC(x) +! # define CASEMBC(x) +! #endif + static void reginsert(int, char_u *); + static void reginsert_nr(int op, long val, char_u *opnd); + static void reginsert_limits(int, long, long, char_u *); +--- 684,696 ---- + static char_u *regpiece(int *); + static char_u *regatom(int *); + static char_u *regnode(int); + static int use_multibytecode(int c); + static int prog_magic_wrong(void); + static char_u *regnext(char_u *); + static void regc(int b); + static void regmbc(int c); +! #define REGMBC(x) regmbc(x); +! #define CASEMBC(x) case x: + static void reginsert(int, char_u *); + static void reginsert_nr(int op, long val, char_u *opnd); + static void reginsert_limits(int, long, long, char_u *); +*************** +*** 747,763 **** + + if (p[1] == '=') + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + l = (*mb_ptr2len)(p + 2); +- #endif + if (p[l + 2] == '=' && p[l + 3] == ']') + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + c = mb_ptr2char(p + 2); + else +- #endif + c = p[2]; + *pp += l + 4; + return c; +--- 725,737 ---- +*************** +*** 798,807 **** + static void + reg_equi_class(int c) + { +- #ifdef FEAT_MBYTE + if (enc_utf8 || STRCMP(p_enc, "latin1") == 0 + || STRCMP(p_enc, "iso-8859-15") == 0) +- #endif + { + #ifdef EBCDIC + int i; +--- 772,779 ---- +*************** +*** 1134,1150 **** + + if (p[0] != NUL && p[1] == '.') + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + l = (*mb_ptr2len)(p + 2); +- #endif + if (p[l + 2] == '.' && p[l + 3] == ']') + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + c = mb_ptr2char(p + 2); + else +- #endif + c = p[2]; + *pp += l + 4; + return c; +--- 1106,1118 ---- +*************** +*** 1171,1179 **** + static char_u * + skip_anyof(char_u *p) + { +- #ifdef FEAT_MBYTE + int l; +- #endif + + if (*p == '^') /* Complement of range. */ + ++p; +--- 1139,1145 ---- +*************** +*** 1181,1191 **** + ++p; + while (*p != NUL && *p != ']') + { +- #ifdef FEAT_MBYTE + if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1) + p += l; + else +- #endif + if (*p == '-') + { + ++p; +--- 1147,1155 ---- +*************** +*** 1395,1405 **** + + if (OP(scan) == EXACTLY) + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + r->regstart = (*mb_ptr2char)(OPERAND(scan)); + else +- #endif + r->regstart = *OPERAND(scan); + } + else if ((OP(scan) == BOW +--- 1359,1367 ---- +*************** +*** 1409,1419 **** + || OP(scan) == MCLOSE + 0 || OP(scan) == NCLOSE) + && OP(regnext(scan)) == EXACTLY) + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + r->regstart = (*mb_ptr2char)(OPERAND(regnext(scan))); + else +- #endif + r->regstart = *OPERAND(regnext(scan)); + } + +--- 1371,1379 ---- +*************** +*** 1696,1704 **** + cont = FALSE; + break; + case Magic('Z'): +- #ifdef FEAT_MBYTE + regflags |= RF_ICOMBINE; +- #endif + skipchr_keepstart(); + break; + case Magic('c'): +--- 1656,1662 ---- +*************** +*** 2008,2014 **** + p = vim_strchr(classchars, no_Magic(c)); + if (p == NULL) + EMSG_RET_NULL(_("E63: invalid use of \\_")); +! #ifdef FEAT_MBYTE + /* When '.' is followed by a composing char ignore the dot, so that + * the composing char is matched here. */ + if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr())) +--- 1966,1972 ---- + p = vim_strchr(classchars, no_Magic(c)); + if (p == NULL) + EMSG_RET_NULL(_("E63: invalid use of \\_")); +! + /* When '.' is followed by a composing char ignore the dot, so that + * the composing char is matched here. */ + if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr())) +*************** +*** 2016,2022 **** + c = getchr(); + goto do_multibyte; + } +- #endif + ret = regnode(classcodes[p - classchars] + extra); + *flagp |= HASWIDTH | SIMPLE; + break; +--- 1974,1979 ---- +*************** +*** 2268,2287 **** + EMSG2_RET_NULL( + _("E678: Invalid character after %s%%[dxouU]"), + reg_magic == MAGIC_ALL); +- #ifdef FEAT_MBYTE + if (use_multibytecode(i)) + ret = regnode(MULTIBYTECODE); + else +- #endif + ret = regnode(EXACTLY); + if (i == 0) + regc(0x0a); + else +- #ifdef FEAT_MBYTE + regmbc(i); +- #else +- regc(i); +- #endif + regc(NUL); + *flagp |= HASWIDTH; + break; +--- 2225,2238 ---- +*************** +*** 2403,2413 **** + endc = get_coll_element(®parse); + if (endc == 0) + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + endc = mb_ptr2char_adv(®parse); + else +- #endif + endc = *regparse++; + } + +--- 2354,2362 ---- +*************** +*** 2417,2423 **** + + if (startc > endc) + EMSG_RET_NULL(_(e_reverse_range)); +- #ifdef FEAT_MBYTE + if (has_mbyte && ((*mb_char2len)(startc) > 1 + || (*mb_char2len)(endc) > 1)) + { +--- 2366,2371 ---- +*************** +*** 2428,2434 **** + regmbc(startc); + } + else +- #endif + { + #ifdef EBCDIC + int alpha_only = FALSE; +--- 2376,2381 ---- +*************** +*** 2488,2498 **** + if (startc == 0) + regc(0x0a); + else +- #ifdef FEAT_MBYTE + regmbc(startc); +- #else +- regc(startc); +- #endif + } + else + { +--- 2435,2441 ---- +*************** +*** 2606,2612 **** + } + else + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + int len; +--- 2549,2554 ---- +*************** +*** 2621,2627 **** + regc(*regparse++); + } + else +- #endif + { + startc = *regparse++; + regc(startc); +--- 2563,2568 ---- +*************** +*** 2645,2651 **** + { + int len; + +- #ifdef FEAT_MBYTE + /* A multi-byte character is handled as a separate atom if it's + * before a multi and when it's a composing char. */ + if (use_multibytecode(c)) +--- 2586,2591 ---- +*************** +*** 2656,2662 **** + *flagp |= HASWIDTH | SIMPLE; + break; + } +- #endif + + ret = regnode(EXACTLY); + +--- 2596,2601 ---- +*************** +*** 2675,2681 **** + && !is_Magic(c))); ++len) + { + c = no_Magic(c); +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + regmbc(c); +--- 2614,2619 ---- +*************** +*** 2695,2701 **** + } + } + else +- #endif + regc(c); + c = getchr(); + } +--- 2633,2638 ---- +*************** +*** 2712,2718 **** + return ret; + } + +- #ifdef FEAT_MBYTE + /* + * Return TRUE if MULTIBYTECODE should be used instead of EXACTLY for + * character "c". +--- 2649,2654 ---- +*************** +*** 2724,2730 **** + && (re_multi_type(peekchr()) != NOT_MULTI + || (enc_utf8 && utf_iscomposing(c))); + } +- #endif + + /* + * Emit a node. +--- 2660,2665 ---- +*************** +*** 2759,2765 **** + *regcode++ = b; + } + +- #ifdef FEAT_MBYTE + /* + * Emit (if appropriate) a multi-byte character of code + */ +--- 2694,2699 ---- +*************** +*** 2773,2779 **** + else + regcode += (*mb_char2bytes)(c, regcode); + } +- #endif + + /* + * Insert an operator in front of already-emitted operand +--- 2707,2712 ---- +*************** +*** 3139,3159 **** + * Next character can never be (made) magic? + * Then backslashing it won't do anything. + */ +- #ifdef FEAT_MBYTE + if (has_mbyte) + curchr = (*mb_ptr2char)(regparse + 1); + else +- #endif + curchr = c; + } + break; + } + +- #ifdef FEAT_MBYTE + default: + if (has_mbyte) + curchr = (*mb_ptr2char)(regparse); +- #endif + } + } + +--- 3072,3088 ---- +*************** +*** 3173,3186 **** + prevchr_len = 0; + if (regparse[prevchr_len] != NUL) + { +- #ifdef FEAT_MBYTE + if (enc_utf8) + /* exclude composing chars that mb_ptr2len does include */ + prevchr_len += utf_ptr2len(regparse + prevchr_len); + else if (has_mbyte) + prevchr_len += (*mb_ptr2len)(regparse + prevchr_len); + else +- #endif + ++prevchr_len; + } + regparse += prevchr_len; +--- 3102,3113 ---- +*************** +*** 3538,3548 **** + * contains '\c' or '\C' the value is overruled. */ + int reg_ic; + +- #ifdef FEAT_MBYTE + /* Similar to "reg_ic", but only for 'combining' characters. Set with \Z + * flag in the regexp. Defaults to false, always. */ + int reg_icombine; +- #endif + + /* Copy of "rmm_maxcol": maximum column to search for a match. Zero when + * there is no maximum. */ +--- 3465,3473 ---- +*************** +*** 3714,3722 **** + rex.reg_buf = curbuf; + rex.reg_win = NULL; + rex.reg_ic = rmp->rm_ic; +- #ifdef FEAT_MBYTE + rex.reg_icombine = FALSE; +- #endif + rex.reg_maxcol = 0; + + return bt_regexec_both(line, col, NULL, NULL); +--- 3639,3645 ---- +*************** +*** 3748,3756 **** + rex.reg_maxline = rex.reg_buf->b_ml.ml_line_count - lnum; + rex.reg_line_lbr = FALSE; + rex.reg_ic = rmp->rmm_ic; +- #ifdef FEAT_MBYTE + rex.reg_icombine = FALSE; +- #endif + rex.reg_maxcol = rmp->rmm_maxcol; + + return bt_regexec_both(NULL, col, tm, timed_out); +--- 3671,3677 ---- +*************** +*** 3827,3848 **** + else if (prog->regflags & RF_NOICASE) + rex.reg_ic = FALSE; + +- #ifdef FEAT_MBYTE + /* If pattern contains "\Z" overrule value of rex.reg_icombine */ + if (prog->regflags & RF_ICOMBINE) + rex.reg_icombine = TRUE; +- #endif + + /* If there is a "must appear" string, look for it. */ + if (prog->regmust != NULL) + { + int c; + +- #ifdef FEAT_MBYTE + if (has_mbyte) + c = (*mb_ptr2char)(prog->regmust); + else +- #endif + c = *prog->regmust; + s = line + col; + +--- 3748,3765 ---- +*************** +*** 3850,3867 **** + * This is used very often, esp. for ":global". Use three versions of + * the loop to avoid overhead of conditions. + */ +! if (!rex.reg_ic +! #ifdef FEAT_MBYTE +! && !has_mbyte +! #endif +! ) + while ((s = vim_strbyte(s, c)) != NULL) + { + if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) + break; /* Found it. */ + ++s; + } +- #ifdef FEAT_MBYTE + else if (!rex.reg_ic || (!enc_utf8 && mb_char2len(c) > 1)) + while ((s = vim_strchr(s, c)) != NULL) + { +--- 3767,3779 ---- + * This is used very often, esp. for ":global". Use three versions of + * the loop to avoid overhead of conditions. + */ +! if (!rex.reg_ic && !has_mbyte) + while ((s = vim_strbyte(s, c)) != NULL) + { + if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) + break; /* Found it. */ + ++s; + } + else if (!rex.reg_ic || (!enc_utf8 && mb_char2len(c) > 1)) + while ((s = vim_strchr(s, c)) != NULL) + { +*************** +*** 3869,3875 **** + break; /* Found it. */ + MB_PTR_ADV(s); + } +- #endif + else + while ((s = cstrchr(s, c)) != NULL) + { +--- 3781,3786 ---- +*************** +*** 3890,3908 **** + { + int c; + +- #ifdef FEAT_MBYTE + if (has_mbyte) + c = (*mb_ptr2char)(rex.line + col); + else +- #endif + c = rex.line[col]; + if (prog->regstart == NUL + || prog->regstart == c +! || (rex.reg_ic && (( +! #ifdef FEAT_MBYTE +! (enc_utf8 && utf_fold(prog->regstart) == utf_fold(c))) + || (c < 255 && prog->regstart < 255 && +- #endif + MB_TOLOWER(prog->regstart) == MB_TOLOWER(c))))) + retval = regtry(prog, col, tm, timed_out); + else +--- 3801,3815 ---- + { + int c; + + if (has_mbyte) + c = (*mb_ptr2char)(rex.line + col); + else + c = rex.line[col]; + if (prog->regstart == NUL + || prog->regstart == c +! || (rex.reg_ic +! && (((enc_utf8 && utf_fold(prog->regstart) == utf_fold(c))) + || (c < 255 && prog->regstart < 255 && + MB_TOLOWER(prog->regstart) == MB_TOLOWER(c))))) + retval = regtry(prog, col, tm, timed_out); + else +*************** +*** 3920,3930 **** + { + /* Skip until the char we know it must start with. + * Used often, do some work to avoid call overhead. */ +! if (!rex.reg_ic +! #ifdef FEAT_MBYTE +! && !has_mbyte +! #endif +! ) + s = vim_strbyte(rex.line + col, prog->regstart); + else + s = cstrchr(rex.line + col, prog->regstart); +--- 3827,3833 ---- + { + /* Skip until the char we know it must start with. + * Used often, do some work to avoid call overhead. */ +! if (!rex.reg_ic && !has_mbyte) + s = vim_strbyte(rex.line + col, prog->regstart); + else + s = cstrchr(rex.line + col, prog->regstart); +*************** +*** 3955,3965 **** + } + if (rex.line[col] == NUL) + break; +- #ifdef FEAT_MBYTE + if (has_mbyte) + col += (*mb_ptr2len)(rex.line + col); + else +- #endif + ++col; + #ifdef FEAT_RELTIME + /* Check for timeout once in a twenty times to avoid overhead. */ +--- 3858,3866 ---- +*************** +*** 4116,4122 **** + return 1 + rex.lnum; + } + +- #ifdef FEAT_MBYTE + /* + * Get class of previous character. + */ +--- 4017,4022 ---- +*************** +*** 4125,4134 **** + { + if (rex.input > rex.line) + return mb_get_class_buf(rex.input - 1 +! - (*mb_head_off)(rex.line, rex.input - 1), rex.reg_buf); + return -1; + } +- #endif + + /* + * Return TRUE if the current rex.input position matches the Visual area. +--- 4025,4033 ---- + { + if (rex.input > rex.line) + return mb_get_class_buf(rex.input - 1 +! - (*mb_head_off)(rex.line, rex.input - 1), rex.reg_buf); + return -1; + } + + /* + * Return TRUE if the current rex.input position matches the Visual area. +*************** +*** 4339,4349 **** + { + if (WITH_NL(op)) + op -= ADD_NL; +- #ifdef FEAT_MBYTE + if (has_mbyte) + c = (*mb_ptr2char)(rex.input); + else +- #endif + c = *rex.input; + switch (op) + { +--- 4238,4246 ---- +*************** +*** 4431,4437 **** + case BOW: /* \<word; rex.input points to w */ + if (c == NUL) /* Can't match at end of line */ + status = RA_NOMATCH; +- #ifdef FEAT_MBYTE + else if (has_mbyte) + { + int this_class; +--- 4328,4333 ---- +*************** +*** 4443,4449 **** + else if (reg_prev_class() == this_class) + status = RA_NOMATCH; /* previous char is in same word */ + } +- #endif + else + { + if (!vim_iswordc_buf(c, rex.reg_buf) || (rex.input > rex.line +--- 4339,4344 ---- +*************** +*** 4455,4461 **** + case EOW: /* word\>; rex.input points after d */ + if (rex.input == rex.line) /* Can't match at start of line */ + status = RA_NOMATCH; +- #ifdef FEAT_MBYTE + else if (has_mbyte) + { + int this_class, prev_class; +--- 4350,4355 ---- +*************** +*** 4467,4473 **** + || prev_class == 0 || prev_class == 1) + status = RA_NOMATCH; + } +- #endif + else + { + if (!vim_iswordc_buf(rex.input[-1], rex.reg_buf) +--- 4361,4366 ---- +*************** +*** 4676,4686 **** + opnd = OPERAND(scan); + /* Inline the first byte, for speed. */ + if (*opnd != *rex.input +! && (!rex.reg_ic || ( +! #ifdef FEAT_MBYTE +! !enc_utf8 && +! #endif +! MB_TOLOWER(*opnd) != MB_TOLOWER(*rex.input)))) + status = RA_NOMATCH; + else if (*opnd == NUL) + { +--- 4569,4577 ---- + opnd = OPERAND(scan); + /* Inline the first byte, for speed. */ + if (*opnd != *rex.input +! && (!rex.reg_ic +! || (!enc_utf8 +! && MB_TOLOWER(*opnd) != MB_TOLOWER(*rex.input)))) + status = RA_NOMATCH; + else if (*opnd == NUL) + { +*************** +*** 4689,4699 **** + } + else + { +! if (opnd[1] == NUL +! #ifdef FEAT_MBYTE +! && !(enc_utf8 && rex.reg_ic) +! #endif +! ) + { + len = 1; /* matched a single byte above */ + } +--- 4580,4586 ---- + } + else + { +! if (opnd[1] == NUL && !(enc_utf8 && rex.reg_ic)) + { + len = 1; /* matched a single byte above */ + } +*************** +*** 4704,4710 **** + if (cstrncmp(opnd, rex.input, &len) != 0) + status = RA_NOMATCH; + } +- #ifdef FEAT_MBYTE + /* Check for following composing character, unless %C + * follows (skips over all composing chars). */ + if (status != RA_NOMATCH +--- 4591,4596 ---- +*************** +*** 4718,4724 **** + * for voweled Hebrew texts. */ + status = RA_NOMATCH; + } +- #endif + if (status != RA_NOMATCH) + rex.input += len; + } +--- 4604,4609 ---- +*************** +*** 4735,4741 **** + ADVANCE_REGINPUT(); + break; + +- #ifdef FEAT_MBYTE + case MULTIBYTECODE: + if (has_mbyte) + { +--- 4620,4625 ---- +*************** +*** 4788,4803 **** + else + status = RA_NOMATCH; + break; +- #endif + case RE_COMPOSING: +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + /* Skip composing characters. */ + while (utf_iscomposing(utf_ptr2char(rex.input))) + MB_CPTR_ADV(rex.input); + } +- #endif + break; + + case NOTHING: +--- 4672,4684 ---- +*************** +*** 5561,5567 **** + } + else + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + char_u *line = +--- 5442,5447 ---- +*************** +*** 5572,5578 **** + + rp->rs_un.regsave.rs_u.pos.col - 1) + 1; + } + else +- #endif + --rp->rs_un.regsave.rs_u.pos.col; + } + } +--- 5452,5457 ---- +*************** +*** 5952,5960 **** + do_class: + while (count < maxcount) + { +- #ifdef FEAT_MBYTE + int l; +! #endif + if (*scan == NUL) + { + if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline +--- 5831,5838 ---- + do_class: + while (count < maxcount) + { + int l; +! + if (*scan == NUL) + { + if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline +*************** +*** 5965,5978 **** + if (got_int) + break; + } +- #ifdef FEAT_MBYTE + else if (has_mbyte && (l = (*mb_ptr2len)(scan)) > 1) + { + if (testval != 0) + break; + scan += l; + } +- #endif + else if ((class_tab[*scan] & mask) == testval) + ++scan; + else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) +--- 5843,5854 ---- +*************** +*** 6081,6087 **** + break; + } + +- #ifdef FEAT_MBYTE + case MULTIBYTECODE: + { + int i, len, cf = 0; +--- 5957,5962 ---- +*************** +*** 6106,6112 **** + } + } + break; +- #endif + + case ANYOF: + case ANYOF + ADD_NL: +--- 5981,5986 ---- +*************** +*** 6117,6125 **** + case ANYBUT + ADD_NL: + while (count < maxcount) + { +- #ifdef FEAT_MBYTE + int len; +! #endif + if (*scan == NUL) + { + if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline +--- 5991,5998 ---- + case ANYBUT + ADD_NL: + while (count < maxcount) + { + int len; +! + if (*scan == NUL) + { + if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline +*************** +*** 6132,6145 **** + } + else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) + ++scan; +- #ifdef FEAT_MBYTE + else if (has_mbyte && (len = (*mb_ptr2len)(scan)) > 1) + { + if ((cstrchr(opnd, (*mb_ptr2char)(scan)) == NULL) == testval) + break; + scan += len; + } +- #endif + else + { + if ((cstrchr(opnd, *scan) == NULL) == testval) +--- 6005,6016 ---- +*************** +*** 6955,6965 **** + sprintf(buf + STRLEN(buf), "BRACE_COMPLEX%d", OP(op) - BRACE_COMPLEX); + p = NULL; + break; +- #ifdef FEAT_MBYTE + case MULTIBYTECODE: + p = "MULTIBYTECODE"; + break; +- #endif + case NEWL: + p = "NEWL"; + break; +--- 6826,6834 ---- +*************** +*** 6989,6995 **** + return OK; + } + +- #ifdef FEAT_MBYTE + typedef struct + { + int a, b, c; +--- 6858,6863 ---- +*************** +*** 7067,7073 **** + *c2 = *c3 = 0; + } + } +- #endif + + /* + * Compare two strings, ignore case if rex.reg_ic set. +--- 6935,6940 ---- +*************** +*** 7084,7090 **** + else + result = MB_STRNICMP(s1, s2, *n); + +- #ifdef FEAT_MBYTE + /* if it failed and it's utf8 and we want to combineignore: */ + if (result != 0 && enc_utf8 && rex.reg_icombine) + { +--- 6951,6956 ---- +*************** +*** 7121,7127 **** + if (result == 0) + *n = (int)(str2 - s2); + } +- #endif + + return result; + } +--- 6987,6992 ---- +*************** +*** 7135,7155 **** + char_u *p; + int cc; + +! if (!rex.reg_ic +! #ifdef FEAT_MBYTE +! || (!enc_utf8 && mb_char2len(c) > 1) +! #endif +! ) + return vim_strchr(s, c); + + /* tolower() and toupper() can be slow, comparing twice should be a lot + * faster (esp. when using MS Visual C++!). + * For UTF-8 need to use folded case. */ +- #ifdef FEAT_MBYTE + if (enc_utf8 && c > 0x80) + cc = utf_fold(c); + else +- #endif + if (MB_ISUPPER(c)) + cc = MB_TOLOWER(c); + else if (MB_ISLOWER(c)) +--- 7000,7014 ---- + char_u *p; + int cc; + +! if (!rex.reg_ic || (!enc_utf8 && mb_char2len(c) > 1)) + return vim_strchr(s, c); + + /* tolower() and toupper() can be slow, comparing twice should be a lot + * faster (esp. when using MS Visual C++!). + * For UTF-8 need to use folded case. */ + if (enc_utf8 && c > 0x80) + cc = utf_fold(c); + else + if (MB_ISUPPER(c)) + cc = MB_TOLOWER(c); + else if (MB_ISLOWER(c)) +*************** +*** 7157,7163 **** + else + return vim_strchr(s, c); + +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + for (p = s; *p != NUL; p += (*mb_ptr2len)(p)) +--- 7016,7021 ---- +*************** +*** 7172,7178 **** + } + } + else +- #endif + /* Faster version for when there are no multi-byte characters. */ + for (p = s; *p != NUL; ++p) + if (*p == c || *p == cc) +--- 7030,7035 ---- +*************** +*** 7285,7294 **** + { + if (*p == '\\' && p[1]) /* skip escaped characters */ + ++p; +- #ifdef FEAT_MBYTE + if (has_mbyte) + p += (*mb_ptr2len)(p) - 1; +- #endif + } + } + +--- 7142,7149 ---- +*************** +*** 7682,7691 **** + c = *src++; + } + } +- #ifdef FEAT_MBYTE + else if (has_mbyte) + c = mb_ptr2char(src - 1); +- #endif + + /* Write to buffer, if copy is set. */ + if (func_one != (fptr_T)NULL) +--- 7537,7544 ---- +*************** +*** 7697,7703 **** + else /* just copy */ + cc = c; + +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + int totlen = mb_ptr2len(src - 1); +--- 7550,7555 ---- +*************** +*** 7721,7729 **** + } + src += totlen - 1; + } +! else +! #endif +! if (copy) + *dst = cc; + dst++; + } +--- 7573,7579 ---- + } + src += totlen - 1; + } +! else if (copy) + *dst = cc; + dst++; + } +*************** +*** 7799,7809 **** + } + else + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + c = mb_ptr2char(s); + else +- #endif + c = *s; + + if (func_one != (fptr_T)NULL) +--- 7649,7657 ---- +*************** +*** 7815,7821 **** + else /* just copy */ + cc = c; + +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + int l; +--- 7663,7668 ---- +*************** +*** 7833,7841 **** + mb_char2bytes(cc, dst); + dst += mb_char2len(cc) - 1; + } +! else +! #endif +! if (copy) + *dst = cc; + dst++; + } +--- 7680,7686 ---- + mb_char2bytes(cc, dst); + dst += mb_char2len(cc) - 1; + } +! else if (copy) + *dst = cc; + dst++; + } +*** ../vim-8.1.0808/src/regexp_nfa.c 2019-01-15 20:19:36.747904404 +0100 +--- src/regexp_nfa.c 2019-01-24 16:14:10.790618054 +0100 +*************** +*** 487,497 **** + s = ret; + while (p->c > 0) + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + s += (*mb_char2bytes)(p->c, s); + else +- #endif + *s++ = p->c; + p = p->out; + } +--- 487,495 ---- +*************** +*** 687,702 **** + nfa_emit_equi_class(int c) + { + #define EMIT2(c) EMIT(c); EMIT(NFA_CONCAT); +! #ifdef FEAT_MBYTE +! # define EMITMBC(c) EMIT(c); EMIT(NFA_CONCAT); +! #else +! # define EMITMBC(c) +! #endif + +- #ifdef FEAT_MBYTE + if (enc_utf8 || STRCMP(p_enc, "latin1") == 0 + || STRCMP(p_enc, "iso-8859-15") == 0) +- #endif + { + #ifdef EBCDIC + # define A_circumflex 0x62 +--- 685,694 ---- + nfa_emit_equi_class(int c) + { + #define EMIT2(c) EMIT(c); EMIT(NFA_CONCAT); +! #define EMITMBC(c) EMIT(c); EMIT(NFA_CONCAT); + + if (enc_utf8 || STRCMP(p_enc, "latin1") == 0 + || STRCMP(p_enc, "iso-8859-15") == 0) + { + #ifdef EBCDIC + # define A_circumflex 0x62 +*************** +*** 1203,1211 **** + int got_coll_char; + char_u *p; + char_u *endp; +- #ifdef FEAT_MBYTE + char_u *old_regparse = regparse; +- #endif + int extra = 0; + int emit_range; + int negated; +--- 1195,1201 ---- +*************** +*** 1310,1316 **** + siemsg("INTERNAL: Unknown character class char: %d", c); + return FAIL; + } +! #ifdef FEAT_MBYTE + /* When '.' is followed by a composing char ignore the dot, so that + * the composing char is matched here. */ + if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr())) +--- 1300,1306 ---- + siemsg("INTERNAL: Unknown character class char: %d", c); + return FAIL; + } +! + /* When '.' is followed by a composing char ignore the dot, so that + * the composing char is matched here. */ + if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr())) +*************** +*** 1319,1325 **** + c = getchr(); + goto nfa_do_multibyte; + } +- #endif + EMIT(nfa_classcodes[p - classchars]); + if (extra == NFA_ADD_NL) + { +--- 1309,1314 ---- +*************** +*** 1827,1835 **** + EMIT(NFA_RANGE); + EMIT(NFA_CONCAT); + } +! else +! #ifdef FEAT_MBYTE +! if (has_mbyte && ((*mb_char2len)(startc) > 1 + || (*mb_char2len)(endc) > 1)) + { + /* Emit the characters in the range. +--- 1816,1822 ---- + EMIT(NFA_RANGE); + EMIT(NFA_CONCAT); + } +! else if (has_mbyte && ((*mb_char2len)(startc) > 1 + || (*mb_char2len)(endc) > 1)) + { + /* Emit the characters in the range. +*************** +*** 1842,1848 **** + } + } + else +- #endif + { + #ifdef EBCDIC + int alpha_only = FALSE; +--- 1829,1834 ---- +*************** +*** 1929,1935 **** + + default: + { +- #ifdef FEAT_MBYTE + int plen; + + nfa_do_multibyte: +--- 1915,1920 ---- +*************** +*** 1961,1967 **** + regparse = old_regparse + plen; + } + else +- #endif + { + c = no_Magic(c); + EMIT(c); +--- 1946,1951 ---- +*************** +*** 2211,2219 **** + break; + + case Magic('Z'): +- #ifdef FEAT_MBYTE + regflags |= RF_ICOMBINE; +- #endif + skipchr_keepstart(); + break; + case Magic('c'): +--- 2195,2201 ---- +*************** +*** 2996,3008 **** + case NFA_START_COLL: + case NFA_START_NEG_COLL: + /* matches some character, including composing chars */ +- #ifdef FEAT_MBYTE + if (enc_utf8) + len += MB_MAXBYTES; + else if (has_mbyte) + len += 2; + else +- #endif + ++len; + if (state->c != NFA_ANY) + { +--- 2978,2988 ---- +*************** +*** 3048,3058 **** + case NFA_NUPPER_IC: + case NFA_ANY_COMPOSING: + /* possibly non-ascii */ +- #ifdef FEAT_MBYTE + if (has_mbyte) + len += 3; + else +- #endif + ++len; + break; + +--- 3028,3036 ---- +*************** +*** 3501,3507 **** + break; + } + +- #ifdef FEAT_MBYTE + case NFA_COMPOSING: /* char with composing char */ + #if 0 + /* TODO */ +--- 3479,3484 ---- +*************** +*** 3511,3517 **** + } + #endif + /* FALLTHROUGH */ +- #endif + + case NFA_MOPEN: /* \( \) Submatch */ + case NFA_MOPEN1: +--- 3488,3493 ---- +*************** +*** 3558,3566 **** + case NFA_ZOPEN8: mclose = NFA_ZCLOSE8; break; + case NFA_ZOPEN9: mclose = NFA_ZCLOSE9; break; + #endif +- #ifdef FEAT_MBYTE + case NFA_COMPOSING: mclose = NFA_END_COMPOSING; break; +- #endif + default: + /* NFA_MOPEN, NFA_MOPEN1 .. NFA_MOPEN9 */ + mclose = *p + NSUBEXP; +--- 3534,3540 ---- +*************** +*** 3596,3606 **** + goto theend; + patch(e.out, s1); + +- #ifdef FEAT_MBYTE + if (mopen == NFA_COMPOSING) + /* COMPOSING->out1 = END_COMPOSING */ + patch(list1(&s->out1), s1); +- #endif + + PUSH(frag(s, list1(&s1->out))); + break; +--- 3570,3578 ---- +*************** +*** 5119,5128 **** + if ((int)(rex.input - rex.line) >= state->val) + { + rex.input -= state->val; +- #ifdef FEAT_MBYTE + if (has_mbyte) + rex.input -= mb_head_off(rex.line, rex.input); +- #endif + } + else + rex.input = rex.line; +--- 5091,5098 ---- +*************** +*** 5381,5391 **** + char_u *s; + + /* Used often, do some work to avoid call overhead. */ +! if (!rex.reg_ic +! #ifdef FEAT_MBYTE +! && !has_mbyte +! #endif +! ) + s = vim_strbyte(rex.line + *colp, c); + else + s = cstrchr(rex.line + *colp, c); +--- 5351,5357 ---- + char_u *s; + + /* Used often, do some work to avoid call overhead. */ +! if (!rex.reg_ic && !has_mbyte) + s = vim_strbyte(rex.line + *colp, c); + else + s = cstrchr(rex.line + *colp, c); +*************** +*** 5424,5435 **** + len2 += MB_CHAR2LEN(c2); + } + if (match +- #ifdef FEAT_MBYTE + /* check that no composing char follows */ + && !(enc_utf8 +! && utf_iscomposing(PTR2CHAR(rex.line + col + len2))) +! #endif +! ) + { + cleanup_subexpr(); + if (REG_MULTI) +--- 5390,5398 ---- + len2 += MB_CHAR2LEN(c2); + } + if (match + /* check that no composing char follows */ + && !(enc_utf8 +! && utf_iscomposing(PTR2CHAR(rex.line + col + len2)))) + { + cleanup_subexpr(); + if (REG_MULTI) +*************** +*** 5596,5609 **** + int curc; + int clen; + +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + curc = (*mb_ptr2char)(rex.input); + clen = (*mb_ptr2len)(rex.input); + } + else +- #endif + { + curc = *rex.input; + clen = 1; +--- 5559,5570 ---- +*************** +*** 5708,5719 **** + { + case NFA_MATCH: + { +- #ifdef FEAT_MBYTE + /* If the match ends before a composing characters and + * rex.reg_icombine is not set, that is not really a match. */ + if (enc_utf8 && !rex.reg_icombine && utf_iscomposing(curc)) + break; +! #endif + nfa_match = TRUE; + copy_sub(&submatch->norm, &t->subs.norm); + #ifdef FEAT_SYN_HL +--- 5669,5679 ---- + { + case NFA_MATCH: + { + /* If the match ends before a composing characters and + * rex.reg_icombine is not set, that is not really a match. */ + if (enc_utf8 && !rex.reg_icombine && utf_iscomposing(curc)) + break; +! + nfa_match = TRUE; + copy_sub(&submatch->norm, &t->subs.norm); + #ifdef FEAT_SYN_HL +*************** +*** 6024,6030 **** + + if (curc == NUL) + result = FALSE; +- #ifdef FEAT_MBYTE + else if (has_mbyte) + { + int this_class; +--- 5984,5989 ---- +*************** +*** 6036,6042 **** + else if (reg_prev_class() == this_class) + result = FALSE; + } +- #endif + else if (!vim_iswordc_buf(curc, rex.reg_buf) + || (rex.input > rex.line + && vim_iswordc_buf(rex.input[-1], rex.reg_buf))) +--- 5995,6000 ---- +*************** +*** 6052,6058 **** + result = TRUE; + if (rex.input == rex.line) + result = FALSE; +- #ifdef FEAT_MBYTE + else if (has_mbyte) + { + int this_class, prev_class; +--- 6010,6015 ---- +*************** +*** 6064,6070 **** + || prev_class == 0 || prev_class == 1) + result = FALSE; + } +- #endif + else if (!vim_iswordc_buf(rex.input[-1], rex.reg_buf) + || (rex.input[0] != NUL + && vim_iswordc_buf(curc, rex.reg_buf))) +--- 6021,6026 ---- +*************** +*** 6093,6099 **** + } + break; + +- #ifdef FEAT_MBYTE + case NFA_COMPOSING: + { + int mc = curc; +--- 6049,6054 ---- +*************** +*** 6169,6175 **** + ADD_STATE_IF_MATCH(end); + break; + } +- #endif + + case NFA_NEWL: + if (curc == NUL && !rex.reg_line_lbr && REG_MULTI +--- 6124,6129 ---- +*************** +*** 6274,6286 **** + case NFA_ANY_COMPOSING: + /* On a composing character skip over it. Otherwise do + * nothing. Always matches. */ +- #ifdef FEAT_MBYTE + if (enc_utf8 && utf_iscomposing(curc)) + { + add_off = clen; + } + else +- #endif + { + add_here = TRUE; + add_off = 0; +--- 6228,6238 ---- +*************** +*** 6562,6571 **** + /* Bail out quickly when there can't be a match, avoid the + * overhead of win_linetabsize() on long lines. */ + if (op != 1 && col > t->state->val +! #ifdef FEAT_MBYTE +! * (has_mbyte ? MB_MAXBYTES : 1) +! #endif +! ) + break; + result = FALSE; + if (op == 1 && col - 1 > t->state->val && col > 100) +--- 6514,6520 ---- + /* Bail out quickly when there can't be a match, avoid the + * overhead of win_linetabsize() on long lines. */ + if (op != 1 && col > t->state->val +! * (has_mbyte ? MB_MAXBYTES : 1)) + break; + result = FALSE; + if (op == 1 && col - 1 > t->state->val && col > 100) +*************** +*** 6676,6687 **** + + if (!result && rex.reg_ic) + result = MB_TOLOWER(c) == MB_TOLOWER(curc); +- #ifdef FEAT_MBYTE + /* If rex.reg_icombine is not set only skip over the character + * itself. When it is set skip over composing characters. */ + if (result && enc_utf8 && !rex.reg_icombine) + clen = utf_ptr2len(rex.input); +- #endif + ADD_STATE_IF_MATCH(t->state); + break; + } +--- 6625,6634 ---- +*************** +*** 7104,7114 **** + else if (prog->regflags & RF_NOICASE) + rex.reg_ic = FALSE; + +- #ifdef FEAT_MBYTE + /* If pattern contains "\Z" overrule value of rex.reg_icombine */ + if (prog->regflags & RF_ICOMBINE) + rex.reg_icombine = TRUE; +- #endif + + rex.line = line; + rex.lnum = 0; /* relative to line */ +--- 7051,7059 ---- +*************** +*** 7149,7159 **** + + /* If match_text is set it contains the full text that must match. + * Nothing else to try. Doesn't handle combining chars well. */ +! if (prog->match_text != NULL +! #ifdef FEAT_MBYTE +! && !rex.reg_icombine +! #endif +! ) + return find_match_text(col, prog->regstart, prog->match_text); + } + +--- 7094,7100 ---- + + /* If match_text is set it contains the full text that must match. + * Nothing else to try. Doesn't handle combining chars well. */ +! if (prog->match_text != NULL && !rex.reg_icombine) + return find_match_text(col, prog->regstart, prog->match_text); + } + +*************** +*** 7334,7342 **** + rex.reg_buf = curbuf; + rex.reg_win = NULL; + rex.reg_ic = rmp->rm_ic; +- #ifdef FEAT_MBYTE + rex.reg_icombine = FALSE; +- #endif + rex.reg_maxcol = 0; + return nfa_regexec_both(line, col, NULL, NULL); + } +--- 7275,7281 ---- +*************** +*** 7385,7393 **** + rex.reg_maxline = rex.reg_buf->b_ml.ml_line_count - lnum; + rex.reg_line_lbr = FALSE; + rex.reg_ic = rmp->rmm_ic; +- #ifdef FEAT_MBYTE + rex.reg_icombine = FALSE; +- #endif + rex.reg_maxcol = rmp->rmm_maxcol; + + return nfa_regexec_both(NULL, col, tm, timed_out); +--- 7324,7330 ---- +*** ../vim-8.1.0808/src/screen.c 2019-01-20 15:30:36.893328693 +0100 +--- src/screen.c 2019-01-24 16:22:53.839166984 +0100 +*************** +*** 144,152 **** + static int next_search_hl_pos(match_T *shl, linenr_T lnum, posmatch_T *pos, colnr_T mincol); + #endif + static void screen_char(unsigned off, int row, int col); +- #ifdef FEAT_MBYTE + static void screen_char_2(unsigned off, int row, int col); +- #endif + static void screenclear2(void); + static void lineclear(unsigned off, int width, int attr); + static void lineinvalid(unsigned off, int width); +--- 144,150 ---- +*************** +*** 314,325 **** + int ret = 0; + schar_T *screenline; /* copy from ScreenLines[] */ + sattr_T *screenattr; /* copy from ScreenAttrs[] */ +- #ifdef FEAT_MBYTE + int i; + u8char_T *screenlineUC = NULL; /* copy from ScreenLinesUC[] */ + u8char_T *screenlineC[MAX_MCO]; /* copy from ScreenLinesC[][] */ + schar_T *screenline2 = NULL; /* copy from ScreenLines2[] */ +- #endif + + redraw_later(type); + if (msg_scrolled || (State != NORMAL && State != NORMAL_BUSY) || exiting) +--- 312,321 ---- +*************** +*** 333,339 **** + (long_u)(rows * cols * sizeof(sattr_T)), FALSE); + if (screenline == NULL || screenattr == NULL) + ret = 2; +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + screenlineUC = (u8char_T *)lalloc( +--- 329,334 ---- +*************** +*** 355,361 **** + if (screenline2 == NULL) + ret = 2; + } +- #endif + + if (ret != 2) + { +--- 350,355 ---- +*************** +*** 368,374 **** + mch_memmove(screenattr + r * cols, + ScreenAttrs + LineOffset[cmdline_row + r], + (size_t)cols * sizeof(sattr_T)); +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + mch_memmove(screenlineUC + r * cols, +--- 362,367 ---- +*************** +*** 383,389 **** + mch_memmove(screenline2 + r * cols, + ScreenLines2 + LineOffset[cmdline_row + r], + (size_t)cols * sizeof(schar_T)); +- #endif + } + + update_screen(0); +--- 376,381 ---- +*************** +*** 402,408 **** + mch_memmove(ScreenAttrs + off, + screenattr + r * cols, + (size_t)cols * sizeof(sattr_T)); +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + mch_memmove(ScreenLinesUC + off, +--- 394,399 ---- +*************** +*** 417,423 **** + mch_memmove(ScreenLines2 + off, + screenline2 + r * cols, + (size_t)cols * sizeof(schar_T)); +- #endif + screen_line(cmdline_row + r, 0, cols, cols, FALSE); + } + ret = 4; +--- 408,413 ---- +*************** +*** 426,432 **** + + vim_free(screenline); + vim_free(screenattr); +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + vim_free(screenlineUC); +--- 416,421 ---- +*************** +*** 435,441 **** + } + if (enc_dbcs == DBCS_JPNU) + vim_free(screenline2); +- #endif + + /* Show the intro message when appropriate. */ + maybe_intro_message(); +--- 424,429 ---- +*************** +*** 830,838 **** + * uses that. */ + gui.col = gui_cursor_col; + gui.row = gui_cursor_row; +- # ifdef FEAT_MBYTE + gui.col = mb_fix_col(gui.col, gui.row); +- # endif + gui_update_cursor(FALSE, FALSE); + gui_may_flush(); + screen_cur_col = gui.col; +--- 818,824 ---- +*************** +*** 2154,2160 **** + int i; + + for (i = 0; i < Rows; ++i) +- # ifdef FEAT_MBYTE + if (enc_utf8) + if ((*mb_off2cells)(LineOffset[i] + Columns - 2, + LineOffset[i] + screen_Columns) > 1) +--- 2140,2145 ---- +*************** +*** 2162,2168 **** + else + screen_draw_rectangle(i, Columns - 1, 1, 1, FALSE); + else +- # endif + screen_char(LineOffset[i] + Columns - 1, i, Columns - 1); + } + #endif +--- 2147,2152 ---- +*************** +*** 2454,2460 **** + { + int off = (int)(current_ScreenLine - ScreenLines); + +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + int cells; +--- 2438,2443 ---- +*************** +*** 2560,2566 **** + } + } + else +- #endif + { + int len = (int)STRLEN(text); + +--- 2543,2548 ---- +*************** +*** 2639,2648 **** + { + ScreenLines[off] = cmdwin_type; + ScreenAttrs[off] = HL_ATTR(HLF_AT); +- #ifdef FEAT_MBYTE + if (enc_utf8) + ScreenLinesUC[off] = 0; +- #endif + ++col; + } + #endif +--- 2621,2628 ---- +*************** +*** 2785,2791 **** + #endif + ) + { +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + if (fill_fold >= 0x80) +--- 2765,2770 ---- +*************** +*** 2802,2808 **** + col++; + } + else +- #endif + ScreenLines[off + col++] = fill_fold; + } + +--- 2781,2786 ---- +*************** +*** 2929,2938 **** + int i; + + mch_memmove(ScreenLines + off, buf, (size_t)len); +- # ifdef FEAT_MBYTE + if (enc_utf8) + vim_memset(ScreenLinesUC + off, 0, sizeof(u8char_T) * (size_t)len); +- # endif + for (i = 0; i < len; ++i) + ScreenAttrs[off + i] = attr; + } +--- 2907,2914 ---- +*************** +*** 3126,3138 **** + int cur_checked_col = 0; /* checked column for current line */ + #endif + int extra_check = 0; // has extra highlighting +- #ifdef FEAT_MBYTE + int multi_attr = 0; /* attributes desired by multibyte */ + int mb_l = 1; /* multi-byte byte length */ + int mb_c = 0; /* decoded multi-byte character */ + int mb_utf8 = FALSE; /* screen char is UTF-8 char */ + int u8cc[MAX_MCO]; /* composing UTF-8 chars */ +- #endif + #ifdef FEAT_DIFF + int filler_lines; /* nr of filler lines to be drawn */ + int filler_todo; /* nr of filler lines still to do + 1 */ +--- 3102,3112 ---- +*************** +*** 3555,3570 **** + v = wp->w_leftcol; + if (v > 0 && !number_only) + { +- #ifdef FEAT_MBYTE + char_u *prev_ptr = ptr; +! #endif + while (vcol < v && *ptr != NUL) + { + c = win_lbr_chartabsize(wp, line, ptr, (colnr_T)vcol, NULL); + vcol += c; +- #ifdef FEAT_MBYTE + prev_ptr = ptr; +- #endif + MB_PTR_ADV(ptr); + } + +--- 3529,3541 ---- + v = wp->w_leftcol; + if (v > 0 && !number_only) + { + char_u *prev_ptr = ptr; +! + while (vcol < v && *ptr != NUL) + { + c = win_lbr_chartabsize(wp, line, ptr, (colnr_T)vcol, NULL); + vcol += c; + prev_ptr = ptr; + MB_PTR_ADV(ptr); + } + +*************** +*** 3592,3609 **** + if (vcol > v) + { + vcol -= c; +- #ifdef FEAT_MBYTE + ptr = prev_ptr; +- #else +- --ptr; +- #endif + /* If the character fits on the screen, don't need to skip it. + * Except for a TAB. */ +! if (( +! #ifdef FEAT_MBYTE +! (*mb_ptr2cells)(ptr) >= c || +! #endif +! *ptr == TAB) && col == 0) + n_skip = v - vcol; + } + +--- 3563,3572 ---- + if (vcol > v) + { + vcol -= c; + ptr = prev_ptr; + /* If the character fits on the screen, don't need to skip it. + * Except for a TAB. */ +! if (( (*mb_ptr2cells)(ptr) >= c || *ptr == TAB) && col == 0) + n_skip = v - vcol; + } + +*************** +*** 3734,3744 **** + /* Highlight one character for an empty match. */ + if (shl->startcol == shl->endcol) + { +- #ifdef FEAT_MBYTE + if (has_mbyte && line[shl->endcol] != NUL) + shl->endcol += (*mb_ptr2len)(line + shl->endcol); + else +- #endif + ++shl->endcol; + } + if ((long)shl->startcol < v) /* match at leftcol */ +--- 3697,3705 ---- +*************** +*** 4133,4142 **** + { + /* handle Visual or match highlighting in this line */ + if (vcol == fromcol +- #ifdef FEAT_MBYTE + || (has_mbyte && vcol + 1 == fromcol && n_extra == 0 + && (*mb_ptr2cells)(ptr) > 1) +- #endif + || ((int)vcol_prev == fromcol_prev + && vcol_prev < vcol /* not at margin */ + && vcol < tocol)) +--- 4094,4101 ---- +*************** +*** 4182,4193 **** + && v >= (long)shl->startcol + && v < (long)shl->endcol) + { +- #ifdef FEAT_MBYTE + int tmp_col = v + MB_PTR2LEN(ptr); + + if (shl->endcol < tmp_col) + shl->endcol = tmp_col; +- #endif + shl->attr_cur = shl->attr; + #ifdef FEAT_CONCEAL + if (cur != NULL && syn_name2id((char_u *)"Conceal") +--- 4141,4150 ---- +*************** +*** 4226,4237 **** + { + /* highlight empty match, try again after + * it */ +- #ifdef FEAT_MBYTE + if (has_mbyte) + shl->endcol += (*mb_ptr2len)(line + + shl->endcol); + else +- #endif + ++shl->endcol; + } + +--- 4183,4192 ---- +*************** +*** 4402,4408 **** + if (c_extra != NUL || (n_extra == 1 && c_final != NUL)) + { + c = (n_extra == 1 && c_final != NUL) ? c_final : c_extra; +- #ifdef FEAT_MBYTE + mb_c = c; /* doesn't handle non-utf-8 multi-byte! */ + if (enc_utf8 && utf_char2len(c) > 1) + { +--- 4357,4362 ---- +*************** +*** 4412,4423 **** + } + else + mb_utf8 = FALSE; +- #endif + } + else + { + c = *p_extra; +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + mb_c = c; +--- 4366,4375 ---- +*************** +*** 4473,4479 **** + p_extra += mb_l - 1; + } + } +- #endif + ++p_extra; + } + --n_extra; +--- 4425,4430 ---- +*************** +*** 4493,4499 **** + #ifdef FEAT_LINEBREAK + c0 = *ptr; + #endif +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + mb_c = c; +--- 4444,4449 ---- +*************** +*** 4511,4519 **** + if (mb_c < 0x80) + { + c = mb_c; +! # ifdef FEAT_LINEBREAK + c0 = mb_c; +! # endif + } + mb_utf8 = TRUE; + +--- 4461,4469 ---- + if (mb_c < 0x80) + { + c = mb_c; +! #ifdef FEAT_LINEBREAK + c0 = mb_c; +! #endif + } + mb_utf8 = TRUE; + +*************** +*** 4690,4696 **** + } + + } +- #endif + ++ptr; + + if (extra_check) +--- 4640,4645 ---- +*************** +*** 4783,4796 **** + char_u *prev_ptr, *p; + int len; + hlf_T spell_hlf = HLF_COUNT; +- # ifdef FEAT_MBYTE + if (has_mbyte) + { + prev_ptr = ptr - mb_l; + v -= mb_l - 1; + } + else +- # endif + prev_ptr = ptr - 1; + + /* Use nextline[] if possible, it has the start of the +--- 4732,4743 ---- +*************** +*** 4862,4875 **** + if (wp->w_p_lbr && c0 == c + && VIM_ISBREAK(c) && !VIM_ISBREAK((int)*ptr)) + { +- # ifdef FEAT_MBYTE + int mb_off = has_mbyte ? (*mb_head_off)(line, ptr - 1) : 0; +! # endif +! char_u *p = ptr - ( +! # ifdef FEAT_MBYTE +! mb_off + +! # endif +! 1); + + /* TODO: is passing p for start of the line OK? */ + n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, +--- 4809,4816 ---- + if (wp->w_p_lbr && c0 == c + && VIM_ISBREAK(c) && !VIM_ISBREAK((int)*ptr)) + { + int mb_off = has_mbyte ? (*mb_head_off)(line, ptr - 1) : 0; +! char_u *p = ptr - (mb_off + 1); + + /* TODO: is passing p for start of the line OK? */ + n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, +*************** +*** 4883,4893 **** + - vcol % (int)wp->w_buffer->b_p_ts - 1; + # endif + +- # ifdef FEAT_MBYTE + c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' '; +- # else +- c_extra = ' '; +- # endif + c_final = NUL; + if (VIM_ISWHITE(c)) + { +--- 4824,4830 ---- +*************** +*** 4906,4915 **** + */ + if (wp->w_p_list + && (((c == 160 +! #ifdef FEAT_MBYTE +! || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f)) +! #endif +! ) && lcs_nbsp) + || (c == ' ' && lcs_space && ptr - line <= trailcol))) + { + c = (c == ' ') ? lcs_space : lcs_nbsp; +--- 4843,4850 ---- + */ + if (wp->w_p_list + && (((c == 160 +! || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f))) +! && lcs_nbsp) + || (c == ' ' && lcs_space && ptr - line <= trailcol))) + { + c = (c == ' ') ? lcs_space : lcs_nbsp; +*************** +*** 4919,4925 **** + extra_attr = HL_ATTR(HLF_8); + saved_attr2 = char_attr; /* save current attr */ + } +- #ifdef FEAT_MBYTE + mb_c = c; + if (enc_utf8 && utf_char2len(c) > 1) + { +--- 4854,4859 ---- +*************** +*** 4929,4935 **** + } + else + mb_utf8 = FALSE; +- #endif + } + + if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') +--- 4863,4868 ---- +*************** +*** 4941,4947 **** + extra_attr = HL_ATTR(HLF_8); + saved_attr2 = char_attr; /* save current attr */ + } +- #ifdef FEAT_MBYTE + mb_c = c; + if (enc_utf8 && utf_char2len(c) > 1) + { +--- 4874,4879 ---- +*************** +*** 4951,4957 **** + } + else + mb_utf8 = FALSE; +- #endif + } + } + +--- 4883,4888 ---- +*************** +*** 5012,5022 **** + /* if n_extra > 0, it gives the number of chars, to + * use for a tab, else we need to calculate the width + * for a tab */ +- #ifdef FEAT_MBYTE + len = (tab_len * mb_char2len(lcs_tab2)); + if (n_extra > 0) + len += n_extra - tab_len; +- #endif + c = lcs_tab1; + p = alloc((unsigned)(len + 1)); + vim_memset(p, ' ', len); +--- 4943,4951 ---- +*************** +*** 5030,5043 **** + tab_len = i; + break; + } +- #ifdef FEAT_MBYTE + mb_char2bytes(lcs_tab2, p); + p += mb_char2len(lcs_tab2); + n_extra += mb_char2len(lcs_tab2) + - (saved_nextra > 0 ? 1 : 0); +- #else +- p[i] = lcs_tab2; +- #endif + } + p_extra = p_extra_free; + #ifdef FEAT_CONCEAL +--- 4959,4968 ---- +*************** +*** 5068,5076 **** + tab_len += vc_saved; + } + #endif +- #ifdef FEAT_MBYTE + mb_utf8 = FALSE; /* don't draw as UTF-8 */ +- #endif + if (wp->w_p_list) + { + c = (n_extra == 0 && lcs_tab3) ? lcs_tab3 : lcs_tab1; +--- 4993,4999 ---- +*************** +*** 5084,5090 **** + n_attr = tab_len + 1; + extra_attr = HL_ATTR(HLF_8); + saved_attr2 = char_attr; /* save current attr */ +- #ifdef FEAT_MBYTE + mb_c = c; + if (enc_utf8 && utf_char2len(c) > 1) + { +--- 5007,5012 ---- +*************** +*** 5092,5098 **** + u8cc[0] = 0; + c = 0xc0; + } +- #endif + } + else + { +--- 5014,5019 ---- +*************** +*** 5160,5166 **** + extra_attr = HL_ATTR(HLF_AT); + n_attr = 1; + } +- #ifdef FEAT_MBYTE + mb_c = c; + if (enc_utf8 && utf_char2len(c) > 1) + { +--- 5081,5086 ---- +*************** +*** 5170,5176 **** + } + else + mb_utf8 = FALSE; /* don't draw as UTF-8 */ +- #endif + } + else if (c != NUL) + { +--- 5090,5095 ---- +*************** +*** 5208,5216 **** + extra_attr = HL_ATTR(HLF_8); + saved_attr2 = char_attr; /* save current attr */ + } +- #ifdef FEAT_MBYTE + mb_utf8 = FALSE; /* don't draw as UTF-8 */ +- #endif + } + #ifdef FEAT_VIRTUALEDIT + else if (VIsual_active +--- 5127,5133 ---- +*************** +*** 5339,5345 **** + is_concealing = TRUE; + n_skip = 1; + } +- # ifdef FEAT_MBYTE + mb_c = c; + if (enc_utf8 && utf_char2len(c) > 1) + { +--- 5256,5261 ---- +*************** +*** 5349,5355 **** + } + else + mb_utf8 = FALSE; /* don't draw as UTF-8 */ +- # endif + } + else + { +--- 5265,5270 ---- +*************** +*** 5438,5444 **** + { + c = lcs_prec; + lcs_prec_todo = NUL; +- #ifdef FEAT_MBYTE + if (has_mbyte && (*mb_char2cells)(mb_c) > 1) + { + /* Double-width character being overwritten by the "precedes" +--- 5353,5358 ---- +*************** +*** 5458,5464 **** + } + else + mb_utf8 = FALSE; /* don't draw as UTF-8 */ +- #endif + if (!attr_pri) + { + saved_attr3 = char_attr; /* save current attr */ +--- 5372,5377 ---- +*************** +*** 5554,5563 **** + { + /* Add a blank character to highlight. */ + ScreenLines[off] = ' '; +- #ifdef FEAT_MBYTE + if (enc_utf8) + ScreenLinesUC[off] = 0; +- #endif + } + #ifdef FEAT_SEARCH_EXTRA + if (area_attr == 0) +--- 5467,5474 ---- +*************** +*** 5657,5666 **** + while (col < wp->w_width) + { + ScreenLines[off] = ' '; +- #ifdef FEAT_MBYTE + if (enc_utf8) + ScreenLinesUC[off] = 0; +- #endif + ++col; + if (draw_color_col) + draw_color_col = advance_color_col(VCOL_HLC, +--- 5568,5575 ---- +*************** +*** 5719,5725 **** + { + c = lcs_ext; + char_attr = HL_ATTR(HLF_AT); +- #ifdef FEAT_MBYTE + mb_c = c; + if (enc_utf8 && utf_char2len(c) > 1) + { +--- 5628,5633 ---- +*************** +*** 5729,5735 **** + } + else + mb_utf8 = FALSE; +- #endif + } + + #ifdef FEAT_SYN_HL +--- 5637,5642 ---- +*************** +*** 5769,5775 **** + /* + * Store the character. + */ +! #if defined(FEAT_RIGHTLEFT) && defined(FEAT_MBYTE) + if (has_mbyte && wp->w_p_rl && (*mb_char2cells)(mb_c) > 1) + { + /* A double-wide character is: put first halve in left cell. */ +--- 5676,5682 ---- + /* + * Store the character. + */ +! #if defined(FEAT_RIGHTLEFT) + if (has_mbyte && wp->w_p_rl && (*mb_char2cells)(mb_c) > 1) + { + /* A double-wide character is: put first halve in left cell. */ +*************** +*** 5778,5784 **** + } + #endif + ScreenLines[off] = c; +- #ifdef FEAT_MBYTE + if (enc_dbcs == DBCS_JPNU) + { + if ((mb_c & 0xff00) == 0x8e00) +--- 5685,5690 ---- +*************** +*** 5810,5819 **** + multi_attr = 0; + } + else +- #endif + ScreenAttrs[off] = char_attr; + +- #ifdef FEAT_MBYTE + if (has_mbyte && (*mb_char2cells)(mb_c) > 1) + { + /* Need to fill two screen columns. */ +--- 5716,5723 ---- +*************** +*** 5844,5850 **** + } + #endif + } +- #endif + #ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) + { +--- 5748,5753 ---- +*************** +*** 5900,5923 **** + } + + +- # ifdef FEAT_MBYTE + if (has_mbyte && (*mb_char2cells)(mb_c) > 1) + { + /* Need to fill two screen columns. */ +! # ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) + { + --boguscols; + --col; + } + else +! # endif + { + ++boguscols; + ++col; + } + } +- # endif + + # ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) +--- 5803,5824 ---- + } + + + if (has_mbyte && (*mb_char2cells)(mb_c) > 1) + { + /* Need to fill two screen columns. */ +! # ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) + { + --boguscols; + --col; + } + else +! # endif + { + ++boguscols; + ++col; + } + } + + # ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) +*************** +*** 6050,6056 **** + #ifdef FEAT_GUI + && !gui.in_use + #endif +- #ifdef FEAT_MBYTE + && !(has_mbyte + && ((*mb_off2cells)(LineOffset[screen_row], + LineOffset[screen_row] + screen_Columns) +--- 5951,5956 ---- +*************** +*** 6058,6066 **** + || (*mb_off2cells)(LineOffset[screen_row - 1] + + (int)Columns - 2, + LineOffset[screen_row] + screen_Columns) +! == 2)) +! #endif +! ) + { + /* First make sure we are at the end of the screen line, + * then output the same character again to let the +--- 5958,5964 ---- + || (*mb_off2cells)(LineOffset[screen_row - 1] + + (int)Columns - 2, + LineOffset[screen_row] + screen_Columns) +! == 2))) + { + /* First make sure we are at the end of the screen line, + * then output the same character again to let the +*************** +*** 6071,6084 **** + + (unsigned)Columns - 1, + screen_row - 1, (int)(Columns - 1)); + +- #ifdef FEAT_MBYTE + /* When there is a multi-byte character, just output a + * space to keep it simple. */ + if (has_mbyte && MB_BYTE2LEN(ScreenLines[LineOffset[ + screen_row - 1] + (Columns - 1)]) > 1) + out_char(' '); + else +- #endif + out_char(ScreenLines[LineOffset[screen_row - 1] + + (Columns - 1)]); + /* force a redraw of the first char on the next line */ +--- 5969,5980 ---- +*************** +*** 6140,6146 **** + return row; + } + +- #ifdef FEAT_MBYTE + /* + * Return if the composing characters at "off_from" and "off_to" differ. + * Only to be used when ScreenLinesUC[off_from] != 0. +--- 6036,6041 ---- +*************** +*** 6159,6165 **** + } + return FALSE; + } +- #endif + + /* + * Check whether the given character needs redrawing: +--- 6054,6059 ---- +*************** +*** 6174,6181 **** + if (cols > 0 + && ((ScreenLines[off_from] != ScreenLines[off_to] + || ScreenAttrs[off_from] != ScreenAttrs[off_to]) +- +- #ifdef FEAT_MBYTE + || (enc_dbcs != 0 + && MB_BYTE2LEN(ScreenLines[off_from]) > 1 + && (enc_dbcs == DBCS_JPNU && ScreenLines[off_from] == 0x8e +--- 6068,6073 ---- +*************** +*** 6188,6196 **** + && comp_char_differs(off_from, off_to)) + || ((*mb_off2cells)(off_from, off_from + cols) > 1 + && ScreenLines[off_from + 1] +! != ScreenLines[off_to + 1]))) +! #endif +! )) + return TRUE; + return FALSE; + } +--- 6080,6086 ---- + && comp_char_differs(off_from, off_to)) + || ((*mb_off2cells)(off_from, off_from + cols) > 1 + && ScreenLines[off_from + 1] +! != ScreenLines[off_to + 1]))))) + return TRUE; + return FALSE; + } +*************** +*** 6227,6236 **** + { + unsigned off_from; + unsigned off_to; +- #ifdef FEAT_MBYTE + unsigned max_off_from; + unsigned max_off_to; +- #endif + int col = 0; + int hl; + int force = FALSE; /* force update rest of the line */ +--- 6117,6124 ---- +*************** +*** 6240,6253 **** + #endif + ; + int redraw_next; /* redraw_this for next character */ +- #ifdef FEAT_MBYTE + int clear_next = FALSE; + int char_cells; /* 1: normal char */ + /* 2: occupies two display cells */ + # define CHAR_CELLS char_cells +- #else +- # define CHAR_CELLS 1 +- #endif + + /* Check for illegal row and col, just in case. */ + if (row >= Rows) +--- 6128,6137 ---- +*************** +*** 6261,6270 **** + + off_from = (unsigned)(current_ScreenLine - ScreenLines); + off_to = LineOffset[row] + coloff; +- #ifdef FEAT_MBYTE + max_off_from = off_from + screen_Columns; + max_off_to = LineOffset[row] + screen_Columns; +- #endif + + #ifdef FEAT_RIGHTLEFT + if (rlflag) +--- 6145,6152 ---- +*************** +*** 6274,6283 **** + { + while (col <= endcol && ScreenLines[off_to] == ' ' + && ScreenAttrs[off_to] == 0 +! # ifdef FEAT_MBYTE +! && (!enc_utf8 || ScreenLinesUC[off_to] == 0) +! # endif +! ) + { + ++off_to; + ++col; +--- 6156,6162 ---- + { + while (col <= endcol && ScreenLines[off_to] == ' ' + && ScreenAttrs[off_to] == 0 +! && (!enc_utf8 || ScreenLinesUC[off_to] == 0)) + { + ++off_to; + ++col; +*************** +*** 6297,6308 **** + + while (col < endcol) + { +- #ifdef FEAT_MBYTE + if (has_mbyte && (col + 1 < endcol)) + char_cells = (*mb_off2cells)(off_from, max_off_from); + else + char_cells = 1; +- #endif + + redraw_this = redraw_next; + redraw_next = force || char_needs_redraw(off_from + CHAR_CELLS, +--- 6176,6185 ---- +*************** +*** 6367,6373 **** + else + screen_attr = 0; /* highlighting has stopped */ + } +- #ifdef FEAT_MBYTE + if (enc_dbcs != 0) + { + /* Check if overwriting a double-byte with a single-byte or +--- 6244,6249 ---- +*************** +*** 6410,6419 **** + && (*mb_off2cells)(off_to, max_off_to) == 1 + && (*mb_off2cells)(off_to + 1, max_off_to) > 1))) + clear_next = TRUE; +- #endif + + ScreenLines[off_to] = ScreenLines[off_from]; +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + ScreenLinesUC[off_to] = ScreenLinesUC[off_from]; +--- 6286,6293 ---- +*************** +*** 6427,6433 **** + } + if (char_cells == 2) + ScreenLines[off_to + 1] = ScreenLines[off_from + 1]; +- #endif + + #if defined(FEAT_GUI) || defined(UNIX) + /* The bold trick makes a single column of pixels appear in the +--- 6301,6306 ---- +*************** +*** 6454,6460 **** + } + #endif + ScreenAttrs[off_to] = ScreenAttrs[off_from]; +! #ifdef FEAT_MBYTE + /* For simplicity set the attributes of second half of a + * double-wide character equal to the first half. */ + if (char_cells == 2) +--- 6327,6333 ---- + } + #endif + ScreenAttrs[off_to] = ScreenAttrs[off_from]; +! + /* For simplicity set the attributes of second half of a + * double-wide character equal to the first half. */ + if (char_cells == 2) +*************** +*** 6463,6469 **** + if (enc_dbcs != 0 && char_cells == 2) + screen_char_2(off_to, row, col + coloff); + else +- #endif + screen_char(off_to, row, col + coloff); + } + else if ( p_wiv +--- 6336,6341 ---- +*************** +*** 6489,6495 **** + col += CHAR_CELLS; + } + +- #ifdef FEAT_MBYTE + if (clear_next) + { + /* Clear the second half of a double-wide character of which the left +--- 6361,6366 ---- +*************** +*** 6499,6505 **** + ScreenLinesUC[off_to] = 0; + screen_char(off_to, row, col + coloff); + } +- #endif + + if (clear_width > 0 + #ifdef FEAT_RIGHTLEFT +--- 6370,6375 ---- +*************** +*** 6514,6523 **** + /* blank out the rest of the line */ + while (col < clear_width && ScreenLines[off_to] == ' ' + && ScreenAttrs[off_to] == 0 +! #ifdef FEAT_MBYTE +! && (!enc_utf8 || ScreenLinesUC[off_to] == 0) +! #endif +! ) + { + ++off_to; + ++col; +--- 6384,6390 ---- + /* blank out the rest of the line */ + while (col < clear_width && ScreenLines[off_to] == ' ' + && ScreenAttrs[off_to] == 0 +! && (!enc_utf8 || ScreenLinesUC[off_to] == 0)) + { + ++off_to; + ++col; +*************** +*** 6538,6544 **** + if (hl > HL_ALL || (hl & HL_BOLD)) + { + int prev_cells = 1; +! # ifdef FEAT_MBYTE + if (enc_utf8) + /* for utf-8, ScreenLines[char_offset + 1] == 0 means + * that its width is 2. */ +--- 6405,6411 ---- + if (hl > HL_ALL || (hl & HL_BOLD)) + { + int prev_cells = 1; +! + if (enc_utf8) + /* for utf-8, ScreenLines[char_offset + 1] == 0 means + * that its width is 2. */ +*************** +*** 6561,6567 **** + screen_char_2(off_to - prev_cells, row, + col + coloff - prev_cells); + else +- # endif + screen_char(off_to - prev_cells, row, + col + coloff - prev_cells); + } +--- 6428,6433 ---- +*************** +*** 6583,6597 **** + + c = fillchar_vsep(&hl); + if (ScreenLines[off_to] != (schar_T)c +- #ifdef FEAT_MBYTE + || (enc_utf8 && (int)ScreenLinesUC[off_to] + != (c >= 0x80 ? c : 0)) +- #endif + || ScreenAttrs[off_to] != hl) + { + ScreenLines[off_to] = c; + ScreenAttrs[off_to] = hl; +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + if (c >= 0x80) +--- 6449,6460 ---- +*************** +*** 6602,6608 **** + else + ScreenLinesUC[off_to] = 0; + } +- #endif + screen_char(off_to, row, col + coloff); + } + } +--- 6465,6470 ---- +*************** +*** 6808,6825 **** + #ifdef FEAT_MENU + int emenu; + #endif +- #if defined(FEAT_MBYTE) || defined(FEAT_MENU) + int l; +- #endif + + if (matches == NULL) /* interrupted completion? */ + return; + +- #ifdef FEAT_MBYTE + if (has_mbyte) + buf = alloc((unsigned)Columns * MB_MAXBYTES + 1); + else +- #endif + buf = alloc((unsigned)Columns + 1); + if (buf == NULL) + return; +--- 6670,6683 ---- +*************** +*** 6912,6918 **** + { + s += skip_status_match_char(xp, s); + clen += ptr2cells(s); +- #ifdef FEAT_MBYTE + if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1) + { + STRNCPY(buf + len, s, l); +--- 6770,6775 ---- +*************** +*** 6920,6926 **** + len += l; + } + else +- #endif + { + STRCPY(buf + len, transchar_byte(*s)); + len += (int)STRLEN(buf + len); +--- 6777,6782 ---- +*************** +*** 7095,7132 **** + p = (char_u *)"<"; /* No room for file name! */ + len = 1; + } +! else +! #ifdef FEAT_MBYTE +! if (has_mbyte) +! { +! int clen = 0, i; +! +! /* Count total number of display cells. */ +! clen = mb_string2cells(p, -1); + +! /* Find first character that will fit. +! * Going from start to end is much faster for DBCS. */ +! for (i = 0; p[i] != NUL && clen >= this_ru_col - 1; +! i += (*mb_ptr2len)(p + i)) +! clen -= (*mb_ptr2cells)(p + i); +! len = clen; +! if (i > 0) +! { +! p = p + i - 1; +! *p = '<'; +! ++len; +! } + +! } +! else +! #endif +! if (len > this_ru_col - 1) + { +! p += len - (this_ru_col - 1); + *p = '<'; +! len = this_ru_col - 1; + } + + row = W_WINROW(wp) + wp->w_height; + screen_puts(p, row, wp->w_wincol, attr); + screen_fill(row, row + 1, len + wp->w_wincol, +--- 6951,6984 ---- + p = (char_u *)"<"; /* No room for file name! */ + len = 1; + } +! else if (has_mbyte) +! { +! int clen = 0, i; + +! /* Count total number of display cells. */ +! clen = mb_string2cells(p, -1); + +! /* Find first character that will fit. +! * Going from start to end is much faster for DBCS. */ +! for (i = 0; p[i] != NUL && clen >= this_ru_col - 1; +! i += (*mb_ptr2len)(p + i)) +! clen -= (*mb_ptr2cells)(p + i); +! len = clen; +! if (i > 0) + { +! p = p + i - 1; + *p = '<'; +! ++len; + } + ++ } ++ else if (len > this_ru_col - 1) ++ { ++ p += len - (this_ru_col - 1); ++ *p = '<'; ++ len = this_ru_col - 1; ++ } ++ + row = W_WINROW(wp) + wp->w_height; + screen_puts(p, row, wp->w_wincol, attr); + screen_fill(row, row + 1, len + wp->w_wincol, +*************** +*** 7397,7407 **** + len = (int)STRLEN(buf); + while (width < maxwidth && len < (int)sizeof(buf) - 1) + { +- #ifdef FEAT_MBYTE + len += (*mb_char2bytes)(fillchar, buf + len); +- #else +- buf[len++] = fillchar; +- #endif + ++width; + } + buf[len] = NUL; +--- 7249,7255 ---- +*************** +*** 7470,7480 **** + { + char_u buf[MB_MAXBYTES + 1]; + +- #ifdef FEAT_MBYTE + if (has_mbyte) + buf[(*mb_char2bytes)(c, buf)] = NUL; + else +- #endif + { + buf[0] = c; + buf[1] = NUL; +--- 7318,7326 ---- +*************** +*** 7499,7505 **** + bytes[0] = ScreenLines[off]; + bytes[1] = NUL; + +- #ifdef FEAT_MBYTE + if (enc_utf8 && ScreenLinesUC[off] != 0) + bytes[utfc_char2bytes(off, bytes)] = NUL; + else if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e) +--- 7345,7350 ---- +*************** +*** 7513,7523 **** + bytes[1] = ScreenLines[off + 1]; + bytes[2] = NUL; + } +- #endif + } + } + +- #ifdef FEAT_MBYTE + /* + * Return TRUE if composing characters for screen posn "off" differs from + * composing characters in "u8cc". +--- 7358,7366 ---- +*************** +*** 7537,7543 **** + } + return FALSE; + } +- #endif + + /* + * Put string '*text' on the screen at position 'row' and 'col', with +--- 7380,7385 ---- +*************** +*** 7571,7606 **** + char_u *ptr = text; + int len = textlen; + int c; +- #ifdef FEAT_MBYTE + unsigned max_off; + int mbyte_blen = 1; + int mbyte_cells = 1; + int u8c = 0; + int u8cc[MAX_MCO]; + int clear_next_cell = FALSE; +! # ifdef FEAT_ARABIC + int prev_c = 0; /* previous Arabic character */ + int pc, nc, nc1; + int pcc[MAX_MCO]; +- # endif + #endif +- #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) + int force_redraw_this; + int force_redraw_next = FALSE; +- #endif + int need_redraw; + + if (ScreenLines == NULL || row >= screen_Rows) /* safety check */ + return; + off = LineOffset[row] + col; + +- #ifdef FEAT_MBYTE + /* When drawing over the right halve of a double-wide char clear out the + * left halve. Only needed in a terminal. */ + if (has_mbyte && col > 0 && col < screen_Columns +! # ifdef FEAT_GUI + && !gui.in_use +! # endif + && mb_fix_col(col, row) != col) + { + ScreenLines[off - 1] = ' '; +--- 7413,7443 ---- + char_u *ptr = text; + int len = textlen; + int c; + unsigned max_off; + int mbyte_blen = 1; + int mbyte_cells = 1; + int u8c = 0; + int u8cc[MAX_MCO]; + int clear_next_cell = FALSE; +! #ifdef FEAT_ARABIC + int prev_c = 0; /* previous Arabic character */ + int pc, nc, nc1; + int pcc[MAX_MCO]; + #endif + int force_redraw_this; + int force_redraw_next = FALSE; + int need_redraw; + + if (ScreenLines == NULL || row >= screen_Rows) /* safety check */ + return; + off = LineOffset[row] + col; + + /* When drawing over the right halve of a double-wide char clear out the + * left halve. Only needed in a terminal. */ + if (has_mbyte && col > 0 && col < screen_Columns +! #ifdef FEAT_GUI + && !gui.in_use +! #endif + && mb_fix_col(col, row) != col) + { + ScreenLines[off - 1] = ' '; +*************** +*** 7615,7631 **** + /* force the cell at "col" to be redrawn */ + force_redraw_next = TRUE; + } +- #endif + +- #ifdef FEAT_MBYTE + max_off = LineOffset[row] + screen_Columns; +- #endif + while (col < screen_Columns + && (len < 0 || (int)(ptr - text) < len) + && *ptr != NUL) + { + c = *ptr; +- #ifdef FEAT_MBYTE + /* check if this is the first byte of a multibyte */ + if (has_mbyte) + { +--- 7452,7464 ---- +*************** +*** 7645,7651 **** + else + u8c = utfc_ptr2char(ptr, u8cc); + mbyte_cells = utf_char2cells(u8c); +! # ifdef UNICODE16 + /* Non-BMP character: display as ? or fullwidth ?. */ + if (u8c >= 0x10000) + { +--- 7478,7484 ---- + else + u8c = utfc_ptr2char(ptr, u8cc); + mbyte_cells = utf_char2cells(u8c); +! #ifdef UNICODE16 + /* Non-BMP character: display as ? or fullwidth ?. */ + if (u8c >= 0x10000) + { +*************** +*** 7653,7660 **** + if (attr == 0) + attr = HL_ATTR(HLF_8); + } +! # endif +! # ifdef FEAT_ARABIC + if (p_arshape && !p_tbidi && ARABIC_CHAR(u8c)) + { + /* Do Arabic shaping. */ +--- 7486,7493 ---- + if (attr == 0) + attr = HL_ATTR(HLF_8); + } +! #endif +! #ifdef FEAT_ARABIC + if (p_arshape && !p_tbidi && ARABIC_CHAR(u8c)) + { + /* Do Arabic shaping. */ +*************** +*** 7676,7682 **** + } + else + prev_c = u8c; +! # endif + if (col + mbyte_cells > screen_Columns) + { + /* Only 1 cell left, but character requires 2 cells: +--- 7509,7515 ---- + } + else + prev_c = u8c; +! #endif + if (col + mbyte_cells > screen_Columns) + { + /* Only 1 cell left, but character requires 2 cells: +*************** +*** 7686,7700 **** + } + } + } +- #endif + +- #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) + force_redraw_this = force_redraw_next; + force_redraw_next = FALSE; +- #endif + + need_redraw = ScreenLines[off] != c +- #ifdef FEAT_MBYTE + || (mbyte_cells == 2 + && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0)) + || (enc_dbcs == DBCS_JPNU +--- 7519,7529 ---- +*************** +*** 7705,7719 **** + (u8char_T)(c < 0x80 && u8cc[0] == 0 ? 0 : u8c) + || (ScreenLinesUC[off] != 0 + && screen_comp_differs(off, u8cc)))) +- #endif + || ScreenAttrs[off] != attr + || exmode_active; + +! if (need_redraw +! #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) +! || force_redraw_this +! #endif +! ) + { + #if defined(FEAT_GUI) || defined(UNIX) + /* The bold trick makes a single row of pixels appear in the next +--- 7534,7543 ---- + (u8char_T)(c < 0x80 && u8cc[0] == 0 ? 0 : u8c) + || (ScreenLinesUC[off] != 0 + && screen_comp_differs(off, u8cc)))) + || ScreenAttrs[off] != attr + || exmode_active; + +! if (need_redraw || force_redraw_this) + { + #if defined(FEAT_GUI) || defined(UNIX) + /* The bold trick makes a single row of pixels appear in the next +*************** +*** 7740,7746 **** + force_redraw_next = TRUE; + } + #endif +- #ifdef FEAT_MBYTE + /* When at the end of the text and overwriting a two-cell + * character with a one-cell character, need to clear the next + * cell. Also when overwriting the left halve of a two-cell char +--- 7564,7569 ---- +*************** +*** 7765,7774 **** + && (*mb_off2cells)(off, max_off) == 1 + && (*mb_off2cells)(off + 1, max_off) > 1))) + ScreenLines[off + mbyte_blen] = 0; +- #endif + ScreenLines[off] = c; + ScreenAttrs[off] = attr; +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + if (c < 0x80 && u8cc[0] == 0) +--- 7588,7595 ---- +*************** +*** 7804,7813 **** + screen_char(off, row, col); + } + else +- #endif + screen_char(off, row, col); + } +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + off += mbyte_cells; +--- 7625,7632 ---- +*************** +*** 7821,7827 **** + } + } + else +- #endif + { + ++off; + ++col; +--- 7640,7645 ---- +*************** +*** 7829,7847 **** + } + } + +- #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) + /* If we detected the next character needs to be redrawn, but the text + * doesn't extend up to there, update the character here. */ + if (force_redraw_next && col < screen_Columns) + { +- # ifdef FEAT_MBYTE + if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1) + screen_char_2(off, row, col); + else +- # endif + screen_char(off, row, col); + } +- #endif + } + + #ifdef FEAT_SEARCH_EXTRA +--- 7647,7661 ---- +*************** +*** 8063,8073 **** + shl->lnum = 0; + break; + } +- #ifdef FEAT_MBYTE + if (has_mbyte) + matchcol += mb_ptr2len(ml); + else +- #endif + ++matchcol; + } + else +--- 7877,7885 ---- +*************** +*** 8515,8521 **** + if (screen_attr != attr) + screen_start_highlight(attr); + +- #ifdef FEAT_MBYTE + if (enc_utf8 && ScreenLinesUC[off] != 0) + { + char_u buf[MB_MAXBYTES + 1]; +--- 8327,8332 ---- +*************** +*** 8523,8531 **** + if (utf_ambiguous_width(ScreenLinesUC[off])) + { + if (*p_ambw == 'd' +! # ifdef FEAT_GUI + && !gui.in_use +! # endif + ) + { + /* Clear the two screen cells. If the character is actually +--- 8334,8342 ---- + if (utf_ambiguous_width(ScreenLinesUC[off])) + { + if (*p_ambw == 'd' +! #ifdef FEAT_GUI + && !gui.in_use +! #endif + ) + { + /* Clear the two screen cells. If the character is actually +*************** +*** 8545,8568 **** + out_str(buf); + } + else +- #endif + { +- #ifdef FEAT_MBYTE + out_flush_check(); +- #endif + out_char(ScreenLines[off]); +- #ifdef FEAT_MBYTE + /* double-byte character in single-width cell */ + if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e) + out_char(ScreenLines2[off]); +- #endif + } + + screen_cur_col++; + } + +- #ifdef FEAT_MBYTE +- + /* + * Used for enc_dbcs only: Put one double-wide character at ScreenLines["off"] + * on the screen at position 'row' and 'col'. +--- 8356,8372 ---- +*************** +*** 8590,8596 **** + out_char(ScreenLines[off + 1]); + ++screen_cur_col; + } +- #endif + + /* + * Draw a rectangle of the screen, inverted when "invert" is TRUE. +--- 8394,8399 ---- +*************** +*** 8606,8614 **** + { + int r, c; + int off; +- #ifdef FEAT_MBYTE + int max_off; +- #endif + + /* Can't use ScreenLines unless initialized */ + if (ScreenLines == NULL) +--- 8409,8415 ---- +*************** +*** 8619,8643 **** + for (r = row; r < row + height; ++r) + { + off = LineOffset[r]; +- #ifdef FEAT_MBYTE + max_off = off + screen_Columns; +- #endif + for (c = col; c < col + width; ++c) + { +- #ifdef FEAT_MBYTE + if (enc_dbcs != 0 && dbcs_off2cells(off + c, max_off) > 1) + { + screen_char_2(off + c, r, c); + ++c; + } + else +- #endif + { + screen_char(off + c, r, c); +- #ifdef FEAT_MBYTE + if (utf_off2cells(off + c, max_off) > 1) + ++c; +- #endif + } + } + } +--- 8420,8438 ---- +*************** +*** 8675,8684 **** + { + ScreenLines[off] = ' '; + ScreenAttrs[off] = attr; +- # ifdef FEAT_MBYTE + if (enc_utf8) + ScreenLinesUC[off] = 0; +- # endif + } + + /* +--- 8470,8477 ---- +*************** +*** 8724,8734 **** + !IS_CTERM); + for (row = start_row; row < end_row; ++row) + { +- #ifdef FEAT_MBYTE + if (has_mbyte +! # ifdef FEAT_GUI + && !gui.in_use +! # endif + ) + { + /* When drawing over the right halve of a double-wide char clear +--- 8517,8526 ---- + !IS_CTERM); + for (row = start_row; row < end_row; ++row) + { + if (has_mbyte +! #ifdef FEAT_GUI + && !gui.in_use +! #endif + ) + { + /* When drawing over the right halve of a double-wide char clear +*************** +*** 8740,8746 **** + if (end_col < screen_Columns && mb_fix_col(end_col, row) != end_col) + screen_puts_len((char_u *)" ", 1, row, end_col, 0); + } +- #endif + /* + * Try to use delete-line termcap code, when no attributes or in a + * "normal" terminal, where a bold/italic space is just a +--- 8532,8537 ---- +*************** +*** 8766,8778 **** + end_off = LineOffset[row] + end_col; + + /* skip blanks (used often, keep it fast!) */ +- #ifdef FEAT_MBYTE + if (enc_utf8) + while (off < end_off && ScreenLines[off] == ' ' + && ScreenAttrs[off] == 0 && ScreenLinesUC[off] == 0) + ++off; + else +- #endif + while (off < end_off && ScreenLines[off] == ' ' + && ScreenAttrs[off] == 0) + ++off; +--- 8557,8567 ---- +*************** +*** 8798,8807 **** + for (col = start_col; col < end_col; ++col) + { + if (ScreenLines[off] != c +- #ifdef FEAT_MBYTE + || (enc_utf8 && (int)ScreenLinesUC[off] + != (c >= 0x80 ? c : 0)) +- #endif + || ScreenAttrs[off] != attr + #if defined(FEAT_GUI) || defined(UNIX) + || force_next +--- 8587,8594 ---- +*************** +*** 8834,8840 **** + } + #endif + ScreenLines[off] = c; +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + if (c >= 0x80) +--- 8621,8626 ---- +*************** +*** 8845,8851 **** + else + ScreenLinesUC[off] = 0; + } +- #endif + ScreenAttrs[off] = attr; + if (!did_delete || c != ' ') + screen_char(off, row, col); +--- 8631,8636 ---- +*************** +*** 8925,8936 **** + int outofmem = FALSE; + int len; + schar_T *new_ScreenLines; +- #ifdef FEAT_MBYTE + u8char_T *new_ScreenLinesUC = NULL; + u8char_T *new_ScreenLinesC[MAX_MCO]; + schar_T *new_ScreenLines2 = NULL; + int i; +- #endif + sattr_T *new_ScreenAttrs; + unsigned *new_LineOffset; + char_u *new_LineWraps; +--- 8710,8719 ---- +*************** +*** 8949,8960 **** + if ((ScreenLines != NULL + && Rows == screen_Rows + && Columns == screen_Columns +- #ifdef FEAT_MBYTE + && enc_utf8 == (ScreenLinesUC != NULL) + && (enc_dbcs == DBCS_JPNU) == (ScreenLines2 != NULL) +! && p_mco == Screen_mco +! #endif +! ) + || Rows == 0 + || Columns == 0 + || (!full_screen && ScreenLines == NULL)) +--- 8732,8740 ---- + if ((ScreenLines != NULL + && Rows == screen_Rows + && Columns == screen_Columns + && enc_utf8 == (ScreenLinesUC != NULL) + && (enc_dbcs == DBCS_JPNU) == (ScreenLines2 != NULL) +! && p_mco == Screen_mco) + || Rows == 0 + || Columns == 0 + || (!full_screen && ScreenLines == NULL)) +*************** +*** 8997,9003 **** + + new_ScreenLines = (schar_T *)lalloc((long_u)( + (Rows + 1) * Columns * sizeof(schar_T)), FALSE); +- #ifdef FEAT_MBYTE + vim_memset(new_ScreenLinesC, 0, sizeof(u8char_T *) * MAX_MCO); + if (enc_utf8) + { +--- 8777,8782 ---- +*************** +*** 9010,9016 **** + if (enc_dbcs == DBCS_JPNU) + new_ScreenLines2 = (schar_T *)lalloc((long_u)( + (Rows + 1) * Columns * sizeof(schar_T)), FALSE); +- #endif + new_ScreenAttrs = (sattr_T *)lalloc((long_u)( + (Rows + 1) * Columns * sizeof(sattr_T)), FALSE); + new_LineOffset = (unsigned *)lalloc((long_u)( +--- 8789,8794 ---- +*************** +*** 9031,9046 **** + outofmem = TRUE; + give_up: + +- #ifdef FEAT_MBYTE + for (i = 0; i < p_mco; ++i) + if (new_ScreenLinesC[i] == NULL) + break; +- #endif + if (new_ScreenLines == NULL +- #ifdef FEAT_MBYTE + || (enc_utf8 && (new_ScreenLinesUC == NULL || i != p_mco)) + || (enc_dbcs == DBCS_JPNU && new_ScreenLines2 == NULL) +- #endif + || new_ScreenAttrs == NULL + || new_LineOffset == NULL + || new_LineWraps == NULL +--- 8809,8820 ---- +*************** +*** 9057,9068 **** + done_outofmem_msg = TRUE; + } + VIM_CLEAR(new_ScreenLines); +- #ifdef FEAT_MBYTE + VIM_CLEAR(new_ScreenLinesUC); + for (i = 0; i < p_mco; ++i) + VIM_CLEAR(new_ScreenLinesC[i]); + VIM_CLEAR(new_ScreenLines2); +- #endif + VIM_CLEAR(new_ScreenAttrs); + VIM_CLEAR(new_LineOffset); + VIM_CLEAR(new_LineWraps); +--- 8831,8840 ---- +*************** +*** 9087,9093 **** + { + (void)vim_memset(new_ScreenLines + new_row * Columns, + ' ', (size_t)Columns * sizeof(schar_T)); +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + (void)vim_memset(new_ScreenLinesUC + new_row * Columns, +--- 8859,8864 ---- +*************** +*** 9100,9106 **** + if (enc_dbcs == DBCS_JPNU) + (void)vim_memset(new_ScreenLines2 + new_row * Columns, + 0, (size_t)Columns * sizeof(schar_T)); +- #endif + (void)vim_memset(new_ScreenAttrs + new_row * Columns, + 0, (size_t)Columns * sizeof(sattr_T)); + old_row = new_row + (screen_Rows - Rows); +--- 8871,8876 ---- +*************** +*** 9110,9125 **** + len = screen_Columns; + else + len = Columns; +- #ifdef FEAT_MBYTE + /* When switching to utf-8 don't copy characters, they + * may be invalid now. Also when p_mco changes. */ + if (!(enc_utf8 && ScreenLinesUC == NULL) + && p_mco == Screen_mco) +- #endif + mch_memmove(new_ScreenLines + new_LineOffset[new_row], + ScreenLines + LineOffset[old_row], + (size_t)len * sizeof(schar_T)); +- #ifdef FEAT_MBYTE + if (enc_utf8 && ScreenLinesUC != NULL + && p_mco == Screen_mco) + { +--- 8880,8892 ---- +*************** +*** 9136,9142 **** + mch_memmove(new_ScreenLines2 + new_LineOffset[new_row], + ScreenLines2 + LineOffset[old_row], + (size_t)len * sizeof(schar_T)); +- #endif + mch_memmove(new_ScreenAttrs + new_LineOffset[new_row], + ScreenAttrs + LineOffset[old_row], + (size_t)len * sizeof(sattr_T)); +--- 8903,8908 ---- +*************** +*** 9150,9162 **** + free_screenlines(); + + ScreenLines = new_ScreenLines; +- #ifdef FEAT_MBYTE + ScreenLinesUC = new_ScreenLinesUC; + for (i = 0; i < p_mco; ++i) + ScreenLinesC[i] = new_ScreenLinesC[i]; + Screen_mco = p_mco; + ScreenLines2 = new_ScreenLines2; +- #endif + ScreenAttrs = new_ScreenAttrs; + LineOffset = new_LineOffset; + LineWraps = new_LineWraps; +--- 8916,8926 ---- +*************** +*** 9213,9226 **** + void + free_screenlines(void) + { +- #ifdef FEAT_MBYTE + int i; + + vim_free(ScreenLinesUC); + for (i = 0; i < Screen_mco; ++i) + vim_free(ScreenLinesC[i]); + vim_free(ScreenLines2); +- #endif + vim_free(ScreenLines); + vim_free(ScreenAttrs); + vim_free(LineOffset); +--- 8977,8988 ---- +*************** +*** 9303,9313 **** + lineclear(unsigned off, int width, int attr) + { + (void)vim_memset(ScreenLines + off, ' ', (size_t)width * sizeof(schar_T)); +- #ifdef FEAT_MBYTE + if (enc_utf8) + (void)vim_memset(ScreenLinesUC + off, 0, + (size_t)width * sizeof(u8char_T)); +- #endif + (void)vim_memset(ScreenAttrs + off, attr, (size_t)width * sizeof(sattr_T)); + } + +--- 9065,9073 ---- +*************** +*** 9332,9338 **** + + mch_memmove(ScreenLines + off_to, ScreenLines + off_from, + wp->w_width * sizeof(schar_T)); +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + int i; +--- 9092,9097 ---- +*************** +*** 9346,9352 **** + if (enc_dbcs == DBCS_JPNU) + mch_memmove(ScreenLines2 + off_to, ScreenLines2 + off_from, + wp->w_width * sizeof(schar_T)); +- #endif + mch_memmove(ScreenAttrs + off_to, ScreenAttrs + off_from, + wp->w_width * sizeof(sattr_T)); + } +--- 9105,9110 ---- +*************** +*** 9533,9539 **** + if (i != 0) + cost = 999; /* different attributes, don't do it */ + } +- #ifdef FEAT_MBYTE + if (enc_utf8) + { + /* Don't use an UTF-8 char for positioning, it's slow. */ +--- 9291,9296 ---- +*************** +*** 9544,9550 **** + break; + } + } +- #endif + } + + /* +--- 9301,9306 ---- +*************** +*** 9603,9617 **** + { + if (ScreenAttrs[off] != screen_attr) + screen_stop_highlight(); +- #ifdef FEAT_MBYTE + out_flush_check(); +- #endif + out_char(ScreenLines[off]); +- #ifdef FEAT_MBYTE + if (enc_dbcs == DBCS_JPNU + && ScreenLines[off] == 0x8e) + out_char(ScreenLines2[off]); +- #endif + ++off; + } + } +--- 9359,9369 ---- +*************** +*** 9660,9672 **** + #ifdef FEAT_RIGHTLEFT + /* With 'rightleft' set and the cursor on a double-wide + * character, position it on the leftmost column. */ +! curwin->w_p_rl ? ((int)curwin->w_width - curwin->w_wcol - ( +! # ifdef FEAT_MBYTE +! (has_mbyte + && (*mb_ptr2cells)(ml_get_cursor()) == 2 +! && vim_isprintc(gchar_cursor())) ? 2 : +! # endif +! 1)) : + #endif + curwin->w_wcol)); + } +--- 9412,9421 ---- + #ifdef FEAT_RIGHTLEFT + /* With 'rightleft' set and the cursor on a double-wide + * character, position it on the leftmost column. */ +! curwin->w_p_rl ? ((int)curwin->w_width - curwin->w_wcol +! - ((has_mbyte + && (*mb_ptr2cells)(ml_get_cursor()) == 2 +! && vim_isprintc(gchar_cursor())) ? 2 : 1)) : + #endif + curwin->w_wcol)); + } +*************** +*** 10808,10823 **** + shorten_dir(NameBuff); + len = vim_strsize(NameBuff); + p = NameBuff; +- #ifdef FEAT_MBYTE + if (has_mbyte) + while (len > room) + { + len -= ptr2cells(p); + MB_PTR_ADV(p); + } +! else +! #endif +! if (len > room) + { + p += len - room; + len = room; +--- 10557,10569 ---- + shorten_dir(NameBuff); + len = vim_strsize(NameBuff); + p = NameBuff; + if (has_mbyte) + while (len > room) + { + len -= ptr2cells(p); + MB_PTR_ADV(p); + } +! else if (len > room) + { + p += len - room; + len = room; +*************** +*** 11210,11227 **** + /* need at least 3 chars left for get_rel_pos() + NUL */ + while (this_ru_col + o < width && RULER_BUF_LEN > i + 4) + { +- #ifdef FEAT_MBYTE + if (has_mbyte) + i += (*mb_char2bytes)(fillchar, buffer + i); + else +- #endif + buffer[i++] = fillchar; + ++o; + } + get_rel_pos(wp, buffer + i, RULER_BUF_LEN - i); + } + /* Truncate at window boundary. */ +- #ifdef FEAT_MBYTE + if (has_mbyte) + { + o = 0; +--- 10956,10970 ---- +*************** +*** 11235,11243 **** + } + } + } +! else +! #endif +! if (this_ru_col + (int)STRLEN(buffer) > width) + buffer[width - this_ru_col] = NUL; + + screen_puts(buffer, row, this_ru_col + off, attr); +--- 10978,10984 ---- + } + } + } +! else if (this_ru_col + (int)STRLEN(buffer) > width) + buffer[width - this_ru_col] = NUL; + + screen_puts(buffer, row, this_ru_col + off, attr); +*** ../vim-8.1.0808/src/version.c 2019-01-24 16:27:41.693254193 +0100 +--- src/version.c 2019-01-24 16:38:47.536784802 +0100 +*************** +*** 793,794 **** +--- 793,796 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 809, + /**/ + +-- +FATHER: One day, lad, all this will be yours ... +PRINCE: What - the curtains? + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |