Esempio n. 1
0
/* c_gets():
 *	Get a string
 */
libedit_private int
c_gets(EditLine *el, wchar_t *buf, const wchar_t *prompt)
{
	ssize_t len;
	wchar_t *cp = el->el_line.buffer, ch;

	if (prompt) {
		len = (ssize_t)wcslen(prompt);
		(void)memcpy(cp, prompt, (size_t)len * sizeof(*cp));
		cp += len;
	}
	len = 0;

	for (;;) {
		el->el_line.cursor = cp;
		*cp = ' ';
		el->el_line.lastchar = cp + 1;
		re_refresh(el);

		if (el_wgetc(el, &ch) != 1) {
			ed_end_of_file(el, 0);
			len = -1;
			break;
		}

		switch (ch) {

		case L'\b':	/* Delete and backspace */
		case 0177:
			if (len == 0) {
				len = -1;
				break;
			}
			len--;
			cp--;
			continue;

		case 0033:	/* ESC */
		case L'\r':	/* Newline */
		case L'\n':
			buf[len] = ch;
			break;

		default:
			if (len >= (ssize_t)(EL_BUFSIZ - 16))
				terminal_beep(el);
			else {
				buf[len++] = ch;
				*cp++ = ch;
			}
			continue;
		}
		break;
	}

	el->el_line.buffer[0] = '\0';
	el->el_line.lastchar = el->el_line.buffer;
	el->el_line.cursor = el->el_line.buffer;
	return (int)len;
}
Esempio n. 2
0
/* ed_quoted_insert():
 *	Add the next character typed verbatim
 *	[^V] [^V]
 */
libedit_private el_action_t
/*ARGSUSED*/
ed_quoted_insert(EditLine *el, wint_t c __attribute__((__unused__)))
{
	int num;
	wchar_t ch;

	tty_quotemode(el);
	num = el_wgetc(el, &ch);
	tty_noquotemode(el);
	if (num == 1)
		return ed_insert(el, ch);
	else
		return ed_end_of_file(el, 0);
}