abermud/DATA/
/*
**  Key drivers
*/
#include "kernel.h"
#include <sgtty.h>
#ifdef	RCSID
static char RCS[] =
	"$Header: key.c,v 1.2 89/07/03 08:17:51 rsalz Exp $";
#endif	/* RCSID */

static char	*pr_bf;
static long	 save_flag = -1;


keysetup()
{
    struct sgttyb	x;

    gtty(fileno(stdin), &x);
    save_flag = x.sg_flags;
    x.sg_flags &= ~ECHO;
    x.sg_flags |= CBREAK;
    stty(fileno(stdin), &x);
}


keysetback()
{
    struct sgttyb	 x;

    if (save_flag != -1) {
	gtty(fileno(stdin), &x);
	x.sg_flags = save_flag;
	stty(fileno(stdin), &x);
    }
}


key_reprint()
{
    pr_qcr = 1;
    pbfr();
    if (pr_due && key_mode)
	printf("\n%s%s", pr_bf, key_buff);
    fflush(stdout);
    pr_due = 0;
}


key_input(ppt, len_max)
    char *ppt;
    int len_max;
{
    int len_cur, x, tmp;

    key_mode = 1;
    pr_bf = ppt;
    bprintf("%s", ppt);
    pbfr();
    pr_due = 0;
    *key_buff = '\0';

    for (len_cur = 0; len_cur < len_max; ) {
	switch (x = getchar()) {
	case '\n':
	    putchar('\n'); 
	    key_mode = 0;
	    return;
	case 'R' & 0x1F:
	    for (tmp = len_cur; tmp; tmp--) {
		putchar(8);
		putchar(' ');
		putchar(8);
	    }
	    printf("%s", key_buff);
	    continue;
	case 'U' & 0x1F:
	    for (tmp = len_cur; tmp; tmp--) {
		putchar(8);
		putchar(' ');
		putchar(8);
	    }
	    len_cur = 0;
	    key_buff[len_cur] = '\0';
	    continue;
	case 'H' & 0x1F:
	case 127:
	    if (len_cur) {
		putchar(8);
		putchar(' ');
		putchar(8);
		key_buff[--len_cur] = '\0';
	    }
	    continue;
	default:
	    if (x < 32)
		continue;
	    putchar(x); 
	    key_buff[len_cur++] = x;
	    key_buff[len_cur] = '\0';
	}
    }
}