| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- /* PDCurses */
- #include <curspriv.h>
- /*man-start**************************************************************
- getstr
- ------
- ### Synopsis
- int getstr(char *str);
- int wgetstr(WINDOW *win, char *str);
- int mvgetstr(int y, int x, char *str);
- int mvwgetstr(WINDOW *win, int y, int x, char *str);
- int getnstr(char *str, int n);
- int wgetnstr(WINDOW *win, char *str, int n);
- int mvgetnstr(int y, int x, char *str, int n);
- int mvwgetnstr(WINDOW *win, int y, int x, char *str, int n);
- int get_wstr(wint_t *wstr);
- int wget_wstr(WINDOW *win, wint_t *wstr);
- int mvget_wstr(int y, int x, wint_t *wstr);
- int mvwget_wstr(WINDOW *win, int, int, wint_t *wstr);
- int getn_wstr(wint_t *wstr, int n);
- int wgetn_wstr(WINDOW *win, wint_t *wstr, int n);
- int mvgetn_wstr(int y, int x, wint_t *wstr, int n);
- int mvwgetn_wstr(WINDOW *win, int y, int x, wint_t *wstr, int n);
- ### Description
- These routines call wgetch() repeatedly to build a string,
- interpreting erase and kill characters along the way, until a newline
- or carriage return is received. When PDCurses is built with wide-
- character support enabled, the narrow-character functions convert the
- wgetch()'d values into a multibyte string in the current locale
- before returning it. The resulting string is placed in the area
- pointed to by *str. The routines with n as the last argument read at
- most n characters.
- Note that there's no way to know how long the buffer passed to
- wgetstr() is, so use wgetnstr() to avoid buffer overflows.
- ### Return Value
- These functions return ERR on failure or any other value on success.
- ### Portability
- X/Open ncurses NetBSD
- getstr Y Y Y
- wgetstr Y Y Y
- mvgetstr Y Y Y
- mvwgetstr Y Y Y
- getnstr Y Y Y
- wgetnstr Y Y Y
- mvgetnstr Y Y Y
- mvwgetnstr Y Y Y
- get_wstr Y Y Y
- wget_wstr Y Y Y
- mvget_wstr Y Y Y
- mvwget_wstr Y Y Y
- getn_wstr Y Y Y
- wgetn_wstr Y Y Y
- mvgetn_wstr Y Y Y
- mvwgetn_wstr Y Y Y
- **man-end****************************************************************/
- #define MAXLINE 255
- int wgetnstr(WINDOW *win, char *str, int n)
- {
- #ifdef PDC_WIDE
- wchar_t wstr[MAXLINE + 1];
- if (n < 0 || n > MAXLINE)
- n = MAXLINE;
- if (wgetn_wstr(win, (wint_t *)wstr, n) == ERR)
- return ERR;
- return PDC_wcstombs(str, wstr, n);
- #else
- int ch, i, num, x, chars;
- char *p;
- bool stop, oldecho, oldcbreak, oldnodelay;
- PDC_LOG(("wgetnstr() - called\n"));
- if (!win || !str)
- return ERR;
- chars = 0;
- p = str;
- stop = FALSE;
- x = win->_curx;
- oldcbreak = SP->cbreak; /* remember states */
- oldecho = SP->echo;
- oldnodelay = win->_nodelay;
- SP->echo = FALSE; /* we do echo ourselves */
- cbreak(); /* ensure each key is returned immediately */
- win->_nodelay = FALSE; /* don't return -1 */
- wrefresh(win);
- while (!stop)
- {
- ch = wgetch(win);
- switch (ch)
- {
- case '\t':
- ch = ' ';
- num = TABSIZE - (win->_curx - x) % TABSIZE;
- for (i = 0; i < num; i++)
- {
- if (chars < n)
- {
- if (oldecho)
- waddch(win, ch);
- *p++ = ch;
- ++chars;
- }
- else
- beep();
- }
- break;
- case _ECHAR: /* CTRL-H -- Delete character */
- if (p > str)
- {
- if (oldecho)
- waddstr(win, "\b \b");
- ch = (unsigned char)(*--p);
- if ((ch < ' ') && (oldecho))
- waddstr(win, "\b \b");
- chars--;
- }
- break;
- case _DLCHAR: /* CTRL-U -- Delete line */
- while (p > str)
- {
- if (oldecho)
- waddstr(win, "\b \b");
- ch = (unsigned char)(*--p);
- if ((ch < ' ') && (oldecho))
- waddstr(win, "\b \b");
- }
- chars = 0;
- break;
- case _DWCHAR: /* CTRL-W -- Delete word */
- while ((p > str) && (*(p - 1) == ' '))
- {
- if (oldecho)
- waddstr(win, "\b \b");
- --p; /* remove space */
- chars--;
- }
- while ((p > str) && (*(p - 1) != ' '))
- {
- if (oldecho)
- waddstr(win, "\b \b");
- ch = (unsigned char)(*--p);
- if ((ch < ' ') && (oldecho))
- waddstr(win, "\b \b");
- chars--;
- }
- break;
- case '\n':
- case '\r':
- stop = TRUE;
- if (oldecho)
- waddch(win, '\n');
- break;
- default:
- if (chars < n)
- {
- if (!SP->key_code && ch < 0x100)
- {
- *p++ = ch;
- if (oldecho)
- waddch(win, ch);
- chars++;
- }
- }
- else
- beep();
- break;
- }
- wrefresh(win);
- }
- *p = '\0';
- SP->echo = oldecho; /* restore old settings */
- SP->cbreak = oldcbreak;
- win->_nodelay = oldnodelay;
- return OK;
- #endif
- }
- int getstr(char *str)
- {
- PDC_LOG(("getstr() - called\n"));
- return wgetnstr(stdscr, str, MAXLINE);
- }
- int wgetstr(WINDOW *win, char *str)
- {
- PDC_LOG(("wgetstr() - called\n"));
- return wgetnstr(win, str, MAXLINE);
- }
- int mvgetstr(int y, int x, char *str)
- {
- PDC_LOG(("mvgetstr() - called\n"));
- if (move(y, x) == ERR)
- return ERR;
- return wgetnstr(stdscr, str, MAXLINE);
- }
- int mvwgetstr(WINDOW *win, int y, int x, char *str)
- {
- PDC_LOG(("mvwgetstr() - called\n"));
- if (wmove(win, y, x) == ERR)
- return ERR;
- return wgetnstr(win, str, MAXLINE);
- }
- int getnstr(char *str, int n)
- {
- PDC_LOG(("getnstr() - called\n"));
- return wgetnstr(stdscr, str, n);
- }
- int mvgetnstr(int y, int x, char *str, int n)
- {
- PDC_LOG(("mvgetnstr() - called\n"));
- if (move(y, x) == ERR)
- return ERR;
- return wgetnstr(stdscr, str, n);
- }
- int mvwgetnstr(WINDOW *win, int y, int x, char *str, int n)
- {
- PDC_LOG(("mvwgetnstr() - called\n"));
- if (wmove(win, y, x) == ERR)
- return ERR;
- return wgetnstr(win, str, n);
- }
- #ifdef PDC_WIDE
- int wgetn_wstr(WINDOW *win, wint_t *wstr, int n)
- {
- int ch, i, num, x, chars;
- wint_t *p;
- bool stop, oldecho, oldcbreak, oldnodelay;
- PDC_LOG(("wgetn_wstr() - called\n"));
- if (!win || !wstr)
- return ERR;
- chars = 0;
- p = wstr;
- stop = FALSE;
- x = win->_curx;
- oldcbreak = SP->cbreak; /* remember states */
- oldecho = SP->echo;
- oldnodelay = win->_nodelay;
- SP->echo = FALSE; /* we do echo ourselves */
- cbreak(); /* ensure each key is returned immediately */
- win->_nodelay = FALSE; /* don't return -1 */
- wrefresh(win);
- while (!stop)
- {
- ch = wgetch(win);
- switch (ch)
- {
- case '\t':
- ch = ' ';
- num = TABSIZE - (win->_curx - x) % TABSIZE;
- for (i = 0; i < num; i++)
- {
- if (chars < n)
- {
- if (oldecho)
- waddch(win, ch);
- *p++ = ch;
- ++chars;
- }
- else
- beep();
- }
- break;
- case _ECHAR: /* CTRL-H -- Delete character */
- if (p > wstr)
- {
- if (oldecho)
- waddstr(win, "\b \b");
- ch = *--p;
- if ((ch < ' ') && (oldecho))
- waddstr(win, "\b \b");
- chars--;
- }
- break;
- case _DLCHAR: /* CTRL-U -- Delete line */
- while (p > wstr)
- {
- if (oldecho)
- waddstr(win, "\b \b");
- ch = *--p;
- if ((ch < ' ') && (oldecho))
- waddstr(win, "\b \b");
- }
- chars = 0;
- break;
- case _DWCHAR: /* CTRL-W -- Delete word */
- while ((p > wstr) && (*(p - 1) == ' '))
- {
- if (oldecho)
- waddstr(win, "\b \b");
- --p; /* remove space */
- chars--;
- }
- while ((p > wstr) && (*(p - 1) != ' '))
- {
- if (oldecho)
- waddstr(win, "\b \b");
- ch = *--p;
- if ((ch < ' ') && (oldecho))
- waddstr(win, "\b \b");
- chars--;
- }
- break;
- case '\n':
- case '\r':
- stop = TRUE;
- if (oldecho)
- waddch(win, '\n');
- break;
- default:
- if (chars < n)
- {
- if (!SP->key_code)
- {
- *p++ = ch;
- if (oldecho)
- waddch(win, ch);
- chars++;
- }
- }
- else
- beep();
- break;
- }
- wrefresh(win);
- }
- *p = '\0';
- SP->echo = oldecho; /* restore old settings */
- SP->cbreak = oldcbreak;
- win->_nodelay = oldnodelay;
- return OK;
- }
- int get_wstr(wint_t *wstr)
- {
- PDC_LOG(("get_wstr() - called\n"));
- return wgetn_wstr(stdscr, wstr, MAXLINE);
- }
- int wget_wstr(WINDOW *win, wint_t *wstr)
- {
- PDC_LOG(("wget_wstr() - called\n"));
- return wgetn_wstr(win, wstr, MAXLINE);
- }
- int mvget_wstr(int y, int x, wint_t *wstr)
- {
- PDC_LOG(("mvget_wstr() - called\n"));
- if (move(y, x) == ERR)
- return ERR;
- return wgetn_wstr(stdscr, wstr, MAXLINE);
- }
- int mvwget_wstr(WINDOW *win, int y, int x, wint_t *wstr)
- {
- PDC_LOG(("mvwget_wstr() - called\n"));
- if (wmove(win, y, x) == ERR)
- return ERR;
- return wgetn_wstr(win, wstr, MAXLINE);
- }
- int getn_wstr(wint_t *wstr, int n)
- {
- PDC_LOG(("getn_wstr() - called\n"));
- return wgetn_wstr(stdscr, wstr, n);
- }
- int mvgetn_wstr(int y, int x, wint_t *wstr, int n)
- {
- PDC_LOG(("mvgetn_wstr() - called\n"));
- if (move(y, x) == ERR)
- return ERR;
- return wgetn_wstr(stdscr, wstr, n);
- }
- int mvwgetn_wstr(WINDOW *win, int y, int x, wint_t *wstr, int n)
- {
- PDC_LOG(("mvwgetn_wstr() - called\n"));
- if (wmove(win, y, x) == ERR)
- return ERR;
- return wgetn_wstr(win, wstr, n);
- }
- #endif
|