commit 577298a3f93a358cd4120df78539537717342c0f
parent f4a799aaec93a6e02acd53c7e7ff9c0e847c5b42
Author: David Lawrence Ramsey <pooka109@gmail.com>
Date: Sat, 8 Jan 2005 07:21:41 +0000
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
Diffstat:
3 files changed, 8 insertions(+), 97 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -53,13 +53,12 @@ CVS code -
(mostly) work properly with files containing multibyte
characters, and text display of such files should now (mostly)
work properly as well. New functions control_rep(),
- parse_char(), move_left(), move_right(), and
- display_string_len(); changes to do_left(), do_right(),
- do_delete(), breakable(), break_line(), do_output(),
- get_buffer(), unget_input(), actual_x(), strnlenpt(),
- display_string(), titlebar(), statusbar(), onekey(),
- edit_add(), do_replace_highlight(), and do_credits(). (David
- Benbennick and DLR)
+ parse_char(), move_left(), and move_right(); changes to
+ do_left(), do_right(), do_delete(), breakable(), break_line(),
+ do_output(), get_buffer(), unget_input(), actual_x(),
+ strnlenpt(), display_string(), titlebar(), statusbar(),
+ onekey(), edit_add(), do_replace_highlight(), and
+ do_credits(). (David Benbennick and DLR)
- Overhaul the high-level input routines for the statusbar to
make them read the shortcut lists for functions instead of
manually running them, to make nanogetstr() less complex, and
diff --git a/src/proto.h b/src/proto.h
@@ -601,8 +601,6 @@ void blank_edit(void);
void blank_statusbar(void);
void check_statusblank(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
dollars);
void nanoget_repaint(const char *buf, const char *inputbuf, size_t x);
diff --git a/src/winio.c b/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
* caller wants to display buf starting with column start_col, and
* 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);
- alloc_len = display_string_len(buf + start_index, start_col,
- start_col + len);
#ifdef NANO_WIDE
if (!ISSET(NO_UTF8))
- alloc_len += MB_CUR_MAX * 2;
+ alloc_len = MB_CUR_MAX * (len + 2);
else
#endif
- alloc_len += 2;
+ alloc_len = len + 2;
converted = charalloc(alloc_len + 1);
index = 0;