mirror of
https://github.com/neovim/neovim.git
synced 2025-09-17 16:58:17 +00:00
vim-patch:7.4.1147 (#5005)
Problem: Conflict for "chartab". (Kazunobu Kuriyama)
Solution: Rename the global one to something less obvious. Move it into
src/chartab.c.
88e8f9f144
This commit is contained in:

committed by
Justin M. Keyes

parent
29060a592c
commit
dcbd1c7b13
@@ -43,20 +43,29 @@ static bool chartab_initialized = false;
|
|||||||
#define GET_CHARTAB(buf, c) \
|
#define GET_CHARTAB(buf, c) \
|
||||||
((buf)->b_chartab[(unsigned)(c) >> 6] & (1ull << ((c) & 0x3f)))
|
((buf)->b_chartab[(unsigned)(c) >> 6] & (1ull << ((c) & 0x3f)))
|
||||||
|
|
||||||
/// Fill chartab[]. Also fills curbuf->b_chartab[] with flags for keyword
|
// Table used below, see init_chartab() for an explanation
|
||||||
|
static char_u g_chartab[256];
|
||||||
|
|
||||||
|
// Flags for g_chartab[].
|
||||||
|
#define CT_CELL_MASK 0x07 ///< mask: nr of display cells (1, 2 or 4)
|
||||||
|
#define CT_PRINT_CHAR 0x10 ///< flag: set for printable chars
|
||||||
|
#define CT_ID_CHAR 0x20 ///< flag: set for ID chars
|
||||||
|
#define CT_FNAME_CHAR 0x40 ///< flag: set for file name chars
|
||||||
|
|
||||||
|
/// Fill g_chartab[]. Also fills curbuf->b_chartab[] with flags for keyword
|
||||||
/// characters for current buffer.
|
/// characters for current buffer.
|
||||||
///
|
///
|
||||||
/// Depends on the option settings 'iskeyword', 'isident', 'isfname',
|
/// Depends on the option settings 'iskeyword', 'isident', 'isfname',
|
||||||
/// 'isprint' and 'encoding'.
|
/// 'isprint' and 'encoding'.
|
||||||
///
|
///
|
||||||
/// The index in chartab[] depends on 'encoding':
|
/// The index in g_chartab[] depends on 'encoding':
|
||||||
/// - For non-multi-byte index with the byte (same as the character).
|
/// - For non-multi-byte index with the byte (same as the character).
|
||||||
/// - For DBCS index with the first byte.
|
/// - For DBCS index with the first byte.
|
||||||
/// - For UTF-8 index with the character (when first byte is up to 0x80 it is
|
/// - For UTF-8 index with the character (when first byte is up to 0x80 it is
|
||||||
/// the same as the character, if the first byte is 0x80 and above it depends
|
/// the same as the character, if the first byte is 0x80 and above it depends
|
||||||
/// on further bytes).
|
/// on further bytes).
|
||||||
///
|
///
|
||||||
/// The contents of chartab[]:
|
/// The contents of g_chartab[]:
|
||||||
/// - The lower two bits, masked by CT_CELL_MASK, give the number of display
|
/// - The lower two bits, masked by CT_CELL_MASK, give the number of display
|
||||||
/// cells the character occupies (1 or 2). Not valid for UTF-8 above 0x80.
|
/// cells the character occupies (1 or 2). Not valid for UTF-8 above 0x80.
|
||||||
/// - CT_PRINT_CHAR bit is set when the character is printable (no need to
|
/// - CT_PRINT_CHAR bit is set when the character is printable (no need to
|
||||||
@@ -94,32 +103,32 @@ int buf_init_chartab(buf_T *buf, int global)
|
|||||||
c = 0;
|
c = 0;
|
||||||
|
|
||||||
while (c < ' ') {
|
while (c < ' ') {
|
||||||
chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
|
g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (c <= '~') {
|
while (c <= '~') {
|
||||||
chartab[c++] = 1 + CT_PRINT_CHAR;
|
g_chartab[c++] = 1 + CT_PRINT_CHAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_altkeymap) {
|
if (p_altkeymap) {
|
||||||
while (c < YE) {
|
while (c < YE) {
|
||||||
chartab[c++] = 1 + CT_PRINT_CHAR;
|
g_chartab[c++] = 1 + CT_PRINT_CHAR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (c < 256) {
|
while (c < 256) {
|
||||||
if (enc_utf8 && (c >= 0xa0)) {
|
if (enc_utf8 && (c >= 0xa0)) {
|
||||||
// UTF-8: bytes 0xa0 - 0xff are printable (latin1)
|
// UTF-8: bytes 0xa0 - 0xff are printable (latin1)
|
||||||
chartab[c++] = CT_PRINT_CHAR + 1;
|
g_chartab[c++] = CT_PRINT_CHAR + 1;
|
||||||
} else if ((enc_dbcs == DBCS_JPNU) && (c == 0x8e)) {
|
} else if ((enc_dbcs == DBCS_JPNU) && (c == 0x8e)) {
|
||||||
// euc-jp characters starting with 0x8e are single width
|
// euc-jp characters starting with 0x8e are single width
|
||||||
chartab[c++] = CT_PRINT_CHAR + 1;
|
g_chartab[c++] = CT_PRINT_CHAR + 1;
|
||||||
} else if ((enc_dbcs != 0) && (MB_BYTE2LEN(c) == 2)) {
|
} else if ((enc_dbcs != 0) && (MB_BYTE2LEN(c) == 2)) {
|
||||||
// other double-byte chars can be printable AND double-width
|
// other double-byte chars can be printable AND double-width
|
||||||
chartab[c++] = CT_PRINT_CHAR + 2;
|
g_chartab[c++] = CT_PRINT_CHAR + 2;
|
||||||
} else {
|
} else {
|
||||||
// the rest is unprintable by default
|
// the rest is unprintable by default
|
||||||
chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
|
g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,7 +137,7 @@ int buf_init_chartab(buf_T *buf, int global)
|
|||||||
if (((enc_dbcs != 0) && (MB_BYTE2LEN(c) > 1))
|
if (((enc_dbcs != 0) && (MB_BYTE2LEN(c) > 1))
|
||||||
|| ((enc_dbcs == DBCS_JPNU) && (c == 0x8e))
|
|| ((enc_dbcs == DBCS_JPNU) && (c == 0x8e))
|
||||||
|| (enc_utf8 && (c >= 0xa0))) {
|
|| (enc_utf8 && (c >= 0xa0))) {
|
||||||
chartab[c] |= CT_FNAME_CHAR;
|
g_chartab[c] |= CT_FNAME_CHAR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,9 +240,9 @@ int buf_init_chartab(buf_T *buf, int global)
|
|||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
// (re)set ID flag
|
// (re)set ID flag
|
||||||
if (tilde) {
|
if (tilde) {
|
||||||
chartab[c] &= (uint8_t)~CT_ID_CHAR;
|
g_chartab[c] &= (uint8_t)~CT_ID_CHAR;
|
||||||
} else {
|
} else {
|
||||||
chartab[c] |= CT_ID_CHAR;
|
g_chartab[c] |= CT_ID_CHAR;
|
||||||
}
|
}
|
||||||
} else if (i == 1) {
|
} else if (i == 1) {
|
||||||
// (re)set printable
|
// (re)set printable
|
||||||
@@ -244,20 +253,20 @@ int buf_init_chartab(buf_T *buf, int global)
|
|||||||
|| (p_altkeymap && (F_isalpha(c) || F_isdigit(c))))
|
|| (p_altkeymap && (F_isalpha(c) || F_isdigit(c))))
|
||||||
&& !(enc_dbcs && (MB_BYTE2LEN(c) == 2))) {
|
&& !(enc_dbcs && (MB_BYTE2LEN(c) == 2))) {
|
||||||
if (tilde) {
|
if (tilde) {
|
||||||
chartab[c] = (uint8_t)((chartab[c] & ~CT_CELL_MASK)
|
g_chartab[c] = (uint8_t)((g_chartab[c] & ~CT_CELL_MASK)
|
||||||
+ ((dy_flags & DY_UHEX) ? 4 : 2));
|
+ ((dy_flags & DY_UHEX) ? 4 : 2));
|
||||||
chartab[c] &= (uint8_t)~CT_PRINT_CHAR;
|
g_chartab[c] &= (uint8_t)~CT_PRINT_CHAR;
|
||||||
} else {
|
} else {
|
||||||
chartab[c] = (uint8_t)((chartab[c] & ~CT_CELL_MASK) + 1);
|
g_chartab[c] = (uint8_t)((g_chartab[c] & ~CT_CELL_MASK) + 1);
|
||||||
chartab[c] |= CT_PRINT_CHAR;
|
g_chartab[c] |= CT_PRINT_CHAR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (i == 2) {
|
} else if (i == 2) {
|
||||||
// (re)set fname flag
|
// (re)set fname flag
|
||||||
if (tilde) {
|
if (tilde) {
|
||||||
chartab[c] &= (uint8_t)~CT_FNAME_CHAR;
|
g_chartab[c] &= (uint8_t)~CT_FNAME_CHAR;
|
||||||
} else {
|
} else {
|
||||||
chartab[c] |= CT_FNAME_CHAR;
|
g_chartab[c] |= CT_FNAME_CHAR;
|
||||||
}
|
}
|
||||||
} else { // i == 3
|
} else { // i == 3
|
||||||
// (re)set keyword flag
|
// (re)set keyword flag
|
||||||
@@ -492,9 +501,9 @@ char_u* str_foldcase(char_u *str, int orglen, char_u *buf, int buflen)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Catch 22: chartab[] can't be initialized before the options are
|
// Catch 22: g_chartab[] can't be initialized before the options are
|
||||||
// initialized, and initializing options may cause transchar() to be called!
|
// initialized, and initializing options may cause transchar() to be called!
|
||||||
// When chartab_initialized == false don't use chartab[].
|
// When chartab_initialized == false don't use g_chartab[].
|
||||||
// Does NOT work for multi-byte characters, c must be <= 255.
|
// Does NOT work for multi-byte characters, c must be <= 255.
|
||||||
// Also doesn't work for the first byte of a multi-byte, "c" must be a
|
// Also doesn't work for the first byte of a multi-byte, "c" must be a
|
||||||
// character!
|
// character!
|
||||||
@@ -633,7 +642,7 @@ int byte2cells(int b)
|
|||||||
if (enc_utf8 && (b >= 0x80)) {
|
if (enc_utf8 && (b >= 0x80)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return chartab[b] & CT_CELL_MASK;
|
return g_chartab[b] & CT_CELL_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return number of display cells occupied by character "c".
|
/// Return number of display cells occupied by character "c".
|
||||||
@@ -665,7 +674,7 @@ int char2cells(int c)
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return chartab[c & 0xff] & CT_CELL_MASK;
|
return g_chartab[c & 0xff] & CT_CELL_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return number of display cells occupied by character at "*p".
|
/// Return number of display cells occupied by character at "*p".
|
||||||
@@ -682,7 +691,7 @@ int ptr2cells(char_u *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// For DBCS we can tell the cell count from the first byte.
|
// For DBCS we can tell the cell count from the first byte.
|
||||||
return chartab[*p] & CT_CELL_MASK;
|
return g_chartab[*p] & CT_CELL_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the number of character cells string "s" will take on the screen,
|
/// Return the number of character cells string "s" will take on the screen,
|
||||||
@@ -806,7 +815,7 @@ unsigned int win_linetabsize(win_T *wp, char_u *line, colnr_T len)
|
|||||||
bool vim_isIDc(int c)
|
bool vim_isIDc(int c)
|
||||||
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
||||||
{
|
{
|
||||||
return c > 0 && c < 0x100 && (chartab[c] & CT_ID_CHAR);
|
return c > 0 && c < 0x100 && (g_chartab[c] & CT_ID_CHAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check that "c" is a keyword character:
|
/// Check that "c" is a keyword character:
|
||||||
@@ -878,7 +887,7 @@ bool vim_iswordp_buf(char_u *p, buf_T *buf)
|
|||||||
bool vim_isfilec(int c)
|
bool vim_isfilec(int c)
|
||||||
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
||||||
{
|
{
|
||||||
return c >= 0x100 || (c > 0 && (chartab[c] & CT_FNAME_CHAR));
|
return c >= 0x100 || (c > 0 && (g_chartab[c] & CT_FNAME_CHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check that "c" is a valid file-name character or a wildcard character
|
/// Check that "c" is a valid file-name character or a wildcard character
|
||||||
@@ -906,7 +915,7 @@ bool vim_isprintc(int c)
|
|||||||
if (enc_utf8 && (c >= 0x100)) {
|
if (enc_utf8 && (c >= 0x100)) {
|
||||||
return utf_printable(c);
|
return utf_printable(c);
|
||||||
}
|
}
|
||||||
return c >= 0x100 || (c > 0 && (chartab[c] & CT_PRINT_CHAR));
|
return c >= 0x100 || (c > 0 && (g_chartab[c] & CT_PRINT_CHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Strict version of vim_isprintc(c), don't return true if "c" is the head
|
/// Strict version of vim_isprintc(c), don't return true if "c" is the head
|
||||||
@@ -925,7 +934,7 @@ bool vim_isprintc_strict(int c)
|
|||||||
if (enc_utf8 && (c >= 0x100)) {
|
if (enc_utf8 && (c >= 0x100)) {
|
||||||
return utf_printable(c);
|
return utf_printable(c);
|
||||||
}
|
}
|
||||||
return c >= 0x100 || (c > 0 && (chartab[c] & CT_PRINT_CHAR));
|
return c >= 0x100 || (c > 0 && (g_chartab[c] & CT_PRINT_CHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// like chartabsize(), but also check for line breaks on the screen
|
/// like chartabsize(), but also check for line breaks on the screen
|
||||||
@@ -1247,7 +1256,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
|
|||||||
if (enc_utf8 && (c >= 0x80)) {
|
if (enc_utf8 && (c >= 0x80)) {
|
||||||
incr = utf_ptr2cells(ptr);
|
incr = utf_ptr2cells(ptr);
|
||||||
} else {
|
} else {
|
||||||
incr = CHARSIZE(c);
|
incr = g_chartab[c] & CT_CELL_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a double-cell char doesn't fit at the end of a line
|
// If a double-cell char doesn't fit at the end of a line
|
||||||
@@ -1261,7 +1270,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
|
|||||||
head = 1;
|
head = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
incr = CHARSIZE(c);
|
incr = g_chartab[c] & CT_CELL_MASK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,14 +1,6 @@
|
|||||||
#ifndef NVIM_CHARSET_H
|
#ifndef NVIM_CHARSET_H
|
||||||
#define NVIM_CHARSET_H
|
#define NVIM_CHARSET_H
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags for chartab[].
|
|
||||||
*/
|
|
||||||
#define CT_CELL_MASK 0x07 /* mask: nr of display cells (1, 2 or 4) */
|
|
||||||
#define CT_PRINT_CHAR 0x10 /* flag: set for printable chars */
|
|
||||||
#define CT_ID_CHAR 0x20 /* flag: set for ID chars */
|
|
||||||
#define CT_FNAME_CHAR 0x40 /* flag: set for file name chars */
|
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
# include "charset.h.generated.h"
|
# include "charset.h.generated.h"
|
||||||
#endif
|
#endif
|
||||||
|
@@ -914,9 +914,6 @@ EXTERN int KeyTyped; // TRUE if user typed current char
|
|||||||
EXTERN int KeyStuffed; // TRUE if current char from stuffbuf
|
EXTERN int KeyStuffed; // TRUE if current char from stuffbuf
|
||||||
EXTERN int maptick INIT(= 0); // tick for each non-mapped char
|
EXTERN int maptick INIT(= 0); // tick for each non-mapped char
|
||||||
|
|
||||||
EXTERN uint8_t chartab[256]; // table used in charset.c; See
|
|
||||||
// init_chartab() for explanation
|
|
||||||
|
|
||||||
EXTERN int must_redraw INIT(= 0); /* type of redraw necessary */
|
EXTERN int must_redraw INIT(= 0); /* type of redraw necessary */
|
||||||
EXTERN int skip_redraw INIT(= FALSE); /* skip redraw once */
|
EXTERN int skip_redraw INIT(= FALSE); /* skip redraw once */
|
||||||
EXTERN int do_redraw INIT(= FALSE); /* extra redraw once */
|
EXTERN int do_redraw INIT(= FALSE); /* extra redraw once */
|
||||||
|
@@ -73,11 +73,6 @@
|
|||||||
/* Returns empty string if it is NULL. */
|
/* Returns empty string if it is NULL. */
|
||||||
#define EMPTY_IF_NULL(x) ((x) ? (x) : (char_u *)"")
|
#define EMPTY_IF_NULL(x) ((x) ? (x) : (char_u *)"")
|
||||||
|
|
||||||
/* macro version of chartab().
|
|
||||||
* Only works with values 0-255!
|
|
||||||
* Doesn't work for UTF-8 mode with chars >= 0x80. */
|
|
||||||
#define CHARSIZE(c) (chartab[c] & CT_CELL_MASK)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Adjust chars in a language according to 'langmap' option.
|
* Adjust chars in a language according to 'langmap' option.
|
||||||
* NOTE that there is no noticeable overhead if 'langmap' is not set.
|
* NOTE that there is no noticeable overhead if 'langmap' is not set.
|
||||||
|
@@ -670,8 +670,8 @@ static void init_locale(void)
|
|||||||
{
|
{
|
||||||
char_u *p;
|
char_u *p;
|
||||||
|
|
||||||
/* expand_env() doesn't work yet, because chartab[] is not initialized
|
// expand_env() doesn't work yet, because g_chartab[] is not
|
||||||
* yet, call vim_getenv() directly */
|
// initialized yet, call vim_getenv() directly
|
||||||
p = (char_u *)vim_getenv("VIMRUNTIME");
|
p = (char_u *)vim_getenv("VIMRUNTIME");
|
||||||
if (p != NULL && *p != NUL) {
|
if (p != NULL && *p != NUL) {
|
||||||
vim_snprintf((char *)NameBuff, MAXPATHL, "%s/lang", p);
|
vim_snprintf((char *)NameBuff, MAXPATHL, "%s/lang", p);
|
||||||
|
@@ -2439,16 +2439,13 @@ did_set_string_option (
|
|||||||
else if (varp == &curwin->w_p_briopt) {
|
else if (varp == &curwin->w_p_briopt) {
|
||||||
if (briopt_check(curwin) == FAIL)
|
if (briopt_check(curwin) == FAIL)
|
||||||
errmsg = e_invarg;
|
errmsg = e_invarg;
|
||||||
}
|
} else if (varp == &p_isi
|
||||||
/*
|
|
||||||
* 'isident', 'iskeyword', 'isprint or 'isfname' option: refill chartab[]
|
|
||||||
* If the new option is invalid, use old value. 'lisp' option: refill
|
|
||||||
* chartab[] for '-' char
|
|
||||||
*/
|
|
||||||
else if ( varp == &p_isi
|
|
||||||
|| varp == &(curbuf->b_p_isk)
|
|| varp == &(curbuf->b_p_isk)
|
||||||
|| varp == &p_isp
|
|| varp == &p_isp
|
||||||
|| varp == &p_isf) {
|
|| varp == &p_isf) {
|
||||||
|
// 'isident', 'iskeyword', 'isprint or 'isfname' option: refill g_chartab[]
|
||||||
|
// If the new option is invalid, use old value. 'lisp' option: refill
|
||||||
|
// g_chartab[] for '-' char
|
||||||
if (init_chartab() == FAIL) {
|
if (init_chartab() == FAIL) {
|
||||||
did_chartab = TRUE; /* need to restore it below */
|
did_chartab = TRUE; /* need to restore it below */
|
||||||
errmsg = e_invarg; /* error in value */
|
errmsg = e_invarg; /* error in value */
|
||||||
|
@@ -3416,12 +3416,10 @@ win_line (
|
|||||||
/*
|
/*
|
||||||
* Handling of non-printable characters.
|
* Handling of non-printable characters.
|
||||||
*/
|
*/
|
||||||
if (!(chartab[c & 0xff] & CT_PRINT_CHAR)) {
|
if (!vim_isprintc(c)) {
|
||||||
/*
|
// when getting a character from the file, we may have to
|
||||||
* when getting a character from the file, we may have to
|
// turn it into something else on the way to putting it
|
||||||
* turn it into something else on the way to putting it
|
// into "ScreenLines".
|
||||||
* into "ScreenLines".
|
|
||||||
*/
|
|
||||||
if (c == TAB && (!wp->w_p_list || lcs_tab1)) {
|
if (c == TAB && (!wp->w_p_list || lcs_tab1)) {
|
||||||
int tab_len = 0;
|
int tab_len = 0;
|
||||||
long vcol_adjusted = vcol; // removed showbreak length
|
long vcol_adjusted = vcol; // removed showbreak length
|
||||||
|
@@ -552,7 +552,7 @@ static int included_patches[] = {
|
|||||||
1150,
|
1150,
|
||||||
1149,
|
1149,
|
||||||
// 1148 NA
|
// 1148 NA
|
||||||
// 1147,
|
1147,
|
||||||
// 1146 NA
|
// 1146 NA
|
||||||
// 1145 NA
|
// 1145 NA
|
||||||
1144,
|
1144,
|
||||||
|
Reference in New Issue
Block a user