1 /* vi:set ts=8 sts=4 sw=4:
3 * VIM - Vi IMproved by Bram Moolenaar
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
13 static int win_chartabsize
__ARGS((win_T
*wp
, char_u
*p
, colnr_T col
));
17 static int win_nolbr_chartabsize
__ARGS((win_T
*wp
, char_u
*s
, colnr_T col
, int *headp
));
20 static int nr2hex
__ARGS((int c
));
22 static int chartab_initialized
= FALSE
;
24 /* b_chartab[] is an array of 32 bytes, each bit representing one of the
25 * characters 0-255. */
26 #define SET_CHARTAB(buf, c) (buf)->b_chartab[(unsigned)(c) >> 3] |= (1 << ((c) & 0x7))
27 #define RESET_CHARTAB(buf, c) (buf)->b_chartab[(unsigned)(c) >> 3] &= ~(1 << ((c) & 0x7))
28 #define GET_CHARTAB(buf, c) ((buf)->b_chartab[(unsigned)(c) >> 3] & (1 << ((c) & 0x7)))
31 * Fill chartab[]. Also fills curbuf->b_chartab[] with flags for keyword
32 * characters for current buffer.
34 * Depends on the option settings 'iskeyword', 'isident', 'isfname',
35 * 'isprint' and 'encoding'.
37 * The index in chartab[] depends on 'encoding':
38 * - For non-multi-byte index with the byte (same as the character).
39 * - For DBCS index with the first byte.
40 * - For UTF-8 index with the character (when first byte is up to 0x80 it is
41 * the same as the character, if the first byte is 0x80 and above it depends
44 * The contents of chartab[]:
45 * - The lower two bits, masked by CT_CELL_MASK, give the number of display
46 * cells the character occupies (1 or 2). Not valid for UTF-8 above 0x80.
47 * - CT_PRINT_CHAR bit is set when the character is printable (no need to
48 * translate the character before displaying it). Note that only DBCS
49 * characters can have 2 display cells and still be printable.
50 * - CT_FNAME_CHAR bit is set when the character can be in a file name.
51 * - CT_ID_CHAR bit is set when the character can be in an identifier.
53 * Return FAIL if 'iskeyword', 'isident', 'isfname' or 'isprint' option has an
54 * error, OK otherwise.
59 return buf_init_chartab(curbuf
, TRUE
);
63 buf_init_chartab(buf
, global
)
65 int global
; /* FALSE: only set buf->b_chartab[] */
77 * Set the default size for printable characters:
78 * From <Space> to '~' is 1 (printable), others are 2 (not printable).
79 * This also inits all 'isident' and 'isfname' flags to FALSE.
81 * EBCDIC: all chars below ' ' are not printable, all others are
86 chartab
[c
++] = (dy_flags
& DY_UHEX
) ? 4 : 2;
92 chartab
[c
++] = 1 + CT_PRINT_CHAR
;
97 chartab
[c
++] = 1 + CT_PRINT_CHAR
;
103 /* UTF-8: bytes 0xa0 - 0xff are printable (latin1) */
104 if (enc_utf8
&& c
>= 0xa0)
105 chartab
[c
++] = CT_PRINT_CHAR
+ 1;
106 /* euc-jp characters starting with 0x8e are single width */
107 else if (enc_dbcs
== DBCS_JPNU
&& c
== 0x8e)
108 chartab
[c
++] = CT_PRINT_CHAR
+ 1;
109 /* other double-byte chars can be printable AND double-width */
110 else if (enc_dbcs
!= 0 && MB_BYTE2LEN(c
) == 2)
111 chartab
[c
++] = CT_PRINT_CHAR
+ 2;
114 /* the rest is unprintable by default */
115 chartab
[c
++] = (dy_flags
& DY_UHEX
) ? 4 : 2;
119 /* Assume that every multi-byte char is a filename character. */
120 for (c
= 1; c
< 256; ++c
)
121 if ((enc_dbcs
!= 0 && MB_BYTE2LEN(c
) > 1)
122 || (enc_dbcs
== DBCS_JPNU
&& c
== 0x8e)
123 || (enc_utf8
&& c
>= 0xa0))
124 chartab
[c
] |= CT_FNAME_CHAR
;
129 * Init word char flags all to FALSE
131 vim_memset(buf
->b_chartab
, 0, (size_t)32);
134 for (c
= 0; c
< 256; ++c
)
136 /* double-byte characters are probably word characters */
137 if (MB_BYTE2LEN(c
) == 2)
144 * In lisp mode the '-' character is included in keywords.
147 SET_CHARTAB(buf
, '-');
150 /* Walk through the 'isident', 'iskeyword', 'isfname' and 'isprint'
151 * options Each option is a list of characters, character numbers or
152 * ranges, separated by commas, e.g.: "200-210,x,#-178,-"
154 for (i
= global
? 0 : 3; i
<= 3; ++i
)
157 p
= p_isi
; /* first round: 'isident' */
159 p
= p_isp
; /* second round: 'isprint' */
161 p
= p_isf
; /* third round: 'isfname' */
163 p
= buf
->b_p_isk
; /* fourth round: 'iskeyword' */
169 if (*p
== '^' && p
[1] != NUL
)
179 if (*p
== '-' && p
[1] != NUL
)
187 if (c
<= 0 || (c2
< c
&& c2
!= -1) || c2
>= 256
188 || !(*p
== NUL
|| *p
== ','))
191 if (c2
== -1) /* not a range */
194 * A single '@' (not "@-@"):
195 * Decide on letters being ID/printable/keyword chars with
196 * standard function isalpha(). This takes care of locale for
197 * single-byte characters).
210 if (!do_isalpha
|| isalpha(c
)
212 || (p_altkeymap
&& (F_isalpha(c
) || F_isdigit(c
)))
216 if (i
== 0) /* (re)set ID flag */
219 chartab
[c
] &= ~CT_ID_CHAR
;
221 chartab
[c
] |= CT_ID_CHAR
;
223 else if (i
== 1) /* (re)set printable */
231 && (F_isalpha(c
) || F_isdigit(c
)))
235 /* For double-byte we keep the cell width, so
236 * that we can detect it from the first byte. */
237 && !(enc_dbcs
&& MB_BYTE2LEN(c
) == 2)
243 chartab
[c
] = (chartab
[c
] & ~CT_CELL_MASK
)
244 + ((dy_flags
& DY_UHEX
) ? 4 : 2);
245 chartab
[c
] &= ~CT_PRINT_CHAR
;
249 chartab
[c
] = (chartab
[c
] & ~CT_CELL_MASK
) + 1;
250 chartab
[c
] |= CT_PRINT_CHAR
;
254 else if (i
== 2) /* (re)set fname flag */
257 chartab
[c
] &= ~CT_FNAME_CHAR
;
259 chartab
[c
] |= CT_FNAME_CHAR
;
261 else /* i == 3 */ /* (re)set keyword flag */
264 RESET_CHARTAB(buf
, c
);
271 p
= skip_to_option_part(p
);
274 chartab_initialized
= TRUE
;
279 * Translate any special characters in buf[bufsize] in-place.
280 * The result is a string with only printable characters, but if there is not
281 * enough room, not all characters will be translated.
284 trans_characters(buf
, bufsize
)
288 int len
; /* length of string needing translation */
289 int room
; /* room in buffer after string */
290 char_u
*trs
; /* translated character */
291 int trs_len
; /* length of trs[] */
293 len
= (int)STRLEN(buf
);
294 room
= bufsize
- len
;
298 /* Assume a multi-byte character doesn't need translation. */
299 if (has_mbyte
&& (trs_len
= (*mb_ptr2len
)(buf
)) > 1)
304 trs
= transchar_byte(*buf
);
305 trs_len
= (int)STRLEN(trs
);
311 mch_memmove(buf
+ trs_len
, buf
+ 1, (size_t)len
);
313 mch_memmove(buf
, trs
, (size_t)trs_len
);
320 #if defined(FEAT_EVAL) || defined(FEAT_TITLE) || defined(FEAT_INS_EXPAND) \
323 * Translate a string into allocated memory, replacing special chars with
324 * printable chars. Returns NULL when out of memory.
340 /* Compute the length of the result, taking account of unprintable
341 * multi-byte characters. */
346 if ((l
= (*mb_ptr2len
)(p
)) > 1)
348 c
= (*mb_ptr2char
)(p
);
354 transchar_hex(hexbuf
, c
);
355 len
+= (int)STRLEN(hexbuf
);
360 l
= byte2cells(*p
++);
364 len
+= 4; /* illegal byte sequence */
367 res
= alloc((unsigned)(len
+ 1));
371 res
= alloc((unsigned)(vim_strsize(s
) + 1));
379 if (has_mbyte
&& (l
= (*mb_ptr2len
)(p
)) > 1)
381 c
= (*mb_ptr2char
)(p
);
383 STRNCAT(res
, p
, l
); /* append printable multi-byte char */
385 transchar_hex(res
+ STRLEN(res
), c
);
390 STRCAT(res
, transchar_byte(*p
++));
397 #if defined(FEAT_SYN_HL) || defined(FEAT_INS_EXPAND) || defined(PROTO)
399 * Convert the string "str[orglen]" to do ignore-case comparing. Uses the
401 * When "buf" is NULL returns an allocated string (NULL for out-of-memory).
402 * Otherwise puts the result in "buf[buflen]".
405 str_foldcase(str
, orglen
, buf
, buflen
)
415 #define GA_CHAR(i) ((char_u *)ga.ga_data)[i]
416 #define GA_PTR(i) ((char_u *)ga.ga_data + i)
417 #define STR_CHAR(i) (buf == NULL ? GA_CHAR(i) : buf[i])
418 #define STR_PTR(i) (buf == NULL ? GA_PTR(i) : buf + i)
420 /* Copy "str" into "buf" or allocated memory, unmodified. */
423 ga_init2(&ga
, 1, 10);
424 if (ga_grow(&ga
, len
+ 1) == FAIL
)
426 mch_memmove(ga
.ga_data
, str
, (size_t)len
);
431 if (len
>= buflen
) /* Ugly! */
433 mch_memmove(buf
, str
, (size_t)len
);
440 /* Make each character lower case. */
442 while (STR_CHAR(i
) != NUL
)
445 if (enc_utf8
|| (has_mbyte
&& MB_BYTE2LEN(STR_CHAR(i
)) > 1))
451 c
= utf_ptr2char(STR_PTR(i
));
455 int ol
= utf_char2len(c
);
456 int nl
= utf_char2len(lc
);
458 /* If the byte length changes need to shift the following
459 * characters forward or backward. */
464 if (buf
== NULL
? ga_grow(&ga
, nl
- ol
+ 1) == FAIL
465 : len
+ nl
- ol
>= buflen
)
467 /* out of memory, keep old char */
476 mch_memmove(GA_PTR(i
) + nl
, GA_PTR(i
) + ol
,
477 STRLEN(GA_PTR(i
) + ol
) + 1);
478 ga
.ga_len
+= nl
- ol
;
482 mch_memmove(buf
+ i
+ nl
, buf
+ i
+ ol
,
483 STRLEN(buf
+ i
+ ol
) + 1);
488 (void)utf_char2bytes(lc
, STR_PTR(i
));
491 /* skip to next multi-byte char */
492 i
+= (*mb_ptr2len
)(STR_PTR(i
));
498 GA_CHAR(i
) = TOLOWER_LOC(GA_CHAR(i
));
500 buf
[i
] = TOLOWER_LOC(buf
[i
]);
506 return (char_u
*)ga
.ga_data
;
512 * Catch 22: chartab[] can't be initialized before the options are
513 * initialized, and initializing options may cause transchar() to be called!
514 * When chartab_initialized == FALSE don't use chartab[].
515 * Does NOT work for multi-byte characters, c must be <= 255.
516 * Also doesn't work for the first byte of a multi-byte, "c" must be a
519 static char_u transchar_buf
[7];
528 if (IS_SPECIAL(c
)) /* special key code, display as ~@ char */
530 transchar_buf
[0] = '~';
531 transchar_buf
[1] = '@';
536 if ((!chartab_initialized
&& (
540 (c
>= ' ' && c
<= '~')
545 )) || (c
< 256 && vim_isprintc_strict(c
)))
547 /* printable character */
548 transchar_buf
[i
] = c
;
549 transchar_buf
[i
+ 1] = NUL
;
552 transchar_nonprint(transchar_buf
+ i
, c
);
553 return transchar_buf
;
556 #if defined(FEAT_MBYTE) || defined(PROTO)
558 * Like transchar(), but called with a byte instead of a character. Checks
559 * for an illegal UTF-8 byte.
565 if (enc_utf8
&& c
>= 0x80)
567 transchar_nonprint(transchar_buf
, c
);
568 return transchar_buf
;
575 * Convert non-printable character to two or more printable characters in
576 * "buf[]". "buf" needs to be able to hold five bytes.
577 * Does NOT work for multi-byte characters, c must be <= 255.
580 transchar_nonprint(buf
, c
)
585 c
= NUL
; /* we use newline in place of a NUL */
586 else if (c
== CAR
&& get_fileformat(curbuf
) == EOL_MAC
)
587 c
= NL
; /* we use CR in place of NL in this case */
589 if (dy_flags
& DY_UHEX
) /* 'display' has "uhex" */
590 transchar_hex(buf
, c
);
593 /* For EBCDIC only the characters 0-63 and 255 are not printable */
594 else if (CtrlChar(c
) != 0 || c
== DEL
)
596 else if (c
<= 0x7f) /* 0x00 - 0x1f and 0x7f */
602 buf
[1] = '?'; /* DEL displayed as ^? */
604 buf
[1] = CtrlChar(c
);
606 buf
[1] = c
^ 0x40; /* DEL displayed as ^? */
612 else if (enc_utf8
&& c
>= 0x80)
614 transchar_hex(buf
, c
);
618 else if (c
>= ' ' + 0x80 && c
<= '~' + 0x80) /* 0xa0 - 0xfe */
628 buf
[1] = MetaChar(c
);
632 else /* 0x80 - 0x9f and 0xff */
635 * TODO: EBCDIC I don't know what to do with this chars, so I display
636 * them as '~?' for now
640 buf
[1] = '?'; /* 0xff displayed as ~? */
642 buf
[1] = (c
- 0x80) ^ 0x40; /* 0xff displayed as ~? */
649 transchar_hex(buf
, c
)
659 buf
[++i
] = nr2hex((unsigned)c
>> 12);
660 buf
[++i
] = nr2hex((unsigned)c
>> 8);
663 buf
[++i
] = nr2hex((unsigned)c
>> 4);
664 buf
[++i
] = nr2hex(c
);
670 * Convert the lower 4 bits of byte "c" to its hex character.
671 * Lower case letters are used to avoid the confusion of <F1> being 0xf1 or
679 return (c
& 0xf) + '0';
680 return (c
& 0xf) - 10 + 'a';
684 * Return number of display cells occupied by byte "b".
685 * Caller must make sure 0 <= b <= 255.
686 * For multi-byte mode "b" must be the first byte of a character.
687 * A TAB is counted as two cells: "^I".
688 * For UTF-8 mode this will return 0 for bytes >= 0x80, because the number of
689 * cells depends on further bytes.
696 if (enc_utf8
&& b
>= 0x80)
699 return (chartab
[b
] & CT_CELL_MASK
);
703 * Return number of display cells occupied by character "c".
704 * "c" can be a special key (negative number) in which case 3 or 4 is returned.
705 * A TAB is counted as two cells: "^I" or four: "<09>".
712 return char2cells(K_SECOND(c
)) + 2;
716 /* UTF-8: above 0x80 need to check the value */
718 return utf_char2cells(c
);
719 /* DBCS: double-byte means double-width, except for euc-jp with first
721 if (enc_dbcs
!= 0 && c
>= 0x100)
723 if (enc_dbcs
== DBCS_JPNU
&& ((unsigned)c
>> 8) == 0x8e)
729 return (chartab
[c
& 0xff] & CT_CELL_MASK
);
733 * Return number of display cells occupied by character at "*p".
734 * A TAB is counted as two cells: "^I" or four: "<09>".
741 /* For UTF-8 we need to look at more bytes if the first byte is >= 0x80. */
742 if (enc_utf8
&& *p
>= 0x80)
743 return utf_ptr2cells(p
);
744 /* For DBCS we can tell the cell count from the first byte. */
746 return (chartab
[*p
] & CT_CELL_MASK
);
750 * Return the number of characters string "s" will take on the screen,
751 * counting TABs as two characters: "^I".
757 return vim_strnsize(s
, (int)MAXCOL
);
761 * Return the number of characters string "s[len]" will take on the screen,
762 * counting TABs as two characters: "^I".
771 while (*s
!= NUL
&& --len
>= 0)
776 int l
= (*mb_ptr2len
)(s
);
778 size
+= ptr2cells(s
);
784 size
+= byte2cells(*s
++);
790 * Return the number of characters 'c' will take on the screen, taking
791 * into account the size of a tab.
792 * Use a define to make it fast, this is used very often!!!
793 * Also see getvcol() below.
796 #define RET_WIN_BUF_CHARTABSIZE(wp, buf, p, col) \
797 if (*(p) == TAB && (!(wp)->w_p_list || lcs_tab1)) \
800 ts = (buf)->b_p_ts; \
801 return (int)(ts - (col % ts)); \
806 #if defined(FEAT_VREPLACE) || defined(FEAT_EX_EXTRA) || defined(FEAT_GUI) \
807 || defined(FEAT_VIRTUALEDIT) || defined(PROTO)
813 RET_WIN_BUF_CHARTABSIZE(curwin
, curbuf
, p
, col
)
817 #ifdef FEAT_LINEBREAK
819 win_chartabsize(wp
, p
, col
)
824 RET_WIN_BUF_CHARTABSIZE(wp
, wp
->w_buffer
, p
, col
)
829 * return the number of characters the string 's' will take on the screen,
830 * taking into account the size of a tab
839 col
+= lbr_chartabsize_adv(&s
, col
);
844 * Like linetabsize(), but for a given window instead of the current one.
847 win_linetabsize(wp
, p
, len
)
855 for (s
= p
; *s
!= NUL
&& (len
== MAXCOL
|| s
< p
+ len
); mb_ptr_adv(s
))
856 col
+= win_lbr_chartabsize(wp
, s
, col
, NULL
);
861 * Return TRUE if 'c' is a normal identifier character:
862 * Letters and characters from the 'isident' option.
868 return (c
> 0 && c
< 0x100 && (chartab
[c
] & CT_ID_CHAR
));
872 * return TRUE if 'c' is a keyword character: Letters and characters from
873 * 'iskeyword' option for current buffer.
874 * For multi-byte characters mb_get_class() is used (builtin rules).
884 return dbcs_class((unsigned)c
>> 8, c
& 0xff) >= 2;
886 return utf_class(c
) >= 2;
889 return (c
> 0 && c
< 0x100 && GET_CHARTAB(curbuf
, c
) != 0);
893 * Just like vim_iswordc() but uses a pointer to the (multi-byte) character.
900 if (has_mbyte
&& MB_BYTE2LEN(*p
) > 1)
901 return mb_get_class(p
) >= 2;
903 return GET_CHARTAB(curbuf
, *p
) != 0;
906 #if defined(FEAT_SYN_HL) || defined(PROTO)
908 vim_iswordc_buf(p
, buf
)
913 if (has_mbyte
&& MB_BYTE2LEN(*p
) > 1)
914 return mb_get_class(p
) >= 2;
916 return (GET_CHARTAB(buf
, *p
) != 0);
921 * return TRUE if 'c' is a valid file-name character
922 * Assume characters above 0x100 are valid (multi-byte).
928 return (c
>= 0x100 || (c
> 0 && (chartab
[c
] & CT_FNAME_CHAR
)));
932 * return TRUE if 'c' is a printable character
933 * Assume characters above 0x100 are printable (multi-byte), except for
941 if (enc_utf8
&& c
>= 0x100)
942 return utf_printable(c
);
944 return (c
>= 0x100 || (c
> 0 && (chartab
[c
] & CT_PRINT_CHAR
)));
948 * Strict version of vim_isprintc(c), don't return TRUE if "c" is the head
949 * byte of a double-byte character.
952 vim_isprintc_strict(c
)
956 if (enc_dbcs
!= 0 && c
< 0x100 && MB_BYTE2LEN(c
) > 1)
958 if (enc_utf8
&& c
>= 0x100)
959 return utf_printable(c
);
961 return (c
>= 0x100 || (c
> 0 && (chartab
[c
] & CT_PRINT_CHAR
)));
965 * like chartabsize(), but also check for line breaks on the screen
968 lbr_chartabsize(s
, col
)
972 #ifdef FEAT_LINEBREAK
973 if (!curwin
->w_p_lbr
&& *p_sbr
== NUL
)
977 if (curwin
->w_p_wrap
)
978 return win_nolbr_chartabsize(curwin
, s
, col
, NULL
);
980 RET_WIN_BUF_CHARTABSIZE(curwin
, curbuf
, s
, col
)
981 #ifdef FEAT_LINEBREAK
983 return win_lbr_chartabsize(curwin
, s
, col
, NULL
);
988 * Call lbr_chartabsize() and advance the pointer.
991 lbr_chartabsize_adv(s
, col
)
997 retval
= lbr_chartabsize(*s
, col
);
1003 * This function is used very often, keep it fast!!!!
1005 * If "headp" not NULL, set *headp to the size of what we for 'showbreak'
1006 * string at start of line. Warning: *headp is only set if it's a non-zero
1007 * value, init to 0 before calling.
1011 win_lbr_chartabsize(wp
, s
, col
, headp
)
1017 #ifdef FEAT_LINEBREAK
1030 int tab_corr
= (*s
== TAB
);
1034 * No 'linebreak' and 'showbreak': return quickly.
1036 if (!wp
->w_p_lbr
&& *p_sbr
== NUL
)
1041 return win_nolbr_chartabsize(wp
, s
, col
, headp
);
1043 RET_WIN_BUF_CHARTABSIZE(wp
, wp
->w_buffer
, s
, col
)
1046 #ifdef FEAT_LINEBREAK
1048 * First get normal size, without 'linebreak'
1050 size
= win_chartabsize(wp
, s
, col
);
1054 * If 'linebreak' set check at a blank before a non-blank if the line
1055 * needs a break here
1059 && !vim_isbreak(s
[1])
1062 # ifdef FEAT_VERTSPLIT
1068 * Count all characters from first non-blank after a blank up to next
1069 * non-blank after a blank.
1071 numberextra
= win_col_off(wp
);
1073 colmax
= W_WIDTH(wp
) - numberextra
;
1076 n
= colmax
+ win_col_off2(wp
);
1078 colmax
+= (((col
- colmax
) / n
) + 1) * n
;
1089 && (col2
== col
|| !vim_isbreak(*ps
))))))
1092 col2
+= win_chartabsize(wp
, s
, col2
);
1093 if (col2
>= colmax
) /* doesn't fit */
1095 size
= colmax
- col
;
1102 else if (has_mbyte
&& size
== 2 && MB_BYTE2LEN(*s
) > 1
1103 && wp
->w_p_wrap
&& in_win_border(wp
, col
))
1105 ++size
; /* Count the ">" in the last column. */
1111 * May have to add something for 'showbreak' string at start of line
1112 * Set *headp to the size of what we add.
1115 if (*p_sbr
!= NUL
&& wp
->w_p_wrap
&& col
!= 0)
1117 numberextra
= win_col_off(wp
);
1118 col
+= numberextra
+ mb_added
;
1119 if (col
>= (colnr_T
)W_WIDTH(wp
))
1122 numberextra
= W_WIDTH(wp
) - (numberextra
- win_col_off2(wp
));
1123 if (numberextra
> 0)
1124 col
= col
% numberextra
;
1126 if (col
== 0 || col
+ size
> (colnr_T
)W_WIDTH(wp
))
1128 added
= vim_strsize(p_sbr
);
1130 size
+= (added
/ wp
->w_buffer
->b_p_ts
) * wp
->w_buffer
->b_p_ts
;
1138 *headp
= added
+ mb_added
;
1143 #if defined(FEAT_MBYTE) || defined(PROTO)
1145 * Like win_lbr_chartabsize(), except that we know 'linebreak' is off and
1146 * 'wrap' is on. This means we need to check for a double-byte character that
1147 * doesn't fit at the end of the screen line.
1150 win_nolbr_chartabsize(wp
, s
, col
, headp
)
1158 if (*s
== TAB
&& (!wp
->w_p_list
|| lcs_tab1
))
1160 n
= wp
->w_buffer
->b_p_ts
;
1161 return (int)(n
- (col
% n
));
1164 /* Add one cell for a double-width character in the last column of the
1165 * window, displayed with a ">". */
1166 if (n
== 2 && MB_BYTE2LEN(*s
) > 1 && in_win_border(wp
, col
))
1176 * Return TRUE if virtual column "vcol" is in the rightmost column of window
1180 in_win_border(wp
, vcol
)
1184 colnr_T width1
; /* width of first line (after line number) */
1185 colnr_T width2
; /* width of further lines */
1187 #ifdef FEAT_VERTSPLIT
1188 if (wp
->w_width
== 0) /* there is no border */
1191 width1
= W_WIDTH(wp
) - win_col_off(wp
);
1192 if (vcol
< width1
- 1)
1194 if (vcol
== width1
- 1)
1196 width2
= width1
+ win_col_off2(wp
);
1197 return ((vcol
- width1
) % width2
== width2
- 1);
1199 #endif /* FEAT_MBYTE */
1202 * Get virtual column number of pos.
1203 * start: on the first position of this character (TAB, ctrl)
1204 * cursor: where the cursor is on this character (first char, except for TAB)
1205 * end: on the last position of this character (TAB, ctrl)
1207 * This is used very often, keep it fast!
1210 getvcol(wp
, pos
, start
, cursor
, end
)
1218 char_u
*ptr
; /* points to current char */
1219 char_u
*posptr
; /* points to char at pos->col */
1222 int ts
= wp
->w_buffer
->b_p_ts
;
1226 ptr
= ml_get_buf(wp
->w_buffer
, pos
->lnum
, FALSE
);
1227 posptr
= ptr
+ pos
->col
;
1230 * This function is used very often, do some speed optimizations.
1231 * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop.
1232 * Also use this when 'list' is set but tabs take their normal size.
1234 if ((!wp
->w_p_list
|| lcs_tab1
!= NUL
)
1235 #ifdef FEAT_LINEBREAK
1236 && !wp
->w_p_lbr
&& *p_sbr
== NUL
1249 /* make sure we don't go past the end of the line */
1252 incr
= 1; /* NUL at end of line only takes one column */
1255 /* A tab gets expanded, depending on the current column */
1257 incr
= ts
- (vcol
% ts
);
1263 /* For utf-8, if the byte is >= 0x80, need to look at
1264 * further bytes to find the cell width. */
1265 if (enc_utf8
&& c
>= 0x80)
1266 incr
= utf_ptr2cells(ptr
);
1270 /* If a double-cell char doesn't fit at the end of a line
1271 * it wraps to the next line, it's like this char is three
1273 if (incr
== 2 && wp
->w_p_wrap
&& in_win_border(wp
, vcol
))
1284 if (ptr
>= posptr
) /* character at pos->col */
1295 /* A tab gets expanded, depending on the current column */
1297 incr
= win_lbr_chartabsize(wp
, ptr
, vcol
, &head
);
1298 /* make sure we don't go past the end of the line */
1301 incr
= 1; /* NUL at end of line only takes one column */
1305 if (ptr
>= posptr
) /* character at pos->col */
1313 *start
= vcol
+ head
;
1315 *end
= vcol
+ incr
- 1;
1321 && !virtual_active()
1324 && (*p_sel
== 'e' || ltoreq(*pos
, VIsual
)))
1327 *cursor
= vcol
+ incr
- 1; /* cursor at end */
1329 *cursor
= vcol
+ head
; /* cursor at start */
1334 * Get virtual cursor column in the current window, pretending 'list' is off.
1337 getvcol_nolist(posp
)
1340 int list_save
= curwin
->w_p_list
;
1343 curwin
->w_p_list
= FALSE
;
1344 getvcol(curwin
, posp
, NULL
, &vcol
, NULL
);
1345 curwin
->w_p_list
= list_save
;
1349 #if defined(FEAT_VIRTUALEDIT) || defined(PROTO)
1351 * Get virtual column in virtual mode.
1354 getvvcol(wp
, pos
, start
, cursor
, end
)
1368 if (virtual_active())
1370 /* For virtual mode, only want one value */
1371 getvcol(wp
, pos
, &col
, NULL
, NULL
);
1373 coladd
= pos
->coladd
;
1376 /* Cannot put the cursor on part of a wide character. */
1377 ptr
= ml_get_buf(wp
->w_buffer
, pos
->lnum
, FALSE
);
1378 if (pos
->col
< STRLEN(ptr
))
1380 int c
= (*mb_ptr2char
)(ptr
+ pos
->col
);
1382 if (c
!= TAB
&& vim_isprintc(c
))
1384 endadd
= char2cells(c
) - 1;
1385 if (coladd
> endadd
) /* past end of line */
1398 *end
= col
+ endadd
;
1401 getvcol(wp
, pos
, start
, cursor
, end
);
1405 #if defined(FEAT_VISUAL) || defined(PROTO)
1407 * Get the leftmost and rightmost virtual column of pos1 and pos2.
1408 * Used for Visual block mode.
1411 getvcols(wp
, pos1
, pos2
, left
, right
)
1414 colnr_T
*left
, *right
;
1416 colnr_T from1
, from2
, to1
, to2
;
1418 if (ltp(pos1
, pos2
))
1420 getvvcol(wp
, pos1
, &from1
, NULL
, &to1
);
1421 getvvcol(wp
, pos2
, &from2
, NULL
, &to2
);
1425 getvvcol(wp
, pos2
, &from1
, NULL
, &to1
);
1426 getvvcol(wp
, pos1
, &from2
, NULL
, &to2
);
1434 if (*p_sel
== 'e' && from2
- 1 >= to1
)
1445 * skipwhite: skip over ' ' and '\t'.
1451 while (vim_iswhite(*p
)) /* skip to next non-white */
1463 while (VIM_ISDIGIT(*p
)) /* skip to next non-digit */
1468 #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) || defined(PROTO)
1470 * skip over digits and hex characters
1476 while (vim_isxdigit(*p
)) /* skip to next non-digit */
1482 #if defined(FEAT_EX_EXTRA) || defined(PROTO)
1484 * skip to digit (or NUL after the string)
1490 while (*p
!= NUL
&& !VIM_ISDIGIT(*p
)) /* skip to next digit */
1496 * skip to hex character (or NUL after the string)
1502 while (*p
!= NUL
&& !vim_isxdigit(*p
)) /* skip to next digit */
1509 * Variant of isdigit() that can handle characters > 0x100.
1510 * We don't use isdigit() here, because on some systems it also considers
1511 * superscript 1 to be a digit.
1512 * Use the VIM_ISDIGIT() macro for simple arguments.
1518 return (c
>= '0' && c
<= '9');
1522 * Variant of isxdigit() that can handle characters > 0x100.
1523 * We don't use isxdigit() here, because on some systems it also considers
1524 * superscript 1 to be a digit.
1530 return (c
>= '0' && c
<= '9')
1531 || (c
>= 'a' && c
<= 'f')
1532 || (c
>= 'A' && c
<= 'F');
1535 #if defined(FEAT_MBYTE) || defined(PROTO)
1537 * Vim's own character class functions. These exist because many library
1538 * islower()/toupper() etc. do not work properly: they crash when used with
1539 * invalid values or can't handle latin1 when the locale is C.
1540 * Speed is most important here.
1542 #define LATIN1LOWER 'l'
1543 #define LATIN1UPPER 'U'
1545 /* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]%_'abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ */
1546 static char_u latin1flags
[257] = " UUUUUUUUUUUUUUUUUUUUUUUUUU llllllllllllllllllllllllll UUUUUUUUUUUUUUUUUUUUUUU UUUUUUUllllllllllllllllllllllll llllllll";
1547 static char_u latin1upper
[257] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\x7f€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ÷ØÙÚÛÜÝÞÿ";
1548 static char_u latin1lower
[257] = " !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿àáâãäåæçèéêëìíîïðñòóôõö×øùúûüýþßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
1559 return utf_islower(c
);
1562 #ifdef HAVE_ISWLOWER
1566 /* islower() can't handle these chars and may crash */
1570 return (latin1flags
[c
] & LATIN1LOWER
) == LATIN1LOWER
;
1584 return utf_isupper(c
);
1587 #ifdef HAVE_ISWUPPER
1591 /* islower() can't handle these chars and may crash */
1595 return (latin1flags
[c
] & LATIN1UPPER
) == LATIN1UPPER
;
1609 return utf_toupper(c
);
1612 #ifdef HAVE_TOWUPPER
1616 /* toupper() can't handle these chars and may crash */
1620 return latin1upper
[c
];
1622 return TOUPPER_LOC(c
);
1634 return utf_tolower(c
);
1637 #ifdef HAVE_TOWLOWER
1641 /* tolower() can't handle these chars and may crash */
1645 return latin1lower
[c
];
1647 return TOLOWER_LOC(c
);
1652 * skiptowhite: skip over text until ' ' or '\t' or NUL.
1658 while (*p
!= ' ' && *p
!= '\t' && *p
!= NUL
)
1663 #if defined(FEAT_LISTCMDS) || defined(FEAT_SIGNS) || defined(FEAT_SNIFF) \
1666 * skiptowhite_esc: Like skiptowhite(), but also skip escaped chars
1672 while (*p
!= ' ' && *p
!= '\t' && *p
!= NUL
)
1674 if ((*p
== '\\' || *p
== Ctrl_V
) && *(p
+ 1) != NUL
)
1683 * Getdigits: Get a number from a string and skip over it.
1684 * Note: the argument is a pointer to a char_u pointer!
1694 retval
= atol((char *)p
);
1695 if (*p
== '-') /* skip negative sign */
1697 p
= skipdigits(p
); /* skip to next non-digit */
1703 * Return TRUE if "lbuf" is empty or only contains blanks.
1706 vim_isblankline(lbuf
)
1711 p
= skipwhite(lbuf
);
1712 return (*p
== NUL
|| *p
== '\r' || *p
== '\n');
1716 * Convert a string into a long and/or unsigned long, taking care of
1717 * hexadecimal and octal numbers. Accepts a '-' sign.
1718 * If "hexp" is not NULL, returns a flag to indicate the type of the number:
1723 * If "len" is not NULL, the length of the number in characters is returned.
1724 * If "nptr" is not NULL, the signed result is returned in it.
1725 * If "unptr" is not NULL, the unsigned result is returned in it.
1726 * If "unptr" is not NULL, the unsigned result is returned in it.
1727 * If "dooct" is non-zero recognize octal numbers, when > 1 always assume
1729 * If "dohex" is non-zero recognize hex numbers, when > 1 always assume
1733 vim_str2nr(start
, hexp
, len
, dooct
, dohex
, nptr
, unptr
)
1735 int *hexp
; /* return: type of number 0 = decimal, 'x'
1736 or 'X' is hex, '0' = octal */
1737 int *len
; /* return: detected length of number */
1738 int dooct
; /* recognize octal number */
1739 int dohex
; /* recognize hex number */
1740 long *nptr
; /* return: signed result */
1741 unsigned long *unptr
; /* return: unsigned result */
1743 char_u
*ptr
= start
;
1744 int hex
= 0; /* default is decimal */
1745 int negative
= FALSE
;
1746 unsigned long un
= 0;
1755 /* Recognize hex and octal. */
1756 if (ptr
[0] == '0' && ptr
[1] != '8' && ptr
[1] != '9')
1759 if (dohex
&& (hex
== 'X' || hex
== 'x') && vim_isxdigit(ptr
[2]))
1760 ptr
+= 2; /* hexadecimal */
1763 hex
= 0; /* default is decimal */
1766 /* Don't interpret "0", "08" or "0129" as octal. */
1767 for (n
= 1; VIM_ISDIGIT(ptr
[n
]); ++n
)
1771 hex
= 0; /* can't be octal */
1775 hex
= '0'; /* assume octal */
1782 * Do the string-to-numeric conversion "manually" to avoid sscanf quirks.
1784 if (hex
== '0' || dooct
> 1)
1787 while ('0' <= *ptr
&& *ptr
<= '7')
1789 un
= 8 * un
+ (unsigned long)(*ptr
- '0');
1793 else if (hex
!= 0 || dohex
> 1)
1796 while (vim_isxdigit(*ptr
))
1798 un
= 16 * un
+ (unsigned long)hex2nr(*ptr
);
1805 while (VIM_ISDIGIT(*ptr
))
1807 un
= 10 * un
+ (unsigned long)(*ptr
- '0');
1815 *len
= (int)(ptr
- start
);
1818 if (negative
) /* account for leading '-' for decimal numbers */
1828 * Return the value of a single hex character.
1829 * Only valid when the argument is '0' - '9', 'A' - 'F' or 'a' - 'f'.
1835 if (c
>= 'a' && c
<= 'f')
1836 return c
- 'a' + 10;
1837 if (c
>= 'A' && c
<= 'F')
1838 return c
- 'A' + 10;
1842 #if defined(FEAT_TERMRESPONSE) \
1843 || (defined(FEAT_GUI_GTK) && defined(FEAT_WINDOWS)) || defined(PROTO)
1845 * Convert two hex characters to a byte.
1846 * Return -1 if one of the characters is not hex.
1852 if (!vim_isxdigit(p
[0]) || !vim_isxdigit(p
[1]))
1854 return (hex2nr(p
[0]) << 4) + hex2nr(p
[1]);
1859 * Return TRUE if "str" starts with a backslash that should be removed.
1860 * For MS-DOS, WIN32 and OS/2 this is only done when the character after the
1861 * backslash is not a normal file name character.
1862 * '$' is a valid file name character, we don't remove the backslash before
1863 * it. This means it is not possible to use an environment variable after a
1864 * backslash. "C:\$VIM\doc" is taken literally, only "$VIM\doc" works.
1865 * Although "\ name" is valid, the backslash in "Program\ files" must be
1866 * removed. Assume a file name doesn't start with a space.
1867 * For multi-byte names, never remove a backslash before a non-ascii
1868 * character, assume that all multi-byte characters are valid file name
1875 #ifdef BACKSLASH_IN_FILENAME
1876 return (str
[0] == '\\'
1884 && !vim_isfilec(str
[1]))));
1886 return (str
[0] == '\\' && str
[1] != NUL
);
1891 * Halve the number of backslashes in a file name argument.
1892 * For MS-DOS we only do this if the character after the backslash
1893 * is not a normal file character.
1900 if (rem_backslash(p
))
1905 * backslash_halve() plus save the result in allocated memory.
1908 backslash_halve_save(p
)
1913 res
= vim_strsave(p
);
1916 backslash_halve(res
);
1920 #if (defined(EBCDIC) && defined(FEAT_POSTSCRIPT)) || defined(PROTO)
1922 * Table for EBCDIC to ASCII conversion unashamedly taken from xxd.c!
1923 * The first 64 entries have been added to map control characters defined in
1926 static char_u ebcdic2ascii_tab
[256] =
1928 0000, 0001, 0002, 0003, 0004, 0011, 0006, 0177,
1929 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017,
1930 0020, 0021, 0022, 0023, 0024, 0012, 0010, 0027,
1931 0030, 0031, 0032, 0033, 0033, 0035, 0036, 0037,
1932 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047,
1933 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057,
1934 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067,
1935 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077,
1936 0040, 0240, 0241, 0242, 0243, 0244, 0245, 0246,
1937 0247, 0250, 0325, 0056, 0074, 0050, 0053, 0174,
1938 0046, 0251, 0252, 0253, 0254, 0255, 0256, 0257,
1939 0260, 0261, 0041, 0044, 0052, 0051, 0073, 0176,
1940 0055, 0057, 0262, 0263, 0264, 0265, 0266, 0267,
1941 0270, 0271, 0313, 0054, 0045, 0137, 0076, 0077,
1942 0272, 0273, 0274, 0275, 0276, 0277, 0300, 0301,
1943 0302, 0140, 0072, 0043, 0100, 0047, 0075, 0042,
1944 0303, 0141, 0142, 0143, 0144, 0145, 0146, 0147,
1945 0150, 0151, 0304, 0305, 0306, 0307, 0310, 0311,
1946 0312, 0152, 0153, 0154, 0155, 0156, 0157, 0160,
1947 0161, 0162, 0136, 0314, 0315, 0316, 0317, 0320,
1948 0321, 0345, 0163, 0164, 0165, 0166, 0167, 0170,
1949 0171, 0172, 0322, 0323, 0324, 0133, 0326, 0327,
1950 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337,
1951 0340, 0341, 0342, 0343, 0344, 0135, 0346, 0347,
1952 0173, 0101, 0102, 0103, 0104, 0105, 0106, 0107,
1953 0110, 0111, 0350, 0351, 0352, 0353, 0354, 0355,
1954 0175, 0112, 0113, 0114, 0115, 0116, 0117, 0120,
1955 0121, 0122, 0356, 0357, 0360, 0361, 0362, 0363,
1956 0134, 0237, 0123, 0124, 0125, 0126, 0127, 0130,
1957 0131, 0132, 0364, 0365, 0366, 0367, 0370, 0371,
1958 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067,
1959 0070, 0071, 0372, 0373, 0374, 0375, 0376, 0377
1963 * Convert a buffer worth of characters from EBCDIC to ASCII. Only useful if
1964 * wanting 7-bit ASCII characters out the other end.
1967 ebcdic2ascii(buffer
, len
)
1973 for (i
= 0; i
< len
; i
++)
1974 buffer
[i
] = ebcdic2ascii_tab
[buffer
[i
]];