termio under SysV (kbdhit() and getch())

Personage root at siva.UUCP
Sat Mar 4 19:45:41 AEST 1989


In article <7851 at chinet.chi.il.us>, les at chinet.chi.il.us (Leslie Mikesell) writes:
> In article <1182 at naucse.UUCP> jdc at naucse.UUCP (John Campbell) writes:
> >And the bad news is that I no longer have a valid plan for implementing
> >a peek into the typeahead buffer at all!  Anyone know if this can be done
> >under SysV?  (And, of course, how it is done?)

There is a way (several ways???).

> What you have to do is read the characters into your own buffer and then
> you can peek all you like.

 True, but then ungetch() is useless if needed.

#define DISCLAIMER
#ifdef DISLAIMER

   In a recent 'pitch to pay for knowledge' I received this neat 'scrap'
of code. It is attributed to Dr. Rebecca Thomas who is the 'controller' of the
'Unix World'  WIZARDS GRABBAG  coloumn. Code follows:

#endif /* DISCLAIMER */

--------------------------cut above---------------------------------------------
/* for readability, set your tab stops to 3. */
#include <stdio.h>
#include <ctype.h>
#include <termio.h>

#define DEBUG

#define ECHO_OFF 1
#define ECHO_ON 0

#ifdef DEBUG
main()
{
	int i, ch, getch();
	char s[BUFSIZ];

	printf("Type  [Enter]  to quit\n");
	do {
		ch = getch(ECHO_OFF); s[i++] = ch;
	} while(ch != '\f');	

	s[--i] = '\0'; i = 0;
	while(s[i]) {
		if(isprint(s[i])) { printf("%c",s[i]); } else { printf("\\%d",s[i]); }
		i++;
	}
	putchar('\n');
}
#endif

int getch(echo)
int echo;
{
	struct termio tsaved, tnew;
	char buf;

	ioctl(0, TCGETA, &tsaved);
	tnew = tsaved;
	tnew.c_lflag &= ~ICANON;
	tnew.c_lflag &= ~ISIG;
	if(echo == ECHO_OFF)
		tnew.c_lflag &= ~ECHO;
	else
		tnew.c_lflag &= ECHO;
	tnew.c_cc[VMIN] = 1;
	tnew.c_cc[VTIME] = 0;
	ioctl(0, TCSETA, &tnew);
	read(0, &buf, 1);
	ioctl(0, TCSETA, &tsaved);
	if(buf == tsaved.c_cc[VEOF])
		return(EOF);
	return(buf);
}
-------------------------cut below----------------------------------------------

This topic of terminal independent character input interests me a great deal;
So:
1) is a timeout acceptable in a 'keystroke input loop' ?
2) is having to strike a given key (most notably Escape) twice (more than once)
   an acceptable work around?
3) if you are so smart, would you mind sharing the secret??
   (P.S. the clock granularity is insufficient to make reliable non-blocking 
    reads and expect any timing related grouping; like an 8mhz i286)
   (:->  :-)  ;-%  B-S) (my friends and I smile, hopefully)
-- 
"I only did what you didn't tell me not to do..."                    Users Credo
siva!uumgr                                                            Mark Marsh



More information about the Comp.sys.att mailing list