Add an option to use wcwidth_cjk() instead of wcwidth(), as several people
[u/mdw/putty] / terminal.c
index 36f59c3..904f1b8 100644 (file)
@@ -1017,6 +1017,21 @@ static termline *lineptr(Terminal *term, int y, int lineno, int screen)
     }
 
     /* We assume that we don't screw up and retrieve something out of range. */
+    if (line == NULL) {
+       fatalbox("line==NULL in terminal.c\n"
+                "lineno=%d y=%d w=%d h=%d\n"
+                "count(scrollback=%p)=%d\n"
+                "count(screen=%p)=%d\n"
+                "count(alt=%p)=%d alt_sblines=%d\n"
+                "whichtree=%p treeindex=%d\n\n"
+                "Please contact <putty@projects.tartarus.org> "
+                "and pass on the above information.",
+                lineno, y, term->cols, term->rows,
+                term->scrollback, count234(term->scrollback),
+                term->screen, count234(term->screen),
+                term->alt_screen, count234(term->alt_screen), term->alt_sblines,
+                whichtree, treeindex);
+    }
     assert(line != NULL);
 
     resizeline(term, line, term->cols);
@@ -2608,12 +2623,19 @@ static void term_out(Terminal *term)
            }
        }
 
-       /* How about C1 controls ? */
+       /*
+        * How about C1 controls? 
+        * Explicitly ignore SCI (0x9a), which we don't translate to DECID.
+        */
        if ((c & -32) == 0x80 && term->termstate < DO_CTRLS &&
            !term->vt52_mode && has_compat(VT220)) {
-           term->termstate = SEEN_ESC;
-           term->esc_query = FALSE;
-           c = '@' + (c & 0x1F);
+           if (c == 0x9a)
+               c = 0;
+           else {
+               term->termstate = SEEN_ESC;
+               term->esc_query = FALSE;
+               c = '@' + (c & 0x1F);
+           }
        }
 
        /* Or the GL control. */
@@ -2633,13 +2655,12 @@ static void term_out(Terminal *term)
        if ((c & ~0x1F) == 0 && term->termstate < DO_CTRLS) {
            switch (c) {
              case '\005':             /* ENQ: terminal type query */
-               /* Strictly speaking this is VT100 but a VT100 defaults to
+               /* 
+                * Strictly speaking this is VT100 but a VT100 defaults to
                 * no response. Other terminals respond at their option.
                 *
                 * Don't put a CR in the default string as this tends to
                 * upset some weird software.
-                *
-                * An xterm returns "xterm" (5 characters)
                 */
                compatibility(ANSIMIN);
                if (term->ldisc) {
@@ -2824,7 +2845,9 @@ static void term_out(Terminal *term)
                    if (DIRECT_CHAR(c))
                        width = 1;
                    if (!width)
-                       width = wcwidth((wchar_t) c);
+                       width = (term->cfg.cjk_ambig_wide ?
+                                wcwidth_cjk((wchar_t) c) :
+                                wcwidth((wchar_t) c));
 
                    if (term->wrapnext && term->wrap && width > 0) {
                        cline->lattr |= LATTR_WRAPPED;
@@ -3510,7 +3533,7 @@ static void term_out(Terminal *term)
                                  case 95:
                                  case 96:
                                  case 97:
-                                   /* xterm-style bright foreground */
+                                   /* aixterm-style bright foreground */
                                    term->curr_attr &= ~ATTR_FGMASK;
                                    term->curr_attr |=
                                        ((term->esc_args[i] - 90 + 8)
@@ -3541,7 +3564,7 @@ static void term_out(Terminal *term)
                                  case 105:
                                  case 106:
                                  case 107:
-                                   /* xterm-style bright background */
+                                   /* aixterm-style bright background */
                                    term->curr_attr &= ~ATTR_BGMASK;
                                    term->curr_attr |=
                                        ((term->esc_args[i] - 100 + 8)
@@ -3798,7 +3821,7 @@ static void term_out(Terminal *term)
                            }
                        }
                        break;
-                     case 'Z':         /* CBT: BackTab for xterm */
+                     case 'Z':         /* CBT */
                        compatibility(OTHER);
                        {
                            int i = def(term->esc_args[0], 1);
@@ -6210,13 +6233,13 @@ int term_data(Terminal *term, int is_stderr, const char *data, int len)
      * the remote side needing to wait until term_out() has cleared
      * a backlog.
      *
-     * This is a slightly suboptimal way to deal with SSH2 - in
+     * This is a slightly suboptimal way to deal with SSH-2 - in
      * principle, the window mechanism would allow us to continue
      * to accept data on forwarded ports and X connections even
      * while the terminal processing was going slowly - but we
      * can't do the 100% right thing without moving the terminal
      * processing into a separate thread, and that might hurt
-     * portability. So we manage stdout buffering the old SSH1 way:
+     * portability. So we manage stdout buffering the old SSH-1 way:
      * if the terminal processing goes slowly, the whole SSH
      * connection stops accepting data until it's ready.
      *