*****Listing 3*****

/*
 *  keys.c -	gets arrow and function keys from termcap,
 *		returns terminfo codes
 *		changes quit key for use as arrow
 *
 * 		define NO_SYSV for versions of curses that do not look up
 *     		arrow & function keys from termcap
 *
 *  copyright 1988 Ronald Florence
 *  changed VMIN & VTIME for wy99 @ 9600 ron@mlfarm (7/11/88)
 */

#include <curses.h>
#ifndef KEY_DOWN
#include "keys.h"
#endif

#define NKEYS	16

char	
#ifdef NO_SYSV
  *tcap_ids[] = {
    "kd", "ku", "kl", "kr", "kh", "kb",
    "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9", 0
    },
#endif
  *fkeys[NKEYS];
	
lookupkeys()
{
#ifdef NO_SYSV
  static char	sbuf[256];
  char	**key, tbuf[1024], *fill = sbuf, *tgetstr(); 
  int	i = 0;

  tgetent(tbuf, ttytype);
  for (key = tcap_ids; *key; ++key) 
    fkeys[i++] = tgetstr(*key, &fill);
#else
  fkeys[0] = KD;
  fkeys[1] = KU;
  fkeys[2] = KL;
  fkeys[3] = KR;
  fkeys[4] = KH;
  fkeys[5] = KB;
  fkeys[6] = K0;
  fkeys[7] = K1;
  fkeys[8] = K2;
  fkeys[9] = K3;
  fkeys[10] = K4;
  fkeys[11] = K5;
  fkeys[12] = K6;
  fkeys[13] = K7;
  fkeys[14] = K8;
  fkeys[15] = K9;
#endif
  fixquit();
}	


getkey()
{
  char	cmd[6];
  register	k;
  
  k = read(0, cmd, 6);
  cmd[k] = '\0';
  for (k = 0; k < NKEYS; k++)   
    if (strcmp(cmd, fkeys[k]) == 0)
      return (k + KEY_DOWN);
  return ((int) *cmd);
}


fixquit()
{
  struct termio	new;

  ioctl(0, TCGETA, &new);
  new.c_cc[VQUIT] = 0xff;	/* in case QUIT is an arrow */
  new.c_cc[VTIME] = 1;		/* minimum timeout */
  new.c_cc[VMIN] = 3;		/* three characters satisfy */
  ioctl(0, TCSETA, &new);
}
