]> git.wh0rd.org Git - nano.git/commitdiff
add a few missing NANO_WIDE #ifdefs, and remove display_string_len()
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 27 Dec 2004 18:53:38 +0000 (18:53 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 27 Dec 2004 18:53:38 +0000 (18:53 +0000)
until I can fix it to no longer cause memory corruption

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2201 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/nano.c
src/winio.c

index 8137dd21ea170b630eef4fef504f0d0ded98099f..8a160f445109d461ac48a77a1af5cdd964d13565 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -52,12 +52,12 @@ CVS code -
          Movement and cursor display in the edit window should now work
          properly with files containing multibyte characters, and text
          display of such files should work properly some of the time.
-         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(), and do_credits(). (David Benbennick and DLR)
+         New functions control_rep(), 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(), and do_credits(). (David
+         Benbennick and DLR)
 - cut.c:
   do_cut_text()
        - If keep_cutbuffer is FALSE, only blow away the text in the
index d474fe9b280682fa9411ccd0981fa56e53945b1a..fd439aa404a69edfb7f66e05a6d73d13a596c998 100644 (file)
@@ -3596,11 +3596,9 @@ void do_output(int *kbinput, size_t kbinput_len)
 
     char *key =
 #ifdef NANO_WIDE
-       charalloc(MB_CUR_MAX)
-#else
-       charalloc(1)
+       !ISSET(NO_UTF8) ? charalloc(MB_CUR_MAX) :
 #endif
-       ;
+       charalloc(1);
 
     assert(current != NULL && current->data != NULL);
 
index 3806e032444cece3d28b414d2c744d92eef4b669..df26baf722fe30e7d0828782cda8c89548277ef0 100644 (file)
@@ -1720,89 +1720,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 buf
- * properly, not counting the null terminator?  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;
-           /* The current wide character. */
-       int wide_buf_len;
-           /* How many bytes wide is this character? */
-       size_t old_col = start_col;
-#ifdef NANO_WIDE
-       bool bad_char;
-#endif
-
-       wide_buf_len = parse_char(buf, &wide_buf, &start_col
-#ifdef NANO_WIDE
-               , &bad_char
-#endif
-               );
-
-#ifdef NANO_WIDE
-       /* If buf contains a null byte or an invalid multibyte
-        * character, interpret its first byte as though it's a wide
-        * character. */
-       if (!ISSET(NO_UTF8) && bad_char) {
-           char *bad_wide_buf = charalloc(MB_CUR_MAX);
-           int bad_wide_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_wide_buf_len = wctomb(bad_wide_buf, (wchar_t)wide_buf);
-
-           if (bad_wide_buf_len != -1)
-               retval += bad_wide_buf_len;
-
-           free(bad_wide_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 translate
-        * the byte to its visible equivalent as returned by
-        * control_rep(). */
-       else if (is_cntrl_char(wide_buf)) {
-           char ctrl_wide_buf = control_rep((unsigned char)wide_buf);
-
-           retval += parse_char(&ctrl_wide_buf, NULL, NULL
-#ifdef NANO_WIDE
-               , NULL
-#endif
-               ) + 1;
-
-       /* If we have a normal character, add its width in bytes
-        * normally. */
-       } else
-           retval += wide_buf_len;
-       buf += wide_buf_len;
-    }
-
-    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
@@ -1838,8 +1755,13 @@ 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,
-       column + len) + 2;
+#ifdef NANO_WIDE
+    if (!ISSET(NO_UTF8))
+       alloc_len = len * MB_CUR_MAX;
+    else
+#endif
+       alloc_len = len;
+
     converted = charalloc(alloc_len + 1);
     index = 0;
 
@@ -1857,12 +1779,20 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 
        if (is_cntrl_char(wide_buf)) {
            if (column < start_col) {
-               char *ctrl_wide_buf = charalloc(MB_CUR_MAX);
+               char *ctrl_wide_buf =
+#ifdef NANO_WIDE
+                       !ISSET(NO_UTF8) ? charalloc(MB_CUR_MAX) :
+#endif
+                       charalloc(1);
                int ctrl_wide_buf_len, i;
 
                wide_buf = control_rep((unsigned char)wide_buf);
-               ctrl_wide_buf_len = wctomb(ctrl_wide_buf,
-                       (wchar_t)wide_buf);
+               ctrl_wide_buf_len =
+#ifdef NANO_WIDE
+                       !ISSET(NO_UTF8) ? wctomb(ctrl_wide_buf,
+                       (wchar_t)wide_buf) :
+#endif
+                       1;
 
                for (i = 0; i < ctrl_wide_buf_len; i++)
                    converted[index++] = ctrl_wide_buf[i];
@@ -1929,22 +1859,34 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
                start_col++;
            }
        } else if (is_cntrl_char(wide_buf)) {
-           char *ctrl_wide_buf = charalloc(MB_CUR_MAX);
+           char *ctrl_wide_buf =
+#ifdef NANO_WIDE
+               !ISSET(NO_UTF8) ? charalloc(MB_CUR_MAX) :
+#endif
+               charalloc(1);
            int ctrl_wide_buf_len, i;
 
            converted[index++] = '^';
            start_col++;
            wide_buf = control_rep((unsigned char)wide_buf);
 
-           ctrl_wide_buf_len = wctomb(ctrl_wide_buf,
-               (wchar_t)wide_buf);
+           ctrl_wide_buf_len =
+#ifdef NANO_WIDE
+               !ISSET(NO_UTF8) ? wctomb(ctrl_wide_buf,
+               (wchar_t)wide_buf) :
+#endif
+               1;
 
            for (i = 0; i < ctrl_wide_buf_len; i++)
                converted[index++] = ctrl_wide_buf[i];
 
            free(ctrl_wide_buf);
 
-           start_col += wcwidth((wchar_t)wide_buf);
+           start_col +=
+#ifdef NANO_WIDE
+               !ISSET(NO_UTF8) ? wcwidth((wchar_t)wide_buf) :
+#endif
+               1;
        } else if (wide_buf == ' ') {
            converted[index++] =
 #if !defined(NANO_SMALL) && defined(ENABLE_NANORC)