]> git.wh0rd.org Git - nano.git/commitdiff
make whitespace display mode work with multibyte characters
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 10 Mar 2005 22:52:21 +0000 (22:52 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 10 Mar 2005 22:52:21 +0000 (22:52 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2346 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
doc/nanorc.sample
src/global.c
src/nano.c
src/proto.h
src/rcfile.c
src/winio.c

index b13c15dd935fc3daa49f05d95c95eabbc8b79280..52d8a8efd6bd7274486dfa0126fe7325ecd1c84e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -171,6 +171,10 @@ CVS code -
          parse_syntax(), parse_colors(), parse_rcfile(), do_rcfile(),
          etc. (David Benbennick)  DLR: Rename colortoint() to
          color_to_int(), and add a few miscellaneous tweaks.
+       - Still more steps toward full wide/multibyte character support.
+         Make whitespace display mode work with multibyte characters,
+         and add a few related documentation updates.  Changes to
+         do_help(), main(), parse_rcfile(), and display_string(). (DLR)
 - cut.c:
   do_cut_text()
        - If keep_cutbuffer is FALSE, only blow away the text in the
@@ -325,6 +329,9 @@ CVS code -
          Piefel)
        - Add the "morespace" option. (DLR)
        - Add support for characters to the "c-file" regexes. (DLR)
+       - Add the hexadecimal equivalents of the decimal values
+         suggested for whitespace display, now that it can handle
+         multibyte characters. (DLR)
 - nano.1. nanorc.5, nano.texi:
        - Add the "morespace" option, and sync with the descriptions in
          nanorc.sample in a few places. (DLR)
index ef8eaa1257e70a9d9776171d78e5b50abea5c462..63d7f778cc969c97ea335b16442984645b931b4d 100644 (file)
 ## Save automatically on exit, don't prompt.
 # set tempfile
 
-## Disallow file modification, why would you want this in an rc file? ;)
+## Disallow file modification; why would you want this in an rcfile? ;)
 # set view
 
 ## The two characters used to display the first characters of tabs and
-## spaces.  187 and 183 seem to be good values for these.
+## spaces.  187 decimal (00BB hexadecimal) and 183 decimal (00B7
+## hexadecimal) seem to be good values for these.
 # set whitespace "  "
 
 ## Color setup
index 5c2996bd8efd3dfa6f00ffaffed828aa18c14ffe..19a37de55a66a37d62dd867bda66a277157e5e9c 100644 (file)
@@ -78,6 +78,7 @@ openfilestruct *open_files = NULL;    /* The list of open file
 char *whitespace = NULL;       /* Characters used when displaying
                                   the first characters of tabs and
                                   spaces. */
+int whitespace_len[2];         /* The length of the characters. */
 #endif
 
 #ifndef DISABLE_JUSTIFY
index 4c1b4960ebad467011dbe6bfa4e2d03e9123f0d9..96bdb53129e318fa707d379b34d57993a27148b0 100644 (file)
@@ -380,10 +380,10 @@ void help_init(void)
          "Esc key twice.  Escape-key sequences are notated with the Meta "
          "(M) symbol and can be entered using either the Esc, Alt or "
          "Meta key depending on your keyboard setup.  Also, pressing Esc "
-         "twice and then typing a three-digit number from 000 to 255 "
-         "will enter the character with the corresponding value.  The "
-         "following keystrokes are available in the main editor window.  "
-         "Alternative keys are shown in parentheses:\n\n");
+         "twice and then typing a three-digit decimal number from 000 to "
+         " 255 will enter the character with the corresponding value.  "
+         "The following keystrokes are available in the main editor "
+         " window.  Alternative keys are shown in parentheses:\n\n");
 
     htx = _(htx);
 
@@ -4271,8 +4271,11 @@ int main(int argc, char **argv)
 
 #if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
     /* If whitespace wasn't specified, set its default value. */
-    if (whitespace == NULL)
+    if (whitespace == NULL) {
        whitespace = mallocstrcpy(NULL, "  ");
+       whitespace_len[0] = 1;
+       whitespace_len[1] = 1;
+    }
 #endif
 
     /* If tabsize wasn't specified, set its default value. */
index a39217a633628b7beccf0a218413324b7523d8c0..3f7c30c663c2f401707da37acb8134976bfc6cdc 100644 (file)
@@ -47,6 +47,7 @@ extern int currslen;
 
 #if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
 extern char *whitespace;
+extern int whitespace_len[2];
 #endif
 
 #ifndef DISABLE_JUSTIFY
index a1b60e2f4539f29061bea65ce157e5017d653b66..03c30565061ab506636aa2dab2a537eee2a04cdd 100644 (file)
@@ -570,13 +570,24 @@ void parse_rcfile(FILE *rcstream)
 #endif
 #ifndef NANO_SMALL
                        if (strcasecmp(rcopts[i].name, "whitespace") == 0) {
-                           size_t ws_len;
-                           whitespace = mallocstrcpy(NULL, option);
-                           ws_len = strlen(whitespace);
-                           if (ws_len != 2 || (ws_len == 2 && (is_cntrl_char(whitespace[0]) || is_cntrl_char(whitespace[1])))) {
-                               rcfile_error(N_("Two non-control characters required"));
+                           /* We use display_string() here so that any
+                            * invalid multibyte characters in option
+                            * will be converted to valid multibyte
+                            * characters in whitespace. */
+                           whitespace = display_string(option, 0, 3, FALSE);
+
+                           if (mbstrlen(whitespace) != 2 || strlenpt(whitespace) != 2) {
+                               rcfile_error(N_("Two single-column characters required"));
                                free(whitespace);
                                whitespace = NULL;
+                           } else {
+                               whitespace_len[0] =
+                                       parse_mbchar(whitespace, NULL,
+                                       NULL, NULL);
+                               whitespace_len[1] =
+                                       parse_mbchar(whitespace +
+                                       whitespace_len[0], NULL,
+                                       NULL, NULL);
                            }
                        } else
 #endif
index 671855266d728d38fa02e1b2b709450f4edeec0d..bc0b92019eb16830bd5567c1542a04c6c207fd68 100644 (file)
@@ -2278,11 +2278,15 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
                NULL);
 
        if (*buf_mb == '\t') {
-           converted[index++] =
 #if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
-               ISSET(WHITESPACE_DISPLAY) ? whitespace[0] :
+           if (ISSET(WHITESPACE_DISPLAY)) {
+               int i;
+
+               for (i = 0; i < whitespace_len[0]; i++)
+                   converted[index++] = whitespace[i];
+           } else
 #endif
-               ' '; 
+               converted[index++] = ' '; 
            start_col++;
            while (start_col % tabsize != 0) {
                converted[index++] = ' ';
@@ -2308,11 +2312,16 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 
            free(ctrl_buf_mb);
        } else if (*buf_mb == ' ') {
-           converted[index++] =
 #if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
-               ISSET(WHITESPACE_DISPLAY) ? whitespace[1] :
+           if (ISSET(WHITESPACE_DISPLAY)) {
+               int i;
+
+               for (i = whitespace_len[0]; i < whitespace_len[0] +
+                       whitespace_len[1]; i++)
+                   converted[index++] = whitespace[i];
+           } else
 #endif
-               ' ';
+               converted[index++] = ' '; 
            start_col++;
        } else {
            int i;