1 /****************************************************************************
2 * Copyright 2019,2020 Thomas E. Dickey *
3 * Copyright 2002-2016,2017 Free Software Foundation, Inc. *
5 * Permission is hereby granted, free of charge, to any person obtaining a *
6 * copy of this software and associated documentation files (the *
7 * "Software"), to deal in the Software without restriction, including *
8 * without limitation the rights to use, copy, modify, merge, publish, *
9 * distribute, distribute with modifications, sublicense, and/or sell *
10 * copies of the Software, and to permit persons to whom the Software is *
11 * furnished to do so, subject to the following conditions: *
13 * The above copyright notice and this permission notice shall be included *
14 * in all copies or substantial portions of the Software. *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
19 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
22 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
24 * Except as contained in this notice, the name(s) of the above copyright *
25 * holders shall not be used in advertising or otherwise to promote the *
26 * sale, use or other dealings in this Software without prior written *
28 ****************************************************************************/
30 /****************************************************************************
31 * Author: Thomas Dickey 2002 *
32 ****************************************************************************/
37 ** The routine wins_wch().
41 #include <curses.priv.h>
43 MODULE_ID("$Id: lib_ins_wch.c,v 1.25 2020/12/05 20:04:59 tom Exp $")
46 * Insert the given character, updating the current location to simplify
50 _nc_insert_wch(WINDOW *win, const cchar_t *wch)
52 int cells = _nc_wacs_width(CharOf(CHDEREF(wch)));
56 code = winsch(win, (chtype) CharOf(CHDEREF(wch)));
61 if (win->_curx <= win->_maxx) {
63 struct ldat *line = &(win->_line[win->_cury]);
64 NCURSES_CH_T *end = &(line->text[win->_curx]);
65 NCURSES_CH_T *temp1 = &(line->text[win->_maxx]);
66 NCURSES_CH_T *temp2 = temp1 - cells;
68 CHANGED_TO_EOL(line, win->_curx, win->_maxx);
72 *temp1 = _nc_render(win, *wch);
73 for (cell = 1; cell < cells; ++cell) {
74 SetWidecExt(temp1[cell], cell);
77 win->_curx = (NCURSES_SIZE_T) (win->_curx + cells);
84 wins_wch(WINDOW *win, const cchar_t *wch)
88 T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch)));
91 NCURSES_SIZE_T oy = win->_cury;
92 NCURSES_SIZE_T ox = win->_curx;
94 code = _nc_insert_wch(win, wch);
104 wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
108 T((T_CALLED("wins_nwstr(%p,%s,%d)"),
109 (void *) win, _nc_viswbufn(wstr, n), n));
119 SCREEN *sp = _nc_screen_of(win);
120 NCURSES_SIZE_T oy = win->_cury;
121 NCURSES_SIZE_T ox = win->_curx;
123 for (cp = wstr; (*cp != L'\0') && ((cp - wstr) < n); cp++) {
124 int len = _nc_wacs_width(*cp);
126 if ((len >= 0 && len != 1) || !is7bits(*cp)) {
128 wchar_t tmp_wchar = *cp;
129 memset(&tmp_cchar, 0, sizeof(tmp_cchar));
130 (void) setcchar(&tmp_cchar,
135 code = _nc_insert_wch(win, &tmp_cchar);
137 /* tabs, other ASCII stuff */
138 code = _nc_insert_ch(sp, win, (chtype) (*cp));