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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 static int chartab_initialized = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 #define SET_CHARTAB(buf, c) (buf)->b_chartab[(unsigned)(c) >> 3] |= (1 << ((c) & 0x7))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 #define RESET_CHARTAB(buf, c) (buf)->b_chartab[(unsigned)(c) >> 3] &= ~(1 << ((c) & 0x7))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 #define GET_CHARTAB(buf, c) ((buf)->b_chartab[(unsigned)(c) >> 3] & (1 << ((c) & 0x7)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 * characters for current buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 * Depends on the option settings 'iskeyword', 'isident', 'isfname',
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 * 'isprint' and 'encoding'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 * - For non-multi-byte index with the byte (same as the character).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 * - For DBCS index with the first byte.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 * - For UTF-8 index with the character (when first byte is up to 0x80 it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 * the same as the character, if the first byte is 0x80 and above it depends
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 * on further bytes).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 * - The lower two bits, masked by CT_CELL_MASK, give the number of display
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 * cells the character occupies (1 or 2). Not valid for UTF-8 above 0x80.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 * - CT_PRINT_CHAR bit is set when the character is printable (no need to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 * translate the character before displaying it). Note that only DBCS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 * characters can have 2 display cells and still be printable.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 * - CT_FNAME_CHAR bit is set when the character can be in a file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 * - CT_ID_CHAR bit is set when the character can be in an identifier.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 * Return FAIL if 'iskeyword', 'isident', 'isfname' or 'isprint' option has an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 * error, OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 return buf_init_chartab(curbuf, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 int c2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 int tilde;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 int do_isalpha;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 if (global)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 * Set the default size for printable characters:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 * From <Space> to '~' is 1 (printable), others are 2 (not printable).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 * This also inits all 'isident' and 'isfname' flags to FALSE.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 c = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 while (c < 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 for (c = 1; c < 256; ++c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 if ((enc_dbcs != 0 && MB_BYTE2LEN(c) > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 || (enc_dbcs == DBCS_JPNU && c == 0x8e)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 * Init word char flags all to FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
ef254e0f2365 updated for version 7.0063
vimboss
parents: 221
diff changeset
124 if (enc_dbcs != 0)
ef254e0f2365 updated for version 7.0063
vimboss
parents: 221
diff changeset
125 for (c = 0; c < 256; ++c)
ef254e0f2365 updated for version 7.0063
vimboss
parents: 221
diff changeset
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
ef254e0f2365 updated for version 7.0063
vimboss
parents: 221
diff changeset
128 if (MB_BYTE2LEN(c) == 2)
ef254e0f2365 updated for version 7.0063
vimboss
parents: 221
diff changeset
129 SET_CHARTAB(buf, c);
ef254e0f2365 updated for version 7.0063
vimboss
parents: 221
diff changeset
130 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 * In lisp mode the '-' character is included in keywords.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 if (buf->b_p_lisp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 SET_CHARTAB(buf, '-');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 for (i = global ? 0 : 3; i <= 3; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 while (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 tilde = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 do_isalpha = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 if (*p == '^' && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 tilde = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 if (VIM_ISDIGIT(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3f1b2e6496de updated for version 7.2-252
vimboss
parents: 1876
diff changeset
164 c = mb_ptr2char_adv(&p);
3f1b2e6496de updated for version 7.2-252
vimboss
parents: 1876
diff changeset
165 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 c = *p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 c2 = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 if (*p == '-' && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 if (VIM_ISDIGIT(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
fd24e02210c9 updated for version 7.2-276
vimboss
parents: 1970
diff changeset
174 c2 = mb_ptr2char_adv(&p);
fd24e02210c9 updated for version 7.2-276
vimboss
parents: 1970
diff changeset
175 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 c2 = *p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 }
1979
fd24e02210c9 updated for version 7.2-276
vimboss
parents: 1970
diff changeset
178 if (c <= 0 || c >= 256 || (c2 < c && c2 != -1) || c2 >= 256
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 || !(*p == NUL || *p == ','))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 * A single '@' (not "@-@"):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 * Decide on letters being ID/printable/keyword chars with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 * standard function isalpha(). This takes care of locale for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 * single-byte characters).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 if (c == '@')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 do_isalpha = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 c = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 c2 = 255;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 c2 = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 while (c <= c2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 if (tilde)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 if (tilde)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 RESET_CHARTAB(buf, c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 SET_CHARTAB(buf, c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 ++c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 }
4096
cd5145d2408b updated for version 7.3.802
Bram Moolenaar <bram@vim.org>
parents: 4080
diff changeset
251
cd5145d2408b updated for version 7.3.802
Bram Moolenaar <bram@vim.org>
parents: 4080
diff changeset
252 c = *p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 p = skip_to_option_part(p);
4096
cd5145d2408b updated for version 7.3.802
Bram Moolenaar <bram@vim.org>
parents: 4080
diff changeset
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
cd5145d2408b updated for version 7.3.802
Bram Moolenaar <bram@vim.org>
parents: 4080
diff changeset
256 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 chartab_initialized = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 * Translate any special characters in buf[bufsize] in-place.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 * The result is a string with only printable characters, but if there is not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 * enough room, not all characters will be translated.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 len = (int)STRLEN(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 room = bufsize - len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 while (*buf != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 308
diff changeset
283 if (has_mbyte && (trs_len = (*mb_ptr2len)(buf)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 len -= trs_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 trs = transchar_byte(*buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 trs_len = (int)STRLEN(trs);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 if (trs_len > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 room -= trs_len - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 if (room <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 mch_memmove(buf + trs_len, buf + 1, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 mch_memmove(buf, trs, (size_t)trs_len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 buf += trs_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 * Translate a string into allocated memory, replacing special chars with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 * printable chars. Returns NULL when out of memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 char_u *res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 int l, len, c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 char_u hexbuf[11];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 p = s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 while (*p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 308
diff changeset
323 if ((l = (*mb_ptr2len)(p)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 c = (*mb_ptr2char)(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 p += l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 if (vim_isprintc(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 len += l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 transchar_hex(hexbuf, c);
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 782
diff changeset
332 len += (int)STRLEN(hexbuf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 l = byte2cells(*p++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 if (l > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 len += l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 return res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 /*
221
7fd4b5df33be updated for version 7.0062
vimboss
parents: 130
diff changeset
372 * Convert the string "str[orglen]" to do ignore-case comparing. Uses the
7fd4b5df33be updated for version 7.0062
vimboss
parents: 130
diff changeset
373 * current locale.
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
374 * When "buf" is NULL returns an allocated string (NULL for out-of-memory).
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
375 * Otherwise puts the result in "buf[buflen]".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 garray_T ga;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 int i;
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
386 int len = orglen;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
394 if (buf == NULL)
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
395 {
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
396 ga_init2(&ga, 1, 10);
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
397 if (ga_grow(&ga, len + 1) == FAIL)
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
398 return NULL;
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
399 mch_memmove(ga.ga_data, str, (size_t)len);
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
400 ga.ga_len = len;
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
401 }
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
402 else
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
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
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
405 len = buflen - 1;
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
406 mch_memmove(buf, str, (size_t)len);
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
407 }
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
408 if (buf == NULL)
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
409 GA_CHAR(len) = NUL;
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
410 else
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
411 buf[len] = NUL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 i = 0;
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
415 while (STR_CHAR(i) != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 {
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
417 if (enc_utf8 || (has_mbyte && MB_BYTE2LEN(STR_CHAR(i)) > 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 {
1654
0eef0f621811 updated for version 7.2a-006
vimboss
parents: 1621
diff changeset
421 int c = utf_ptr2char(STR_PTR(i));
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
422 int olen = utf_ptr2len(STR_PTR(i));
1654
0eef0f621811 updated for version 7.2a-006
vimboss
parents: 1621
diff changeset
423 int lc = utf_tolower(c);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
428 if ((c < 0x80 || olen > 1) && c != lc)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
430 int nlen = utf_char2len(lc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
434 if (olen != nlen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
436 if (nlen > olen)
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
437 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
438 if (buf == NULL
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
439 ? ga_grow(&ga, nlen - olen + 1) == FAIL
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
440 : len + nlen - olen >= buflen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 lc = c;
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
444 nlen = olen;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 }
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
446 }
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
447 if (olen != nlen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 {
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
449 if (buf == NULL)
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
450 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
451 STRMOVE(GA_PTR(i) + nlen, GA_PTR(i) + olen);
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
452 ga.ga_len += nlen - olen;
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
453 }
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
454 else
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
455 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
456 STRMOVE(buf + i + nlen, buf + i + olen);
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 2541
diff changeset
457 len += nlen - olen;
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
458 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 }
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
461 (void)utf_char2bytes(lc, STR_PTR(i));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 308
diff changeset
465 i += (*mb_ptr2len)(STR_PTR(i));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 {
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
469 if (buf == NULL)
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
470 GA_CHAR(i) = TOLOWER_LOC(GA_CHAR(i));
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
471 else
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
472 buf[i] = TOLOWER_LOC(buf[i]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 ++i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476
130
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
477 if (buf == NULL)
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
478 return (char_u *)ga.ga_data;
964dc7d8b63d updated for version 7.0044
vimboss
parents: 42
diff changeset
479 return buf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 * Does NOT work for multi-byte characters, c must be <= 255.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 * Also doesn't work for the first byte of a multi-byte, "c" must be a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 * character!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 i = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 c = K_SECOND(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 if (enc_utf8 && c >= 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 * Does NOT work for multi-byte characters, c must be <= 255.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 int i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 buf[0] = '<';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 if (c > 255)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 buf[++i] = nr2hex((unsigned)c >> 12);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 buf[++i] = nr2hex((unsigned)c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 buf[++i] = nr2hex((unsigned)c >> 4);
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1687
diff changeset
600 buf[++i] = nr2hex((unsigned)c);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 buf[++i] = '>';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 buf[++i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 * Convert the lower 4 bits of byte "c" to its hex character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 * Lower case letters are used to avoid the confusion of <F1> being 0xf1 or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 * function key 1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 */
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1687
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 if ((c & 0xf) <= 9)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 return (c & 0xf) + '0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 return (c & 0xf) - 10 + 'a';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 * Return number of display cells occupied by byte "b".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 * Caller must make sure 0 <= b <= 255.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 * For multi-byte mode "b" must be the first byte of a character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 * A TAB is counted as two cells: "^I".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 * For UTF-8 mode this will return 0 for bytes >= 0x80, because the number of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 * cells depends on further bytes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 if (enc_utf8 && b >= 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 * Return number of display cells occupied by character "c".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 * "c" can be a special key (negative number) in which case 3 or 4 is returned.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 * A TAB is counted as two cells: "^I" or four: "<09>".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 if (IS_SPECIAL(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 return char2cells(K_SECOND(c)) + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 if (c >= 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 if (enc_dbcs != 0 && c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 if (enc_dbcs == DBCS_JPNU && ((unsigned)c >> 8) == 0x8e)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 return 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 * Return number of display cells occupied by character at "*p".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 * A TAB is counted as two cells: "^I" or four: "<09>".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 if (enc_utf8 && *p >= 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 /*
3292
c7861dd3b593 updated for version 7.3.414
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
679 * Return the number of character cells string "s" will take on the screen,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 * counting TABs as two characters: "^I".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 return vim_strnsize(s, (int)MAXCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 /*
3292
c7861dd3b593 updated for version 7.3.414
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
689 * Return the number of character cells string "s[len]" will take on the
c7861dd3b593 updated for version 7.3.414
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
690 * screen, counting TABs as two characters: "^I".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 int size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 return size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
708
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 * Return the number of characters 'c' will take on the screen, taking
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 * into account the size of a tab.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 * Use a define to make it fast, this is used very often!!!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 * Also see getvcol() below.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 { \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 int ts; \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 ts = (buf)->b_p_ts; \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 return (int)(ts - (col % ts)); \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 } \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 else \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, p, col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 #ifdef FEAT_LINEBREAK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 RET_WIN_BUF_CHARTABSIZE(wp, wp->w_buffer, p, col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863 /*
42
c75153d791d0 updated for version 7.0026
vimboss
parents: 41
diff changeset
864 * Return TRUE if 'c' is a normal identifier character:
c75153d791d0 updated for version 7.0026
vimboss
parents: 41
diff changeset
865 * Letters and characters from the 'isident' option.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 * For multi-byte characters mb_get_class() is used (builtin rules).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 {
4043
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 3533
diff changeset
891 return vim_iswordc_buf(c, curbuf);
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 3533
diff changeset
892 }
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 3533
diff changeset
893
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 3533
diff changeset
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
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 3533
diff changeset
896 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 if (c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 if (enc_dbcs != 0)
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1687
diff changeset
900 return dbcs_class((unsigned)c >> 8, (unsigned)(c & 0xff)) >= 2;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 * Just like vim_iswordc() but uses a pointer to the (multi-byte) character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
952 * return TRUE if 'c' is a valid file-name character or a wildcard character
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
953 * Assume characters above 0x100 are valid (multi-byte).
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
954 * Explicitly interpret ']' as a wildcard character as mch_has_wildcard("]")
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
955 * returns false.
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
956 */
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
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
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
959 {
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
960 char_u buf[2];
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
961
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
962 buf[0] = (char_u)c;
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
963 buf[1] = NUL;
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
964 return vim_isfilec(c) || c == ']' || mch_has_wildcard(buf);
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
965 }
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
966
1d4c67f84709 updated for version 7.1-084
vimboss
parents: 1365
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 * Assume characters above 0x100 are printable (multi-byte), except for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 * Unicode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 if (enc_utf8 && c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 * Strict version of vim_isprintc(c), don't return TRUE if "c" is the head
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 * byte of a double-byte character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 if (enc_dbcs != 0 && c < 0x100 && MB_BYTE2LEN(c) > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989 if (enc_utf8 && c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 * Call lbr_chartabsize() and advance the pointer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 int retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 * This function is used very often, keep it fast!!!!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162 #ifdef FEAT_LINEBREAK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 int size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 int mb_added = 0;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 227
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1188 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 mb_added = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 /*
5995
ef83b423ebf7 updated for version 7.4.338
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
fcb898dea2bc updated for version 7.4.478
Bram Moolenaar <bram@vim.org>
parents: 6278
diff changeset
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
fcb898dea2bc updated for version 7.4.478
Bram Moolenaar <bram@vim.org>
parents: 6278
diff changeset
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
134a7d55f9fa updated for version 7.4.579
Bram Moolenaar <bram@vim.org>
parents: 6312
diff changeset
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
134a7d55f9fa updated for version 7.4.579
Bram Moolenaar <bram@vim.org>
parents: 6312
diff changeset
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
134a7d55f9fa updated for version 7.4.579
Bram Moolenaar <bram@vim.org>
parents: 6312
diff changeset
1388 }
33045
0561bf3ba10c patch 9.0.1813: linebreak incorrect drawn with breakindent
Christian Brabandt <cb@256bit.org>
parents: 33021
diff changeset
1389 }
5995
ef83b423ebf7 updated for version 7.4.338
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 if (headp != NULL)
32984
75c283beb74f re-sync with git
Christian Brabandt <cb@256bit.org>
parents: 32925
diff changeset
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
134a7d55f9fa updated for version 7.4.579
Bram Moolenaar <bram@vim.org>
parents: 6312
diff changeset
1445 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 n = wp->w_buffer->b_p_ts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 if (n == 2 && MB_BYTE2LEN(*s) > 1 && in_win_border(wp, col))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 if (headp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 *headp = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 return 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 return n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 * Return TRUE if virtual column "vcol" is in the rightmost column of window
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 * "wp".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1687
diff changeset
1509 if ((int)vcol < width1 - 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 return FALSE;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1687
diff changeset
1511 if ((int)vcol == width1 - 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 width2 = width1 + win_col_off2(wp);
1970
7bcd81b96e2a updated for version 7.2-267
vimboss
parents: 1955
diff changeset
1514 if (width2 <= 0)
7bcd81b96e2a updated for version 7.2-267
vimboss
parents: 1955
diff changeset
1515 return FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 return ((vcol - width1) % width2 == width2 - 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 * Get virtual column number of pos.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 * start: on the first position of this character (TAB, ctrl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 * cursor: where the cursor is on this character (first char, except for TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 * end: on the last position of this character (TAB, ctrl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 * This is used very often, keep it fast!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 int incr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 int ts = wp->w_buffer->b_p_ts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 vcol = 0;
5995
ef83b423ebf7 updated for version 7.4.338
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
1551 line = ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 * This function is used very often, do some speed optimizations.
5995
ef83b423ebf7 updated for version 7.4.338
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560 * Also use this when 'list' is set but tabs take their normal size.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 head = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 if (enc_utf8 && c >= 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 incr = utf_ptr2cells(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
75f5889a5d8e updated for version 7.1-260
vimboss
parents: 1369
diff changeset
1602 if (incr == 2 && wp->w_p_wrap && MB_BYTE2LEN(*ptr) > 1
75f5889a5d8e updated for version 7.1-260
vimboss
parents: 1369
diff changeset
1603 && in_win_border(wp, vcol))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 ++incr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 head = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1615 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 if (start != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 *start = vcol + head;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 if (end != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 *end = vcol + incr - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 if (cursor != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1666 && !wp->w_p_list
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 * Get virtual cursor column in the current window, pretending 'list' is off.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 int list_save = curwin->w_p_list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 colnr_T vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 curwin->w_p_list = list_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 return vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 * Get virtual column in virtual mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718 colnr_T col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 colnr_T coladd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 colnr_T endadd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 if (virtual_active())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 getvcol(wp, pos, &col, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1727
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1728 coladd = pos->coladd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 int c = (*mb_ptr2char)(ptr + pos->col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736 if (c != TAB && vim_isprintc(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1737 {
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1687
diff changeset
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
862863033fdd updated for version 7.0158
vimboss
parents: 497
diff changeset
1740 endadd = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 col += coladd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746 if (start != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 *start = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 if (cursor != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 *cursor = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 if (end != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 *end = col + endadd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 getvcol(wp, pos, start, cursor, end);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 * Get the leftmost and rightmost virtual column of pos1 and pos2.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 * Used for Visual block mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 colnr_T from1, from2, to1, to2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 getvvcol(wp, pos1, &from1, NULL, &to1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 getvvcol(wp, pos2, &from2, NULL, &to2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778 getvvcol(wp, pos2, &from1, NULL, &to1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 getvvcol(wp, pos1, &from2, NULL, &to2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 if (from2 < from1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 *left = from2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784 *left = from1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 if (to2 > to1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 if (*p_sel == 'e' && from2 - 1 >= to1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 *right = from2 - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 *right = to2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 *right = to1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 {
1687
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
1802 char_u *p = q;
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1841 * skip over digits
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 {
1687
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
1846 char_u *p = q;
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852
741
ac1f1e69c50d updated for version 7.0222
vimboss
parents: 557
diff changeset
1853 #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) || defined(PROTO)
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
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
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1868 * skip over digits and hex characters
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1869 */
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
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
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1872 {
1687
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
1873 char_u *p = q;
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
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
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1876 ++p;
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1877 return p;
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1878 }
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1879 #endif
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 293
diff changeset
1880
293
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1895 * skip to digit (or NUL after the string)
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1896 */
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1899 {
1687
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
1900 char_u *p = q;
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1903 ++p;
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1904 return p;
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1905 }
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1906
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1907 /*
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1908 * skip to hex character (or NUL after the string)
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1909 */
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1912 {
1687
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
1913 char_u *p = q;
b2e037ed7e33 updated for version 7.2b-020
vimboss
parents: 1654
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1916 ++p;
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1917 return p;
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1918 }
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
1919
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 * Variant of isdigit() that can handle characters > 0x100.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 * We don't use isdigit() here, because on some systems it also considers
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 * superscript 1 to be a digit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 * Use the VIM_ISDIGIT() macro for simple arguments.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 return (c >= '0' && c <= '9');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 * Variant of isxdigit() that can handle characters > 0x100.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 * We don't use isxdigit() here, because on some systems it also considers
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 * superscript 1 to be a digit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 return (c >= '0' && c <= '9')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 || (c >= 'a' && c <= 'f')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 || (c >= 'A' && c <= 'F');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1961 /*
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1962 * Vim's own character class functions. These exist because many library
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1963 * islower()/toupper() etc. do not work properly: they crash when used with
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1964 * invalid values or can't handle latin1 when the locale is C.
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1965 * Speed is most important here.
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1966 */
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1967 #define LATIN1LOWER 'l'
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1968 #define LATIN1UPPER 'U'
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1969
497
73f10d8124f4 updated for version 7.0136
vimboss
parents: 492
diff changeset
1970 static char_u latin1flags[257] = " UUUUUUUUUUUUUUUUUUUUUUUUUU llllllllllllllllllllllllll UUUUUUUUUUUUUUUUUUUUUUU UUUUUUUllllllllllllllllllllllll llllllll";
3533
a17918b76ca1 updated for version 7.3.527
Bram Moolenaar <bram@vim.org>
parents: 3292
diff changeset
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";
a17918b76ca1 updated for version 7.3.527
Bram Moolenaar <bram@vim.org>
parents: 3292
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1973
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1976 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1977 if (c <= '@')
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1978 return FALSE;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1979 if (c >= 0x80)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1980 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1981 if (enc_utf8)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1982 return utf_islower(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1983 if (c >= 0x100)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1984 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1985 #ifdef HAVE_ISWLOWER
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1986 if (has_mbyte)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1987 return iswlower(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1990 return FALSE;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1991 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1992 if (enc_latin1like)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1993 return (latin1flags[c] & LATIN1LOWER) == LATIN1LOWER;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1996 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
1997
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2000 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2001 if (c <= '@')
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2002 return FALSE;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2003 if (c >= 0x80)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2004 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2005 if (enc_utf8)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2006 return utf_isupper(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2007 if (c >= 0x100)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2008 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2009 #ifdef HAVE_ISWUPPER
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2010 if (has_mbyte)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2011 return iswupper(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2014 return FALSE;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2015 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2016 if (enc_latin1like)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2017 return (latin1flags[c] & LATIN1UPPER) == LATIN1UPPER;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2020 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2021
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2030 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2031 if (c <= '@')
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2034 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2035 if (enc_utf8)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2036 return utf_toupper(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2037 if (c >= 0x100)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2038 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2039 #ifdef HAVE_TOWUPPER
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2040 if (has_mbyte)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2041 return towupper(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2044 return c;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2045 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2046 if (enc_latin1like)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2047 return latin1upper[c];
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2051 return TOUPPER_LOC(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2052 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2053
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2056 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2057 if (c <= '@')
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2060 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2061 if (enc_utf8)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2062 return utf_tolower(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2063 if (c >= 0x100)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2064 {
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2065 #ifdef HAVE_TOWLOWER
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2066 if (has_mbyte)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2067 return towlower(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2070 return c;
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2071 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2072 if (enc_latin1like)
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2073 return latin1lower[c];
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
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
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2077 return TOLOWER_LOC(c);
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2078 }
81c06952fb1d updated for version 7.0135
vimboss
parents: 474
diff changeset
2079
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 * skiptowhite: skip over text until ' ' or '\t' or NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 while (*p != ' ' && *p != '\t' && *p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 * skiptowhite_esc: Like skiptowhite(), but also skip escaped chars
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 while (*p != ' ' && *p != '\t' && *p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099 if ((*p == '\\' || *p == Ctrl_V) && *(p + 1) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 * Note: the argument is a pointer to a char_u pointer!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 long retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 p = *pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 *pp = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 * Return TRUE if "lbuf" is empty or only contains blanks.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 p = skipwhite(lbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 return (*p == NUL || *p == '\r' || *p == '\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 * 0 decimal
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 * 'X' hex
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 * 'x' hex
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 * If "len" is not NULL, the length of the number in characters is returned.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 * If "nptr" is not NULL, the signed result is returned in it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
2210 int n;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 if (ptr[0] == '-')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 negative = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 ++ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
2222 if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9'
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
2223 && (maxlen == 0 || maxlen > 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
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
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
2249 {
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
2250 if (ptr[n] > '7')
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
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
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
2253 break;
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
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
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
2256 }
410fa1a31baf updated for version 7.0023
vimboss
parents: 16
diff changeset
2257 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
2298 while ('0' <= *ptr && *ptr <= '7')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
2309 ++ptr;
6927
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
2310 if (n++ == maxlen)
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 }
293
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
2326 while (vim_isxdigit(*ptr))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
f811be6fa9b5 updated for version 7.0077
vimboss
parents: 273
diff changeset
2337 ++ptr;
6927
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
2338 if (n++ == maxlen)
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 {
18757
c469e1930456 patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18574
diff changeset
2350 // decimal
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 while (VIM_ISDIGIT(*ptr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365 ++ptr;
6927
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
2366 if (n++ == maxlen)
58d9f967ae1a patch 7.4.782
Bram Moolenaar <bram@vim.org>
parents: 6503
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 if (len != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 *len = (int)(ptr - start);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386 if (nptr != NULL)
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
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
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
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
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
2411 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 if (unptr != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 *unptr = un;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417 * Return the value of a single hex character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 * Only valid when the argument is '0' - '9', 'A' - 'F' or 'a' - 'f'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 if (c >= 'a' && c <= 'f')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2424 return c - 'a' + 10;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 if (c >= 'A' && c <= 'F')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 return c - 'A' + 10;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 return c - '0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 * Convert two hex characters to a byte.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 * Return -1 if one of the characters is not hex.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2437 if (!vim_isxdigit(p[0]) || !vim_isxdigit(p[1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2438 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2439 return (hex2nr(p[0]) << 4) + hex2nr(p[1]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2440 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2441
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2442 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 * backslash is not a normal file name character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 * '$' is a valid file name character, we don't remove the backslash before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 * it. This means it is not possible to use an environment variable after a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448 * backslash. "C:\$VIM\doc" is taken literally, only "$VIM\doc" works.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 * Although "\ name" is valid, the backslash in "Program\ files" must be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 * removed. Assume a file name doesn't start with a space.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451 * For multi-byte names, never remove a backslash before a non-ascii
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452 * character, assume that all multi-byte characters are valid file name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 * characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 return (str[0] == '\\'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 && str[1] < 0x80
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 && (str[1] == ' '
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 || (str[1] != NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 && str[1] != '*'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 && str[1] != '?'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 && !vim_isfilec(str[1]))));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467 return (str[0] == '\\' && str[1] != NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2472 * Halve the number of backslashes in a file name argument.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473 * For MS-DOS we only do this if the character after the backslash
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 * is not a normal file character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 for ( ; *p; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 if (rem_backslash(p))
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1546
diff changeset
2481 STRMOVE(p, p + 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2482 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2487 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2491 char_u *res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 res = vim_strsave(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494 if (res == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 backslash_halve(res);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 return res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498 }