blob: ecaabcc9b73e3bd8ab037d4b8686db5b317dba47 [file] [log] [blame]
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05301/****************************************************************************
micky3879b9f5e72025-07-08 18:04:53 -04002 * Copyright 2019-2020,2023 Thomas E. Dickey *
3 * Copyright 2002-2016,2017 Free Software Foundation, Inc. *
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05304 * *
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: *
12 * *
13 * The above copyright notice and this permission notice shall be included *
14 * in all copies or substantial portions of the Software. *
15 * *
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. *
23 * *
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 *
27 * authorization. *
28 ****************************************************************************/
29
30/****************************************************************************
31 * Author: Thomas Dickey 2002 *
32 ****************************************************************************/
33
34/*
35** lib_ins_wch.c
36**
37** The routine wins_wch().
38**
39*/
40
41#include <curses.priv.h>
42
micky3879b9f5e72025-07-08 18:04:53 -040043MODULE_ID("$Id: lib_ins_wch.c,v 1.29 2023/11/21 21:53:28 tom Exp $")
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053044
45/*
46 * Insert the given character, updating the current location to simplify
47 * inserting a string.
48 */
Steve Kondikae271bc2015-11-15 02:50:53 +010049NCURSES_EXPORT(int)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053050_nc_insert_wch(WINDOW *win, const cchar_t *wch)
51{
micky3879b9f5e72025-07-08 18:04:53 -040052 int cells = _nc_wacs_width(CharOf(CHDEREF(wch)));
Steve Kondikae271bc2015-11-15 02:50:53 +010053 int code = OK;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053054
Steve Kondikae271bc2015-11-15 02:50:53 +010055 if (cells < 0) {
56 code = winsch(win, (chtype) CharOf(CHDEREF(wch)));
57 } else {
58 if (cells == 0)
59 cells = 1;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053060
Steve Kondikae271bc2015-11-15 02:50:53 +010061 if (win->_curx <= win->_maxx) {
micky3879b9f5e72025-07-08 18:04:53 -040062 int cell;
Steve Kondikae271bc2015-11-15 02:50:53 +010063 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;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053067
Steve Kondikae271bc2015-11-15 02:50:53 +010068 CHANGED_TO_EOL(line, win->_curx, win->_maxx);
69 while (temp1 > end)
70 *temp1-- = *temp2--;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053071
Steve Kondikae271bc2015-11-15 02:50:53 +010072 *temp1 = _nc_render(win, *wch);
73 for (cell = 1; cell < cells; ++cell) {
74 SetWidecExt(temp1[cell], cell);
75 }
76
micky3879b9f5e72025-07-08 18:04:53 -040077 win->_curx = (NCURSES_SIZE_T) (win->_curx + cells);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053078 }
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053079 }
Steve Kondikae271bc2015-11-15 02:50:53 +010080 return code;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053081}
82
83NCURSES_EXPORT(int)
84wins_wch(WINDOW *win, const cchar_t *wch)
85{
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053086 int code = ERR;
87
Steve Kondikae271bc2015-11-15 02:50:53 +010088 T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch)));
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053089
90 if (win != 0) {
micky3879b9f5e72025-07-08 18:04:53 -040091 NCURSES_SIZE_T oy = win->_cury;
92 NCURSES_SIZE_T ox = win->_curx;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053093
94 code = _nc_insert_wch(win, wch);
95
96 win->_curx = ox;
97 win->_cury = oy;
98 _nc_synchook(win);
99 }
100 returnCode(code);
101}
102
103NCURSES_EXPORT(int)
104wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
105{
106 int code = ERR;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530107
Steve Kondikae271bc2015-11-15 02:50:53 +0100108 T((T_CALLED("wins_nwstr(%p,%s,%d)"),
109 (void *) win, _nc_viswbufn(wstr, n), n));
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530110
111 if (win != 0
micky3879b9f5e72025-07-08 18:04:53 -0400112 && wstr != 0
113 && n != 0) {
Steve Kondikae271bc2015-11-15 02:50:53 +0100114
micky3879b9f5e72025-07-08 18:04:53 -0400115 if (n < 0) {
116 n = INT_MAX;
117 }
118 code = OK;
119
120 if (n > 0) {
121 const wchar_t *cp;
122 SCREEN *sp = _nc_screen_of(win);
123 NCURSES_SIZE_T oy = win->_cury;
124 NCURSES_SIZE_T ox = win->_curx;
125
126 for (cp = wstr; ((cp - wstr) < n) && (*cp != L'\0'); cp++) {
127 int len = _nc_wacs_width(*cp);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530128
Steve Kondikae271bc2015-11-15 02:50:53 +0100129 if ((len >= 0 && len != 1) || !is7bits(*cp)) {
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530130 cchar_t tmp_cchar;
131 wchar_t tmp_wchar = *cp;
132 memset(&tmp_cchar, 0, sizeof(tmp_cchar));
133 (void) setcchar(&tmp_cchar,
134 &tmp_wchar,
135 WA_NORMAL,
Steve Kondikae271bc2015-11-15 02:50:53 +0100136 (short) 0,
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530137 (void *) 0);
138 code = _nc_insert_wch(win, &tmp_cchar);
139 } else {
140 /* tabs, other ASCII stuff */
Steve Kondikae271bc2015-11-15 02:50:53 +0100141 code = _nc_insert_ch(sp, win, (chtype) (*cp));
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530142 }
143 if (code != OK)
144 break;
145 }
146
147 win->_curx = ox;
148 win->_cury = oy;
149 _nc_synchook(win);
150 }
151 }
152 returnCode(code);
153}