X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_instr.c;h=2aa0fc32e9f3307a80d12e7320800c4e2af09494;hp=b3e1d030a4b64eb11f4e4ce63799c71789a4b029;hb=fae162795e065e5901068152e91f2962b6b247f3;hpb=0eb88fc5281804773e2a0c7a488a4452463535ce diff --git a/ncurses/base/lib_instr.c b/ncurses/base/lib_instr.c index b3e1d030..2aa0fc32 100644 --- a/ncurses/base/lib_instr.c +++ b/ncurses/base/lib_instr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998 Free Software Foundation, Inc. * + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 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 * @@ -29,9 +30,9 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * ****************************************************************************/ - /* ** lib_instr.c ** @@ -41,33 +42,81 @@ #include -MODULE_ID("$Id: lib_instr.c,v 1.8 1998/02/11 12:13:54 tom Exp $") +MODULE_ID("$Id: lib_instr.c,v 1.24 2020/02/02 23:34:34 tom Exp $") -int winnstr(WINDOW *win, char *str, int n) +NCURSES_EXPORT(int) +winnstr(WINDOW *win, char *str, int n) { - int i=0, row, col; + int i = 0; + + T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n)); + + if (!win || !str) { + i = ERR; + } else { + int row = win->_cury; + int col = win->_curx; + NCURSES_CH_T *text = win->_line[row].text; + + if (n < 0) + n = win->_maxx - col + 1; + + for (; i < n;) { +#if USE_WIDEC_SUPPORT + cchar_t *cell = &(text[col]); + attr_t attrs; + NCURSES_PAIRS_T pair; + mbstate_t state; + char *tmp; - T((T_CALLED("winnstr(%p,%p,%d)"), win, str, n)); + if (!isWidecExt(*cell)) { + wchar_t *wch; + int n2; - if (!str) - returnCode(0); - - if (win) { - getyx(win, row, col); + n2 = getcchar(cell, 0, 0, 0, 0); + if (n2 > 0 + && (wch = typeCalloc(wchar_t, (unsigned) n2 + 1)) != 0) { + bool done = FALSE; - if (n < 0) - n = win->_maxx - win->_curx + 1; + if (getcchar(cell, wch, &attrs, &pair, 0) == OK) { + size_t n3; - for (; i < n;) { - str[i++] = TextOf(win->_line[row].text[col]); + init_mb(state); + n3 = wcstombs(0, wch, (size_t) 0); + if (!isEILSEQ(n3) && (n3 != 0)) { + size_t need = n3 + 10 + (size_t) i; + int have = (int) n3 + i; + + /* check for loop-done as well as overflow */ + if (have > n || (int) need <= 0) { + done = TRUE; + } else if ((tmp = typeCalloc(char, need)) == 0) { + done = TRUE; + } else { + size_t i3; + + 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(text[col]); +#endif if (++col > win->_maxx) { - col = 0; - if (++row > win->_maxy) break; } - } } - str[i] = '\0'; /* SVr4 does not seem to count the null */ - returnCode(i); + str[i] = '\0'; /* SVr4 does not seem to count the null */ + } + T(("winnstr returns %s", _nc_visbuf(str))); + returnCode(i); } -