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-d3aeb78583b8
master
David Lawrence Ramsey 2005-01-08 07:21:41 +00:00
parent f4a799aaec
commit 577298a3f9
3 changed files with 8 additions and 97 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;