]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_addstr.c
ncurses 5.5
[ncurses.git] / ncurses / base / lib_addstr.c
index 1c3e19a46e09ce275bbd6e7cfb31a027a187cbc9..7a93c4152e616c685459c67dbd8615fc16a09e34 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2002,2003 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2003,2004 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -30,7 +30,7 @@
  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
  *                                                                          *
- *  Rewritten 2001-2002 to support wide-characters by                       *
+ *  Rewritten 2001-2004 to support wide-characters by                       *
  *     Sven Verdoolaege                                                    *
  *     Thomas Dickey                                                       *
  ****************************************************************************/
@@ -44,7 +44,7 @@
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: lib_addstr.c,v 1.39 2003/12/06 18:04:33 tom Exp $")
+MODULE_ID("$Id: lib_addstr.c,v 1.43 2004/12/12 00:15:31 tom Exp $")
 
 NCURSES_EXPORT(int)
 waddnstr(WINDOW *win, const char *astr, int n)
@@ -119,7 +119,7 @@ waddchnstr(WINDOW *win, const chtype *astr, int n)
 #if USE_WIDEC_SUPPORT
 
 NCURSES_EXPORT(int)
-_nc_wchstrlen(const cchar_t * s)
+_nc_wchstrlen(const cchar_t *s)
 {
     int result = 0;
     while (CharOf(s[result]) != L'\0') {
@@ -129,13 +129,14 @@ _nc_wchstrlen(const cchar_t * s)
 }
 
 NCURSES_EXPORT(int)
-wadd_wchnstr(WINDOW *win, const cchar_t * astr, int n)
+wadd_wchnstr(WINDOW *win, const cchar_t *astr, int n)
 {
+    NCURSES_CH_T blank = NewChar(BLANK_TEXT);
     NCURSES_SIZE_T y = win->_cury;
     NCURSES_SIZE_T x = win->_curx;
     int code = OK;
     struct ldat *line;
-    int i, start, end;
+    int i, j, start, len, end;
 
     T((T_CALLED("wadd_wchnstr(%p,%s,%d)"), win, _nc_viscbuf(astr, n), n));
 
@@ -153,22 +154,58 @@ wadd_wchnstr(WINDOW *win, const cchar_t * astr, int n)
     line = &(win->_line[y]);
     start = x;
     end = x + n - 1;
-    if (isnac(line->text[x])) {
-       line->text[x - 1] = win->_nc_bkgd;
-       --start;
+
+    /*
+     * Reset orphaned cells of multi-column characters that extend up to the
+     * new string's location to blanks.
+     */
+    if (x > 0 && isWidecExt(line->text[x])) {
+       for (i = 0; i <= x; ++i) {
+           if (!isWidecExt(line->text[x - i])) {
+               /* must be isWidecBase() */
+               start -= i;
+               while (i > 0) {
+                   line->text[x - i--] = _nc_render(win, blank);
+               }
+               break;
+           }
+       }
     }
+
+    /*
+     * Copy the new string to the window.
+     */
     for (i = 0; i < n && x <= win->_maxx; ++i) {
-       line->text[x++] = astr[i];
-       if (wcwidth(CharOf(astr[i])) > 1) {
-           if (x <= win->_maxx)
-               AddAttr(line->text[x++], WA_NAC);
-           else
-               line->text[x - 1] = win->_nc_bkgd;
+       if (isWidecExt(astr[i]))
+           continue;
+
+       len = wcwidth(CharOf(astr[i]));
+
+       if (x + len - 1 <= win->_maxx) {
+           line->text[x] = _nc_render(win, astr[i]);
+           if (len > 1) {
+               for (j = 0; j < len; ++j) {
+                   if (j != 0) {
+                       line->text[x + j] = line->text[x];
+                   }
+                   SetWidecExt(line->text[x + j], j);
+               }
+           }
+           x += len;
+           end += len - 1;
+       } else {
+           break;
        }
     }
-    if (x <= win->_maxx && isnac(line->text[x])) {
-       line->text[x] = win->_nc_bkgd;
+
+    /*
+     * Set orphaned cells of multi-column characters which lie after the new
+     * string to blanks.
+     */
+    while (x <= win->_maxx && isWidecExt(line->text[x])) {
+       line->text[x] = _nc_render(win, blank);
        ++end;
+       ++x;
     }
     CHANGED_RANGE(line, start, end);
 
@@ -177,7 +214,7 @@ wadd_wchnstr(WINDOW *win, const cchar_t * astr, int n)
 }
 
 NCURSES_EXPORT(int)
-waddnwstr(WINDOW *win, const wchar_t * str, int n)
+waddnwstr(WINDOW *win, const wchar_t *str, int n)
 {
     int code = ERR;