/* ** 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'; } } }