X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fwidechar%2Flib_get_wstr.c;h=bf39aa1a188bf26f801c2c4a2e4dbd28636c5e98;hp=906e02a6528ecff1c4e8068c650f6ee25c2b8873;hb=55ccd2b959766810cf7db8d1c4462f338ce0afc8;hpb=a8987e73ec254703634802b4f7ee30d3a485524d diff --git a/ncurses/widechar/lib_get_wstr.c b/ncurses/widechar/lib_get_wstr.c index 906e02a6..bf39aa1a 100644 --- a/ncurses/widechar/lib_get_wstr.c +++ b/ncurses/widechar/lib_get_wstr.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2002,2003 Free Software Foundation, Inc. * + * Copyright (c) 2002-2003,2004 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 * @@ -27,7 +27,7 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2002 * + * Author: Thomas E. Dickey * ****************************************************************************/ /* @@ -40,23 +40,38 @@ #include #include -MODULE_ID("$Id: lib_get_wstr.c,v 1.6 2003/05/17 21:33:03 tom Exp $") +MODULE_ID("$Id: lib_get_wstr.c,v 1.8 2004/10/16 21:55:36 tom Exp $") + +static int +wadd_wint(WINDOW *win, wint_t *src) +{ + cchar_t tmp; + wchar_t wch[2]; + + wch[0] = *src; + wch[1] = 0; + setcchar(&tmp, wch, A_NORMAL, 0, NULL); + return wadd_wch(win, &tmp); +} /* * This wipes out the last character, no matter whether it was a tab, control * or other character, and handles reverse wraparound. */ -static wchar_t * -WipeOut(WINDOW *win, int y, int x, wchar_t * first, wchar_t * last, bool echoed) +static wint_t * +WipeOut(WINDOW *win, int y, int x, wint_t *first, wint_t *last, bool echoed) { if (last > first) { *--last = '\0'; if (echoed) { int y1 = win->_cury; int x1 = win->_curx; + int n; wmove(win, y, x); - waddwstr(win, first); + for (n = 0; first[n] != 0; ++n) { + wadd_wint(win, first + n); + } getyx(win, y, x); while (win->_cury < y1 || (win->_cury == y1 && win->_curx < x1)) @@ -69,14 +84,14 @@ WipeOut(WINDOW *win, int y, int x, wchar_t * first, wchar_t * last, bool echoed) } NCURSES_EXPORT(int) -wgetn_wstr(WINDOW *win, wint_t * str, int maxlen) +wgetn_wstr(WINDOW *win, wint_t *str, int maxlen) { TTY buf; bool oldnl, oldecho, oldraw, oldcbreak; wint_t erasec; wint_t killc; - wchar_t *oldstr; - wchar_t *tmpstr; + wint_t *oldstr = str; + wint_t *tmpstr = str; wint_t ch; int y, x, code; @@ -99,10 +114,6 @@ wgetn_wstr(WINDOW *win, wint_t * str, int maxlen) erasec = erasechar(); killc = killchar(); - assert(sizeof(wchar_t) == sizeof(wint_t)); - oldstr = (wchar_t *) str; - tmpstr = (wchar_t *) str; - getyx(win, y, x); if (is_wintouched(win) || (win->_flags & _HASMOVED)) @@ -160,10 +171,8 @@ wgetn_wstr(WINDOW *win, wint_t * str, int maxlen) *tmpstr = 0; if (oldecho == TRUE) { int oldy = win->_cury; - cchar_t tmp; - setcchar(&tmp, tmpstr - 1, A_NORMAL, 0, NULL); - if (wadd_wch(win, &tmp) == ERR) { + if (wadd_wint(win, tmpstr - 1) == ERR) { /* * We can't really use the lower-right corner for input, * since it'll mess up bookkeeping for erases. @@ -210,13 +219,13 @@ wgetn_wstr(WINDOW *win, wint_t * str, int maxlen) *tmpstr = 0; if (code == ERR) { if (tmpstr == oldstr) { - *tmpstr++ = (wchar_t) WEOF; + *tmpstr++ = WEOF; *tmpstr = 0; } returnCode(ERR); } - T(("wgetn_wstr returns %s", _nc_viswbuf(oldstr))); + T(("wgetn_wstr returns %s", _nc_viswibuf(oldstr))); returnCode(OK); }