diff options
author | ache <ache@FreeBSD.org> | 1994-10-07 08:58:58 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1994-10-07 08:58:58 +0000 |
commit | a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9 (patch) | |
tree | 4a94ca97fb2fc2fdc1fcdd522a66e39c6e763138 /lib/libncurses/lib_getstr.c | |
download | FreeBSD-src-a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9.zip FreeBSD-src-a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9.tar.gz |
Moved from ports with several enhancements
Diffstat (limited to 'lib/libncurses/lib_getstr.c')
-rw-r--r-- | lib/libncurses/lib_getstr.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/lib/libncurses/lib_getstr.c b/lib/libncurses/lib_getstr.c new file mode 100644 index 0000000..fae5b21 --- /dev/null +++ b/lib/libncurses/lib_getstr.c @@ -0,0 +1,113 @@ + +/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for * +* details. If they are missing then this copy is in violation of * +* the copyright conditions. */ + +/* +** lib_getstr.c +** +** The routine wgetstr(). +** +*/ + +#include "curses.priv.h" +#include "unctrl.h" + +inline void backspace(WINDOW *win) +{ + mvwaddstr(curscr, win->_begy + win->_cury, win->_begx + win->_curx, + "\b \b"); + waddstr(win, "\b \b"); + fputs("\b \b", SP->_ofp); + fflush(SP->_ofp); + SP->_curscol--; +} + +int wgetnstr(WINDOW *win, char *str, int maxlen) +{ +bool oldnl, oldecho, oldraw, oldcbreak, oldkeypad; +char erasec; +char killc; +char *oldstr; +int ch; + + T(("wgetnstr(%x,%x, %d) called", win, str, maxlen)); + + oldnl = SP->_nl; + oldecho = SP->_echo; + oldraw = SP->_raw; + oldcbreak = SP->_cbreak; + oldkeypad = win->_use_keypad; + nl(); + noecho(); + noraw(); + cbreak(); + keypad(win, FALSE); + + erasec = erasechar(); + killc = killchar(); + + oldstr = str; + + vidattr(win->_attrs); + if (is_wintouched(win) || (win->_flags & _HASMOVED)) + wrefresh(win); + + while ((ch = wgetch(win)) != ERR) { + if (ch == '\n' || ch == '\r') + break; + if (ch == erasec || ch == KEY_LEFT || ch == KEY_BACKSPACE) { + if (str > oldstr) { + str--; + backspace(win); + } + } else if (ch == killc) { + while (str > oldstr) { + str--; + backspace(win); + } + } else if (maxlen >= 0 && str - oldstr >= maxlen) { + beep(); + } else { + mvwaddstr(curscr, win->_begy + win->_cury, + win->_begx + win->_curx, unctrl(ch)); + waddstr(win, unctrl(ch)); + if (oldecho == TRUE) { + fputs(unctrl(ch), SP->_ofp); + fflush(SP->_ofp); + } + SP->_curscol++; + *str++ = ch; + } + } + + win->_curx = 0; + if (win->_cury < win->_maxy) + win->_cury++; + wrefresh(win); + + if (! oldnl) + nonl(); + + if (oldecho) + echo(); + + if (oldraw) + raw(); + + if (! oldcbreak) + nocbreak(); + + if (oldkeypad) + keypad(win, TRUE); + + if (ch == ERR) { + *str = '\0'; + return ERR; + } + *str = '\0'; + + T(("wgetnstr returns %s", oldstr)); + + return(OK); +} |