ncursesw-morphos/ncurses/base/lib_instr.c
Thomas E. Dickey 3a0d9d27e0 ncurses 5.7 - patch 20091024
+ quiet some pedantic gcc warnings.
+ modify _nc_wgetch() to check for a -1 in the fifo, e.g., after a
  SIGWINCH, and discard that value, to avoid confusing application
  (patch by Eygene Ryabinkin, FreeBSD bin/136223).
2009-10-25 01:06:00 +00:00

113 lines
4.0 KiB
C

/****************************************************************************
* Copyright (c) 1998-2007,2009 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 *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
* and: Thomas E. Dickey 1996-on *
****************************************************************************/
/*
** lib_instr.c
**
** The routine winnstr().
**
*/
#include <curses.priv.h>
MODULE_ID("$Id: lib_instr.c,v 1.17 2009/10/24 22:55:45 tom Exp $")
NCURSES_EXPORT(int)
winnstr(WINDOW *win, char *str, int n)
{
int i = 0, row, col;
T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n));
if (!str)
returnCode(0);
if (win) {
getyx(win, row, col);
if (n < 0)
n = win->_maxx - win->_curx + 1;
for (; i < n;) {
#if USE_WIDEC_SUPPORT
cchar_t *cell = &(win->_line[row].text[col]);
wchar_t *wch;
attr_t attrs;
short pair;
int n2;
bool done = FALSE;
mbstate_t state;
size_t i3, n3;
char *tmp;
if (!isWidecExt(*cell)) {
n2 = getcchar(cell, 0, 0, 0, 0);
if (n2 > 0
&& (wch = typeCalloc(wchar_t, (unsigned) n2 + 1)) != 0) {
if (getcchar(cell, wch, &attrs, &pair, 0) == OK) {
init_mb(state);
n3 = wcstombs(0, wch, 0);
if (!isEILSEQ(n3) && (n3 != 0)) {
if (((int) n3 + i) > n) {
done = TRUE;
} else if ((tmp = typeCalloc(char, n3 + 10)) == 0) {
done = TRUE;
} else {
init_mb(state);
wcstombs(tmp, wch, n3);
for (i3 = 0; i3 < n3; ++i3)
str[i++] = tmp[i3];
free(tmp);
}
}
}
free(wch);
if (done)
break;
}
}
#else
str[i++] = (char) CharOf(win->_line[row].text[col]);
#endif
if (++col > win->_maxx) {
break;
}
}
}
str[i] = '\0'; /* SVr4 does not seem to count the null */
T(("winnstr returns %s", _nc_visbuf(str)));
returnCode(i);
}