remove display_string_len() again for the time being, since it's still
prone to off-by-one errors that lead to memory corruption and I can't find anything obviously wrong with it; always allocate enough space for len columns of text now; any extra space that isn't used will be removed by the null_at() call at the end of display_string() anyway git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2245 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
f4a799aaec
commit
577298a3f9
13
ChangeLog
13
ChangeLog
|
@ -53,13 +53,12 @@ CVS code -
|
||||||
(mostly) work properly with files containing multibyte
|
(mostly) work properly with files containing multibyte
|
||||||
characters, and text display of such files should now (mostly)
|
characters, and text display of such files should now (mostly)
|
||||||
work properly as well. New functions control_rep(),
|
work properly as well. New functions control_rep(),
|
||||||
parse_char(), move_left(), move_right(), and
|
parse_char(), move_left(), and move_right(); changes to
|
||||||
display_string_len(); changes to do_left(), do_right(),
|
do_left(), do_right(), do_delete(), breakable(), break_line(),
|
||||||
do_delete(), breakable(), break_line(), do_output(),
|
do_output(), get_buffer(), unget_input(), actual_x(),
|
||||||
get_buffer(), unget_input(), actual_x(), strnlenpt(),
|
strnlenpt(), display_string(), titlebar(), statusbar(),
|
||||||
display_string(), titlebar(), statusbar(), onekey(),
|
onekey(), edit_add(), do_replace_highlight(), and
|
||||||
edit_add(), do_replace_highlight(), and do_credits(). (David
|
do_credits(). (David Benbennick and DLR)
|
||||||
Benbennick and DLR)
|
|
||||||
- Overhaul the high-level input routines for the statusbar to
|
- Overhaul the high-level input routines for the statusbar to
|
||||||
make them read the shortcut lists for functions instead of
|
make them read the shortcut lists for functions instead of
|
||||||
manually running them, to make nanogetstr() less complex, and
|
manually running them, to make nanogetstr() less complex, and
|
||||||
|
|
|
@ -601,8 +601,6 @@ void blank_edit(void);
|
||||||
void blank_statusbar(void);
|
void blank_statusbar(void);
|
||||||
void check_statusblank(void);
|
void check_statusblank(void);
|
||||||
void blank_bottombars(void);
|
void blank_bottombars(void);
|
||||||
size_t display_string_len(const char *buf, size_t start_col, size_t
|
|
||||||
end_col);
|
|
||||||
char *display_string(const char *buf, size_t start_col, size_t len, bool
|
char *display_string(const char *buf, size_t start_col, size_t len, bool
|
||||||
dollars);
|
dollars);
|
||||||
void nanoget_repaint(const char *buf, const char *inputbuf, size_t x);
|
void nanoget_repaint(const char *buf, const char *inputbuf, size_t x);
|
||||||
|
|
90
src/winio.c
90
src/winio.c
|
@ -2148,90 +2148,6 @@ void blank_bottombars(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* buf is a multibyte string to be displayed. We need to expand tabs
|
|
||||||
* and control characters. How many bytes do we need to display?
|
|
||||||
* start_col is the column of *buf (usually 0). We display to
|
|
||||||
* (end_col - 1). */
|
|
||||||
size_t display_string_len(const char *buf, size_t start_col, size_t
|
|
||||||
end_col)
|
|
||||||
{
|
|
||||||
size_t retval = 0;
|
|
||||||
|
|
||||||
assert(buf != NULL);
|
|
||||||
|
|
||||||
/* Throughout the loop, we maintain the fact that *buf displays at
|
|
||||||
* column start_col. */
|
|
||||||
while (start_col <= end_col && *buf != '\0') {
|
|
||||||
int wide_buf, mb_buf_len;
|
|
||||||
#ifdef NANO_WIDE
|
|
||||||
bool bad_char;
|
|
||||||
#endif
|
|
||||||
size_t old_col = start_col;
|
|
||||||
|
|
||||||
mb_buf_len = parse_char(buf, &wide_buf
|
|
||||||
#ifdef NANO_WIDE
|
|
||||||
, &bad_char
|
|
||||||
#endif
|
|
||||||
, &start_col);
|
|
||||||
|
|
||||||
#ifdef NANO_WIDE
|
|
||||||
/* If buf contains a null byte or an invalid multibyte
|
|
||||||
* character, interpret that character as though it's a wide
|
|
||||||
* character. */
|
|
||||||
if (!ISSET(NO_UTF8) && bad_char) {
|
|
||||||
char *bad_mb_buf = charalloc(MB_CUR_MAX);
|
|
||||||
int bad_mb_buf_len;
|
|
||||||
|
|
||||||
/* If we have a control character, add one byte to account
|
|
||||||
* for the "^" that will be displayed in front of it, and
|
|
||||||
* translate the character to its visible equivalent as
|
|
||||||
* returned by control_rep(). */
|
|
||||||
if (is_cntrl_char(wide_buf)) {
|
|
||||||
retval++;
|
|
||||||
wide_buf = control_rep((unsigned char)wide_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Translate the wide character to its multibyte
|
|
||||||
* equivalent. */
|
|
||||||
bad_mb_buf_len = wctomb(bad_mb_buf, (wchar_t)wide_buf);
|
|
||||||
|
|
||||||
if (bad_mb_buf_len != -1)
|
|
||||||
retval += bad_mb_buf_len;
|
|
||||||
|
|
||||||
free(bad_mb_buf);
|
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
/* If we have a tab, get its width in bytes using the
|
|
||||||
* current value of col. */
|
|
||||||
if (wide_buf == '\t')
|
|
||||||
retval += start_col - old_col;
|
|
||||||
/* If we have a control character, add one byte to account
|
|
||||||
* for the "^" that will be displayed in front of it, and
|
|
||||||
* then add the number of bytes for its visible equivalent
|
|
||||||
* as returned by control_rep(). */
|
|
||||||
else if (is_cntrl_char(wide_buf)) {
|
|
||||||
char ctrl_mb_buf = control_rep((unsigned char)wide_buf);
|
|
||||||
|
|
||||||
retval++;
|
|
||||||
retval += parse_char(&ctrl_mb_buf, NULL
|
|
||||||
#ifdef NANO_WIDE
|
|
||||||
, NULL
|
|
||||||
#endif
|
|
||||||
, NULL);
|
|
||||||
/* If we have a normal character, add its width in bytes
|
|
||||||
* normally. */
|
|
||||||
} else
|
|
||||||
retval += mb_buf_len;
|
|
||||||
#ifdef NANO_WIDE
|
|
||||||
}
|
|
||||||
|
|
||||||
buf += mb_buf_len;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert buf into a string that can be displayed on screen. The
|
/* Convert buf into a string that can be displayed on screen. The
|
||||||
* caller wants to display buf starting with column start_col, and
|
* caller wants to display buf starting with column start_col, and
|
||||||
* extending for at most len columns. start_col is zero-based. len is
|
* extending for at most len columns. start_col is zero-based. len is
|
||||||
|
@ -2266,14 +2182,12 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
|
||||||
|
|
||||||
assert(column <= start_col);
|
assert(column <= start_col);
|
||||||
|
|
||||||
alloc_len = display_string_len(buf + start_index, start_col,
|
|
||||||
start_col + len);
|
|
||||||
#ifdef NANO_WIDE
|
#ifdef NANO_WIDE
|
||||||
if (!ISSET(NO_UTF8))
|
if (!ISSET(NO_UTF8))
|
||||||
alloc_len += MB_CUR_MAX * 2;
|
alloc_len = MB_CUR_MAX * (len + 2);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
alloc_len += 2;
|
alloc_len = len + 2;
|
||||||
|
|
||||||
converted = charalloc(alloc_len + 1);
|
converted = charalloc(alloc_len + 1);
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
Loading…
Reference in New Issue