Mercurial > vim
annotate src/charset.c @ 34623:65e7eaf68f19 v9.1.0200
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Commit: https://github.com/vim/vim/commit/b2d124c6258ff41e1f951bf39a4afc386d79ddc4
Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Date: Sun Mar 24 09:43:25 2024 +0100
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Problem: `gj`/`gk` was updating the desired cursor virtual column to
the outer virtual text, even though the actual cursor position
was moved to not be on the virtual text, leading the need to
do an extra `gj`/`gk` to move past each virtual text line.
(rickhowe)
Solution: Exclude the outer virtual text when getting the line length
for moving the cursor with `gj`/`gk`, so that no extra
movement is needed to skip over virtual text lines.
(Dylan Thacker-Smith)
fixes: #12028
related: #14262
Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 24 Mar 2024 10:00:05 +0100 |
parents | 9e093c96dff6 |
children | 81e6583c8b73 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9399
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 #include "vim.h" | |
11 | |
15595
1ec942f1b648
patch 8.1.0805: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
12 #if defined(HAVE_WCHAR_H) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
13 # include <wchar.h> // for towupper() and towlower() |
15595
1ec942f1b648
patch 8.1.0805: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
14 #endif |
7 | 15 |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
16 static int win_nolbr_chartabsize(chartabsize_T *cts, int *headp); |
7799
af3c41a3c53f
commit https://github.com/vim/vim/commit/f28dbcea371b3a35727d91afc90fb90e0527d78a
Christian Brabandt <cb@256bit.org>
parents:
7697
diff
changeset
|
17 static unsigned nr2hex(unsigned c); |
7 | 18 |
19 static int chartab_initialized = FALSE; | |
20 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
21 // b_chartab[] is an array of 32 bytes, each bit representing one of the |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
22 // characters 0-255. |
7 | 23 #define SET_CHARTAB(buf, c) (buf)->b_chartab[(unsigned)(c) >> 3] |= (1 << ((c) & 0x7)) |
24 #define RESET_CHARTAB(buf, c) (buf)->b_chartab[(unsigned)(c) >> 3] &= ~(1 << ((c) & 0x7)) | |
25 #define GET_CHARTAB(buf, c) ((buf)->b_chartab[(unsigned)(c) >> 3] & (1 << ((c) & 0x7))) | |
26 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
27 // table used below, see init_chartab() for an explanation |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
28 static char_u g_chartab[256]; |
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
29 |
7 | 30 /* |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
31 * Flags for g_chartab[]. |
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
32 */ |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
33 #define CT_CELL_MASK 0x07 // mask: nr of display cells (1, 2 or 4) |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
34 #define CT_PRINT_CHAR 0x10 // flag: set for printable chars |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
35 #define CT_ID_CHAR 0x20 // flag: set for ID chars |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
36 #define CT_FNAME_CHAR 0x40 // flag: set for file name chars |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
37 |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
16819
diff
changeset
|
38 static int in_win_border(win_T *wp, colnr_T vcol); |
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
16819
diff
changeset
|
39 |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
40 /* |
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
41 * Fill g_chartab[]. Also fills curbuf->b_chartab[] with flags for keyword |
7 | 42 * characters for current buffer. |
43 * | |
44 * Depends on the option settings 'iskeyword', 'isident', 'isfname', | |
45 * 'isprint' and 'encoding'. | |
46 * | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
47 * The index in g_chartab[] depends on 'encoding': |
7 | 48 * - For non-multi-byte index with the byte (same as the character). |
49 * - For DBCS index with the first byte. | |
50 * - For UTF-8 index with the character (when first byte is up to 0x80 it is | |
51 * the same as the character, if the first byte is 0x80 and above it depends | |
52 * on further bytes). | |
53 * | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
54 * The contents of g_chartab[]: |
7 | 55 * - The lower two bits, masked by CT_CELL_MASK, give the number of display |
56 * cells the character occupies (1 or 2). Not valid for UTF-8 above 0x80. | |
57 * - CT_PRINT_CHAR bit is set when the character is printable (no need to | |
58 * translate the character before displaying it). Note that only DBCS | |
59 * characters can have 2 display cells and still be printable. | |
60 * - CT_FNAME_CHAR bit is set when the character can be in a file name. | |
61 * - CT_ID_CHAR bit is set when the character can be in an identifier. | |
62 * | |
63 * Return FAIL if 'iskeyword', 'isident', 'isfname' or 'isprint' option has an | |
64 * error, OK otherwise. | |
65 */ | |
66 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
67 init_chartab(void) |
7 | 68 { |
69 return buf_init_chartab(curbuf, TRUE); | |
70 } | |
71 | |
72 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
73 buf_init_chartab( |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
74 buf_T *buf, |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
75 int global) // FALSE: only set buf->b_chartab[] |
7 | 76 { |
77 int c; | |
78 int c2; | |
79 char_u *p; | |
80 int i; | |
81 int tilde; | |
82 int do_isalpha; | |
83 | |
84 if (global) | |
85 { | |
86 /* | |
87 * Set the default size for printable characters: | |
88 * From <Space> to '~' is 1 (printable), others are 2 (not printable). | |
89 * This also inits all 'isident' and 'isfname' flags to FALSE. | |
90 */ | |
91 c = 0; | |
92 while (c < ' ') | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
93 g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2; |
7 | 94 while (c <= '~') |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
95 g_chartab[c++] = 1 + CT_PRINT_CHAR; |
7 | 96 while (c < 256) |
97 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
98 // UTF-8: bytes 0xa0 - 0xff are printable (latin1) |
7 | 99 if (enc_utf8 && c >= 0xa0) |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
100 g_chartab[c++] = CT_PRINT_CHAR + 1; |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
101 // euc-jp characters starting with 0x8e are single width |
7 | 102 else if (enc_dbcs == DBCS_JPNU && c == 0x8e) |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
103 g_chartab[c++] = CT_PRINT_CHAR + 1; |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
104 // other double-byte chars can be printable AND double-width |
7 | 105 else if (enc_dbcs != 0 && MB_BYTE2LEN(c) == 2) |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
106 g_chartab[c++] = CT_PRINT_CHAR + 2; |
7 | 107 else |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
108 // the rest is unprintable by default |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
109 g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2; |
7 | 110 } |
111 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
112 // Assume that every multi-byte char is a filename character. |
7 | 113 for (c = 1; c < 256; ++c) |
114 if ((enc_dbcs != 0 && MB_BYTE2LEN(c) > 1) | |
115 || (enc_dbcs == DBCS_JPNU && c == 0x8e) | |
116 || (enc_utf8 && c >= 0xa0)) | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
117 g_chartab[c] |= CT_FNAME_CHAR; |
7 | 118 } |
119 | |
120 /* | |
121 * Init word char flags all to FALSE | |
122 */ | |
20007
aadd1cae2ff5
patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents:
19195
diff
changeset
|
123 CLEAR_FIELD(buf->b_chartab); |
227 | 124 if (enc_dbcs != 0) |
125 for (c = 0; c < 256; ++c) | |
126 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
127 // double-byte characters are probably word characters |
227 | 128 if (MB_BYTE2LEN(c) == 2) |
129 SET_CHARTAB(buf, c); | |
130 } | |
7 | 131 |
132 /* | |
133 * In lisp mode the '-' character is included in keywords. | |
134 */ | |
135 if (buf->b_p_lisp) | |
136 SET_CHARTAB(buf, '-'); | |
137 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
138 // Walk through the 'isident', 'iskeyword', 'isfname' and 'isprint' |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
139 // options Each option is a list of characters, character numbers or |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
140 // ranges, separated by commas, e.g.: "200-210,x,#-178,-" |
7 | 141 for (i = global ? 0 : 3; i <= 3; ++i) |
142 { | |
143 if (i == 0) | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
144 p = p_isi; // first round: 'isident' |
7 | 145 else if (i == 1) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
146 p = p_isp; // second round: 'isprint' |
7 | 147 else if (i == 2) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
148 p = p_isf; // third round: 'isfname' |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
149 else // i == 3 |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
150 p = buf->b_p_isk; // fourth round: 'iskeyword' |
7 | 151 |
152 while (*p) | |
153 { | |
154 tilde = FALSE; | |
155 do_isalpha = FALSE; | |
156 if (*p == '^' && p[1] != NUL) | |
157 { | |
158 tilde = TRUE; | |
159 ++p; | |
160 } | |
161 if (VIM_ISDIGIT(*p)) | |
162 c = getdigits(&p); | |
24665
661d15592d3c
patch 8.2.2871: unnessary VIM_ISDIGIT() calls, badly indented code
Bram Moolenaar <Bram@vim.org>
parents:
24375
diff
changeset
|
163 else if (has_mbyte) |
1955 | 164 c = mb_ptr2char_adv(&p); |
165 else | |
7 | 166 c = *p++; |
167 c2 = -1; | |
168 if (*p == '-' && p[1] != NUL) | |
169 { | |
170 ++p; | |
171 if (VIM_ISDIGIT(*p)) | |
172 c2 = getdigits(&p); | |
24665
661d15592d3c
patch 8.2.2871: unnessary VIM_ISDIGIT() calls, badly indented code
Bram Moolenaar <Bram@vim.org>
parents:
24375
diff
changeset
|
173 else if (has_mbyte) |
1979 | 174 c2 = mb_ptr2char_adv(&p); |
175 else | |
7 | 176 c2 = *p++; |
177 } | |
1979 | 178 if (c <= 0 || c >= 256 || (c2 < c && c2 != -1) || c2 >= 256 |
7 | 179 || !(*p == NUL || *p == ',')) |
180 return FAIL; | |
181 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
182 if (c2 == -1) // not a range |
7 | 183 { |
184 /* | |
185 * A single '@' (not "@-@"): | |
186 * Decide on letters being ID/printable/keyword chars with | |
187 * standard function isalpha(). This takes care of locale for | |
188 * single-byte characters). | |
189 */ | |
190 if (c == '@') | |
191 { | |
192 do_isalpha = TRUE; | |
193 c = 1; | |
194 c2 = 255; | |
195 } | |
196 else | |
197 c2 = c; | |
198 } | |
199 while (c <= c2) | |
200 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
201 // Use the MB_ functions here, because isalpha() doesn't |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
202 // work properly when 'encoding' is "latin1" and the locale is |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
203 // "C". |
15850
a6ca8cf07a98
patch 8.1.0932: Farsi support is outdated and unused
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
204 if (!do_isalpha || MB_ISLOWER(c) || MB_ISUPPER(c)) |
7 | 205 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
206 if (i == 0) // (re)set ID flag |
7 | 207 { |
208 if (tilde) | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
209 g_chartab[c] &= ~CT_ID_CHAR; |
7 | 210 else |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
211 g_chartab[c] |= CT_ID_CHAR; |
7 | 212 } |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
213 else if (i == 1) // (re)set printable |
7 | 214 { |
27490
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
215 if ((c < ' ' || c > '~' |
15595
1ec942f1b648
patch 8.1.0805: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
216 // For double-byte we keep the cell width, so |
1ec942f1b648
patch 8.1.0805: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
217 // that we can detect it from the first byte. |
1ec942f1b648
patch 8.1.0805: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
218 ) && !(enc_dbcs && MB_BYTE2LEN(c) == 2)) |
7 | 219 { |
220 if (tilde) | |
221 { | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
222 g_chartab[c] = (g_chartab[c] & ~CT_CELL_MASK) |
7 | 223 + ((dy_flags & DY_UHEX) ? 4 : 2); |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
224 g_chartab[c] &= ~CT_PRINT_CHAR; |
7 | 225 } |
226 else | |
227 { | |
29595
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
228 g_chartab[c] = (g_chartab[c] & ~CT_CELL_MASK) |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
229 + 1; |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
230 g_chartab[c] |= CT_PRINT_CHAR; |
7 | 231 } |
232 } | |
233 } | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
234 else if (i == 2) // (re)set fname flag |
7 | 235 { |
236 if (tilde) | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
237 g_chartab[c] &= ~CT_FNAME_CHAR; |
7 | 238 else |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
239 g_chartab[c] |= CT_FNAME_CHAR; |
7 | 240 } |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
241 else // i == 3 (re)set keyword flag |
7 | 242 { |
243 if (tilde) | |
244 RESET_CHARTAB(buf, c); | |
245 else | |
246 SET_CHARTAB(buf, c); | |
247 } | |
248 } | |
249 ++c; | |
250 } | |
4096 | 251 |
252 c = *p; | |
7 | 253 p = skip_to_option_part(p); |
4096 | 254 if (c == ',' && *p == NUL) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
255 // Trailing comma is not allowed. |
4096 | 256 return FAIL; |
7 | 257 } |
258 } | |
259 chartab_initialized = TRUE; | |
260 return OK; | |
261 } | |
262 | |
263 /* | |
264 * Translate any special characters in buf[bufsize] in-place. | |
265 * The result is a string with only printable characters, but if there is not | |
266 * enough room, not all characters will be translated. | |
267 */ | |
268 void | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
269 trans_characters( |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
270 char_u *buf, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
271 int bufsize) |
7 | 272 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
273 int len; // length of string needing translation |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
274 int room; // room in buffer after string |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
275 char_u *trs; // translated character |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
276 int trs_len; // length of trs[] |
7 | 277 |
278 len = (int)STRLEN(buf); | |
279 room = bufsize - len; | |
280 while (*buf != 0) | |
281 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
282 // Assume a multi-byte character doesn't need translation. |
474 | 283 if (has_mbyte && (trs_len = (*mb_ptr2len)(buf)) > 1) |
7 | 284 len -= trs_len; |
285 else | |
286 { | |
287 trs = transchar_byte(*buf); | |
288 trs_len = (int)STRLEN(trs); | |
289 if (trs_len > 1) | |
290 { | |
291 room -= trs_len - 1; | |
292 if (room <= 0) | |
293 return; | |
294 mch_memmove(buf + trs_len, buf + 1, (size_t)len); | |
295 } | |
296 mch_memmove(buf, trs, (size_t)trs_len); | |
297 --len; | |
298 } | |
299 buf += trs_len; | |
300 } | |
301 } | |
302 | |
303 /* | |
304 * Translate a string into allocated memory, replacing special chars with | |
305 * printable chars. Returns NULL when out of memory. | |
306 */ | |
307 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
308 transstr(char_u *s) |
7 | 309 { |
310 char_u *res; | |
311 char_u *p; | |
312 int l, len, c; | |
313 char_u hexbuf[11]; | |
314 | |
315 if (has_mbyte) | |
316 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
317 // Compute the length of the result, taking account of unprintable |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
318 // multi-byte characters. |
7 | 319 len = 0; |
320 p = s; | |
321 while (*p != NUL) | |
322 { | |
474 | 323 if ((l = (*mb_ptr2len)(p)) > 1) |
7 | 324 { |
325 c = (*mb_ptr2char)(p); | |
326 p += l; | |
327 if (vim_isprintc(c)) | |
328 len += l; | |
329 else | |
330 { | |
331 transchar_hex(hexbuf, c); | |
835 | 332 len += (int)STRLEN(hexbuf); |
7 | 333 } |
334 } | |
335 else | |
336 { | |
337 l = byte2cells(*p++); | |
338 if (l > 0) | |
339 len += l; | |
340 else | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
341 len += 4; // illegal byte sequence |
7 | 342 } |
343 } | |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
344 res = alloc(len + 1); |
7 | 345 } |
346 else | |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
347 res = alloc(vim_strsize(s) + 1); |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
348 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
349 if (res == NULL) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
350 return NULL; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
351 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
352 *res = NUL; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
353 p = s; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
354 while (*p != NUL) |
7 | 355 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
356 if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1) |
7 | 357 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
358 c = (*mb_ptr2char)(p); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
359 if (vim_isprintc(c)) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
360 STRNCAT(res, p, l); // append printable multi-byte char |
7 | 361 else |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
362 transchar_hex(res + STRLEN(res), c); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
363 p += l; |
7 | 364 } |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
365 else |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31489
diff
changeset
|
366 STRCAT(res, transchar_byte(*p++)); |
7 | 367 } |
368 return res; | |
369 } | |
370 | |
371 /* | |
221 | 372 * Convert the string "str[orglen]" to do ignore-case comparing. Uses the |
373 * current locale. | |
130 | 374 * When "buf" is NULL returns an allocated string (NULL for out-of-memory). |
375 * Otherwise puts the result in "buf[buflen]". | |
7 | 376 */ |
377 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
378 str_foldcase( |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
379 char_u *str, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
380 int orglen, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
381 char_u *buf, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
382 int buflen) |
7 | 383 { |
384 garray_T ga; | |
385 int i; | |
130 | 386 int len = orglen; |
7 | 387 |
388 #define GA_CHAR(i) ((char_u *)ga.ga_data)[i] | |
27752
c1d1639b52dd
patch 8.2.4402: missing parenthesis may cause unexpected problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
389 #define GA_PTR(i) ((char_u *)ga.ga_data + (i)) |
130 | 390 #define STR_CHAR(i) (buf == NULL ? GA_CHAR(i) : buf[i]) |
27752
c1d1639b52dd
patch 8.2.4402: missing parenthesis may cause unexpected problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
391 #define STR_PTR(i) (buf == NULL ? GA_PTR(i) : buf + (i)) |
7 | 392 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
393 // Copy "str" into "buf" or allocated memory, unmodified. |
130 | 394 if (buf == NULL) |
395 { | |
396 ga_init2(&ga, 1, 10); | |
397 if (ga_grow(&ga, len + 1) == FAIL) | |
398 return NULL; | |
399 mch_memmove(ga.ga_data, str, (size_t)len); | |
400 ga.ga_len = len; | |
401 } | |
402 else | |
403 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
404 if (len >= buflen) // Ugly! |
130 | 405 len = buflen - 1; |
406 mch_memmove(buf, str, (size_t)len); | |
407 } | |
408 if (buf == NULL) | |
409 GA_CHAR(len) = NUL; | |
410 else | |
411 buf[len] = NUL; | |
7 | 412 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
413 // Make each character lower case. |
7 | 414 i = 0; |
130 | 415 while (STR_CHAR(i) != NUL) |
7 | 416 { |
130 | 417 if (enc_utf8 || (has_mbyte && MB_BYTE2LEN(STR_CHAR(i)) > 1)) |
7 | 418 { |
419 if (enc_utf8) | |
420 { | |
1654 | 421 int c = utf_ptr2char(STR_PTR(i)); |
3263 | 422 int olen = utf_ptr2len(STR_PTR(i)); |
1654 | 423 int lc = utf_tolower(c); |
7 | 424 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
425 // Only replace the character when it is not an invalid |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
426 // sequence (ASCII character or more than one byte) and |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
427 // utf_tolower() doesn't return the original character. |
3263 | 428 if ((c < 0x80 || olen > 1) && c != lc) |
7 | 429 { |
3263 | 430 int nlen = utf_char2len(lc); |
7 | 431 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
432 // If the byte length changes need to shift the following |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
433 // characters forward or backward. |
3263 | 434 if (olen != nlen) |
7 | 435 { |
3263 | 436 if (nlen > olen) |
130 | 437 { |
3263 | 438 if (buf == NULL |
439 ? ga_grow(&ga, nlen - olen + 1) == FAIL | |
440 : len + nlen - olen >= buflen) | |
7 | 441 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
442 // out of memory, keep old char |
7 | 443 lc = c; |
3263 | 444 nlen = olen; |
7 | 445 } |
130 | 446 } |
3263 | 447 if (olen != nlen) |
7 | 448 { |
130 | 449 if (buf == NULL) |
450 { | |
3263 | 451 STRMOVE(GA_PTR(i) + nlen, GA_PTR(i) + olen); |
452 ga.ga_len += nlen - olen; | |
130 | 453 } |
454 else | |
455 { | |
3263 | 456 STRMOVE(buf + i + nlen, buf + i + olen); |
457 len += nlen - olen; | |
130 | 458 } |
7 | 459 } |
460 } | |
130 | 461 (void)utf_char2bytes(lc, STR_PTR(i)); |
7 | 462 } |
463 } | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
464 // skip to next multi-byte char |
474 | 465 i += (*mb_ptr2len)(STR_PTR(i)); |
7 | 466 } |
467 else | |
468 { | |
130 | 469 if (buf == NULL) |
470 GA_CHAR(i) = TOLOWER_LOC(GA_CHAR(i)); | |
471 else | |
472 buf[i] = TOLOWER_LOC(buf[i]); | |
7 | 473 ++i; |
474 } | |
475 } | |
476 | |
130 | 477 if (buf == NULL) |
478 return (char_u *)ga.ga_data; | |
479 return buf; | |
7 | 480 } |
481 | |
482 /* | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
483 * Catch 22: g_chartab[] can't be initialized before the options are |
7 | 484 * initialized, and initializing options may cause transchar() to be called! |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
485 * When chartab_initialized == FALSE don't use g_chartab[]. |
7 | 486 * Does NOT work for multi-byte characters, c must be <= 255. |
487 * Also doesn't work for the first byte of a multi-byte, "c" must be a | |
488 * character! | |
489 */ | |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
490 static char_u transchar_charbuf[7]; |
7 | 491 |
492 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
493 transchar(int c) |
7 | 494 { |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
495 return transchar_buf(curbuf, c); |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
496 } |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
497 |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
498 char_u * |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
499 transchar_buf(buf_T *buf, int c) |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
500 { |
7 | 501 int i; |
502 | |
503 i = 0; | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
504 if (IS_SPECIAL(c)) // special key code, display as ~@ char |
7 | 505 { |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
506 transchar_charbuf[0] = '~'; |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
507 transchar_charbuf[1] = '@'; |
7 | 508 i = 2; |
509 c = K_SECOND(c); | |
510 } | |
511 | |
27490
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
512 if ((!chartab_initialized && ((c >= ' ' && c <= '~'))) |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
513 || (c < 256 && vim_isprintc_strict(c))) |
7 | 514 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
515 // printable character |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
516 transchar_charbuf[i] = c; |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
517 transchar_charbuf[i + 1] = NUL; |
7 | 518 } |
519 else | |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
520 transchar_nonprint(buf, transchar_charbuf + i, c); |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
521 return transchar_charbuf; |
7 | 522 } |
523 | |
524 /* | |
525 * Like transchar(), but called with a byte instead of a character. Checks | |
31964
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
526 * for an illegal UTF-8 byte. Uses 'fileformat' of the current buffer. |
7 | 527 */ |
528 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
529 transchar_byte(int c) |
7 | 530 { |
31964
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
531 return transchar_byte_buf(curbuf, c); |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
532 } |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
533 |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
534 /* |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
535 * Like transchar_buf(), but called with a byte instead of a character. Checks |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
536 * for an illegal UTF-8 byte. Uses 'fileformat' of "buf", unless it is NULL. |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
537 */ |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
538 char_u * |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
539 transchar_byte_buf(buf_T *buf, int c) |
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
540 { |
7 | 541 if (enc_utf8 && c >= 0x80) |
542 { | |
31964
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
543 transchar_nonprint(buf, transchar_charbuf, c); |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
544 return transchar_charbuf; |
7 | 545 } |
31964
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
546 return transchar_buf(buf, c); |
7 | 547 } |
548 /* | |
549 * Convert non-printable character to two or more printable characters in | |
31906
9fc3b3928ad5
patch 9.0.1285: various small problems
Bram Moolenaar <Bram@vim.org>
parents:
31667
diff
changeset
|
550 * "charbuf[]". "charbuf" needs to be able to hold five bytes. |
7 | 551 * Does NOT work for multi-byte characters, c must be <= 255. |
552 */ | |
553 void | |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
554 transchar_nonprint(buf_T *buf, char_u *charbuf, int c) |
7 | 555 { |
556 if (c == NL) | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
557 c = NUL; // we use newline in place of a NUL |
31964
c0a9bc376b54
patch 9.0.1314: :messages behavior depends on 'fileformat' of current buffer
Bram Moolenaar <Bram@vim.org>
parents:
31946
diff
changeset
|
558 else if (buf != NULL && c == CAR && get_fileformat(buf) == EOL_MAC) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
559 c = NL; // we use CR in place of NL in this case |
7 | 560 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
561 if (dy_flags & DY_UHEX) // 'display' has "uhex" |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
562 transchar_hex(charbuf, c); |
7 | 563 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
564 else if (c <= 0x7f) // 0x00 - 0x1f and 0x7f |
7 | 565 { |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
566 charbuf[0] = '^'; |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
567 charbuf[1] = c ^ 0x40; // DEL displayed as ^? |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
568 charbuf[2] = NUL; |
7 | 569 } |
28013
dbf6d5ea7a1f
patch 8.2.4531: LGTM warnings for condition and buffer size
Bram Moolenaar <Bram@vim.org>
parents:
27952
diff
changeset
|
570 else if (enc_utf8) |
7 | 571 { |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
572 transchar_hex(charbuf, c); |
7 | 573 } |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
574 else if (c >= ' ' + 0x80 && c <= '~' + 0x80) // 0xa0 - 0xfe |
7 | 575 { |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
576 charbuf[0] = '|'; |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
577 charbuf[1] = c - 0x80; |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
578 charbuf[2] = NUL; |
7 | 579 } |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
580 else // 0x80 - 0x9f and 0xff |
7 | 581 { |
20782
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
582 charbuf[0] = '~'; |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
583 charbuf[1] = (c - 0x80) ^ 0x40; // 0xff displayed as ~? |
c4bce986c31a
patch 8.2.0943: displaying ^M or ^J depends on current buffer
Bram Moolenaar <Bram@vim.org>
parents:
20665
diff
changeset
|
584 charbuf[2] = NUL; |
7 | 585 } |
586 } | |
587 | |
588 void | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
589 transchar_hex(char_u *buf, int c) |
7 | 590 { |
591 int i = 0; | |
592 | |
593 buf[0] = '<'; | |
594 if (c > 255) | |
595 { | |
596 buf[++i] = nr2hex((unsigned)c >> 12); | |
597 buf[++i] = nr2hex((unsigned)c >> 8); | |
598 } | |
599 buf[++i] = nr2hex((unsigned)c >> 4); | |
1869 | 600 buf[++i] = nr2hex((unsigned)c); |
7 | 601 buf[++i] = '>'; |
602 buf[++i] = NUL; | |
603 } | |
604 | |
605 /* | |
606 * Convert the lower 4 bits of byte "c" to its hex character. | |
607 * Lower case letters are used to avoid the confusion of <F1> being 0xf1 or | |
608 * function key 1. | |
609 */ | |
1869 | 610 static unsigned |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
611 nr2hex(unsigned c) |
7 | 612 { |
613 if ((c & 0xf) <= 9) | |
614 return (c & 0xf) + '0'; | |
615 return (c & 0xf) - 10 + 'a'; | |
616 } | |
617 | |
618 /* | |
619 * Return number of display cells occupied by byte "b". | |
620 * Caller must make sure 0 <= b <= 255. | |
621 * For multi-byte mode "b" must be the first byte of a character. | |
622 * A TAB is counted as two cells: "^I". | |
623 * For UTF-8 mode this will return 0 for bytes >= 0x80, because the number of | |
624 * cells depends on further bytes. | |
625 */ | |
626 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
627 byte2cells(int b) |
7 | 628 { |
629 if (enc_utf8 && b >= 0x80) | |
630 return 0; | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
631 return (g_chartab[b] & CT_CELL_MASK); |
7 | 632 } |
633 | |
634 /* | |
635 * Return number of display cells occupied by character "c". | |
636 * "c" can be a special key (negative number) in which case 3 or 4 is returned. | |
637 * A TAB is counted as two cells: "^I" or four: "<09>". | |
638 */ | |
639 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
640 char2cells(int c) |
7 | 641 { |
642 if (IS_SPECIAL(c)) | |
643 return char2cells(K_SECOND(c)) + 2; | |
644 if (c >= 0x80) | |
645 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
646 // UTF-8: above 0x80 need to check the value |
7 | 647 if (enc_utf8) |
648 return utf_char2cells(c); | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
649 // DBCS: double-byte means double-width, except for euc-jp with first |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
650 // byte 0x8e |
7 | 651 if (enc_dbcs != 0 && c >= 0x100) |
652 { | |
653 if (enc_dbcs == DBCS_JPNU && ((unsigned)c >> 8) == 0x8e) | |
654 return 1; | |
655 return 2; | |
656 } | |
657 } | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
658 return (g_chartab[c & 0xff] & CT_CELL_MASK); |
7 | 659 } |
660 | |
661 /* | |
662 * Return number of display cells occupied by character at "*p". | |
663 * A TAB is counted as two cells: "^I" or four: "<09>". | |
664 */ | |
665 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
666 ptr2cells(char_u *p) |
7 | 667 { |
29597
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
668 if (!has_mbyte) |
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
669 return byte2cells(*p); |
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
670 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
671 // For UTF-8 we need to look at more bytes if the first byte is >= 0x80. |
7 | 672 if (enc_utf8 && *p >= 0x80) |
673 return utf_ptr2cells(p); | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
674 // For DBCS we can tell the cell count from the first byte. |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
675 return (g_chartab[*p] & CT_CELL_MASK); |
7 | 676 } |
677 | |
678 /* | |
3292 | 679 * Return the number of character cells string "s" will take on the screen, |
7 | 680 * counting TABs as two characters: "^I". |
681 */ | |
682 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
683 vim_strsize(char_u *s) |
7 | 684 { |
685 return vim_strnsize(s, (int)MAXCOL); | |
686 } | |
687 | |
688 /* | |
3292 | 689 * Return the number of character cells string "s[len]" will take on the |
690 * screen, counting TABs as two characters: "^I". | |
7 | 691 */ |
692 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
693 vim_strnsize(char_u *s, int len) |
7 | 694 { |
695 int size = 0; | |
696 | |
697 while (*s != NUL && --len >= 0) | |
29597
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
698 { |
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
699 int l = (*mb_ptr2len)(s); |
7 | 700 |
29597
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
701 size += ptr2cells(s); |
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
702 s += l; |
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
703 len -= l - 1; |
f2d7f20d83c3
patch 9.0.0139: truncating virtual text after a line not implemented
Bram Moolenaar <Bram@vim.org>
parents:
29595
diff
changeset
|
704 } |
15595
1ec942f1b648
patch 8.1.0805: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
705 |
7 | 706 return size; |
707 } | |
708 | |
709 /* | |
710 * Return the number of characters 'c' will take on the screen, taking | |
711 * into account the size of a tab. | |
712 * Use a define to make it fast, this is used very often!!! | |
713 * Also see getvcol() below. | |
714 */ | |
715 | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
716 #ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
717 # define RET_WIN_BUF_CHARTABSIZE(wp, buf, p, col) \ |
27752
c1d1639b52dd
patch 8.2.4402: missing parenthesis may cause unexpected problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
718 if (*(p) == TAB && (!(wp)->w_p_list || (wp)->w_lcs_chars.tab1)) \ |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
719 { \ |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
720 return tabstop_padding(col, (buf)->b_p_ts, (buf)->b_p_vts_array); \ |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
721 } \ |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
722 else \ |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
723 return ptr2cells(p); |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
724 #else |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
725 # define RET_WIN_BUF_CHARTABSIZE(wp, buf, p, col) \ |
23952
44be09b25619
patch 8.2.2518: 'listchars' should be window-local
Bram Moolenaar <Bram@vim.org>
parents:
23533
diff
changeset
|
726 if (*(p) == TAB && (!(wp)->w_p_list || wp->w_lcs_chars.tab1)) \ |
7 | 727 { \ |
728 int ts; \ | |
729 ts = (buf)->b_p_ts; \ | |
730 return (int)(ts - (col % ts)); \ | |
731 } \ | |
732 else \ | |
733 return ptr2cells(p); | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
734 #endif |
7 | 735 |
736 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
737 chartabsize(char_u *p, colnr_T col) |
7 | 738 { |
739 RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, p, col) | |
740 } | |
741 | |
742 #ifdef FEAT_LINEBREAK | |
743 static int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
744 win_chartabsize(win_T *wp, char_u *p, colnr_T col) |
7 | 745 { |
746 RET_WIN_BUF_CHARTABSIZE(wp, wp->w_buffer, p, col) | |
747 } | |
748 #endif | |
749 | |
750 /* | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
751 * Return the number of characters the string "s" will take on the screen, |
2339
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
752 * taking into account the size of a tab. |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
753 * Does not handle text properties, since "s" is not a buffer line. |
7 | 754 */ |
755 int | |
30833
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
756 linetabsize_str(char_u *s) |
7 | 757 { |
2339
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
758 return linetabsize_col(0, s); |
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
759 } |
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
760 |
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
761 /* |
30833
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
762 * Like linetabsize_str(), but "s" starts at column "startcol". |
2339
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
763 */ |
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
764 int |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
765 linetabsize_col(int startcol, char_u *s) |
2339
01e4b4d37842
Added strdisplaywidth() function.
Bram Moolenaar <bram@vim.org>
parents:
2108
diff
changeset
|
766 { |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
767 chartabsize_T cts; |
7 | 768 |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
769 init_chartabsize_arg(&cts, curwin, 0, startcol, s, s); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
770 while (*cts.cts_ptr != NUL) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
771 cts.cts_vcol += lbr_chartabsize_adv(&cts); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
772 clear_chartabsize_arg(&cts); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
773 return (int)cts.cts_vcol; |
7 | 774 } |
775 | |
776 /* | |
30833
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
777 * Like linetabsize_str(), but for a given window instead of the current one. |
7 | 778 */ |
779 int | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
780 win_linetabsize(win_T *wp, linenr_T lnum, char_u *line, colnr_T len) |
7 | 781 { |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
782 chartabsize_T cts; |
7 | 783 |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
784 init_chartabsize_arg(&cts, wp, lnum, 0, line, line); |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
785 win_linetabsize_cts(&cts, len); |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
786 clear_chartabsize_arg(&cts); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
787 return (int)cts.cts_vcol; |
7 | 788 } |
789 | |
30833
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
790 /* |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
791 * Return the number of cells line "lnum" of window "wp" will take on the |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
792 * screen, taking into account the size of a tab and text properties. |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
793 */ |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
794 int |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
795 linetabsize(win_T *wp, linenr_T lnum) |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
796 { |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
797 return win_linetabsize(wp, lnum, |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
798 ml_get_buf(wp->w_buffer, lnum, FALSE), (colnr_T)MAXCOL); |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
799 } |
e3d5781c7ec6
patch 9.0.0751: 'scrolloff' does not work well with 'smoothscroll'
Bram Moolenaar <Bram@vim.org>
parents:
30825
diff
changeset
|
800 |
34623
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
801 /* |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
802 * Like linetabsize(), but excludes 'above'/'after'/'right'/'below' aligned |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
803 * virtual text, while keeping inline virtual text. |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
804 */ |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
805 int |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
806 linetabsize_no_outer(win_T *wp, linenr_T lnum) |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
807 { |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
808 #ifndef FEAT_PROP_POPUP |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
809 return linetabsize(wp, lnum); |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
810 #else |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
811 chartabsize_T cts; |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
812 char_u *line = ml_get_buf(wp->w_buffer, lnum, FALSE); |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
813 |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
814 init_chartabsize_arg(&cts, wp, lnum, 0, line, line); |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
815 |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
816 if (cts.cts_text_prop_count) |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
817 { |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
818 int write_idx = 0; |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
819 for (int read_idx = 0; read_idx < cts.cts_text_prop_count; read_idx++) |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
820 { |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
821 textprop_T *tp = &cts.cts_text_props[read_idx]; |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
822 if (tp->tp_col != MAXCOL) |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
823 { |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
824 if (read_idx != write_idx) |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
825 cts.cts_text_props[write_idx] = *tp; |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
826 write_idx++; |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
827 } |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
828 } |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
829 cts.cts_text_prop_count = write_idx; |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
830 if (cts.cts_text_prop_count == 0) |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
831 VIM_CLEAR(cts.cts_text_props); |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
832 } |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
833 |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
834 win_linetabsize_cts(&cts, (colnr_T)MAXCOL); |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
835 clear_chartabsize_arg(&cts); |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
836 return (int)cts.cts_vcol; |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
837 #endif |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
838 } |
65e7eaf68f19
patch 9.1.0200: `gj`/`gk` not skipping over outer virtual text lines
Christian Brabandt <cb@256bit.org>
parents:
34540
diff
changeset
|
839 |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
840 void |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
841 win_linetabsize_cts(chartabsize_T *cts, colnr_T len) |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
842 { |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
843 #ifdef FEAT_PROP_POPUP |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
844 cts->cts_with_trailing = len == MAXCOL; |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
845 #endif |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
846 for ( ; *cts->cts_ptr != NUL && (len == MAXCOL || cts->cts_ptr < cts->cts_line + len); |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
847 MB_PTR_ADV(cts->cts_ptr)) |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
848 cts->cts_vcol += win_lbr_chartabsize(cts, NULL); |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
849 #ifdef FEAT_PROP_POPUP |
32925
5d17e74a756d
patch 9.0.1770: lines disappear when modifying chars before virt text
Christian Brabandt <cb@256bit.org>
parents:
32790
diff
changeset
|
850 // check for a virtual text at the end of a line or on an empty line |
33021
2b47322be0d1
patch 9.0.1802: Multiline regex with Visual selection fails with virtual text
Christian Brabandt <cb@256bit.org>
parents:
33017
diff
changeset
|
851 if (len == MAXCOL && cts->cts_has_prop_with_text && *cts->cts_ptr == NUL) |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
852 { |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
853 (void)win_lbr_chartabsize(cts, NULL); |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
854 cts->cts_vcol += cts->cts_cur_text_width; |
31946
05414bdc5c2c
patch 9.0.1305: cursor in wrong line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
31938
diff
changeset
|
855 // when properties are above or below the empty line must also be |
05414bdc5c2c
patch 9.0.1305: cursor in wrong line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
31938
diff
changeset
|
856 // counted |
32925
5d17e74a756d
patch 9.0.1770: lines disappear when modifying chars before virt text
Christian Brabandt <cb@256bit.org>
parents:
32790
diff
changeset
|
857 if (cts->cts_ptr == cts->cts_line && cts->cts_prop_lines > 0) |
31946
05414bdc5c2c
patch 9.0.1305: cursor in wrong line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
31938
diff
changeset
|
858 ++cts->cts_vcol; |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
859 } |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
860 #endif |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
861 } |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
862 |
7 | 863 /* |
42 | 864 * Return TRUE if 'c' is a normal identifier character: |
865 * Letters and characters from the 'isident' option. | |
7 | 866 */ |
867 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
868 vim_isIDc(int c) |
7 | 869 { |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
870 return (c > 0 && c < 0x100 && (g_chartab[c] & CT_ID_CHAR)); |
7 | 871 } |
872 | |
873 /* | |
24375
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
874 * Like vim_isIDc() but not using the 'isident' option: letters, numbers and |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
875 * underscore. |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
876 */ |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
877 int |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
878 vim_isNormalIDc(int c) |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
879 { |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
880 return ASCII_ISALNUM(c) || c == '_'; |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
881 } |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
882 |
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24268
diff
changeset
|
883 /* |
7 | 884 * return TRUE if 'c' is a keyword character: Letters and characters from |
10549
055b1633aed7
patch 8.0.0164: outdated and misplaced comments
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
885 * 'iskeyword' option for the current buffer. |
7 | 886 * For multi-byte characters mb_get_class() is used (builtin rules). |
887 */ | |
888 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
889 vim_iswordc(int c) |
7 | 890 { |
4043 | 891 return vim_iswordc_buf(c, curbuf); |
892 } | |
893 | |
894 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
895 vim_iswordc_buf(int c, buf_T *buf) |
4043 | 896 { |
7 | 897 if (c >= 0x100) |
898 { | |
899 if (enc_dbcs != 0) | |
1869 | 900 return dbcs_class((unsigned)c >> 8, (unsigned)(c & 0xff)) >= 2; |
7 | 901 if (enc_utf8) |
10724
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
902 return utf_class_buf(c, buf) >= 2; |
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
903 return FALSE; |
7 | 904 } |
10724
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
905 return (c > 0 && GET_CHARTAB(buf, c) != 0); |
7 | 906 } |
907 | |
908 /* | |
909 * Just like vim_iswordc() but uses a pointer to the (multi-byte) character. | |
910 */ | |
911 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
912 vim_iswordp(char_u *p) |
7 | 913 { |
10724
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
914 return vim_iswordp_buf(p, curbuf); |
7 | 915 } |
916 | |
917 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
918 vim_iswordp_buf(char_u *p, buf_T *buf) |
7 | 919 { |
10724
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
920 int c = *p; |
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
921 |
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
922 if (has_mbyte && MB_BYTE2LEN(c) > 1) |
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
923 c = (*mb_ptr2char)(p); |
ae1c6bf22e5f
patch 8.0.0252: not properly recognizing word characters between 128 and 255
Christian Brabandt <cb@256bit.org>
parents:
10720
diff
changeset
|
924 return vim_iswordc_buf(c, buf); |
7 | 925 } |
926 | |
927 /* | |
29595
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
928 * Return TRUE if 'c' is a valid file-name character as specified with the |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
929 * 'isfname' option. |
7 | 930 * Assume characters above 0x100 are valid (multi-byte). |
29595
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
931 * To be used for commands like "gf". |
7 | 932 */ |
933 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
934 vim_isfilec(int c) |
7 | 935 { |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
936 return (c >= 0x100 || (c > 0 && (g_chartab[c] & CT_FNAME_CHAR))); |
7 | 937 } |
938 | |
32144
f3987fde6dea
patch 9.0.1403: unused variables and functions
Bram Moolenaar <Bram@vim.org>
parents:
32098
diff
changeset
|
939 #if defined(FEAT_SPELL) || defined(PROTO) |
7 | 940 /* |
29595
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
941 * Return TRUE if 'c' is a valid file-name character, including characters left |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
942 * out of 'isfname' to make "gf" work, such as comma, space, '@', etc. |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
943 */ |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
944 int |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
945 vim_is_fname_char(int c) |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
946 { |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
947 return vim_isfilec(c) || c == ',' || c == ' ' || c == '@'; |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
948 } |
32144
f3987fde6dea
patch 9.0.1403: unused variables and functions
Bram Moolenaar <Bram@vim.org>
parents:
32098
diff
changeset
|
949 #endif |
29595
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
950 |
5233acfa06f1
patch 9.0.0138: not enough characters accepted for 'spellfile'
Bram Moolenaar <Bram@vim.org>
parents:
29583
diff
changeset
|
951 /* |
1369 | 952 * return TRUE if 'c' is a valid file-name character or a wildcard character |
953 * Assume characters above 0x100 are valid (multi-byte). | |
954 * Explicitly interpret ']' as a wildcard character as mch_has_wildcard("]") | |
955 * returns false. | |
956 */ | |
957 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
958 vim_isfilec_or_wc(int c) |
1369 | 959 { |
960 char_u buf[2]; | |
961 | |
962 buf[0] = (char_u)c; | |
963 buf[1] = NUL; | |
964 return vim_isfilec(c) || c == ']' || mch_has_wildcard(buf); | |
965 } | |
966 | |
967 /* | |
11333
fef09eb74832
patch 8.0.0552: toupper and tolower don't work properly for Turkish
Christian Brabandt <cb@256bit.org>
parents:
11133
diff
changeset
|
968 * Return TRUE if 'c' is a printable character. |
7 | 969 * Assume characters above 0x100 are printable (multi-byte), except for |
970 * Unicode. | |
971 */ | |
972 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
973 vim_isprintc(int c) |
7 | 974 { |
975 if (enc_utf8 && c >= 0x100) | |
976 return utf_printable(c); | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
977 return (c >= 0x100 || (c > 0 && (g_chartab[c] & CT_PRINT_CHAR))); |
7 | 978 } |
979 | |
980 /* | |
981 * Strict version of vim_isprintc(c), don't return TRUE if "c" is the head | |
982 * byte of a double-byte character. | |
983 */ | |
984 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
985 vim_isprintc_strict(int c) |
7 | 986 { |
987 if (enc_dbcs != 0 && c < 0x100 && MB_BYTE2LEN(c) > 1) | |
988 return FALSE; | |
989 if (enc_utf8 && c >= 0x100) | |
990 return utf_printable(c); | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
991 return (c >= 0x100 || (c > 0 && (g_chartab[c] & CT_PRINT_CHAR))); |
7 | 992 } |
993 | |
994 /* | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
995 * Prepare the structure passed to chartabsize functions. |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
996 * "line" is the start of the line, "ptr" is the first relevant character. |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
997 * When "lnum" is zero do not use text properties that insert text. |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
998 */ |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
999 void |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1000 init_chartabsize_arg( |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1001 chartabsize_T *cts, |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1002 win_T *wp, |
30152
1e6d387bd51f
patch 9.0.0412: compiler warning for unused argument
Bram Moolenaar <Bram@vim.org>
parents:
30148
diff
changeset
|
1003 linenr_T lnum UNUSED, |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1004 colnr_T col, |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1005 char_u *line, |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1006 char_u *ptr) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1007 { |
29574
24f01baa27b2
patch 9.0.0128: Coverity complains about possible double free
Bram Moolenaar <Bram@vim.org>
parents:
29568
diff
changeset
|
1008 CLEAR_POINTER(cts); |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1009 cts->cts_win = wp; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1010 cts->cts_vcol = col; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1011 cts->cts_line = line; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1012 cts->cts_ptr = ptr; |
34153
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1013 #ifdef FEAT_LINEBREAK |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1014 cts->cts_bri_size = -1; |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1015 #endif |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1016 #ifdef FEAT_PROP_POPUP |
30257
45788c16b3a5
patch 9.0.0464: with virtual text "above" indenting doesn't work well
Bram Moolenaar <Bram@vim.org>
parents:
30207
diff
changeset
|
1017 if (lnum > 0 && !ignore_text_props) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1018 { |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1019 char_u *prop_start; |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1020 int count; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1021 |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1022 count = get_text_props(wp->w_buffer, lnum, &prop_start, FALSE); |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1023 cts->cts_text_prop_count = count; |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1024 if (count > 0) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1025 { |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1026 // Make a copy of the properties, so that they are properly |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1027 // aligned. Make it twice as long for the sorting below. |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1028 cts->cts_text_props = ALLOC_MULT(textprop_T, count * 2); |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1029 if (cts->cts_text_props == NULL) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1030 cts->cts_text_prop_count = 0; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1031 else |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1032 { |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1033 int i; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1034 |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1035 mch_memmove(cts->cts_text_props + count, prop_start, |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1036 count * sizeof(textprop_T)); |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1037 for (i = 0; i < count; ++i) |
31319
243c35fad9cb
patch 9.0.0993: display errors when adding or removing text property type
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
1038 { |
243c35fad9cb
patch 9.0.0993: display errors when adding or removing text property type
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
1039 textprop_T *tp = cts->cts_text_props + i + count; |
243c35fad9cb
patch 9.0.0993: display errors when adding or removing text property type
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
1040 if (tp->tp_id < 0 |
243c35fad9cb
patch 9.0.0993: display errors when adding or removing text property type
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
1041 && text_prop_type_valid(wp->w_buffer, tp)) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1042 { |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1043 cts->cts_has_prop_with_text = TRUE; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1044 break; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1045 } |
31319
243c35fad9cb
patch 9.0.0993: display errors when adding or removing text property type
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
1046 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1047 if (!cts->cts_has_prop_with_text) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1048 { |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1049 // won't use the text properties, free them |
29574
24f01baa27b2
patch 9.0.0128: Coverity complains about possible double free
Bram Moolenaar <Bram@vim.org>
parents:
29568
diff
changeset
|
1050 VIM_CLEAR(cts->cts_text_props); |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1051 cts->cts_text_prop_count = 0; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1052 } |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1053 else |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1054 { |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1055 int *text_prop_idxs; |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1056 |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1057 // Need to sort the array to get any truncation right. |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1058 // Do the sorting in the second part of the array, then |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1059 // move the sorted props to the first part of the array. |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1060 text_prop_idxs = ALLOC_MULT(int, count); |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1061 if (text_prop_idxs != NULL) |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1062 { |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1063 for (i = 0; i < count; ++i) |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1064 text_prop_idxs[i] = i + count; |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1065 sort_text_props(curbuf, cts->cts_text_props, |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1066 text_prop_idxs, count); |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1067 // Here we want the reverse order. |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1068 for (i = 0; i < count; ++i) |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1069 cts->cts_text_props[count - i - 1] = |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1070 cts->cts_text_props[text_prop_idxs[i]]; |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1071 vim_free(text_prop_idxs); |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1072 } |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1073 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1074 } |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1075 } |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1076 } |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1077 #endif |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1078 } |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1079 |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1080 /* |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1081 * Free any allocated item in "cts". |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1082 */ |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1083 void |
29453
decd0a51b99f
patch 9.0.0068: build fails with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
29451
diff
changeset
|
1084 clear_chartabsize_arg(chartabsize_T *cts UNUSED) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1085 { |
29453
decd0a51b99f
patch 9.0.0068: build fails with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
29451
diff
changeset
|
1086 #ifdef FEAT_PROP_POPUP |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1087 if (cts->cts_text_prop_count > 0) |
29465
1ae3e2d691a0
patch 9.0.0074: Coverity warns for double free
Bram Moolenaar <Bram@vim.org>
parents:
29453
diff
changeset
|
1088 { |
29574
24f01baa27b2
patch 9.0.0128: Coverity complains about possible double free
Bram Moolenaar <Bram@vim.org>
parents:
29568
diff
changeset
|
1089 VIM_CLEAR(cts->cts_text_props); |
24f01baa27b2
patch 9.0.0128: Coverity complains about possible double free
Bram Moolenaar <Bram@vim.org>
parents:
29568
diff
changeset
|
1090 cts->cts_text_prop_count = 0; |
29465
1ae3e2d691a0
patch 9.0.0074: Coverity warns for double free
Bram Moolenaar <Bram@vim.org>
parents:
29453
diff
changeset
|
1091 } |
29453
decd0a51b99f
patch 9.0.0068: build fails with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
29451
diff
changeset
|
1092 #endif |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1093 } |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1094 |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1095 /* |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1096 * Like chartabsize(), but also check for line breaks on the screen and text |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1097 * properties that insert text. |
7 | 1098 */ |
1099 int | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1100 lbr_chartabsize(chartabsize_T *cts) |
7 | 1101 { |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1102 #if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1103 if (1 |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1104 # ifdef FEAT_LINEBREAK |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1105 && !curwin->w_p_lbr && *get_showbreak_value(curwin) == NUL |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1106 && !curwin->w_p_bri |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1107 # endif |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1108 # ifdef FEAT_PROP_POPUP |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1109 && !cts->cts_has_prop_with_text |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1110 #endif |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1111 ) |
7 | 1112 { |
1113 #endif | |
1114 if (curwin->w_p_wrap) | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1115 return win_nolbr_chartabsize(cts, NULL); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1116 RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, cts->cts_ptr, cts->cts_vcol) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1117 #if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) |
7 | 1118 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1119 return win_lbr_chartabsize(cts, NULL); |
7 | 1120 #endif |
1121 } | |
1122 | |
1123 /* | |
1124 * Call lbr_chartabsize() and advance the pointer. | |
1125 */ | |
1126 int | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1127 lbr_chartabsize_adv(chartabsize_T *cts) |
7 | 1128 { |
1129 int retval; | |
1130 | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1131 retval = lbr_chartabsize(cts); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1132 MB_PTR_ADV(cts->cts_ptr); |
7 | 1133 return retval; |
1134 } | |
1135 | |
1136 /* | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1137 * Return the screen size of the character indicated by "cts". |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1138 * "cts->cts_cur_text_width" is set to the extra size for a text property that |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1139 * inserts text. |
7 | 1140 * This function is used very often, keep it fast!!!! |
1141 * | |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1142 * If "headp" not NULL, set "*headp" to the size of 'showbreak'/'breakindent' |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1143 * included in the return value. |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1144 * When "cts->cts_max_head_vcol" is positive, only count in "*headp" the size |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1145 * of 'showbreak'/'breakindent' before "cts->cts_max_head_vcol". |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1146 * When "cts->cts_max_head_vcol" is negative, only count in "*headp" the size |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1147 * of 'showbreak'/'breakindent' before where cursor should be placed. |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1148 * |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1149 * Warning: "*headp" may not be set if it's 0, init to 0 before calling. |
7 | 1150 */ |
1151 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1152 win_lbr_chartabsize( |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1153 chartabsize_T *cts, |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1154 int *headp UNUSED) |
7 | 1155 { |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1156 win_T *wp = cts->cts_win; |
30825
c7983f593fa7
patch 9.0.0747: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
30749
diff
changeset
|
1157 #if defined(FEAT_PROP_POPUP) || defined(FEAT_LINEBREAK) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1158 char_u *line = cts->cts_line; // start of the line |
29453
decd0a51b99f
patch 9.0.0068: build fails with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
29451
diff
changeset
|
1159 #endif |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1160 char_u *s = cts->cts_ptr; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1161 colnr_T vcol = cts->cts_vcol; |
7 | 1162 #ifdef FEAT_LINEBREAK |
1163 int size; | |
1164 int mb_added = 0; | |
236 | 1165 int n; |
18574
8b0114ffde2b
patch 8.1.2281: 'showbreak' cannot be set for one window
Bram Moolenaar <Bram@vim.org>
parents:
18082
diff
changeset
|
1166 char_u *sbr; |
29633
e80174903fdf
patch 9.0.0157: 'showbreak' displayed below truncated "after" text prop
Bram Moolenaar <Bram@vim.org>
parents:
29613
diff
changeset
|
1167 int no_sbr = FALSE; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1168 #endif |
7 | 1169 |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1170 #if defined(FEAT_PROP_POPUP) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1171 cts->cts_cur_text_width = 0; |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1172 cts->cts_first_char = 0; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1173 #endif |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1174 |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1175 #if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) |
7 | 1176 /* |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1177 * No 'linebreak', 'showbreak', 'breakindent' and text properties that |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1178 * insert text: return quickly. |
7 | 1179 */ |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1180 if (1 |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1181 # ifdef FEAT_LINEBREAK |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1182 && !wp->w_p_lbr && !wp->w_p_bri && *get_showbreak_value(wp) == NUL |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1183 # endif |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1184 # ifdef FEAT_PROP_POPUP |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1185 && !cts->cts_has_prop_with_text |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1186 # endif |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1187 ) |
7 | 1188 #endif |
1189 { | |
1190 if (wp->w_p_wrap) | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1191 return win_nolbr_chartabsize(cts, headp); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1192 RET_WIN_BUF_CHARTABSIZE(wp, wp->w_buffer, s, vcol) |
7 | 1193 } |
1194 | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1195 #if defined(FEAT_LINEBREAK) || defined(FEAT_PROP_POPUP) |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1196 int has_lcs_eol = wp->w_p_list && wp->w_lcs_chars.eol != NUL; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1197 |
7 | 1198 /* |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1199 * First get the normal size, without 'linebreak' or text properties |
7 | 1200 */ |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1201 size = win_chartabsize(wp, s, vcol); |
34441
84a5cafeb34c
patch 9.1.0140: cursor on wrong row after 1 char 'below' virtual text when EOL is shown
Christian Brabandt <cb@256bit.org>
parents:
34211
diff
changeset
|
1202 if (*s == NUL) |
84a5cafeb34c
patch 9.1.0140: cursor on wrong row after 1 char 'below' virtual text when EOL is shown
Christian Brabandt <cb@256bit.org>
parents:
34211
diff
changeset
|
1203 { |
84a5cafeb34c
patch 9.1.0140: cursor on wrong row after 1 char 'below' virtual text when EOL is shown
Christian Brabandt <cb@256bit.org>
parents:
34211
diff
changeset
|
1204 // 1 cell for EOL list char (if present), as opposed to the two cell ^@ |
84a5cafeb34c
patch 9.1.0140: cursor on wrong row after 1 char 'below' virtual text when EOL is shown
Christian Brabandt <cb@256bit.org>
parents:
34211
diff
changeset
|
1205 // for a NUL character in the text. |
84a5cafeb34c
patch 9.1.0140: cursor on wrong row after 1 char 'below' virtual text when EOL is shown
Christian Brabandt <cb@256bit.org>
parents:
34211
diff
changeset
|
1206 size = has_lcs_eol ? 1 : 0; |
84a5cafeb34c
patch 9.1.0140: cursor on wrong row after 1 char 'below' virtual text when EOL is shown
Christian Brabandt <cb@256bit.org>
parents:
34211
diff
changeset
|
1207 } |
33086
4be1ffa13b56
patch 9.0.1828: cursor wrong with virt text before double-width char
Christian Brabandt <cb@256bit.org>
parents:
33077
diff
changeset
|
1208 # ifdef FEAT_LINEBREAK |
4be1ffa13b56
patch 9.0.1828: cursor wrong with virt text before double-width char
Christian Brabandt <cb@256bit.org>
parents:
33077
diff
changeset
|
1209 int is_doublewidth = has_mbyte && size == 2 && MB_BYTE2LEN(*s) > 1; |
4be1ffa13b56
patch 9.0.1828: cursor wrong with virt text before double-width char
Christian Brabandt <cb@256bit.org>
parents:
33077
diff
changeset
|
1210 # endif |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1211 |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1212 # ifdef FEAT_PROP_POPUP |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1213 if (cts->cts_has_prop_with_text) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1214 { |
29676
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1215 int tab_size = size; |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1216 int charlen = *s == NUL ? 1 : mb_ptr2len(s); |
29603
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1217 int i; |
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1218 int col = (int)(s - line); |
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1219 garray_T *gap = &wp->w_buffer->b_textprop_text; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1220 |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1221 // The "$" for 'list' mode will go between the EOL and |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1222 // the text prop, account for that. |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1223 if (has_lcs_eol) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1224 { |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1225 ++vcol; |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1226 --size; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1227 } |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1228 |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1229 for (i = 0; i < cts->cts_text_prop_count; ++i) |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1230 { |
29918
e6e0f1c39edb
patch 9.0.0297: cursor position wrong after right aligned virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29816
diff
changeset
|
1231 textprop_T *tp = cts->cts_text_props + i; |
e6e0f1c39edb
patch 9.0.0297: cursor position wrong after right aligned virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29816
diff
changeset
|
1232 int col_off = win_col_off(wp); |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1233 |
29603
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1234 // Watch out for the text being deleted. "cts_text_props" is a |
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1235 // copy, the text prop may actually have been removed from the line. |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1236 if (tp->tp_id < 0 |
29655
53e434838a85
patch 9.0.0168: cursor positioned wrong with two virtual text properties
Bram Moolenaar <Bram@vim.org>
parents:
29633
diff
changeset
|
1237 && ((tp->tp_col - 1 >= col |
29676
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1238 && tp->tp_col - 1 < col + charlen) |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1239 || (tp->tp_col == MAXCOL |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1240 && ((tp->tp_flags & TP_FLAG_ALIGN_ABOVE) |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1241 ? col == 0 |
33021
2b47322be0d1
patch 9.0.1802: Multiline regex with Visual selection fails with virtual text
Christian Brabandt <cb@256bit.org>
parents:
33017
diff
changeset
|
1242 : s[0] == NUL && cts->cts_with_trailing))) |
31489
966c87c57912
patch 9.0.1077: can add text property with negative ID before virtual text
Bram Moolenaar <Bram@vim.org>
parents:
31371
diff
changeset
|
1243 && -tp->tp_id - 1 < gap->ga_len) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1244 { |
29603
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1245 char_u *p = ((char_u **)gap->ga_data)[-tp->tp_id - 1]; |
29560
14b139cbec49
patch 9.0.0121: cannot put virtual text after or below a line
Bram Moolenaar <Bram@vim.org>
parents:
29477
diff
changeset
|
1246 |
29603
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1247 if (p != NULL) |
29560
14b139cbec49
patch 9.0.0121: cannot put virtual text after or below a line
Bram Moolenaar <Bram@vim.org>
parents:
29477
diff
changeset
|
1248 { |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1249 int cells; |
29603
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1250 |
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1251 if (tp->tp_col == MAXCOL) |
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1252 { |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1253 int n_extra = (int)STRLEN(p); |
29740
b167c91b5f6b
patch 9.0.0210: 'list' mode does not work properly with virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29730
diff
changeset
|
1254 |
30749
6fe513996997
patch 9.0.0709: virtual text "after" not correct with 'nowrap'
Bram Moolenaar <Bram@vim.org>
parents:
30304
diff
changeset
|
1255 cells = text_prop_position(wp, tp, vcol, |
29918
e6e0f1c39edb
patch 9.0.0297: cursor position wrong after right aligned virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29816
diff
changeset
|
1256 (vcol + size) % (wp->w_width - col_off) + col_off, |
31371
1c43d8bad31d
patch 9.0.1019: 'smoothscroll' and virtual text above don't work together
Bram Moolenaar <Bram@vim.org>
parents:
31319
diff
changeset
|
1257 &n_extra, &p, NULL, NULL, FALSE); |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1258 # ifdef FEAT_LINEBREAK |
29633
e80174903fdf
patch 9.0.0157: 'showbreak' displayed below truncated "after" text prop
Bram Moolenaar <Bram@vim.org>
parents:
29613
diff
changeset
|
1259 no_sbr = TRUE; // don't use 'showbreak' now |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1260 # endif |
29603
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1261 } |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1262 else |
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1263 cells = vim_strsize(p); |
29603
8f01d250793a
patch 9.0.0142: crash when adding and removing virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29597
diff
changeset
|
1264 cts->cts_cur_text_width += cells; |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1265 if (tp->tp_flags & TP_FLAG_ALIGN_ABOVE) |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1266 cts->cts_first_char += cells; |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1267 else |
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1268 size += cells; |
29730
0eeab24d3faf
patch 9.0.0205: cursor in wrong position when inserting after virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29718
diff
changeset
|
1269 cts->cts_start_incl = tp->tp_flags & TP_FLAG_START_INCL; |
29676
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1270 if (*s == TAB) |
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1271 { |
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1272 // tab size changes because of the inserted text |
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1273 size -= tab_size; |
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1274 tab_size = win_chartabsize(wp, s, vcol + size); |
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1275 size += tab_size; |
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1276 } |
31946
05414bdc5c2c
patch 9.0.1305: cursor in wrong line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
31938
diff
changeset
|
1277 if (tp->tp_col == MAXCOL && (tp->tp_flags |
05414bdc5c2c
patch 9.0.1305: cursor in wrong line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
31938
diff
changeset
|
1278 & (TP_FLAG_ALIGN_ABOVE | TP_FLAG_ALIGN_BELOW))) |
05414bdc5c2c
patch 9.0.1305: cursor in wrong line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
31938
diff
changeset
|
1279 // count extra line for property above/below |
05414bdc5c2c
patch 9.0.1305: cursor in wrong line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
31938
diff
changeset
|
1280 ++cts->cts_prop_lines; |
29560
14b139cbec49
patch 9.0.0121: cannot put virtual text after or below a line
Bram Moolenaar <Bram@vim.org>
parents:
29477
diff
changeset
|
1281 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1282 } |
29613
1a0aea1e23f4
patch 9.0.0147: cursor positioned wrong after two "below" text properties
Bram Moolenaar <Bram@vim.org>
parents:
29605
diff
changeset
|
1283 if (tp->tp_col != MAXCOL && tp->tp_col - 1 > col) |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1284 break; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1285 } |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1286 if (has_lcs_eol) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1287 { |
29816
bbe62ea78aac
patch 9.0.0247: cannot add padding to virtual text without highlight
Bram Moolenaar <Bram@vim.org>
parents:
29740
diff
changeset
|
1288 --vcol; |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1289 ++size; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1290 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1291 } |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1292 # endif |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1293 |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1294 # ifdef FEAT_LINEBREAK |
33086
4be1ffa13b56
patch 9.0.1828: cursor wrong with virt text before double-width char
Christian Brabandt <cb@256bit.org>
parents:
33077
diff
changeset
|
1295 if (is_doublewidth && wp->w_p_wrap && in_win_border(wp, vcol + size - 2)) |
7 | 1296 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1297 ++size; // Count the ">" in the last column. |
7 | 1298 mb_added = 1; |
1299 } | |
1300 | |
1301 /* | |
5995 | 1302 * May have to add something for 'breakindent' and/or 'showbreak' |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1303 * string at the start of a screen line. |
7 | 1304 */ |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1305 int head = mb_added; |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1306 sbr = no_sbr ? empty_option : get_showbreak_value(wp); |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1307 // When "size" is 0, no new screen line is started. |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1308 if (size > 0 && wp->w_p_wrap && (*sbr != NUL || wp->w_p_bri)) |
7 | 1309 { |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1310 int col_off_prev = win_col_off(wp); |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1311 int width2 = wp->w_width - col_off_prev + win_col_off2(wp); |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1312 colnr_T wcol = vcol + col_off_prev; |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1313 # ifdef FEAT_PROP_POPUP |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1314 wcol -= wp->w_virtcol_first_char; |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1315 # endif |
33045
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1316 colnr_T max_head_vcol = cts->cts_max_head_vcol; |
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1317 int added = 0; |
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1318 |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1319 // cells taken by 'showbreak'/'breakindent' before current char |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1320 int head_prev = 0; |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1321 if (wcol >= wp->w_width) |
7 | 1322 { |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1323 wcol -= wp->w_width; |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1324 col_off_prev = wp->w_width - width2; |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1325 if (wcol >= width2 && width2 > 0) |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1326 wcol %= width2; |
18574
8b0114ffde2b
patch 8.1.2281: 'showbreak' cannot be set for one window
Bram Moolenaar <Bram@vim.org>
parents:
18082
diff
changeset
|
1327 if (*sbr != NUL) |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1328 head_prev += vim_strsize(sbr); |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1329 if (wp->w_p_bri) |
34153
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1330 { |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1331 if (cts->cts_bri_size < 0) |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1332 cts->cts_bri_size = get_breakindent_win(wp, line); |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1333 head_prev += cts->cts_bri_size; |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1334 } |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1335 if (wcol < head_prev) |
6288 | 1336 { |
33045
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1337 head_prev -= wcol; |
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1338 wcol += head_prev; |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1339 added += head_prev; |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1340 if (max_head_vcol <= 0 || vcol < max_head_vcol) |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1341 head += head_prev; |
6288 | 1342 } |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1343 else |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1344 head_prev = 0; |
33045
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1345 wcol += col_off_prev; |
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1346 } |
6503 | 1347 |
33045
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1348 if (wcol + size > wp->w_width) |
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1349 { |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1350 // cells taken by 'showbreak'/'breakindent' halfway current char |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1351 int head_mid = 0; |
18574
8b0114ffde2b
patch 8.1.2281: 'showbreak' cannot be set for one window
Bram Moolenaar <Bram@vim.org>
parents:
18082
diff
changeset
|
1352 if (*sbr != NUL) |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1353 head_mid += vim_strsize(sbr); |
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1354 if (wp->w_p_bri) |
34153
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1355 { |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1356 if (cts->cts_bri_size < 0) |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1357 cts->cts_bri_size = get_breakindent_win(wp, line); |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1358 head_mid += cts->cts_bri_size; |
c7779252fab5
patch 9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol
Christian Brabandt <cb@256bit.org>
parents:
34074
diff
changeset
|
1359 } |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1360 if (head_mid > 0 && wcol + size > wp->w_width) |
6503 | 1361 { |
33017
7d0357f70cf8
patch 9.0.1800: Cursor position still wrong with 'showbreak' and virtual text
Christian Brabandt <cb@256bit.org>
parents:
32984
diff
changeset
|
1362 // Calculate effective window width. |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1363 int prev_rem = wp->w_width - wcol; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1364 int width = width2 - head_mid; |
16819
91619e48e1a7
patch 8.1.1411: Coverity warns for divide by zero
Bram Moolenaar <Bram@vim.org>
parents:
16764
diff
changeset
|
1365 |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1366 if (width <= 0) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1367 width = 1; |
33017
7d0357f70cf8
patch 9.0.1800: Cursor position still wrong with 'showbreak' and virtual text
Christian Brabandt <cb@256bit.org>
parents:
32984
diff
changeset
|
1368 // Divide "size - prev_rem" by "width", rounding up. |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1369 int cnt = (size - prev_rem + width - 1) / width; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1370 added += cnt * head_mid; |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1371 |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1372 if (max_head_vcol == 0 || vcol + size + added < max_head_vcol) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1373 head += cnt * head_mid; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1374 else if (max_head_vcol > vcol + head_prev + prev_rem) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1375 head += (max_head_vcol - (vcol + head_prev + prev_rem) |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1376 + width2 - 1) / width2 * head_mid; |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1377 # ifdef FEAT_PROP_POPUP |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1378 else if (max_head_vcol < 0) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1379 { |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1380 int off = 0; |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1381 if (*s != NUL |
32977
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1382 && ((State & MODE_NORMAL) || cts->cts_start_incl)) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1383 off += cts->cts_cur_text_width; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1384 if (off >= prev_rem) |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1385 head += (1 + (off - prev_rem) / width) * head_mid; |
68a12270d21b
patch 9.0.1785: wrong cursor position with 'showbreak' and lcs-eol
Christian Brabandt <cb@256bit.org>
parents:
32971
diff
changeset
|
1386 } |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1387 # endif |
6503 | 1388 } |
33045
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1389 } |
5995 | 1390 |
33045
0561bf3ba10c
patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents:
33021
diff
changeset
|
1391 size += added; |
7 | 1392 } |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1393 |
7 | 1394 if (headp != NULL) |
32984 | 1395 *headp = head; |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1396 |
34211
f9b706e23b10
patch 9.1.0054: 'linebreak' may still apply to leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
34155
diff
changeset
|
1397 int need_lbr = FALSE; |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1398 /* |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1399 * If 'linebreak' set check at a blank before a non-blank if the line |
34211
f9b706e23b10
patch 9.1.0054: 'linebreak' may still apply to leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
34155
diff
changeset
|
1400 * needs a break here. |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1401 */ |
34211
f9b706e23b10
patch 9.1.0054: 'linebreak' may still apply to leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
34155
diff
changeset
|
1402 if (wp->w_p_lbr && wp->w_p_wrap && wp->w_width != 0 |
f9b706e23b10
patch 9.1.0054: 'linebreak' may still apply to leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
34155
diff
changeset
|
1403 && VIM_ISBREAK((int)s[0]) && !VIM_ISBREAK((int)s[1])) |
33536
886e7c8f7614
patch 9.0.2017: linebreak applies for leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
33220
diff
changeset
|
1404 { |
886e7c8f7614
patch 9.0.2017: linebreak applies for leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
33220
diff
changeset
|
1405 char_u *t = cts->cts_line; |
33547
a319d4aa6b53
patch 9.0.2021: Coverity complains about change in charset
Christian Brabandt <cb@256bit.org>
parents:
33536
diff
changeset
|
1406 while (VIM_ISBREAK((int)t[0])) |
33536
886e7c8f7614
patch 9.0.2017: linebreak applies for leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
33220
diff
changeset
|
1407 t++; |
34211
f9b706e23b10
patch 9.1.0054: 'linebreak' may still apply to leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
34155
diff
changeset
|
1408 // 'linebreak' is only needed when not in leading whitespace. |
f9b706e23b10
patch 9.1.0054: 'linebreak' may still apply to leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
34155
diff
changeset
|
1409 need_lbr = s >= t; |
33536
886e7c8f7614
patch 9.0.2017: linebreak applies for leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
33220
diff
changeset
|
1410 } |
34211
f9b706e23b10
patch 9.1.0054: 'linebreak' may still apply to leading whitespace
Christian Brabandt <cb@256bit.org>
parents:
34155
diff
changeset
|
1411 if (need_lbr) |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1412 { |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1413 /* |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1414 * Count all characters from first non-blank after a blank up to next |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1415 * non-blank after a blank. |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1416 */ |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1417 int numberextra = win_col_off(wp); |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1418 colnr_T col_adj = size - 1; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1419 colnr_T colmax = (colnr_T)(wp->w_width - numberextra - col_adj); |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1420 if (vcol >= colmax) |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1421 { |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1422 colmax += col_adj; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1423 n = colmax + win_col_off2(wp); |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1424 if (n > 0) |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1425 colmax += (((vcol - colmax) / n) + 1) * n - col_adj; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1426 } |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1427 |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1428 colnr_T vcol2 = vcol; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1429 for (;;) |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1430 { |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1431 char_u *ps = s; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1432 MB_PTR_ADV(s); |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1433 int c = *s; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1434 if (!(c != NUL |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1435 && (VIM_ISBREAK(c) |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1436 || (!VIM_ISBREAK(c) |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1437 && (vcol2 == vcol || !VIM_ISBREAK((int)*ps)))))) |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1438 break; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1439 |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1440 vcol2 += win_chartabsize(wp, s, vcol2); |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1441 if (vcol2 >= colmax) // doesn't fit |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1442 { |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1443 size = colmax - vcol + col_adj; |
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1444 break; |
6503 | 1445 } |
7 | 1446 } |
1447 } | |
33077
d03841a271aa
patch 9.0.1825: wrong cursor position with virt text and 'linebreak'
Christian Brabandt <cb@256bit.org>
parents:
33045
diff
changeset
|
1448 |
33103
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1449 # ifdef FEAT_PROP_POPUP |
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1450 size += cts->cts_first_char; |
61fc08239937
patch 9.0.1836: display wrong with virttext, linebreak and breakindent
Christian Brabandt <cb@256bit.org>
parents:
33086
diff
changeset
|
1451 # endif |
7 | 1452 return size; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1453 # endif |
7 | 1454 #endif |
1455 } | |
1456 | |
1457 /* | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1458 * Like win_lbr_chartabsize(), except that we know 'linebreak' is off, 'wrap' |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1459 * is on and there are no properties that insert text. This means we need to |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1460 * check for a double-byte character that doesn't fit at the end of the screen |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1461 * line. |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1462 * Only uses "cts_win", "cts_ptr" and "cts_vcol" from "cts". |
7 | 1463 */ |
1464 static int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1465 win_nolbr_chartabsize( |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1466 chartabsize_T *cts, |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1467 int *headp) |
7 | 1468 { |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1469 win_T *wp = cts->cts_win; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1470 char_u *s = cts->cts_ptr; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1471 colnr_T col = cts->cts_vcol; |
7 | 1472 int n; |
1473 | |
23952
44be09b25619
patch 8.2.2518: 'listchars' should be window-local
Bram Moolenaar <Bram@vim.org>
parents:
23533
diff
changeset
|
1474 if (*s == TAB && (!wp->w_p_list || wp->w_lcs_chars.tab1)) |
7 | 1475 { |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1476 # ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1477 return tabstop_padding(col, wp->w_buffer->b_p_ts, |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1478 wp->w_buffer->b_p_vts_array); |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1479 # else |
7 | 1480 n = wp->w_buffer->b_p_ts; |
1481 return (int)(n - (col % n)); | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1482 # endif |
7 | 1483 } |
1484 n = ptr2cells(s); | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1485 // Add one cell for a double-width character in the last column of the |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1486 // window, displayed with a ">". |
7 | 1487 if (n == 2 && MB_BYTE2LEN(*s) > 1 && in_win_border(wp, col)) |
1488 { | |
1489 if (headp != NULL) | |
1490 *headp = 1; | |
1491 return 3; | |
1492 } | |
1493 return n; | |
1494 } | |
1495 | |
1496 /* | |
1497 * Return TRUE if virtual column "vcol" is in the rightmost column of window | |
1498 * "wp". | |
1499 */ | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
16819
diff
changeset
|
1500 static int |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1501 in_win_border(win_T *wp, colnr_T vcol) |
7 | 1502 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1503 int width1; // width of first line (after line number) |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1504 int width2; // width of further lines |
7 | 1505 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1506 if (wp->w_width == 0) // there is no border |
7 | 1507 return FALSE; |
12515
972ea22c946f
patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
1508 width1 = wp->w_width - win_col_off(wp); |
1869 | 1509 if ((int)vcol < width1 - 1) |
7 | 1510 return FALSE; |
1869 | 1511 if ((int)vcol == width1 - 1) |
7 | 1512 return TRUE; |
1513 width2 = width1 + win_col_off2(wp); | |
1970 | 1514 if (width2 <= 0) |
1515 return FALSE; | |
7 | 1516 return ((vcol - width1) % width2 == width2 - 1); |
1517 } | |
1518 | |
1519 /* | |
1520 * Get virtual column number of pos. | |
1521 * start: on the first position of this character (TAB, ctrl) | |
1522 * cursor: where the cursor is on this character (first char, except for TAB) | |
1523 * end: on the last position of this character (TAB, ctrl) | |
1524 * | |
1525 * This is used very often, keep it fast! | |
1526 */ | |
1527 void | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1528 getvcol( |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1529 win_T *wp, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1530 pos_T *pos, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1531 colnr_T *start, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1532 colnr_T *cursor, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1533 colnr_T *end) |
7 | 1534 { |
1535 colnr_T vcol; | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1536 char_u *ptr; // points to current char |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1537 char_u *line; // start of the line |
7 | 1538 int incr; |
1539 int head; | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1540 #ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1541 int *vts = wp->w_buffer->b_p_vts_array; |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1542 #endif |
7 | 1543 int ts = wp->w_buffer->b_p_ts; |
1544 int c; | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1545 chartabsize_T cts; |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1546 #ifdef FEAT_PROP_POPUP |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1547 int on_NUL = FALSE; |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1548 #endif |
7 | 1549 |
1550 vcol = 0; | |
5995 | 1551 line = ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE); |
7 | 1552 |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1553 init_chartabsize_arg(&cts, wp, pos->lnum, 0, line, line); |
32971
ccfca4f03a2b
Some more missing changes :(
Christian Brabandt <cb@256bit.org>
parents:
32925
diff
changeset
|
1554 cts.cts_max_head_vcol = -1; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1555 |
7 | 1556 /* |
1557 * This function is used very often, do some speed optimizations. | |
5995 | 1558 * When 'list', 'linebreak', 'showbreak' and 'breakindent' are not set |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1559 * and there are no text properties with "text" use a simple loop. |
7 | 1560 * Also use this when 'list' is set but tabs take their normal size. |
1561 */ | |
23952
44be09b25619
patch 8.2.2518: 'listchars' should be window-local
Bram Moolenaar <Bram@vim.org>
parents:
23533
diff
changeset
|
1562 if ((!wp->w_p_list || wp->w_lcs_chars.tab1 != NUL) |
7 | 1563 #ifdef FEAT_LINEBREAK |
18574
8b0114ffde2b
patch 8.1.2281: 'showbreak' cannot be set for one window
Bram Moolenaar <Bram@vim.org>
parents:
18082
diff
changeset
|
1564 && !wp->w_p_lbr && *get_showbreak_value(wp) == NUL && !wp->w_p_bri |
7 | 1565 #endif |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1566 #ifdef FEAT_PROP_POPUP |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1567 && !cts.cts_has_prop_with_text |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1568 #endif |
7 | 1569 ) |
1570 { | |
1571 for (;;) | |
1572 { | |
1573 head = 0; | |
1574 c = *ptr; | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1575 // make sure we don't go past the end of the line |
7 | 1576 if (c == NUL) |
1577 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1578 incr = 1; // NUL at end of line only takes one column |
7 | 1579 break; |
1580 } | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1581 // A tab gets expanded, depending on the current column |
7 | 1582 if (c == TAB) |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1583 #ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1584 incr = tabstop_padding(vcol, ts, vts); |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1585 #else |
7 | 1586 incr = ts - (vcol % ts); |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14061
diff
changeset
|
1587 #endif |
7 | 1588 else |
1589 { | |
1590 if (has_mbyte) | |
1591 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1592 // For utf-8, if the byte is >= 0x80, need to look at |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1593 // further bytes to find the cell width. |
7 | 1594 if (enc_utf8 && c >= 0x80) |
1595 incr = utf_ptr2cells(ptr); | |
1596 else | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
1597 incr = g_chartab[c] & CT_CELL_MASK; |
7 | 1598 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1599 // If a double-cell char doesn't fit at the end of a line |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1600 // it wraps to the next line, it's like this char is three |
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1601 // cells wide. |
1546 | 1602 if (incr == 2 && wp->w_p_wrap && MB_BYTE2LEN(*ptr) > 1 |
1603 && in_win_border(wp, vcol)) | |
7 | 1604 { |
1605 ++incr; | |
1606 head = 1; | |
1607 } | |
1608 } | |
1609 else | |
7697
f04e2b6feea2
commit https://github.com/vim/vim/commit/88e8f9f14434a7cd538d0c159dc432bea869a5bd
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
1610 incr = g_chartab[c] & CT_CELL_MASK; |
7 | 1611 } |
1612 | |
34155
5c42c39dab38
patch 9.1.0038: Unnecessary loop in getvcol()
Christian Brabandt <cb@256bit.org>
parents:
34153
diff
changeset
|
1613 char_u *next_ptr = ptr + (*mb_ptr2len)(ptr); |
5c42c39dab38
patch 9.1.0038: Unnecessary loop in getvcol()
Christian Brabandt <cb@256bit.org>
parents:
34153
diff
changeset
|
1614 if (next_ptr - line > pos->col) // character at pos->col |
7 | 1615 break; |
1616 | |
1617 vcol += incr; | |
34155
5c42c39dab38
patch 9.1.0038: Unnecessary loop in getvcol()
Christian Brabandt <cb@256bit.org>
parents:
34153
diff
changeset
|
1618 ptr = next_ptr; |
7 | 1619 } |
1620 } | |
1621 else | |
1622 { | |
1623 for (;;) | |
1624 { | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1625 // A tab gets expanded, depending on the current column. |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1626 // Other things also take up space. |
7 | 1627 head = 0; |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1628 incr = win_lbr_chartabsize(&cts, &head); |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1629 // make sure we don't go past the end of the line |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1630 if (*cts.cts_ptr == NUL) |
7 | 1631 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1632 incr = 1; // NUL at end of line only takes one column |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1633 #ifdef FEAT_PROP_POPUP |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1634 if (cts.cts_cur_text_width > 0) |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1635 incr = cts.cts_cur_text_width; |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1636 on_NUL = TRUE; |
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1637 #endif |
7 | 1638 break; |
1639 } | |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1640 #ifdef FEAT_PROP_POPUP |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1641 if (cursor == &wp->w_virtcol && cts.cts_ptr == cts.cts_line) |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1642 // do not count the virtual text above for w_curswant |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1643 wp->w_virtcol_first_char = cts.cts_first_char; |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
30152
diff
changeset
|
1644 #endif |
7 | 1645 |
34155
5c42c39dab38
patch 9.1.0038: Unnecessary loop in getvcol()
Christian Brabandt <cb@256bit.org>
parents:
34153
diff
changeset
|
1646 char_u *next_ptr = cts.cts_ptr + (*mb_ptr2len)(cts.cts_ptr); |
5c42c39dab38
patch 9.1.0038: Unnecessary loop in getvcol()
Christian Brabandt <cb@256bit.org>
parents:
34153
diff
changeset
|
1647 if (next_ptr - line > pos->col) // character at pos->col |
7 | 1648 break; |
1649 | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1650 cts.cts_vcol += incr; |
34155
5c42c39dab38
patch 9.1.0038: Unnecessary loop in getvcol()
Christian Brabandt <cb@256bit.org>
parents:
34153
diff
changeset
|
1651 cts.cts_ptr = next_ptr; |
7 | 1652 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1653 vcol = cts.cts_vcol; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1654 ptr = cts.cts_ptr; |
7 | 1655 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1656 clear_chartabsize_arg(&cts); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28964
diff
changeset
|
1657 |
7 | 1658 if (start != NULL) |
1659 *start = vcol + head; | |
1660 if (end != NULL) | |
1661 *end = vcol + incr - 1; | |
1662 if (cursor != NULL) | |
1663 { | |
1664 if (*ptr == TAB | |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28013
diff
changeset
|
1665 && (State & MODE_NORMAL) |
7 | 1666 && !wp->w_p_list |
1667 && !virtual_active() | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10835
diff
changeset
|
1668 && !(VIsual_active |
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10835
diff
changeset
|
1669 && (*p_sel == 'e' || LTOREQ_POS(*pos, VIsual))) |
7 | 1670 ) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1671 *cursor = vcol + incr - 1; // cursor at end |
7 | 1672 else |
29676
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1673 { |
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1674 #ifdef FEAT_PROP_POPUP |
29730
0eeab24d3faf
patch 9.0.0205: cursor in wrong position when inserting after virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29718
diff
changeset
|
1675 // in Insert mode, if "start_incl" is true the text gets inserted |
0eeab24d3faf
patch 9.0.0205: cursor in wrong position when inserting after virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29718
diff
changeset
|
1676 // after the virtual text, thus add its width |
0eeab24d3faf
patch 9.0.0205: cursor in wrong position when inserting after virtual text
Bram Moolenaar <Bram@vim.org>
parents:
29718
diff
changeset
|
1677 if (((State & MODE_INSERT) == 0 || cts.cts_start_incl) && !on_NUL) |
29678
fc0f93590fd4
patch 9.0.0179: cursor pos wrong with wrapping virtual text in empty line
Bram Moolenaar <Bram@vim.org>
parents:
29676
diff
changeset
|
1678 // cursor is after inserted text, unless on the NUL |
29676
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1679 vcol += cts.cts_cur_text_width; |
30207
7147c6059e80
patch 9.0.0439: cursor wrong if inserting before line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
30205
diff
changeset
|
1680 else |
7147c6059e80
patch 9.0.0439: cursor wrong if inserting before line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
30205
diff
changeset
|
1681 // insertion also happens after the "above" virtual text |
7147c6059e80
patch 9.0.0439: cursor wrong if inserting before line with virtual text above
Bram Moolenaar <Bram@vim.org>
parents:
30205
diff
changeset
|
1682 vcol += cts.cts_first_char; |
29676
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1683 #endif |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1684 *cursor = vcol + head; // cursor at start |
29676
b4fea827c20a
patch 9.0.0178: cursor position wrong with virtual text before Tab
Bram Moolenaar <Bram@vim.org>
parents:
29655
diff
changeset
|
1685 } |
7 | 1686 } |
1687 } | |
1688 | |
1689 /* | |
1690 * Get virtual cursor column in the current window, pretending 'list' is off. | |
1691 */ | |
1692 colnr_T | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1693 getvcol_nolist(pos_T *posp) |
7 | 1694 { |
1695 int list_save = curwin->w_p_list; | |
1696 colnr_T vcol; | |
1697 | |
1698 curwin->w_p_list = FALSE; | |
13786
0fa21ba32e21
patch 8.0.1765: CTRL-G j in Insert mode is incorrect when 'virtualedit' set
Christian Brabandt <cb@256bit.org>
parents:
13553
diff
changeset
|
1699 if (posp->coladd) |
0fa21ba32e21
patch 8.0.1765: CTRL-G j in Insert mode is incorrect when 'virtualedit' set
Christian Brabandt <cb@256bit.org>
parents:
13553
diff
changeset
|
1700 getvvcol(curwin, posp, NULL, &vcol, NULL); |
0fa21ba32e21
patch 8.0.1765: CTRL-G j in Insert mode is incorrect when 'virtualedit' set
Christian Brabandt <cb@256bit.org>
parents:
13553
diff
changeset
|
1701 else |
0fa21ba32e21
patch 8.0.1765: CTRL-G j in Insert mode is incorrect when 'virtualedit' set
Christian Brabandt <cb@256bit.org>
parents:
13553
diff
changeset
|
1702 getvcol(curwin, posp, NULL, &vcol, NULL); |
7 | 1703 curwin->w_p_list = list_save; |
1704 return vcol; | |
1705 } | |
1706 | |
1707 /* | |
1708 * Get virtual column in virtual mode. | |
1709 */ | |
1710 void | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1711 getvvcol( |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1712 win_T *wp, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1713 pos_T *pos, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1714 colnr_T *start, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1715 colnr_T *cursor, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1716 colnr_T *end) |
7 | 1717 { |
1718 colnr_T col; | |
1719 colnr_T coladd; | |
1720 colnr_T endadd; | |
1721 char_u *ptr; | |
1722 | |
1723 if (virtual_active()) | |
1724 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1725 // For virtual mode, only want one value |
7 | 1726 getvcol(wp, pos, &col, NULL, NULL); |
1727 | |
1728 coladd = pos->coladd; | |
1729 endadd = 0; | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1730 // Cannot put the cursor on part of a wide character. |
7 | 1731 ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE); |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34441
diff
changeset
|
1732 if (pos->col < ml_get_buf_len(wp->w_buffer, pos->lnum)) |
7 | 1733 { |
1734 int c = (*mb_ptr2char)(ptr + pos->col); | |
1735 | |
1736 if (c != TAB && vim_isprintc(c)) | |
1737 { | |
1869 | 1738 endadd = (colnr_T)(char2cells(c) - 1); |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1739 if (coladd > endadd) // past end of line |
557 | 1740 endadd = 0; |
7 | 1741 else |
1742 coladd = 0; | |
1743 } | |
1744 } | |
1745 col += coladd; | |
1746 if (start != NULL) | |
1747 *start = col; | |
1748 if (cursor != NULL) | |
1749 *cursor = col; | |
1750 if (end != NULL) | |
1751 *end = col + endadd; | |
1752 } | |
1753 else | |
1754 getvcol(wp, pos, start, cursor, end); | |
1755 } | |
1756 | |
1757 /* | |
1758 * Get the leftmost and rightmost virtual column of pos1 and pos2. | |
1759 * Used for Visual block mode. | |
1760 */ | |
1761 void | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1762 getvcols( |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1763 win_T *wp, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1764 pos_T *pos1, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1765 pos_T *pos2, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1766 colnr_T *left, |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1767 colnr_T *right) |
7 | 1768 { |
1769 colnr_T from1, from2, to1, to2; | |
1770 | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10835
diff
changeset
|
1771 if (LT_POSP(pos1, pos2)) |
7 | 1772 { |
1773 getvvcol(wp, pos1, &from1, NULL, &to1); | |
1774 getvvcol(wp, pos2, &from2, NULL, &to2); | |
1775 } | |
1776 else | |
1777 { | |
1778 getvvcol(wp, pos2, &from1, NULL, &to1); | |
1779 getvvcol(wp, pos1, &from2, NULL, &to2); | |
1780 } | |
1781 if (from2 < from1) | |
1782 *left = from2; | |
1783 else | |
1784 *left = from1; | |
1785 if (to2 > to1) | |
1786 { | |
1787 if (*p_sel == 'e' && from2 - 1 >= to1) | |
1788 *right = from2 - 1; | |
1789 else | |
1790 *right = to2; | |
1791 } | |
1792 else | |
1793 *right = to1; | |
1794 } | |
1795 | |
1796 /* | |
26572
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1797 * Skip over ' ' and '\t'. |
7 | 1798 */ |
1799 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1800 skipwhite(char_u *q) |
7 | 1801 { |
1687 | 1802 char_u *p = q; |
1803 | |
26572
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1804 while (VIM_ISWHITE(*p)) |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1805 ++p; |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1806 return p; |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1807 } |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1808 |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26843
diff
changeset
|
1809 #if defined(FEAT_EVAL) || defined(PROTO) |
26572
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1810 /* |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1811 * skip over ' ', '\t' and '\n'. |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1812 */ |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1813 char_u * |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1814 skipwhite_and_nl(char_u *q) |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1815 { |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1816 char_u *p = q; |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1817 |
9f7568104726
patch 8.2.3815: Vim9: cannot have a multi-line dict inside a block
Bram Moolenaar <Bram@vim.org>
parents:
26327
diff
changeset
|
1818 while (VIM_ISWHITE(*p) || *p == NL) |
7 | 1819 ++p; |
1820 return p; | |
1821 } | |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26843
diff
changeset
|
1822 #endif |
7 | 1823 |
1824 /* | |
12323
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1825 * getwhitecols: return the number of whitespace |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1826 * columns (bytes) at the start of a given line |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1827 */ |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1828 int |
32009
4545f58c8490
patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents:
31990
diff
changeset
|
1829 getwhitecols_curline(void) |
12323
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1830 { |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1831 return getwhitecols(ml_get_curline()); |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1832 } |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1833 |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1834 int |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1835 getwhitecols(char_u *p) |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1836 { |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1837 return skipwhite(p) - p; |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1838 } |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1839 |
4dba3e4f3b01
patch 8.0.1041: bogus characters when indenting during visual-block append
Christian Brabandt <cb@256bit.org>
parents:
11337
diff
changeset
|
1840 /* |
293 | 1841 * skip over digits |
7 | 1842 */ |
1843 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1844 skipdigits(char_u *q) |
7 | 1845 { |
1687 | 1846 char_u *p = q; |
1847 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1848 while (VIM_ISDIGIT(*p)) // skip to next non-digit |
7 | 1849 ++p; |
1850 return p; | |
1851 } | |
1852 | |
741 | 1853 #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) || defined(PROTO) |
301 | 1854 /* |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1855 * skip over binary digits |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1856 */ |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1857 char_u * |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1858 skipbin(char_u *q) |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1859 { |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1860 char_u *p = q; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1861 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1862 while (vim_isbdigit(*p)) // skip to next non-digit |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1863 ++p; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1864 return p; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1865 } |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1866 |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1867 /* |
301 | 1868 * skip over digits and hex characters |
1869 */ | |
1870 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1871 skiphex(char_u *q) |
301 | 1872 { |
1687 | 1873 char_u *p = q; |
1874 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1875 while (vim_isxdigit(*p)) // skip to next non-digit |
301 | 1876 ++p; |
1877 return p; | |
1878 } | |
1879 #endif | |
1880 | |
293 | 1881 /* |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1882 * skip to bin digit (or NUL after the string) |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1883 */ |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1884 char_u * |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1885 skiptobin(char_u *q) |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1886 { |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1887 char_u *p = q; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1888 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1889 while (*p != NUL && !vim_isbdigit(*p)) // skip to next digit |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1890 ++p; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1891 return p; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1892 } |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1893 |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1894 /* |
293 | 1895 * skip to digit (or NUL after the string) |
1896 */ | |
1897 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1898 skiptodigit(char_u *q) |
293 | 1899 { |
1687 | 1900 char_u *p = q; |
1901 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1902 while (*p != NUL && !VIM_ISDIGIT(*p)) // skip to next digit |
293 | 1903 ++p; |
1904 return p; | |
1905 } | |
1906 | |
1907 /* | |
1908 * skip to hex character (or NUL after the string) | |
1909 */ | |
1910 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1911 skiptohex(char_u *q) |
293 | 1912 { |
1687 | 1913 char_u *p = q; |
1914 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1915 while (*p != NUL && !vim_isxdigit(*p)) // skip to next digit |
293 | 1916 ++p; |
1917 return p; | |
1918 } | |
1919 | |
7 | 1920 /* |
1921 * Variant of isdigit() that can handle characters > 0x100. | |
1922 * We don't use isdigit() here, because on some systems it also considers | |
1923 * superscript 1 to be a digit. | |
1924 * Use the VIM_ISDIGIT() macro for simple arguments. | |
1925 */ | |
1926 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1927 vim_isdigit(int c) |
7 | 1928 { |
1929 return (c >= '0' && c <= '9'); | |
1930 } | |
1931 | |
1932 /* | |
1933 * Variant of isxdigit() that can handle characters > 0x100. | |
1934 * We don't use isxdigit() here, because on some systems it also considers | |
1935 * superscript 1 to be a digit. | |
1936 */ | |
1937 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1938 vim_isxdigit(int c) |
7 | 1939 { |
1940 return (c >= '0' && c <= '9') | |
1941 || (c >= 'a' && c <= 'f') | |
1942 || (c >= 'A' && c <= 'F'); | |
1943 } | |
1944 | |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1945 /* |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1946 * Corollary of vim_isdigit and vim_isxdigit() that can handle |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1947 * characters > 0x100. |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1948 */ |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1949 int |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1950 vim_isbdigit(int c) |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1951 { |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1952 return (c == '0' || c == '1'); |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1953 } |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
1954 |
23533
ee43d943c3bb
patch 8.2.2309: 0o777 not recognized as octal
Bram Moolenaar <Bram@vim.org>
parents:
20782
diff
changeset
|
1955 static int |
ee43d943c3bb
patch 8.2.2309: 0o777 not recognized as octal
Bram Moolenaar <Bram@vim.org>
parents:
20782
diff
changeset
|
1956 vim_isodigit(int c) |
ee43d943c3bb
patch 8.2.2309: 0o777 not recognized as octal
Bram Moolenaar <Bram@vim.org>
parents:
20782
diff
changeset
|
1957 { |
ee43d943c3bb
patch 8.2.2309: 0o777 not recognized as octal
Bram Moolenaar <Bram@vim.org>
parents:
20782
diff
changeset
|
1958 return (c >= '0' && c <= '7'); |
ee43d943c3bb
patch 8.2.2309: 0o777 not recognized as octal
Bram Moolenaar <Bram@vim.org>
parents:
20782
diff
changeset
|
1959 } |
ee43d943c3bb
patch 8.2.2309: 0o777 not recognized as octal
Bram Moolenaar <Bram@vim.org>
parents:
20782
diff
changeset
|
1960 |
492 | 1961 /* |
1962 * Vim's own character class functions. These exist because many library | |
1963 * islower()/toupper() etc. do not work properly: they crash when used with | |
1964 * invalid values or can't handle latin1 when the locale is C. | |
1965 * Speed is most important here. | |
1966 */ | |
1967 #define LATIN1LOWER 'l' | |
1968 #define LATIN1UPPER 'U' | |
1969 | |
497 | 1970 static char_u latin1flags[257] = " UUUUUUUUUUUUUUUUUUUUUUUUUU llllllllllllllllllllllllll UUUUUUUUUUUUUUUUUUUUUUU UUUUUUUllllllllllllllllllllllll llllllll"; |
3533 | 1971 static char_u latin1upper[257] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xf7\xd8\xd9\xda\xdb\xdc\xdd\xde\xff"; |
1972 static char_u latin1lower[257] = " !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xd7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"; | |
492 | 1973 |
1974 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1975 vim_islower(int c) |
492 | 1976 { |
1977 if (c <= '@') | |
1978 return FALSE; | |
1979 if (c >= 0x80) | |
1980 { | |
1981 if (enc_utf8) | |
1982 return utf_islower(c); | |
1983 if (c >= 0x100) | |
1984 { | |
1985 #ifdef HAVE_ISWLOWER | |
1986 if (has_mbyte) | |
1987 return iswlower(c); | |
1988 #endif | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
1989 // islower() can't handle these chars and may crash |
492 | 1990 return FALSE; |
1991 } | |
1992 if (enc_latin1like) | |
1993 return (latin1flags[c] & LATIN1LOWER) == LATIN1LOWER; | |
1994 } | |
34074
1629cc65d78d
patch 9.1.0006: is*() and to*() function may be unsafe
Christian Brabandt <cb@256bit.org>
parents:
33547
diff
changeset
|
1995 return SAFE_islower(c); |
492 | 1996 } |
1997 | |
1998 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
1999 vim_isupper(int c) |
492 | 2000 { |
2001 if (c <= '@') | |
2002 return FALSE; | |
2003 if (c >= 0x80) | |
2004 { | |
2005 if (enc_utf8) | |
2006 return utf_isupper(c); | |
2007 if (c >= 0x100) | |
2008 { | |
2009 #ifdef HAVE_ISWUPPER | |
2010 if (has_mbyte) | |
2011 return iswupper(c); | |
2012 #endif | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2013 // islower() can't handle these chars and may crash |
492 | 2014 return FALSE; |
2015 } | |
2016 if (enc_latin1like) | |
2017 return (latin1flags[c] & LATIN1UPPER) == LATIN1UPPER; | |
2018 } | |
34074
1629cc65d78d
patch 9.1.0006: is*() and to*() function may be unsafe
Christian Brabandt <cb@256bit.org>
parents:
33547
diff
changeset
|
2019 return SAFE_isupper(c); |
492 | 2020 } |
2021 | |
2022 int | |
27784
bfce04a99561
patch 8.2.4418: crash when using special multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
2023 vim_isalpha(int c) |
bfce04a99561
patch 8.2.4418: crash when using special multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
2024 { |
bfce04a99561
patch 8.2.4418: crash when using special multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
2025 return vim_islower(c) || vim_isupper(c); |
bfce04a99561
patch 8.2.4418: crash when using special multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
2026 } |
bfce04a99561
patch 8.2.4418: crash when using special multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
2027 |
bfce04a99561
patch 8.2.4418: crash when using special multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
27752
diff
changeset
|
2028 int |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2029 vim_toupper(int c) |
492 | 2030 { |
2031 if (c <= '@') | |
2032 return c; | |
11333
fef09eb74832
patch 8.0.0552: toupper and tolower don't work properly for Turkish
Christian Brabandt <cb@256bit.org>
parents:
11133
diff
changeset
|
2033 if (c >= 0x80 || !(cmp_flags & CMP_KEEPASCII)) |
492 | 2034 { |
2035 if (enc_utf8) | |
2036 return utf_toupper(c); | |
2037 if (c >= 0x100) | |
2038 { | |
2039 #ifdef HAVE_TOWUPPER | |
2040 if (has_mbyte) | |
2041 return towupper(c); | |
2042 #endif | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2043 // toupper() can't handle these chars and may crash |
492 | 2044 return c; |
2045 } | |
2046 if (enc_latin1like) | |
2047 return latin1upper[c]; | |
2048 } | |
11337
f0fbebf19b80
patch 8.0.0554: toupper and tolower don't work properly for Turkish
Christian Brabandt <cb@256bit.org>
parents:
11333
diff
changeset
|
2049 if (c < 0x80 && (cmp_flags & CMP_KEEPASCII)) |
f0fbebf19b80
patch 8.0.0554: toupper and tolower don't work properly for Turkish
Christian Brabandt <cb@256bit.org>
parents:
11333
diff
changeset
|
2050 return TOUPPER_ASC(c); |
492 | 2051 return TOUPPER_LOC(c); |
2052 } | |
2053 | |
2054 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2055 vim_tolower(int c) |
492 | 2056 { |
2057 if (c <= '@') | |
2058 return c; | |
11333
fef09eb74832
patch 8.0.0552: toupper and tolower don't work properly for Turkish
Christian Brabandt <cb@256bit.org>
parents:
11133
diff
changeset
|
2059 if (c >= 0x80 || !(cmp_flags & CMP_KEEPASCII)) |
492 | 2060 { |
2061 if (enc_utf8) | |
2062 return utf_tolower(c); | |
2063 if (c >= 0x100) | |
2064 { | |
2065 #ifdef HAVE_TOWLOWER | |
2066 if (has_mbyte) | |
2067 return towlower(c); | |
2068 #endif | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2069 // tolower() can't handle these chars and may crash |
492 | 2070 return c; |
2071 } | |
2072 if (enc_latin1like) | |
2073 return latin1lower[c]; | |
2074 } | |
11337
f0fbebf19b80
patch 8.0.0554: toupper and tolower don't work properly for Turkish
Christian Brabandt <cb@256bit.org>
parents:
11333
diff
changeset
|
2075 if (c < 0x80 && (cmp_flags & CMP_KEEPASCII)) |
f0fbebf19b80
patch 8.0.0554: toupper and tolower don't work properly for Turkish
Christian Brabandt <cb@256bit.org>
parents:
11333
diff
changeset
|
2076 return TOLOWER_ASC(c); |
492 | 2077 return TOLOWER_LOC(c); |
2078 } | |
2079 | |
7 | 2080 /* |
2081 * skiptowhite: skip over text until ' ' or '\t' or NUL. | |
2082 */ | |
2083 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2084 skiptowhite(char_u *p) |
7 | 2085 { |
2086 while (*p != ' ' && *p != '\t' && *p != NUL) | |
2087 ++p; | |
2088 return p; | |
2089 } | |
2090 | |
2091 /* | |
2092 * skiptowhite_esc: Like skiptowhite(), but also skip escaped chars | |
2093 */ | |
2094 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2095 skiptowhite_esc(char_u *p) |
7 | 2096 { |
2097 while (*p != ' ' && *p != '\t' && *p != NUL) | |
2098 { | |
2099 if ((*p == '\\' || *p == Ctrl_V) && *(p + 1) != NUL) | |
2100 ++p; | |
2101 ++p; | |
2102 } | |
2103 return p; | |
2104 } | |
2105 | |
2106 /* | |
26327
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2107 * Get a number from a string and skip over it. |
7 | 2108 * Note: the argument is a pointer to a char_u pointer! |
2109 */ | |
2110 long | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2111 getdigits(char_u **pp) |
7 | 2112 { |
2113 char_u *p; | |
2114 long retval; | |
2115 | |
2116 p = *pp; | |
2117 retval = atol((char *)p); | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2118 if (*p == '-') // skip negative sign |
7 | 2119 ++p; |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2120 p = skipdigits(p); // skip to next non-digit |
7 | 2121 *pp = p; |
2122 return retval; | |
2123 } | |
2124 | |
2125 /* | |
26327
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2126 * Like getdigits() but allow for embedded single quotes. |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2127 */ |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2128 long |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2129 getdigits_quoted(char_u **pp) |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2130 { |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2131 char_u *p = *pp; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2132 long retval = 0; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2133 |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2134 if (*p == '-') |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2135 ++p; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2136 while (VIM_ISDIGIT(*p)) |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2137 { |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2138 if (retval >= LONG_MAX / 10 - 10) |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2139 retval = LONG_MAX; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2140 else |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2141 retval = retval * 10 - '0' + *p; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2142 ++p; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2143 if (in_vim9script() && *p == '\'' && VIM_ISDIGIT(p[1])) |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2144 ++p; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2145 } |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2146 if (**pp == '-') |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2147 { |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2148 if (retval == LONG_MAX) |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2149 retval = LONG_MIN; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2150 else |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2151 retval = -retval; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2152 } |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2153 *pp = p; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2154 return retval; |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2155 } |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2156 |
227543e4181f
patch 8.2.3694: cannot use quotes in the count of an Ex command
Bram Moolenaar <Bram@vim.org>
parents:
25978
diff
changeset
|
2157 /* |
7 | 2158 * Return TRUE if "lbuf" is empty or only contains blanks. |
2159 */ | |
2160 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2161 vim_isblankline(char_u *lbuf) |
7 | 2162 { |
2163 char_u *p; | |
2164 | |
2165 p = skipwhite(lbuf); | |
2166 return (*p == NUL || *p == '\r' || *p == '\n'); | |
2167 } | |
2168 | |
2169 /* | |
2170 * Convert a string into a long and/or unsigned long, taking care of | |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2171 * hexadecimal, octal, and binary numbers. Accepts a '-' sign. |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2172 * If "prep" is not NULL, returns a flag to indicate the type of the number: |
7 | 2173 * 0 decimal |
2174 * '0' octal | |
20665
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2175 * 'O' octal |
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2176 * 'o' octal |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2177 * 'B' bin |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2178 * 'b' bin |
7 | 2179 * 'X' hex |
2180 * 'x' hex | |
2181 * If "len" is not NULL, the length of the number in characters is returned. | |
2182 * If "nptr" is not NULL, the signed result is returned in it. | |
2183 * If "unptr" is not NULL, the unsigned result is returned in it. | |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2184 * If "what" contains STR2NR_BIN recognize binary numbers |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2185 * If "what" contains STR2NR_OCT recognize octal numbers |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2186 * If "what" contains STR2NR_HEX recognize hex numbers |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2187 * If "what" contains STR2NR_FORCE always assume bin/oct/hex. |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2188 * If "what" contains STR2NR_QUOTE ignore embedded single quotes |
12704
ee5f3f5d3c55
patch 8.0.1230: CTRL-A in Visual mode uses character after selection
Christian Brabandt <cb@256bit.org>
parents:
12702
diff
changeset
|
2189 * If maxlen > 0, check at a maximum maxlen chars. |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2190 * If strict is TRUE, check the number strictly. return *len = 0 if fail. |
7 | 2191 */ |
2192 void | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2193 vim_str2nr( |
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2194 char_u *start, |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2195 int *prep, // return: type of number 0 = decimal, 'x' |
20665
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2196 // or 'X' is hex, '0', 'o' or 'O' is octal, |
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2197 // 'b' or 'B' is bin |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2198 int *len, // return: detected length of number |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2199 int what, // what numbers to recognize |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2200 varnumber_T *nptr, // return: signed result |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2201 uvarnumber_T *unptr, // return: unsigned result |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2202 int maxlen, // max length of string to check |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2203 int strict, // check strictly |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2204 int *overflow) // when not NULL set to TRUE for overflow |
7 | 2205 { |
2206 char_u *ptr = start; | |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2207 int pre = 0; // default is decimal |
7 | 2208 int negative = FALSE; |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
2209 uvarnumber_T un = 0; |
39 | 2210 int n; |
7 | 2211 |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2212 if (len != NULL) |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2213 *len = 0; |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2214 |
7 | 2215 if (ptr[0] == '-') |
2216 { | |
2217 negative = TRUE; | |
2218 ++ptr; | |
2219 } | |
2220 | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2221 // Recognize hex, octal, and bin. |
6927 | 2222 if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9' |
2223 && (maxlen == 0 || maxlen > 1)) | |
7 | 2224 { |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2225 pre = ptr[1]; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2226 if ((what & STR2NR_HEX) |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2227 && (pre == 'X' || pre == 'x') && vim_isxdigit(ptr[2]) |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2228 && (maxlen == 0 || maxlen > 2)) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2229 // hexadecimal |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2230 ptr += 2; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2231 else if ((what & STR2NR_BIN) |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2232 && (pre == 'B' || pre == 'b') && vim_isbdigit(ptr[2]) |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2233 && (maxlen == 0 || maxlen > 2)) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2234 // binary |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2235 ptr += 2; |
20665
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2236 else if ((what & STR2NR_OOCT) |
23533
ee43d943c3bb
patch 8.2.2309: 0o777 not recognized as octal
Bram Moolenaar <Bram@vim.org>
parents:
20782
diff
changeset
|
2237 && (pre == 'O' || pre == 'o') && vim_isodigit(ptr[2]) |
20665
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2238 && (maxlen == 0 || maxlen > 2)) |
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2239 // octal with prefix "0o" |
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2240 ptr += 2; |
7 | 2241 else |
2242 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2243 // decimal or octal, default is decimal |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2244 pre = 0; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2245 if (what & STR2NR_OCT) |
39 | 2246 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2247 // Don't interpret "0", "08" or "0129" as octal. |
12704
ee5f3f5d3c55
patch 8.0.1230: CTRL-A in Visual mode uses character after selection
Christian Brabandt <cb@256bit.org>
parents:
12702
diff
changeset
|
2248 for (n = 1; n != maxlen && VIM_ISDIGIT(ptr[n]); ++n) |
39 | 2249 { |
2250 if (ptr[n] > '7') | |
2251 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2252 pre = 0; // can't be octal |
39 | 2253 break; |
2254 } | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2255 pre = '0'; // assume octal |
39 | 2256 } |
2257 } | |
7 | 2258 } |
2259 } | |
2260 | |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2261 // Do the conversion manually to avoid sscanf() quirks. |
6927 | 2262 n = 1; |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2263 if (pre == 'B' || pre == 'b' |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2264 || ((what & STR2NR_BIN) && (what & STR2NR_FORCE))) |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2265 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2266 // bin |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2267 if (pre != 0) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2268 n += 2; // skip over "0b" |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2269 while ('0' <= *ptr && *ptr <= '1') |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2270 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2271 // avoid ubsan error for overflow |
14061
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2272 if (un <= UVARNUM_MAX / 2) |
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2273 un = 2 * un + (uvarnumber_T)(*ptr - '0'); |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2274 else |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2275 { |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2276 un = UVARNUM_MAX; |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2277 if (overflow != NULL) |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2278 *overflow = TRUE; |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2279 } |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2280 ++ptr; |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2281 if (n++ == maxlen) |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2282 break; |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2283 if ((what & STR2NR_QUOTE) && *ptr == '\'' |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2284 && '0' <= ptr[1] && ptr[1] <= '1') |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2285 { |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2286 ++ptr; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2287 if (n++ == maxlen) |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2288 break; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2289 } |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2290 } |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2291 } |
20665
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2292 else if (pre == 'O' || pre == 'o' || |
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2293 pre == '0' || ((what & STR2NR_OCT) && (what & STR2NR_FORCE))) |
7 | 2294 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2295 // octal |
20665
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2296 if (pre != 0 && pre != '0') |
6ff992bf4c82
patch 8.2.0886: cannot use octal numbers in scriptversion 4
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2297 n += 2; // skip over "0o" |
293 | 2298 while ('0' <= *ptr && *ptr <= '7') |
7 | 2299 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2300 // avoid ubsan error for overflow |
14061
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2301 if (un <= UVARNUM_MAX / 8) |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2302 un = 8 * un + (uvarnumber_T)(*ptr - '0'); |
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2303 else |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2304 { |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2305 un = UVARNUM_MAX; |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2306 if (overflow != NULL) |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2307 *overflow = TRUE; |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2308 } |
293 | 2309 ++ptr; |
6927 | 2310 if (n++ == maxlen) |
2311 break; | |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2312 if ((what & STR2NR_QUOTE) && *ptr == '\'' |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2313 && '0' <= ptr[1] && ptr[1] <= '7') |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2314 { |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2315 ++ptr; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2316 if (n++ == maxlen) |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2317 break; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2318 } |
7 | 2319 } |
293 | 2320 } |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2321 else if (pre != 0 || ((what & STR2NR_HEX) && (what & STR2NR_FORCE))) |
293 | 2322 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2323 // hex |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2324 if (pre != 0) |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2325 n += 2; // skip over "0x" |
293 | 2326 while (vim_isxdigit(*ptr)) |
7 | 2327 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2328 // avoid ubsan error for overflow |
14061
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2329 if (un <= UVARNUM_MAX / 16) |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2330 un = 16 * un + (uvarnumber_T)hex2nr(*ptr); |
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2331 else |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2332 { |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2333 un = UVARNUM_MAX; |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2334 if (overflow != NULL) |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2335 *overflow = TRUE; |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2336 } |
293 | 2337 ++ptr; |
6927 | 2338 if (n++ == maxlen) |
2339 break; | |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2340 if ((what & STR2NR_QUOTE) && *ptr == '\'' && vim_isxdigit(ptr[1])) |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2341 { |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2342 ++ptr; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2343 if (n++ == maxlen) |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2344 break; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2345 } |
7 | 2346 } |
2347 } | |
2348 else | |
2349 { | |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2350 // decimal |
7 | 2351 while (VIM_ISDIGIT(*ptr)) |
2352 { | |
14061
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2353 uvarnumber_T digit = (uvarnumber_T)(*ptr - '0'); |
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2354 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2355 // avoid ubsan error for overflow |
14061
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2356 if (un < UVARNUM_MAX / 10 |
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2357 || (un == UVARNUM_MAX / 10 && digit <= UVARNUM_MAX % 10)) |
47b2db8a5709
patch 8.1.0048: vim_str2nr() does not handle numbers close to the maximum
Christian Brabandt <cb@256bit.org>
parents:
13786
diff
changeset
|
2358 un = 10 * un + digit; |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2359 else |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2360 { |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2361 un = UVARNUM_MAX; |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2362 if (overflow != NULL) |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2363 *overflow = TRUE; |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2364 } |
7 | 2365 ++ptr; |
6927 | 2366 if (n++ == maxlen) |
2367 break; | |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2368 if ((what & STR2NR_QUOTE) && *ptr == '\'' && VIM_ISDIGIT(ptr[1])) |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2369 { |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2370 ++ptr; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2371 if (n++ == maxlen) |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2372 break; |
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2373 } |
7 | 2374 } |
2375 } | |
18082
1c7a91cf2356
patch 8.1.2036: the str2nr() tests fail
Bram Moolenaar <Bram@vim.org>
parents:
17809
diff
changeset
|
2376 |
19195
2ef19eed524a
patch 8.2.0156: various typos in source files and tests
Bram Moolenaar <Bram@vim.org>
parents:
18757
diff
changeset
|
2377 // Check for an alphanumeric character immediately following, that is |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2378 // most likely a typo. |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2379 if (strict && n - 1 != maxlen && ASCII_ISALNUM(*ptr)) |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16054
diff
changeset
|
2380 return; |
7 | 2381 |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2382 if (prep != NULL) |
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7072
diff
changeset
|
2383 *prep = pre; |
7 | 2384 if (len != NULL) |
2385 *len = (int)(ptr - start); | |
2386 if (nptr != NULL) | |
16 | 2387 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2388 if (negative) // account for leading '-' for decimal numbers |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2389 { |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18574
diff
changeset
|
2390 // avoid ubsan error for overflow |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2391 if (un > VARNUM_MAX) |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2392 { |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2393 *nptr = VARNUM_MIN; |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2394 if (overflow != NULL) |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2395 *overflow = TRUE; |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2396 } |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2397 else |
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2398 *nptr = -(varnumber_T)un; |
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2399 } |
16 | 2400 else |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2401 { |
30986
360f286b5869
patch 9.0.0828: various typos
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2402 // prevent a large unsigned number to become negative |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2403 if (un > VARNUM_MAX) |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2404 { |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2405 un = VARNUM_MAX; |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2406 if (overflow != NULL) |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2407 *overflow = TRUE; |
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
2408 } |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
2409 *nptr = (varnumber_T)un; |
10658
77d66e9ac0ab
patch 8.0.0219: ubsan reports errors for overflow
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
2410 } |
16 | 2411 } |
7 | 2412 if (unptr != NULL) |
2413 *unptr = un; | |
2414 } | |
2415 | |
2416 /* | |
2417 * Return the value of a single hex character. | |
2418 * Only valid when the argument is '0' - '9', 'A' - 'F' or 'a' - 'f'. | |
2419 */ | |
2420 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2421 hex2nr(int c) |
7 | 2422 { |
2423 if (c >= 'a' && c <= 'f') | |
2424 return c - 'a' + 10; | |
2425 if (c >= 'A' && c <= 'F') | |
2426 return c - 'A' + 10; | |
2427 return c - '0'; | |
2428 } | |
2429 | |
2430 /* | |
2431 * Convert two hex characters to a byte. | |
2432 * Return -1 if one of the characters is not hex. | |
2433 */ | |
2434 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2435 hexhex2nr(char_u *p) |
7 | 2436 { |
2437 if (!vim_isxdigit(p[0]) || !vim_isxdigit(p[1])) | |
2438 return -1; | |
2439 return (hex2nr(p[0]) << 4) + hex2nr(p[1]); | |
2440 } | |
2441 | |
2442 /* | |
2443 * Return TRUE if "str" starts with a backslash that should be removed. | |
16054
78faa25f9698
patch 8.1.1032: warnings from clang static analyzer
Bram Moolenaar <Bram@vim.org>
parents:
15850
diff
changeset
|
2444 * For MS-DOS, MSWIN and OS/2 this is only done when the character after the |
7 | 2445 * backslash is not a normal file name character. |
2446 * '$' is a valid file name character, we don't remove the backslash before | |
2447 * it. This means it is not possible to use an environment variable after a | |
2448 * backslash. "C:\$VIM\doc" is taken literally, only "$VIM\doc" works. | |
2449 * Although "\ name" is valid, the backslash in "Program\ files" must be | |
2450 * removed. Assume a file name doesn't start with a space. | |
2451 * For multi-byte names, never remove a backslash before a non-ascii | |
2452 * character, assume that all multi-byte characters are valid file name | |
2453 * characters. | |
2454 */ | |
2455 int | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2456 rem_backslash(char_u *str) |
7 | 2457 { |
2458 #ifdef BACKSLASH_IN_FILENAME | |
2459 return (str[0] == '\\' | |
2460 && str[1] < 0x80 | |
2461 && (str[1] == ' ' | |
2462 || (str[1] != NUL | |
2463 && str[1] != '*' | |
2464 && str[1] != '?' | |
2465 && !vim_isfilec(str[1])))); | |
2466 #else | |
2467 return (str[0] == '\\' && str[1] != NUL); | |
2468 #endif | |
2469 } | |
2470 | |
2471 /* | |
2472 * Halve the number of backslashes in a file name argument. | |
2473 * For MS-DOS we only do this if the character after the backslash | |
2474 * is not a normal file character. | |
2475 */ | |
2476 void | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2477 backslash_halve(char_u *p) |
7 | 2478 { |
2479 for ( ; *p; ++p) | |
2480 if (rem_backslash(p)) | |
1621 | 2481 STRMOVE(p, p + 1); |
7 | 2482 } |
2483 | |
2484 /* | |
2485 * backslash_halve() plus save the result in allocated memory. | |
17809
59f8948b7590
patch 8.1.1901: the +insert_expand feature is not always available
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
2486 * However, returns "p" when out of memory. |
7 | 2487 */ |
2488 char_u * | |
7817
83861277e6a3
commit https://github.com/vim/vim/commit/7454a06e2642d2b37afad1c5e71cec68081ca4ff
Christian Brabandt <cb@256bit.org>
parents:
7799
diff
changeset
|
2489 backslash_halve_save(char_u *p) |
7 | 2490 { |
2491 char_u *res; | |
2492 | |
2493 res = vim_strsave(p); | |
2494 if (res == NULL) | |
2495 return p; | |
2496 backslash_halve(res); | |
2497 return res; | |
2498 } |