All pastes #1191153 Raw Edit

termios-test.c

public c v1 · immutable
#1191153 ·published 2008-09-02 04:50 UTC
rendered paste body
#include <err.h>#include <errno.h>#include <stdlib.h>#include <stdio.h>#include <termios.h>#include <unistd.h>#include <sys/select.h>intmain(void){	struct termios	told, tnew;	char linebuf[255], *sptr, *eptr;	if (tcgetattr(STDIN_FILENO, &told) == -1)		err(errno, "tcgetattr");	tnew = told;	tnew.c_lflag &= ~(ECHO | ECHONL | ICANON);	if (tcsetattr(STDIN_FILENO, TCSADRAIN, &tnew) == -1)		err(errno, "tcsetattr");	*linebuf = '\0';	sptr = linebuf;	eptr = &linebuf[sizeof(linebuf)];	for (;;) {		uint8_t	c;		fd_set	set;		FD_ZERO(&set);		FD_SET(STDIN_FILENO, &set);		if (select(1, &set, NULL, NULL, NULL) != 1) {			warn("select");			continue;		}		if (read(STDIN_FILENO, &c, 1) < 1)			break;		switch (c) {		case 127:			if (sptr > linebuf) {				--sptr;				(void) fputs("\b \b", stdout);				(void) fflush(stdout);			}			break;		case 10:			*sptr++ = '\r';			*sptr++ = '\n';			*sptr++ = '\0';			goto out;		default:			/* Account for \r\n\0 we'll add */			if (sptr < eptr - 3) {				*sptr++ = c;				(void) fputc(c, stdout);				(void) fflush(stdout);			}		}	}out:	(void) printf("\nString: %s", linebuf);	if (tcsetattr(STDIN_FILENO, TCSADRAIN, &told) == -1)		err(errno, "tcsetattr");	exit(EXIT_SUCCESS);}