add multibyte character support to indent_length(), convert the "smart
home" routines to use it (since it returns the number of bytes taken up by spacing characters at the beginning of the line), and rearrange a few initializations near asserts git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2307 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
2921be2f38
commit
3eeb823f92
|
@ -110,10 +110,10 @@ CVS code -
|
||||||
chars.c), move_left() (renamed move_mbleft() and moved to
|
chars.c), move_left() (renamed move_mbleft() and moved to
|
||||||
chars.c), move_right() (renamed move_mbright() and moved to
|
chars.c), move_right() (renamed move_mbright() and moved to
|
||||||
chars.c), do_home(), do_verbatim_input(), do_delete(),
|
chars.c), do_home(), do_verbatim_input(), do_delete(),
|
||||||
do_tab(), do_next_word(), do_prev_word(), do_input(),
|
do_tab(), do_enter(), indent_length(), do_next_word(),
|
||||||
do_output(), strstrwrapper(), get_buffer(), unget_input(),
|
do_prev_word(), do_input(), do_output(), strstrwrapper(),
|
||||||
unget_kbinput(), get_input(), parse_kbinput(),
|
get_buffer(), unget_input(), unget_kbinput(), get_input(),
|
||||||
unparse_kbinput(), parse_verbatim_kbinput(),
|
parse_kbinput(), unparse_kbinput(), parse_verbatim_kbinput(),
|
||||||
do_statusbar_input(), do_statusbar_home(),
|
do_statusbar_input(), do_statusbar_home(),
|
||||||
do_statusbar_verbatim_kbinput(), do_statusbar_output(), and
|
do_statusbar_verbatim_kbinput(), do_statusbar_output(), and
|
||||||
display_string(); removal of buffer_to_keys() and
|
display_string(); removal of buffer_to_keys() and
|
||||||
|
|
20
src/move.c
20
src/move.c
|
@ -57,26 +57,8 @@ void do_home(void)
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
if (ISSET(SMART_HOME)) {
|
if (ISSET(SMART_HOME)) {
|
||||||
size_t current_x_save = current_x;
|
size_t current_x_save = current_x;
|
||||||
char *blank_mb = charalloc(mb_cur_max());
|
|
||||||
int blank_mb_len;
|
|
||||||
|
|
||||||
current_x = 0;
|
current_x = indent_length(current->data);
|
||||||
|
|
||||||
while (current->data[current_x] != '\0') {
|
|
||||||
blank_mb_len = parse_mbchar(current->data + current_x,
|
|
||||||
blank_mb
|
|
||||||
#ifdef NANO_WIDE
|
|
||||||
, NULL
|
|
||||||
#endif
|
|
||||||
, NULL);
|
|
||||||
|
|
||||||
if (!is_blank_mbchar(blank_mb))
|
|
||||||
break;
|
|
||||||
|
|
||||||
current_x += blank_mb_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(blank_mb);
|
|
||||||
|
|
||||||
if (current_x == current_x_save ||
|
if (current_x == current_x_save ||
|
||||||
current->data[current_x] == '\0')
|
current->data[current_x] == '\0')
|
||||||
|
|
37
src/nano.c
37
src/nano.c
|
@ -1330,11 +1330,13 @@ void do_next_word(void)
|
||||||
{
|
{
|
||||||
size_t pww_save = placewewant;
|
size_t pww_save = placewewant;
|
||||||
const filestruct *current_save = current;
|
const filestruct *current_save = current;
|
||||||
char *char_mb = charalloc(mb_cur_max());
|
char *char_mb;
|
||||||
int char_mb_len;
|
int char_mb_len;
|
||||||
|
|
||||||
assert(current != NULL && current->data != NULL);
|
assert(current != NULL && current->data != NULL);
|
||||||
|
|
||||||
|
char_mb = charalloc(mb_cur_max());
|
||||||
|
|
||||||
/* Move forward until we find the character after the last letter of
|
/* Move forward until we find the character after the last letter of
|
||||||
* the current word. */
|
* the current word. */
|
||||||
while (current->data[current_x] != '\0') {
|
while (current->data[current_x] != '\0') {
|
||||||
|
@ -1399,12 +1401,14 @@ void do_prev_word(void)
|
||||||
{
|
{
|
||||||
size_t pww_save = placewewant;
|
size_t pww_save = placewewant;
|
||||||
const filestruct *current_save = current;
|
const filestruct *current_save = current;
|
||||||
char *char_mb = charalloc(mb_cur_max());
|
char *char_mb;
|
||||||
int char_mb_len;
|
int char_mb_len;
|
||||||
bool begin_line = FALSE;
|
bool begin_line = FALSE;
|
||||||
|
|
||||||
assert(current != NULL && current->data != NULL);
|
assert(current != NULL && current->data != NULL);
|
||||||
|
|
||||||
|
char_mb = charalloc(mb_cur_max());
|
||||||
|
|
||||||
/* Move backward until we find the character before the first letter
|
/* Move backward until we find the character before the first letter
|
||||||
* of the current word. */
|
* of the current word. */
|
||||||
while (!begin_line) {
|
while (!begin_line) {
|
||||||
|
@ -1633,7 +1637,7 @@ bool do_wrap(filestruct *inptr)
|
||||||
if (ISSET(AUTOINDENT)) {
|
if (ISSET(AUTOINDENT)) {
|
||||||
/* Indentation comes from the next line if wrapping, else from
|
/* Indentation comes from the next line if wrapping, else from
|
||||||
* this line. */
|
* this line. */
|
||||||
indentation = (wrapping ? wrap_line : inptr->data);
|
indentation = wrapping ? wrap_line : inptr->data;
|
||||||
indent_len = indent_length(indentation);
|
indent_len = indent_length(indentation);
|
||||||
if (wrapping)
|
if (wrapping)
|
||||||
/* The wrap_line text should not duplicate indentation.
|
/* The wrap_line text should not duplicate indentation.
|
||||||
|
@ -2296,21 +2300,38 @@ void do_spell(void)
|
||||||
}
|
}
|
||||||
#endif /* !DISABLE_SPELLER */
|
#endif /* !DISABLE_SPELLER */
|
||||||
|
|
||||||
#if !defined(NANO_SMALL) || !defined(DISABLE_JUSTIFY)
|
#ifndef NANO_SMALL
|
||||||
/* The "indentation" of a line is the whitespace between the quote part
|
/* The "indentation" of a line is the whitespace between the quote part
|
||||||
* and the non-whitespace of the line. */
|
* and the non-whitespace of the line. */
|
||||||
size_t indent_length(const char *line)
|
size_t indent_length(const char *line)
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
char *blank_mb;
|
||||||
|
int blank_mb_len;
|
||||||
|
|
||||||
assert(line != NULL);
|
assert(line != NULL);
|
||||||
while (is_blank_char(*line)) {
|
|
||||||
line++;
|
blank_mb = charalloc(mb_cur_max());
|
||||||
len++;
|
|
||||||
|
while (*line != '\0') {
|
||||||
|
blank_mb_len = parse_mbchar(line, blank_mb
|
||||||
|
#ifdef NANO_WIDE
|
||||||
|
, NULL
|
||||||
|
#endif
|
||||||
|
, NULL);
|
||||||
|
|
||||||
|
if (!is_blank_mbchar(blank_mb))
|
||||||
|
break;
|
||||||
|
|
||||||
|
line += blank_mb_len;
|
||||||
|
len += blank_mb_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(blank_mb);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
#endif /* !NANO_SMALL || !DISABLE_JUSTIFY */
|
#endif /* !NANO_SMALL */
|
||||||
|
|
||||||
#ifndef DISABLE_JUSTIFY
|
#ifndef DISABLE_JUSTIFY
|
||||||
/* justify_format() replaces Tab by Space and multiple spaces by 1
|
/* justify_format() replaces Tab by Space and multiple spaces by 1
|
||||||
|
|
28
src/winio.c
28
src/winio.c
|
@ -1819,26 +1819,8 @@ void do_statusbar_home(void)
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
if (ISSET(SMART_HOME)) {
|
if (ISSET(SMART_HOME)) {
|
||||||
size_t statusbar_x_save = statusbar_x;
|
size_t statusbar_x_save = statusbar_x;
|
||||||
char *blank_mb = charalloc(mb_cur_max());
|
|
||||||
int blank_mb_len;
|
|
||||||
|
|
||||||
statusbar_x = 0;
|
statusbar_x = indent_length(answer);
|
||||||
|
|
||||||
while (statusbar_x < statusbar_xend) {
|
|
||||||
blank_mb_len = parse_mbchar(answer + statusbar_x,
|
|
||||||
blank_mb
|
|
||||||
#ifdef NANO_WIDE
|
|
||||||
, NULL
|
|
||||||
#endif
|
|
||||||
, NULL);
|
|
||||||
|
|
||||||
if (!is_blank_mbchar(blank_mb))
|
|
||||||
break;
|
|
||||||
|
|
||||||
statusbar_x += blank_mb_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(blank_mb);
|
|
||||||
|
|
||||||
if (statusbar_x == statusbar_x_save ||
|
if (statusbar_x == statusbar_x_save ||
|
||||||
statusbar_x == statusbar_xend)
|
statusbar_x == statusbar_xend)
|
||||||
|
@ -1904,11 +1886,13 @@ void do_statusbar_cut_text(void)
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
void do_statusbar_next_word(void)
|
void do_statusbar_next_word(void)
|
||||||
{
|
{
|
||||||
char *char_mb = charalloc(mb_cur_max());
|
char *char_mb;
|
||||||
int char_mb_len;
|
int char_mb_len;
|
||||||
|
|
||||||
assert(answer != NULL);
|
assert(answer != NULL);
|
||||||
|
|
||||||
|
char_mb = charalloc(mb_cur_max());
|
||||||
|
|
||||||
/* Move forward until we find the character after the last letter of
|
/* Move forward until we find the character after the last letter of
|
||||||
* the current word. */
|
* the current word. */
|
||||||
while (statusbar_x < statusbar_xend) {
|
while (statusbar_x < statusbar_xend) {
|
||||||
|
@ -1950,12 +1934,14 @@ void do_statusbar_next_word(void)
|
||||||
|
|
||||||
void do_statusbar_prev_word(void)
|
void do_statusbar_prev_word(void)
|
||||||
{
|
{
|
||||||
char *char_mb = charalloc(mb_cur_max());
|
char *char_mb;
|
||||||
int char_mb_len;
|
int char_mb_len;
|
||||||
bool begin_line = FALSE;
|
bool begin_line = FALSE;
|
||||||
|
|
||||||
assert(answer != NULL);
|
assert(answer != NULL);
|
||||||
|
|
||||||
|
char_mb = charalloc(mb_cur_max());
|
||||||
|
|
||||||
/* Move backward until we find the character before the first letter
|
/* Move backward until we find the character before the first letter
|
||||||
* of the current word. */
|
* of the current word. */
|
||||||
while (!begin_line) {
|
while (!begin_line) {
|
||||||
|
|
Loading…
Reference in New Issue