]> git.wh0rd.org Git - nano.git/commitdiff
control characters can only be properly filtered out in both non-UTF-8
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 17 Mar 2005 03:52:08 +0000 (03:52 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 17 Mar 2005 03:52:08 +0000 (03:52 +0000)
and UTF-8 mode inside the output routines, so do it there instead of
inside the input routines

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

ChangeLog
configure.ac
src/chars.c
src/nano.c
src/proto.h
src/winio.c

index 97bf46f8936f2110e8e0e791c917b86f89dac2ba..b80ba67476b6bccb948cb7e91c10a7e81df40002 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -94,17 +94,17 @@ CVS code -
          support to a few more functions as well, and move multibyte
          character-specific functions to their own source file.  New
          file chars.c; new functions is_alnum_char(),
-         is_alnum_mbchar(), is_alnum_wchar(), is_ascii_char(),
-         is_blank_mbchar(), is_blank_wchar(), is_cntrl_mbchar(),
-         is_cntrl_wchar(), control_mbrep(), control_wrep(), mbwidth(),
-         mb_cur_max(), make_mbchar(), mbstrlen(), mbstrnlen(),
-         mbstrcasecmp(), mbstrncasecmp(), mbstrcasestr(), and
-         mbrevstrcasestr(); changes to help_init(), is_byte() (moved to
-         chars.c), is_blank_char() (moved to chars.c), is_cntrl_char()
-         (moved to chars.c), nstricmp() (renamed nstrcasecmp() and
-         moved to chars.c), nstrnicmp() (renamed nstrncasecmp() and
-         moved to chars.c), nstristr() (renamed nstrcasestr() and moved
-         to chars.c), revstrstr() (moved to chars.c), revstristr()
+         is_alnum_mbchar(), is_alnum_wchar(), is_blank_mbchar(),
+         is_blank_wchar(), is_cntrl_mbchar(), is_cntrl_wchar(),
+         control_mbrep(), control_wrep(), mbwidth(), mb_cur_max(),
+         make_mbchar(), mbstrlen(), mbstrnlen(), mbstrcasecmp(),
+         mbstrncasecmp(), mbstrcasestr(), and mbrevstrcasestr();
+         changes to help_init(), is_byte() (moved to chars.c),
+         is_blank_char() (moved to chars.c), is_cntrl_char() (moved to
+         chars.c), nstricmp() (renamed nstrcasecmp() and moved to
+         chars.c), nstrnicmp() (renamed nstrncasecmp() and moved to
+         chars.c), nstristr() (renamed nstrcasestr() and moved to
+         chars.c), revstrstr() (moved to chars.c), revstristr()
          (renamed revstrcasestr() and moved to chars.c), nstrnlen()
          (moved to chars.c), parse_char() (renamed parse_mbchar() and
          moved to chars.c), move_left() (renamed move_mbleft() and
index 0492452de3cb2131a651d752e181d42d3e64cf41..ba1a2b316cf1e3aca9e62b7fffbac25a7f5bb4b4 100644 (file)
@@ -291,7 +291,7 @@ AC_MSG_WARN([*** Can not use slang when cross-compiling])),
     esac], [AC_MSG_RESULT(no)])
 
 dnl Checks for functions
-AC_CHECK_FUNCS(snprintf vsnprintf isascii isblank iswalnum iswblank iswspace strcasecmp strncasecmp strcasestr strnlen getline getdelim mblen mbtowc wctomb wcwidth)
+AC_CHECK_FUNCS(snprintf vsnprintf isblank iswalnum iswblank iswspace strcasecmp strncasecmp strcasestr strnlen getline getdelim mblen mbtowc wctomb wcwidth)
 if test "x$ac_cv_func_snprintf" = "xno" -o "x$ac_cv_func_vsnprintf" = "xno"
 then
        AM_PATH_GLIB_2_0(2.0.0,,
index 456d18be823feed1f5f6fedbe93f63d5cdb6f9dc..8080b77578a954a9a7aafb4c63ea8d2ec0093562 100644 (file)
@@ -79,18 +79,6 @@ bool is_alnum_wchar(wchar_t wc)
 {
     return iswalnum(wc);
 }
-
-/* This function is equivalent to isascii(). */
-bool is_ascii_char(int c)
-{
-    return
-#ifdef HAVE_ISASCII
-       isascii(c)
-#else
-       ((unsigned int)c == (signed char)c)
-#endif
-       ;
-}
 #endif
 
 /* This function is equivalent to isblank(). */
index 9f57210e76c2aaf831a732b7ed1351ce257b0710..c67a396cfb06e63f13f2ca737aa906db0f4f325d 100644 (file)
@@ -1210,14 +1210,15 @@ void do_verbatim_input(void)
     /* Read in all the verbatim characters. */
     kbinput = get_verbatim_kbinput(edit, &kbinput_len);
 
-    /* Display all the verbatim characters at once. */
+    /* Display all the verbatim characters at once, not filtering out
+     * control characters. */
     output = charalloc(kbinput_len + 1);
 
     for (i = 0; i < kbinput_len; i++)
        output[i] = (char)kbinput[i];
     output[i] = '\0';
 
-    do_output(output, kbinput_len);
+    do_output(output, kbinput_len, TRUE);
 
     free(output);
 }
@@ -1313,7 +1314,7 @@ void do_tab(void)
 {
     char *kbinput = "\t";
 
-    do_output(kbinput, 1);
+    do_output(kbinput, 1, TRUE);
 }
 
 /* Someone hits return *gasp!* */
@@ -3615,18 +3616,11 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
        );
 
     if (allow_funcs) {
-       /* If we got a character, and it isn't a shortcut, toggle, or
-        * control character, it's a normal text character.  Display the
-        * warning if we're in view mode, or add the character to the
-        * input buffer if we're not. */
-       if (input != ERR && *s_or_t == FALSE && (
-#ifdef NANO_WIDE
-               /* Keep non-ASCII control characters if we're in UTF-8
-                * mode, since they might be part of a UTF-8
-                * sequence. */
-               (!ISSET(NO_UTF8) && !is_ascii_char(input)) ||
-#endif
-               !is_cntrl_char(input))) {
+       /* If we got a character, and it isn't a shortcut or toggle,
+        * it's a normal text character.  Display the warning if we're
+        * in view mode, or add the character to the input buffer if
+        * we're not. */
+       if (input != ERR && *s_or_t == FALSE) {
            if (ISSET(VIEW_MODE))
                print_view_warning();
            else {
@@ -3645,7 +3639,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
         if (*s_or_t == TRUE || get_buffer_len() == 0) {
            if (kbinput != NULL) {
                /* Display all the characters in the input buffer at
-                * once. */
+                * once, filtering out control characters. */
                char *output = charalloc(kbinput_len + 1);
                size_t i;
 
@@ -3653,7 +3647,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
                    output[i] = (char)kbinput[i];
                output[i] = '\0';
 
-               do_output(output, kbinput_len);
+               do_output(output, kbinput_len, FALSE);
 
                free(output);
 
@@ -3776,8 +3770,9 @@ bool do_mouse(void)
 #endif /* !DISABLE_MOUSE */
 
 /* The user typed kbinput_len multibyte characters.  Add them to the
- * edit buffer. */
-void do_output(char *output, size_t output_len)
+ * edit buffer, filtering out all control characters if allow_cntrls is
+ * TRUE. */
+void do_output(char *output, size_t output_len, bool allow_cntrls)
 {
     size_t current_len = strlen(current->data), i = 0;
     bool old_constupdate = ISSET(CONSTUPDATE);
@@ -3794,14 +3789,18 @@ void do_output(char *output, size_t output_len)
     UNSET(CONSTUPDATE);
 
     while (i < output_len) {
-       /* Null to newline, if needed. */
-       if (output[i] == '\0')
-           output[i] = '\n';
-       /* Newline to Enter, if needed. */
-       else if (output[i] == '\n') {
-           do_enter();
-           i++;
-           continue;
+       /* If allow_cntrls is FALSE, filter out nulls and newlines,
+        * since they're control characters. */
+       if (allow_cntrls) {
+           /* Null to newline, if needed. */
+           if (output[i] == '\0')
+               output[i] = '\n';
+           /* Newline to Enter, if needed. */
+           else if (output[i] == '\n') {
+               do_enter();
+               i++;
+               continue;
+           }
        }
 
        /* Interpret the next multibyte character.  If it's an invalid
@@ -3811,6 +3810,10 @@ void do_output(char *output, size_t output_len)
 
        i += char_buf_len;
 
+       /* If allow_cntrls is FALSE, filter out a control character. */
+       if (!allow_cntrls && is_cntrl_mbchar(output + i - char_buf_len))
+           continue;
+
        /* When a character is inserted on the current magicline, it
         * means we need a new one! */
        if (filebot == current)
index 84e99d4ecb3593ef8d35c36d26c8ee2234507083..9a797d1640ae0d283adf3bd28d8cfddf4ade114f 100644 (file)
@@ -156,7 +156,6 @@ bool is_alnum_char(int c);
 bool is_alnum_mbchar(const char *c);
 #ifdef NANO_WIDE
 bool is_alnum_wchar(wchar_t wc);
-bool is_ascii_char(int c);
 #endif
 bool is_blank_char(int c);
 bool is_blank_mbchar(const char *c);
@@ -463,7 +462,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
 #ifndef DISABLE_MOUSE
 bool do_mouse(void);
 #endif
-void do_output(char *output, size_t output_len);
+void do_output(char *output, size_t output_len, bool allow_cntrls);
 
 /* Public functions in rcfile.c. */
 #ifdef ENABLE_NANORC
@@ -626,7 +625,7 @@ void do_statusbar_prev_word(void);
 #endif
 void do_statusbar_verbatim_input(bool *got_enter);
 void do_statusbar_output(char *output, size_t output_len, bool
-       *got_enter);
+       *got_enter, bool allow_cntrls);
 size_t xplustabs(void);
 size_t actual_x(const char *str, size_t xplus);
 size_t strnlenpt(const char *buf, size_t size);
index d8a9cbe0490140e1d6e748325b4690ff1e318f1e..60a60eafcb11e85a64041ead4044f88c59f90a9e 100644 (file)
@@ -1676,18 +1676,11 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
     *s_or_t = have_shortcut;
 
     if (allow_funcs) {
-       /* If we got a character, and it isn't a shortcut, toggle, or
-        * control character, it's a normal text character.  Display the
-        * warning if we're in view mode, or add the character to the
-        * input buffer if we're not. */
-       if (input != ERR && *s_or_t == FALSE && (
-#ifdef NANO_WIDE
-               /* Keep non-ASCII control characters if we're in UTF-8
-                * mode, since they might be part of a UTF-8
-                * sequence. */
-               (!ISSET(NO_UTF8) && !is_ascii_char(input)) ||
-#endif
-               !is_cntrl_char(input))) {
+       /* If we got a character, and it isn't a shortcut or toggle,
+        * it's a normal text character.  Display the warning if we're
+        * in view mode, or add the character to the input buffer if
+        * we're not. */
+       if (input != ERR && *s_or_t == FALSE) {
            /* If we're using restricted mode, the filename isn't blank,
             * and we're at the "Write File" prompt, disable text
             * input. */
@@ -1707,7 +1700,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
            if (kbinput != NULL) {
 
                /* Display all the characters in the input buffer at
-                * once. */
+                * once, filtering out control characters. */
                char *output = charalloc(kbinput_len + 1);
                size_t i;
                bool got_enter;
@@ -1717,7 +1710,8 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
                    output[i] = (char)kbinput[i];
                output[i] = '\0';
 
-               do_statusbar_output(output, kbinput_len, &got_enter);
+               do_statusbar_output(output, kbinput_len, &got_enter,
+                       FALSE);
 
                free(output);
 
@@ -2037,20 +2031,21 @@ void do_statusbar_verbatim_input(bool *got_enter)
     /* Read in all the verbatim characters. */
     kbinput = get_verbatim_kbinput(bottomwin, &kbinput_len);
 
-    /* Display all the verbatim characters at once. */
+    /* Display all the verbatim characters at once, not filtering out
+     * control characters. */
     output = charalloc(kbinput_len + 1);
 
     for (i = 0; i < kbinput_len; i++)
        output[i] = (char)kbinput[i];
     output[i] = '\0';
 
-    do_statusbar_output(output, kbinput_len, got_enter);
+    do_statusbar_output(output, kbinput_len, got_enter, TRUE);
 
     free(output);
 }
 
 void do_statusbar_output(char *output, size_t output_len, bool
-       *got_enter)
+       *got_enter, bool allow_cntrls)
 {
     size_t answer_len = strlen(answer), i = 0;
     char *char_buf = charalloc(mb_cur_max());
@@ -2061,17 +2056,22 @@ void do_statusbar_output(char *output, size_t output_len, bool
     *got_enter = FALSE;
 
     while (i < output_len) {
-       /* Null to newline, if needed. */
-       if (output[i] == '\0')
-           output[i] = '\n';
-       /* Newline to Enter, if needed. */
-       else if (output[i] == '\n') {
-           /* Set got_enter to TRUE to indicate that we got the Enter
-            * key, put back the rest of the characters in output so
-            * that they can be parsed and output again, and get out. */
-           *got_enter = TRUE;
-           unparse_kbinput(output + i, output_len - i);
-           return;
+       /* If allow_cntrls is FALSE, filter out nulls and newlines,
+        * since they're control characters. */
+       if (allow_cntrls) {
+           /* Null to newline, if needed. */
+           if (output[i] == '\0')
+               output[i] = '\n';
+           /* Newline to Enter, if needed. */
+           else if (output[i] == '\n') {
+               /* Set got_enter to TRUE to indicate that we got the
+                * Enter key, put back the rest of the characters in
+                * output so that they can be parsed and output again,
+                * and get out. */
+               *got_enter = TRUE;
+               unparse_kbinput(output + i, output_len - i);
+               return;
+           }
        }
 
        /* Interpret the next multibyte character.  If it's an invalid
@@ -2081,6 +2081,10 @@ void do_statusbar_output(char *output, size_t output_len, bool
 
        i += char_buf_len;
 
+       /* If allow_cntrls is FALSE, filter out a control character. */
+       if (!allow_cntrls && is_cntrl_mbchar(output + i - char_buf_len))
+           continue;
+
        /* More dangerousness fun =) */
        answer = charealloc(answer, answer_len + (char_buf_len * 2));