Use getnstr() and be done with it. It will even beep now!
char *
readln(void)
{
- int c;
- int i = 0;
- char *ln = NULL;
- int y, x, x0;
+ char ln[LINE_MAX];
echo();
curs_set(TRUE);
-
- /* Starting point */
- getyx(stdscr, y, x);
- x0 = x;
-
- while ((c = getch()) != ERR) {
- if (c == KEY_ENTER || c == '\r')
- break;
- if (c == KEY_BACKSPACE || c == CONTROL('H')) {
- getyx(stdscr, y, x);
- if (x >= x0) {
- i--;
- if (i > 0) {
- ln = xrealloc(ln, i * sizeof(*ln));
- } else {
- free(ln);
- ln = NULL;
- }
- move(y, x);
- printw("%c", ' ');
- move(y, x);
- } else {
- move(y, x0);
- }
- continue;
- }
- ln = xrealloc(ln, (i + 1) * sizeof(*ln));
- ln[i] = c;
- i++;
- }
- if (ln != NULL) {
- ln = xrealloc(ln, (i + 1) * sizeof(*ln));
- ln[i] = '\0';
- }
-
- curs_set(FALSE);
+ getnstr(ln, sizeof(ln));
noecho();
-
- return ln;
+ curs_set(FALSE);
+ return strdup(ln);
}
/*