1 /* $OpenBSD: lib_instr.c,v 1.4 2023/10/17 09:52:08 nicm Exp $ */
2
3 /****************************************************************************
4 * Copyright 2020-2021,2023 Thomas E. Dickey *
5 * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
6 * *
7 * Permission is hereby granted, free of charge, to any person obtaining a *
8 * copy of this software and associated documentation files (the *
9 * "Software"), to deal in the Software without restriction, including *
10 * without limitation the rights to use, copy, modify, merge, publish, *
11 * distribute, distribute with modifications, sublicense, and/or sell *
12 * copies of the Software, and to permit persons to whom the Software is *
13 * furnished to do so, subject to the following conditions: *
14 * *
15 * The above copyright notice and this permission notice shall be included *
16 * in all copies or substantial portions of the Software. *
17 * *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
21 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
24 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
25 * *
26 * Except as contained in this notice, the name(s) of the above copyright *
27 * holders shall not be used in advertising or otherwise to promote the *
28 * sale, use or other dealings in this Software without prior written *
29 * authorization. *
30 ****************************************************************************/
31
32 /****************************************************************************
33 * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
34 * and: Eric S. Raymond <esr@snark.thyrsus.com> *
35 * and: Thomas E. Dickey 1996-on *
36 ****************************************************************************/
37
38 /*
39 ** lib_instr.c
40 **
41 ** The routine winnstr().
42 **
43 */
44
45 #include <curses.priv.h>
46
47 MODULE_ID("$Id: lib_instr.c,v 1.4 2023/10/17 09:52:08 nicm Exp $")
48
NCURSES_EXPORT(int)49 NCURSES_EXPORT(int)
50 winnstr(WINDOW *win, char *str, int n)
51 {
52 int i = 0;
53
54 T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n));
55
56 if (!win || !str) {
57 i = ERR;
58 } else {
59 int row = win->_cury;
60 int col = win->_curx;
61 NCURSES_CH_T *text = win->_line[row].text;
62
63 if (n < 0)
64 n = win->_maxx - col + 1;
65
66 for (; i < n;) {
67 #if USE_WIDEC_SUPPORT
68 cchar_t *cell = &(text[col]);
69 attr_t attrs;
70 NCURSES_PAIRS_T pair;
71 char *tmp;
72
73 if (!isWidecExt(*cell)) {
74 wchar_t *wch;
75 int n2;
76
77 n2 = getcchar(cell, 0, 0, 0, 0);
78 if (n2 > 0
79 && (wch = typeCalloc(wchar_t, (unsigned) n2 + 1)) != 0) {
80 bool done = FALSE;
81
82 if (getcchar(cell, wch, &attrs, &pair, 0) == OK) {
83 mbstate_t state;
84 size_t n3;
85
86 init_mb(state);
87 n3 = wcstombs(0, wch, (size_t) 0);
88 if (!isEILSEQ(n3) && (n3 != 0) && (n3 <= MB_LEN_MAX)) {
89 size_t need = n3 + 10 + (size_t) i;
90 int have = (int) n3 + i;
91
92 /* check for loop-done as well as overflow */
93 if (have > n || (int) need <= 0) {
94 done = TRUE;
95 } else if ((tmp = typeCalloc(char, need)) == 0) {
96 done = TRUE;
97 } else {
98 size_t i3;
99
100 init_mb(state);
101 wcstombs(tmp, wch, n3);
102 for (i3 = 0; i3 < n3; ++i3)
103 str[i++] = tmp[i3];
104 free(tmp);
105 }
106 }
107 }
108 free(wch);
109 if (done)
110 break;
111 }
112 }
113 #else
114 str[i++] = (char) CharOf(text[col]);
115 #endif
116 if (++col > win->_maxx) {
117 break;
118 }
119 }
120 str[i] = '\0'; /* SVr4 does not seem to count the null */
121 }
122 T(("winnstr returns %s", _nc_visbuf(str)));
123 returnCode(i);
124 }
125