Mercurial > vim
diff src/misc1.c @ 17:9be87deaeb52 v7.0009
updated for version 7.0009
author | vimboss |
---|---|
date | Fri, 16 Jul 2004 20:18:37 +0000 |
parents | 3ba373b54370 |
children | cc049b00ee70 |
line wrap: on
line diff
--- a/src/misc1.c +++ b/src/misc1.c @@ -992,24 +992,92 @@ open_line(dir, flags, old_indent) for (p = leader + lead_len - 1; p > leader && vim_iswhite(*p); --p) ; - ++p; + +#ifdef FEAT_MBYTE + /* Compute the length of the replaced characters in + * screen characters, not bytes. */ + { + int repl_size = vim_strnsize(lead_repl, + lead_repl_len); + int old_size = 0; + char_u *endp = p; + int l; + + while (old_size < repl_size && p > leader) + { + --p; + p -= mb_head_off(leader, p); + old_size += ptr2cells(p); + } + l = lead_repl_len - (endp - p); + if (l != 0) + mch_memmove(endp + l, endp, + (size_t)((leader + lead_len) - endp)); + lead_len += l; + } +#else if (p < leader + lead_repl_len) p = leader; else p -= lead_repl_len; +#endif mch_memmove(p, lead_repl, (size_t)lead_repl_len); if (p + lead_repl_len > leader + lead_len) p[lead_repl_len] = NUL; /* blank-out any other chars from the old leader. */ while (--p >= leader) + { +#ifdef FEAT_MBYTE + int l = mb_head_off(leader, p); + + if (l > 1) + { + p -= l; + if (ptr2cells(p) > 1) + { + p[1] = ' '; + --l; + } + mch_memmove(p + 1, p + l + 1, + (size_t)((leader + lead_len) - (p + l + 1))); + lead_len -= l; + *p = ' '; + } + else +#endif if (!vim_iswhite(*p)) *p = ' '; + } } else /* left adjusted leader */ { p = skipwhite(leader); +#ifdef FEAT_MBYTE + /* Compute the length of the replaced characters in + * screen characters, not bytes. Move the part that is + * not to be overwritten. */ + { + int repl_size = vim_strnsize(lead_repl, + lead_repl_len); + int i; + int l; + + for (i = 0; p[i] != NUL && i < lead_len; i += l) + { + l = mb_ptr2len_check(p + i); + if (vim_strnsize(p, i + l) > repl_size) + break; + } + if (i != lead_repl_len) + { + mch_memmove(p + lead_repl_len, p + i, + (size_t)(lead_len - i - (leader - p))); + lead_len += lead_repl_len - i; + } + } +#endif mch_memmove(p, lead_repl, (size_t)lead_repl_len); /* Replace any remaining non-white chars in the old @@ -1026,7 +1094,26 @@ open_line(dir, flags, old_indent) (leader + lead_len) - p); } else + { +#ifdef FEAT_MBYTE + int l = mb_ptr2len_check(p); + + if (l > 1) + { + if (ptr2cells(p) > 1) + { + /* Replace a double-wide char with + * two spaces */ + --l; + *p++ = ' '; + } + mch_memmove(p + 1, p + l, + (leader + lead_len) - p); + lead_len -= l - 1; + } +#endif *p = ' '; + } } *p = NUL; } @@ -3789,7 +3876,8 @@ get_env_name(xp, idx) /* Borland C++ 5.2 has this in a header file. */ extern char **environ; # endif - static char_u name[100]; +# define ENVNAMELEN 100 + static char_u name[ENVNAMELEN]; char_u *str; int n; @@ -3797,7 +3885,7 @@ get_env_name(xp, idx) if (str == NULL) return NULL; - for (n = 0; n < 99; ++n) + for (n = 0; n < ENVNAMELEN - 1; ++n) { if (str[n] == '=' || str[n] == NUL) break; @@ -5064,7 +5152,10 @@ cin_is_cpp_baseclass(line, col) *col = 0; - s = cin_skipcomment(line); + s = skipwhite(line); + if (*s == '#') /* skip #define FOO x ? (x) : x */ + return FALSE; + s = cin_skipcomment(s); if (*s == NUL) return FALSE; @@ -5737,7 +5828,8 @@ get_c_indent() if (start_off != 0) amount += start_off; else if (start_align == COM_RIGHT) - amount += lead_start_len - lead_middle_len; + amount += vim_strsize(lead_start) + - vim_strsize(lead_middle); break; } @@ -5751,7 +5843,8 @@ get_c_indent() if (off != 0) amount += off; else if (align == COM_RIGHT) - amount += lead_start_len - lead_middle_len; + amount += vim_strsize(lead_start) + - vim_strsize(lead_middle); done = TRUE; break; }