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", "k1", "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);
}