X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_instr.c;h=dbd2a020ac61ddab0755e3191b05d64ed914839e;hp=aadf8b43112889987108aa1465fd0f2640f98cf3;hb=0de8912c1c0746eb37b733e9e6fdf852aab9506a;hpb=03f728e5bb3630a54fffc4a2ff2f8dbfcce9088e;ds=sidebyside diff --git a/ncurses/base/lib_instr.c b/ncurses/base/lib_instr.c index aadf8b43..dbd2a020 100644 --- a/ncurses/base/lib_instr.c +++ b/ncurses/base/lib_instr.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2011 Free Software Foundation, Inc. * + * Copyright (c) 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 * @@ -41,50 +41,59 @@ #include -MODULE_ID("$Id: lib_instr.c,v 1.18 2011/10/22 16:31:35 tom Exp $") +MODULE_ID("$Id: lib_instr.c,v 1.23 2017/04/29 21:16:20 tom Exp $") 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 (!str) - returnCode(0); - - if (win) { - getyx(win, row, col); + 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 - win->_curx + 1; + n = win->_maxx - col + 1; for (; i < n;) { #if USE_WIDEC_SUPPORT - cchar_t *cell = &(win->_line[row].text[col]); - wchar_t *wch; + cchar_t *cell = &(text[col]); attr_t attrs; - short pair; - int n2; - bool done = FALSE; + NCURSES_PAIRS_T pair; mbstate_t state; - size_t i3, n3; char *tmp; if (!isWidecExt(*cell)) { + wchar_t *wch; + int n2; + n2 = getcchar(cell, 0, 0, 0, 0); if (n2 > 0 && (wch = typeCalloc(wchar_t, (unsigned) n2 + 1)) != 0) { + bool done = FALSE; + if (getcchar(cell, wch, &attrs, &pair, 0) == OK) { + size_t n3; init_mb(state); n3 = wcstombs(0, wch, (size_t) 0); if (!isEILSEQ(n3) && (n3 != 0)) { - if (((int) n3 + i) > n) { + 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, n3 + 10)) == 0) { + } 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) @@ -99,14 +108,14 @@ winnstr(WINDOW *win, char *str, int n) } } #else - str[i++] = (char) CharOf(win->_line[row].text[col]); + str[i++] = (char) CharOf(text[col]); #endif if (++col > win->_maxx) { break; } } + str[i] = '\0'; /* SVr4 does not seem to count the null */ } - str[i] = '\0'; /* SVr4 does not seem to count the null */ T(("winnstr returns %s", _nc_visbuf(str))); returnCode(i); }