139f2269fSPeter Wemm /****************************************************************************
24a1a9510SRong-En Fan * Copyright 2020 Thomas E. Dickey *
339f2269fSPeter Wemm * Copyright 2002-2016,2017 Free Software Foundation, Inc. *
439f2269fSPeter Wemm * *
539f2269fSPeter Wemm * Permission is hereby granted, free of charge, to any person obtaining a *
639f2269fSPeter Wemm * copy of this software and associated documentation files (the *
739f2269fSPeter Wemm * "Software"), to deal in the Software without restriction, including *
839f2269fSPeter Wemm * without limitation the rights to use, copy, modify, merge, publish, *
939f2269fSPeter Wemm * distribute, distribute with modifications, sublicense, and/or sell *
1039f2269fSPeter Wemm * copies of the Software, and to permit persons to whom the Software is *
1139f2269fSPeter Wemm * furnished to do so, subject to the following conditions: *
1239f2269fSPeter Wemm * *
1339f2269fSPeter Wemm * The above copyright notice and this permission notice shall be included *
1439f2269fSPeter Wemm * in all copies or substantial portions of the Software. *
1539f2269fSPeter Wemm * *
1639f2269fSPeter Wemm * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
1739f2269fSPeter Wemm * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
1839f2269fSPeter Wemm * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
1939f2269fSPeter Wemm * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
2039f2269fSPeter Wemm * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
2139f2269fSPeter Wemm * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
2239f2269fSPeter Wemm * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
2339f2269fSPeter Wemm * *
2439f2269fSPeter Wemm * Except as contained in this notice, the name(s) of the above copyright *
2539f2269fSPeter Wemm * holders shall not be used in advertising or otherwise to promote the *
2639f2269fSPeter Wemm * sale, use or other dealings in this Software without prior written *
2739f2269fSPeter Wemm * authorization. *
2839f2269fSPeter Wemm ****************************************************************************/
2939f2269fSPeter Wemm
304a1a9510SRong-En Fan /****************************************************************************
3139f2269fSPeter Wemm * Author: Thomas Dickey *
3239f2269fSPeter Wemm ****************************************************************************/
3339f2269fSPeter Wemm
3439f2269fSPeter Wemm /*
3539f2269fSPeter Wemm ** lib_inwstr.c
3639f2269fSPeter Wemm **
3739f2269fSPeter Wemm ** The routines winnwstr() and winwstr().
3839f2269fSPeter Wemm **
3939f2269fSPeter Wemm */
4039f2269fSPeter Wemm
4139f2269fSPeter Wemm #include <curses.priv.h>
424a1a9510SRong-En Fan
4339f2269fSPeter Wemm MODULE_ID("$Id: lib_inwstr.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
4439f2269fSPeter Wemm
NCURSES_EXPORT(int)4539f2269fSPeter Wemm NCURSES_EXPORT(int)
4639f2269fSPeter Wemm winnwstr(WINDOW *win, wchar_t *wstr, int n)
4739f2269fSPeter Wemm {
4839f2269fSPeter Wemm int count = 0;
4939f2269fSPeter Wemm cchar_t *text;
5039f2269fSPeter Wemm
5139f2269fSPeter Wemm T((T_CALLED("winnwstr(%p,%p,%d)"), (void *) win, (void *) wstr, n));
5239f2269fSPeter Wemm if (wstr != 0) {
534a1a9510SRong-En Fan if (win) {
5439f2269fSPeter Wemm int row, col;
5539f2269fSPeter Wemm int last = 0;
5639f2269fSPeter Wemm bool done = FALSE;
5739f2269fSPeter Wemm
5839f2269fSPeter Wemm getyx(win, row, col);
5939f2269fSPeter Wemm
604a1a9510SRong-En Fan text = win->_line[row].text;
6139f2269fSPeter Wemm while (count < n && !done && count != ERR) {
6239f2269fSPeter Wemm
6339f2269fSPeter Wemm if (!isWidecExt(text[col])) {
644a1a9510SRong-En Fan int inx;
6539f2269fSPeter Wemm wchar_t wch;
664a1a9510SRong-En Fan
6739f2269fSPeter Wemm for (inx = 0; (inx < CCHARW_MAX)
6839f2269fSPeter Wemm && ((wch = text[col].chars[inx]) != 0);
6939f2269fSPeter Wemm ++inx) {
7039f2269fSPeter Wemm if (count + 1 > n) {
7139f2269fSPeter Wemm done = TRUE;
724a1a9510SRong-En Fan if (last == 0) {
7339f2269fSPeter Wemm count = ERR; /* error if we store nothing */
7439f2269fSPeter Wemm } else {
7539f2269fSPeter Wemm count = last; /* only store complete chars */
7639f2269fSPeter Wemm }
7739f2269fSPeter Wemm break;
7839f2269fSPeter Wemm }
794a1a9510SRong-En Fan wstr[count++] = wch;
8039f2269fSPeter Wemm }
814a1a9510SRong-En Fan }
824a1a9510SRong-En Fan last = count;
8339f2269fSPeter Wemm if (++col > win->_maxx) {
8439f2269fSPeter Wemm break;
8539f2269fSPeter Wemm }
8639f2269fSPeter Wemm }
8739f2269fSPeter Wemm }
8839f2269fSPeter Wemm if (count > 0) {
8939f2269fSPeter Wemm wstr[count] = '\0';
9039f2269fSPeter Wemm T(("winnwstr returns %s", _nc_viswbuf(wstr)));
9139f2269fSPeter Wemm }
9239f2269fSPeter Wemm }
9339f2269fSPeter Wemm returnCode(count);
9439f2269fSPeter Wemm }
9539f2269fSPeter Wemm
964a1a9510SRong-En Fan /*
9739f2269fSPeter Wemm * X/Open says winwstr() returns OK if not ERR. If that is not a blunder, it
9839f2269fSPeter Wemm * must have a null termination on the string (see above). Unlike winnstr(),
9939f2269fSPeter Wemm * it does not define what happens for a negative count with winnwstr().
10039f2269fSPeter Wemm */
101 NCURSES_EXPORT(int)
winwstr(WINDOW * win,wchar_t * wstr)102 winwstr(WINDOW *win, wchar_t *wstr)
103 {
104 int result = OK;
105
106 T((T_CALLED("winwstr(%p,%p)"), (void *) win, (void *) wstr));
107 if (win == 0) {
108 result = ERR;
109 } else if (winnwstr(win, wstr,
110 CCHARW_MAX * (win->_maxx - win->_curx + 1)) == ERR) {
111 result = ERR;
112 }
113 returnCode(result);
114 }
115