abermud/DATA/
head     1.2;
access   ;
symbols  ;
locks    ; strict;
comment  @ * @;


1.2
date     89.07.03.08.17.51;  author rsalz;  state Exp;
branches ;
next     1.1;

1.1
date     89.03.13.09.36.33;  author rsalz;  state Exp;
branches ;
next     ;


desc
@@




1.2
log
@Incorporate many fixes by Jussi <eloranta@@tukki.jyu.fi>,
and some minor tweaks by Rich.
@
text
@/*
**  Key drivers
*/
#include "kernel.h"
#include <sgtty.h>
#ifdef	RCSID
static char RCS[] =
	"$Header: key.c,v 1.1 89/03/13 09:36:33 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';
	}
    }
}
@


1.1
log
@Initial revision
@
text
@d1 3
a3 1
/*  Key drivers */
d5 1
d8 1
a8 1
	"$Header$";
d11 2
a13 1
static char *pr_bf;
d17 1
a17 1
}
d19 5
a23 2
keysetback()
{
d27 1
a27 3
key_input(ppt, len_max)
    char *ppt;
    int len_max;
d29 1
a29 1
    char *p;
d31 4
a34 9
    for (pr_bf = ppt; ; ) {
	bprintf("%s", ppt);
	pbfr();
	fgets(key_buff, sizeof key_buff, stdin);
	if (p = strchr(key_buff, '\n'))
	    *p = '\0';
	if (strlen(key_buff) <= len_max)
	    return;
	printf("Too long...\n");
d38 1
d43 1
a43 1
    if (pr_due)
d47 56
@