#include <stdio.h>
#include "externs.h"  
#include "keym.h"
#include "sysdep.h"
#include "display.h"
#include "buffer.h"
#include "window.h"
#include "search.h"

int *DIGIT_ARG;
char LAST_CHAR;
int EDT_DIRECTION = 1;

void (*root_map[128])() =
  {
      beep_cmd,                 /* ^@ */
      beep_cmd,                 /* ^A */
      beep_cmd,                 /* ^B */
      beep_cmd,                 /* ^C */
      page_down_cmd,            /* ^D */
      beep_cmd, /* ^E */
      search_cmd,               /* ^F */
      beep_cmd, /* ^G */
      help_cmd,                 /* ^H */
      page_right_cmd,           /* ^I */
      next_line_cmd,            /* ^J */
      ctrl_k_map_cmd,           /* ^K */
      beep_cmd, /* ^L */
      next_line_cmd,            /* ^M */
      next_line_cmd,            /* ^N */
      beep_cmd, /* ^O */
      previous_line_cmd,        /* ^P */
      beep_cmd, /* ^Q */
      redraw_cmd,               /* ^R */
      beep_cmd, /* ^S */
      time_cmd,                 /* ^T */
      page_up_cmd,              /* ^U */
      page_down_cmd,            /* ^V */
      ctrl_w_map_cmd,           /* ^W */
      ctrl_x_map_cmd,           /* ^X */
      beep_cmd, /* ^Y */
      sys_spawn_cmd,            /* ^Z */
      esc_map_cmd,              /* ^[ */
      beep_cmd, /* ^\ */
      beep_cmd, /* ^] */
      beep_cmd, /* ^^ */
      beep_cmd, /* ^_ */
      page_down_cmd,            /*   */
      beep_cmd, /* ! */
      beep_cmd, /* " */
      beep_cmd, /* # */
      sys_spawn_cmd,            /* $ */
      goto_percent_cmd,         /* % */
      beep_cmd, /* & */
      beep_cmd, /* ' */
      beep_cmd, /* ( */
      beep_cmd, /* ) */
      beep_cmd, /* * */
      beep_cmd, /* + */
      goto_mark_cmd,            /* , */
      digit_arg_cmd,            /* - */
      beep_cmd, /* . */
      search_cmd,               /* / */
      digit_arg_cmd,            /* 0 */
      digit_arg_cmd,            /* 1 */
      digit_arg_cmd,            /* 2 */
      digit_arg_cmd,            /* 3 */
      digit_arg_cmd,            /* 4 */
      digit_arg_cmd,            /* 5 */
      digit_arg_cmd,            /* 6 */
      digit_arg_cmd,            /* 7 */
      digit_arg_cmd,            /* 8 */
      digit_arg_cmd,            /* 9 */
      extended_key_cmd,         /* : */
      beep_cmd, /* ; */
      page_left_cmd,            /* < */
      beep_cmd, /* = */
      page_right_cmd,           /* > */
      search_back_cmd,          /* ? */
      beep_cmd, /* @ */
      beep_cmd, /* A */
      end_of_buffer_cmd,        /* B */
      beep_cmd, /* C */
      page_down_cmd,            /* D */
      edit_cmd, /* E */
      search_cmd,               /* F */
      goto_line_cmd,            /* G */
      help_cmd,                 /* H */
      beep_cmd, /* I */
      goto_line_cmd,            /* J */
      beep_cmd, /* K */
      toggle_lock,              /* L */
      set_mark_cmd,             /* M */
      find_next_cmd,            /* N */
      other_window_cmd,         /* O */
      beep_cmd, /* P */
      exit_cmd,                 /* Q */
      redraw_cmd,               /* R */
      beep_cmd, /* S */
      top_of_buffer_cmd,        /* T */
      page_up_cmd,              /* U */
      next_line_cmd,            /* V */
      toggle_width_cmd,         /* W */
      exit_cmd, /* X */
      beep_cmd, /* Y */
      beep_cmd, /* Z */
      beep_cmd, /* [ */
      beep_cmd, /* \ */
      beep_cmd, /* ] */
      beep_cmd, /* ^ */
      beep_cmd, /* _ */
      beep_cmd, /* ` */
      beep_cmd, /* a */
      end_of_buffer_cmd,        /* b */
      beep_cmd, /* c */
      page_down_cmd,            /* d */
      edit_cmd, /* e */
      search_cmd,               /* f */
      goto_line_cmd,            /* g */
      help_cmd,                 /* h */
      beep_cmd, /* i */
      goto_line_cmd,            /* j */
      beep_cmd, /* k */
      toggle_lock,              /* l */
      set_mark_cmd,             /* m */
      find_next_cmd,            /* n */
      other_window_cmd,         /* o */
      beep_cmd, /* p */
      exit_cmd,                 /* q */
      redraw_cmd,               /* r */
      beep_cmd, /* s */
      top_of_buffer_cmd,        /* t */
      page_up_cmd,              /* u */
      next_line_cmd,            /* v */
      toggle_width_cmd,         /* w */
      exit_cmd, /* x */
      beep_cmd, /* y */
      beep_cmd, /* z */
      beep_cmd, /* { */
      beep_cmd, /* | */
      beep_cmd, /* } */
      beep_cmd, /* ~ */
      page_up_cmd               /* ^? */
    };

/*  escape map  */
void (*escape_map[128])() =
  {
      beep_cmd, /* ^@ */
      beep_cmd, /* ^A */
      beep_cmd, /* ^B */
      beep_cmd, /* ^C */
      beep_cmd, /* ^D */
      beep_cmd, /* ^E */
      beep_cmd, /* ^F */
      beep_cmd, /* ^G */
      beep_cmd, /* ^H */
      beep_cmd, /* ^I */
      beep_cmd, /* ^J */
      beep_cmd, /* ^K */
      beep_cmd, /* ^L */
      beep_cmd, /* ^M */
      beep_cmd, /* ^N */
      beep_cmd, /* ^O */
      beep_cmd, /* ^P */
      beep_cmd, /* ^Q */
      beep_cmd, /* ^R */
      beep_cmd, /* ^S */
      beep_cmd, /* ^T */
      beep_cmd, /* ^U */
      beep_cmd, /* ^V */
      beep_cmd, /* ^W */
      beep_cmd, /* ^X */
      beep_cmd, /* ^Y */
      beep_cmd, /* ^Z */
      beep_cmd, /* ^[ */
      beep_cmd, /* ^\ */
      beep_cmd, /* ^] */
      beep_cmd, /* ^^ */
      beep_cmd, /* ^_ */
      beep_cmd, /*   */
      beep_cmd, /* ! */
      beep_cmd, /* " */
      beep_cmd, /* # */
      sys_spawn_cmd,            /* $ */
      beep_cmd, /* % */
      beep_cmd, /* & */
      beep_cmd, /* ' */
      beep_cmd, /* ( */
      beep_cmd, /* ) */
      beep_cmd, /* * */
      beep_cmd, /* + */
      beep_cmd, /* , */
      digit_arg_cmd,            /* - */
      beep_cmd, /* . */
      beep_cmd, /* / */
      beep_cmd, /* 0 */
      digit_arg_cmd,            /* 1 */
      digit_arg_cmd,            /* 2 */
      digit_arg_cmd,            /* 3 */
      digit_arg_cmd,            /* 4 */
      digit_arg_cmd,            /* 5 */
      digit_arg_cmd,            /* 6 */
      digit_arg_cmd,            /* 7 */
      digit_arg_cmd,            /* 8 */
      digit_arg_cmd,            /* 9 */
      beep_cmd, /* : */
      beep_cmd, /* ; */
      beep_cmd, /* < */
      beep_cmd, /* = */
      beep_cmd, /* > */
      beep_cmd, /* ? */
      beep_cmd, /* @ */
      beep_cmd, /* A */
      beep_cmd, /* B */
      beep_cmd, /* C */
      beep_cmd, /* D */
      beep_cmd, /* E */
      beep_cmd, /* F */
      beep_cmd, /* G */
      beep_cmd, /* H */
      beep_cmd, /* I */
      beep_cmd, /* J */
      beep_cmd, /* K */
      beep_cmd, /* L */
      beep_cmd, /* M */
      beep_cmd, /* N */
      O_map_cmd,                /* O */
      beep_cmd, /* P */
      beep_cmd, /* Q */
      beep_cmd, /* R */
      beep_cmd, /* S */
      beep_cmd, /* T */
      beep_cmd, /* U */
      beep_cmd, /* V */
      beep_cmd, /* W */
      extended_cmd_cmd,         /* X */
      beep_cmd, /* Y */
      beep_cmd, /* Z */
      O_map_cmd,                /* [ */
      beep_cmd, /* \ */
      beep_cmd, /* ] */
      beep_cmd, /* ^ */
      beep_cmd, /* _ */
      beep_cmd, /* ` */
      beep_cmd, /* a */
      beep_cmd, /* b */
      beep_cmd, /* c */
      beep_cmd, /* d */
      beep_cmd, /* e */
      beep_cmd, /* f */
      beep_cmd, /* g */
      beep_cmd, /* h */
      beep_cmd, /* i */
      beep_cmd, /* j */
      beep_cmd, /* k */
      beep_cmd, /* l */
      beep_cmd, /* m */
      beep_cmd, /* n */
      beep_cmd, /* o */
      beep_cmd, /* p */
      beep_cmd, /* q */
      beep_cmd, /* r */
      beep_cmd, /* s */
      beep_cmd, /* t */
      beep_cmd, /* u */
      beep_cmd, /* v */
      beep_cmd, /* w */
      extended_cmd_cmd,         /* x */
      beep_cmd, /* y */
      beep_cmd, /* z */
      beep_cmd, /* { */
      beep_cmd, /* | */
      beep_cmd, /* } */
      beep_cmd, /* ~ */
      beep_cmd  /* ^? */
  };

void (*ctrl_x_map[128])() =
  {
      beep_cmd, /* ^@ */
      beep_cmd, /* ^A */
      beep_cmd, /* ^B */
      exit_cmd, /* ^C */
      beep_cmd, /* ^D */
      beep_cmd, /* ^E */
      find_file_cmd,            /* ^F */
      beep_cmd, /* ^G */
      beep_cmd, /* ^H */
      beep_cmd, /* ^I */
      beep_cmd, /* ^J */
      beep_cmd, /* ^K */
      beep_cmd, /* ^L */
      beep_cmd, /* ^M */
      beep_cmd, /* ^N */
      beep_cmd, /* ^O */
      beep_cmd, /* ^P */
      beep_cmd, /* ^Q */
      beep_cmd, /* ^R */
      beep_cmd, /* ^S */
      beep_cmd, /* ^T */
      beep_cmd, /* ^U */
      beep_cmd, /* ^V */
      beep_cmd, /* ^W */
      beep_cmd, /* ^X */
      beep_cmd, /* ^Y */
      beep_cmd, /* ^Z */
      beep_cmd, /* ^[ */
      beep_cmd, /* ^\ */
      beep_cmd, /* ^] */
      beep_cmd, /* ^^ */
      beep_cmd, /* ^_ */
      beep_cmd, /*   */
      beep_cmd, /* ! */
      beep_cmd, /* " */
      beep_cmd, /* # */
      beep_cmd, /* $ */
      beep_cmd, /* % */
      beep_cmd, /* & */
      beep_cmd, /* ' */
      beep_cmd, /* ( */
      beep_cmd, /* ) */
      beep_cmd, /* * */
      beep_cmd, /* + */
      beep_cmd, /* , */
      beep_cmd, /* - */
      beep_cmd, /* . */
      beep_cmd, /* / */
      del_window_cmd,           /* 0 */
      one_window_cmd,           /* 1 */
      two_window_cmd,           /* 2 */
      beep_cmd, /* 3 */
      beep_cmd, /* 4 */
      beep_cmd, /* 5 */
      beep_cmd, /* 6 */
      beep_cmd, /* 7 */
      beep_cmd, /* 8 */
      beep_cmd, /* 9 */
      beep_cmd, /* : */
      beep_cmd, /* ; */
      beep_cmd, /* < */
      beep_cmd, /* = */
      beep_cmd, /* > */
      beep_cmd, /* ? */
      beep_cmd, /* @ */
      beep_cmd, /* A */
      beep_cmd, /* B */
      beep_cmd, /* C */
      beep_cmd, /* D */
      beep_cmd, /* E */
      beep_cmd, /* F */
      beep_cmd, /* G */
      beep_cmd, /* H */
      beep_cmd, /* I */
      beep_cmd, /* J */
      beep_cmd, /* K */
      beep_cmd, /* L */
      beep_cmd, /* M */
      beep_cmd, /* N */
      other_window_cmd,         /* O */
      beep_cmd, /* P */
      beep_cmd, /* Q */
      beep_cmd, /* R */
      beep_cmd, /* S */
      beep_cmd, /* T */
      beep_cmd, /* U */
      beep_cmd, /* V */
      beep_cmd, /* W */
      beep_cmd, /* X */
      beep_cmd, /* Y */
      beep_cmd, /* Z */
      beep_cmd, /* [ */
      beep_cmd, /* \ */
      beep_cmd, /* ] */
      beep_cmd, /* ^ */
      beep_cmd, /* _ */
      beep_cmd, /* ` */
      beep_cmd, /* a */
      beep_cmd, /* b */
      beep_cmd, /* c */
      beep_cmd, /* d */
      beep_cmd, /* e */
      beep_cmd, /* f */
      beep_cmd, /* g */
      beep_cmd, /* h */
      beep_cmd, /* i */
      beep_cmd, /* j */
      beep_cmd, /* k */
      beep_cmd, /* l */
      beep_cmd, /* m */
      beep_cmd, /* n */
      other_window_cmd,         /* o */
      beep_cmd, /* p */
      beep_cmd, /* q */
      beep_cmd, /* r */
      beep_cmd, /* s */
      beep_cmd, /* t */
      beep_cmd, /* u */
      beep_cmd, /* v */
      beep_cmd, /* w */
      beep_cmd, /* x */
      beep_cmd, /* y */
      beep_cmd, /* z */
      beep_cmd, /* { */
      beep_cmd, /* | */
      beep_cmd, /* } */
      beep_cmd, /* ~ */
      beep_cmd  /* ^? */
  };

void (*ctrl_w_map[128])() =
  {
      beep_cmd, /* ^@ */
      beep_cmd, /* ^A */
      beep_cmd, /* ^B */
      beep_cmd, /* ^C */
      beep_cmd, /* ^D */
      beep_cmd, /* ^E */
      beep_cmd, /* ^F */
      beep_cmd, /* ^G */
      beep_cmd, /* ^H */
      beep_cmd, /* ^I */
      beep_cmd, /* ^J */
      beep_cmd, /* ^K */
      beep_cmd, /* ^L */
      beep_cmd, /* ^M */
      beep_cmd, /* ^N */
      beep_cmd, /* ^O */
      beep_cmd, /* ^P */
      beep_cmd, /* ^Q */
      beep_cmd, /* ^R */
      beep_cmd, /* ^S */
      beep_cmd, /* ^T */
      beep_cmd, /* ^U */
      beep_cmd, /* ^V */
      beep_cmd, /* ^W */
      beep_cmd, /* ^X */
      beep_cmd, /* ^Y */
      beep_cmd, /* ^Z */
      beep_cmd, /* ^[ */
      beep_cmd, /* ^\ */
      beep_cmd, /* ^] */
      beep_cmd, /* ^^ */
      beep_cmd, /* ^_ */
      beep_cmd, /*   */
      beep_cmd, /* ! */
      beep_cmd, /* " */
      beep_cmd, /* # */
      beep_cmd, /* $ */
      beep_cmd, /* % */
      beep_cmd, /* & */
      beep_cmd, /* ' */
      beep_cmd, /* ( */
      beep_cmd, /* ) */
      beep_cmd, /* * */
      beep_cmd, /* + */
      beep_cmd, /* , */
      beep_cmd, /* - */
      beep_cmd, /* . */
      beep_cmd, /* / */
      del_window_cmd,           /* 0 */
      one_window_cmd,           /* 1 */
      two_window_cmd,           /* 2 */
      beep_cmd, /* 3 */
      beep_cmd, /* 4 */
      beep_cmd, /* 5 */
      beep_cmd, /* 6 */
      beep_cmd, /* 7 */
      beep_cmd, /* 8 */
      beep_cmd, /* 9 */
      beep_cmd, /* : */
      beep_cmd, /* ; */
      beep_cmd, /* < */
      beep_cmd, /* = */
      beep_cmd, /* > */
      beep_cmd, /* ? */
      beep_cmd, /* @ */
      beep_cmd, /* A */
      beep_cmd, /* B */
      beep_cmd, /* C */
      beep_cmd, /* D */
      beep_cmd, /* E */
      beep_cmd, /* F */
      beep_cmd, /* G */
      beep_cmd, /* H */
      beep_cmd, /* I */
      beep_cmd, /* J */
      beep_cmd, /* K */
      beep_cmd, /* L */
      beep_cmd, /* M */
      beep_cmd, /* N */
      other_window_cmd,         /* O */
      beep_cmd, /* P */
      beep_cmd, /* Q */
      beep_cmd, /* R */
      beep_cmd, /* S */
      beep_cmd, /* T */
      beep_cmd, /* U */
      beep_cmd, /* V */
      beep_cmd, /* W */
      beep_cmd, /* X */
      beep_cmd, /* Y */
      beep_cmd, /* Z */
      beep_cmd, /* [ */
      beep_cmd, /* \ */
      beep_cmd, /* ] */
      beep_cmd, /* ^ */
      beep_cmd, /* _ */
      beep_cmd, /* ` */
      beep_cmd, /* a */
      beep_cmd, /* b */
      beep_cmd, /* c */
      beep_cmd, /* d */
      beep_cmd, /* e */
      beep_cmd, /* f */
      beep_cmd, /* g */
      beep_cmd, /* h */
      beep_cmd, /* i */
      beep_cmd, /* j */
      beep_cmd, /* k */
      beep_cmd, /* l */
      beep_cmd, /* m */
      beep_cmd, /* n */
      other_window_cmd, /* o */
      beep_cmd, /* p */
      beep_cmd, /* q */
      beep_cmd, /* r */
      beep_cmd, /* s */
      beep_cmd, /* t */
      beep_cmd, /* u */
      beep_cmd, /* v */
      beep_cmd, /* w */
      beep_cmd, /* x */
      beep_cmd, /* y */
      beep_cmd, /* z */
      beep_cmd, /* { */
      beep_cmd, /* | */
      beep_cmd, /* } */
      beep_cmd, /* ~ */
      beep_cmd  /* ^? */
  };

void (*ctrl_k_map[128])() =
  {
      beep_cmd, /* ^@ */
      beep_cmd, /* ^A */
      set_mark_cmd,             /* ^B */
      beep_cmd, /* ^C */
      beep_cmd, /* ^D */
      beep_cmd, /* ^E */
      beep_cmd, /* ^F */
      beep_cmd, /* ^G */
      beep_cmd, /* ^H */
      beep_cmd, /* ^I */
      goto_mark_cmd,            /* ^J */
      beep_cmd, /* ^K */
      beep_cmd, /* ^L */
      goto_mark_cmd,            /* ^M */
      beep_cmd, /* ^N */
      beep_cmd, /* ^O */
      beep_cmd, /* ^P */
      beep_cmd, /* ^Q */
      beep_cmd, /* ^R */
      beep_cmd, /* ^S */
      beep_cmd, /* ^T */
      beep_cmd, /* ^U */
      beep_cmd, /* ^V */
      beep_cmd, /* ^W */
      beep_cmd, /* ^X */
      beep_cmd, /* ^Y */
      beep_cmd, /* ^Z */
      beep_cmd, /* ^[ */
      beep_cmd, /* ^\ */
      beep_cmd, /* ^] */
      beep_cmd, /* ^^ */
      beep_cmd, /* ^_ */
      beep_cmd, /*   */
      beep_cmd, /* ! */
      beep_cmd, /* " */
      beep_cmd, /* # */
      beep_cmd, /* $ */
      beep_cmd, /* % */
      beep_cmd, /* & */
      beep_cmd, /* ' */
      beep_cmd, /* ( */
      beep_cmd, /* ) */
      beep_cmd, /* * */
      beep_cmd, /* + */
      beep_cmd, /* , */
      beep_cmd, /* - */
      beep_cmd, /* . */
      beep_cmd, /* / */
      beep_cmd, /* 0 */
      beep_cmd, /* 1 */
      beep_cmd, /* 2 */
      beep_cmd, /* 3 */
      beep_cmd, /* 4 */
      beep_cmd, /* 5 */
      beep_cmd, /* 6 */
      beep_cmd, /* 7 */
      beep_cmd, /* 8 */
      beep_cmd, /* 9 */
      beep_cmd, /* : */
      beep_cmd, /* ; */
      beep_cmd, /* < */
      beep_cmd, /* = */
      beep_cmd, /* > */
      beep_cmd, /* ? */
      beep_cmd, /* @ */
      beep_cmd, /* A */
      beep_cmd, /* B */
      beep_cmd, /* C */
      extended_cmd_cmd,         /* D */
      exit_cmd,                 /* E */
      beep_cmd, /* F */
      find_file_cmd,            /* G */
      beep_cmd, /* H */
      beep_cmd, /* I */
      beep_cmd, /* J */
      beep_cmd, /* K */
      beep_cmd, /* L */
      set_mark_cmd,             /* M */
      beep_cmd, /* N */
      beep_cmd, /* O */
      beep_cmd, /* P */
      beep_cmd, /* Q */
      beep_cmd, /* R */
      beep_cmd, /* S */
      beep_cmd, /* T */
      beep_cmd, /* U */
      beep_cmd, /* V */
      beep_cmd, /* W */
      beep_cmd, /* X */
      beep_cmd, /* Y */
      beep_cmd, /* Z */
      beep_cmd, /* [ */
      beep_cmd, /* \ */
      beep_cmd, /* ] */
      beep_cmd, /* ^ */
      beep_cmd, /* _ */
      beep_cmd, /* ` */
      beep_cmd, /* a */
      beep_cmd, /* b */
      beep_cmd, /* c */
      extended_cmd_cmd,         /* d */
      exit_cmd,                 /* e */
      beep_cmd, /* f */
      find_file_cmd,            /* g */
      beep_cmd, /* h */
      beep_cmd, /* i */
      beep_cmd, /* j */
      beep_cmd, /* k */
      beep_cmd, /* l */
      set_mark_cmd,             /* m */
      beep_cmd, /* n */
      beep_cmd, /* o */
      beep_cmd, /* p */
      beep_cmd, /* q */
      beep_cmd, /* r */
      beep_cmd, /* s */
      beep_cmd, /* t */
      beep_cmd, /* u */
      beep_cmd, /* v */
      beep_cmd, /* w */
      beep_cmd, /* x */
      beep_cmd, /* y */
      beep_cmd, /* z */
      beep_cmd, /* { */
      beep_cmd, /* | */
      beep_cmd, /* } */
      beep_cmd, /* ~ */
      beep_cmd  /* ^? */
  };

void (*esc_O_map[128])() =
  {
      beep_cmd, /* ^@ */
      beep_cmd, /* ^A */
      beep_cmd, /* ^B */
      beep_cmd, /* ^C */
      beep_cmd, /* ^D */
      beep_cmd, /* ^E */
      beep_cmd, /* ^F */
      beep_cmd, /* ^G */
      beep_cmd, /* ^H */
      beep_cmd, /* ^I */
      beep_cmd, /* ^J */
      beep_cmd, /* ^K */
      beep_cmd, /* ^L */
      beep_cmd, /* ^M */
      beep_cmd, /* ^N */
      beep_cmd, /* ^O */
      beep_cmd, /* ^P */
      beep_cmd, /* ^Q */
      beep_cmd, /* ^R */
      beep_cmd, /* ^S */
      beep_cmd, /* ^T */
      beep_cmd, /* ^U */
      beep_cmd, /* ^V */
      beep_cmd, /* ^W */
      beep_cmd, /* ^X */
      beep_cmd, /* ^Y */
      beep_cmd, /* ^Z */
      beep_cmd, /* ^[ */
      beep_cmd, /* ^\ */
      beep_cmd, /* ^] */
      beep_cmd, /* ^^ */
      beep_cmd, /* ^_ */
      beep_cmd, /*   */
      beep_cmd, /* ! */
      beep_cmd, /* " */
      beep_cmd, /* # */
      beep_cmd, /* $ */
      beep_cmd, /* % */
      beep_cmd, /* & */
      beep_cmd, /* ' */
      beep_cmd, /* ( */
      beep_cmd, /* ) */
      beep_cmd, /* * */
      beep_cmd, /* + */
      beep_cmd, /* , */
      beep_cmd, /* - */
      beep_cmd, /* . */
      beep_cmd, /* / */
      dec_extended_map_cmd,     /* 0 */
      dec_extended_map_cmd,     /* 1 */
      dec_extended_map_cmd,     /* 2 */
      dec_extended_map_cmd,     /* 3 */
      dec_extended_map_cmd,     /* 4 */
      dec_extended_map_cmd,     /* 5 */
      dec_extended_map_cmd,     /* 6 */
      dec_extended_map_cmd,     /* 7 */
      dec_extended_map_cmd,     /* 8 */
      dec_extended_map_cmd,     /* 9 */
      beep_cmd, /* : */
      beep_cmd, /* ; */
      beep_cmd, /* < */
      beep_cmd, /* = */
      beep_cmd, /* > */
      beep_cmd, /* ? */
      beep_cmd, /* @ */
      previous_line_cmd,        /* A */
      next_line_cmd,            /* B */
      page_right_cmd,           /* C */
      page_left_cmd,            /* D */
      beep_cmd, /* E */
      beep_cmd, /* F */
      beep_cmd, /* G */
      beep_cmd, /* H */
      beep_cmd, /* I */
      beep_cmd, /* J */
      beep_cmd, /* K */
      beep_cmd, /* L */
      next_line_cmd, /* M */
      beep_cmd, /* N */
      beep_cmd, /* O */
      pf1_map_cmd, /* P */	/* PF1 */
      help_cmd, /* Q */ /* PF2 */
      edt_find_next_cmd, /* R */ /* PF3 */
      beep_cmd, /* S */ /* PF4 */
      beep_cmd, /* T */
      beep_cmd, /* U */
      beep_cmd, /* V */
      beep_cmd, /* W */
      beep_cmd, /* X */
      beep_cmd, /* Y */
      beep_cmd, /* Z */
      beep_cmd, /* [ */
      beep_cmd, /* \ */
      beep_cmd, /* ] */
      beep_cmd, /* ^ */
      beep_cmd, /* _ */
      beep_cmd, /* ` */
      beep_cmd, /* a */
      beep_cmd, /* b */
      beep_cmd, /* c */
      beep_cmd, /* d */
      beep_cmd, /* e */
      beep_cmd, /* f */
      beep_cmd, /* g */
      beep_cmd, /* h */
      beep_cmd, /* i */
      beep_cmd, /* j */
      beep_cmd, /* k */
      beep_cmd, /* l */
      beep_cmd, /* m */
      set_mark_cmd, /* n */
      beep_cmd, /* o */
      edt_line_cmd, /* p */ /* KP0 */
      beep_cmd, /* q */ /* KP1 */
      beep_cmd, /* r */ /* KP2 */
      beep_cmd, /* s */ /* KP3 */
      edt_forward_cmd, /* t */ /* KP4 */
      edt_back_cmd, /* u */ /* KP5 */
      beep_cmd, /* v */ /* KP6 */
      beep_cmd, /* w */ /* KP7 */
      edt_page_cmd, /* x */ /* KP8 */
      beep_cmd, /* y */ /* KP9 */
      beep_cmd, /* z */
      beep_cmd, /* { */
      beep_cmd, /* | */
      beep_cmd, /* } */
      beep_cmd, /* ~ */
      beep_cmd  /* ^? */
  };

void (*pf1_map[128])() =	/* Gold */
  {
      beep_cmd, /* ^@ */
      beep_cmd, /* ^A */
      beep_cmd, /* ^B */
      beep_cmd, /* ^C */
      beep_cmd, /* ^D */
      beep_cmd, /* ^E */
      beep_cmd, /* ^F */
      beep_cmd, /* ^G */
      beep_cmd, /* ^H */
      beep_cmd, /* ^I */
      beep_cmd, /* ^J */
      beep_cmd, /* ^K */
      beep_cmd, /* ^L */
      beep_cmd, /* ^M */
      beep_cmd, /* ^N */
      beep_cmd, /* ^O */
      beep_cmd, /* ^P */
      beep_cmd, /* ^Q */
      beep_cmd, /* ^R */
      beep_cmd, /* ^S */
      beep_cmd, /* ^T */
      beep_cmd, /* ^U */
      beep_cmd, /* ^V */
      beep_cmd, /* ^W */
      beep_cmd, /* ^X */
      beep_cmd, /* ^Y */
      beep_cmd, /* ^Z */
      pf1_esc_map_cmd, /* ^[ */
      beep_cmd, /* ^\ */
      beep_cmd, /* ^] */
      beep_cmd, /* ^^ */
      beep_cmd, /* ^_ */
      beep_cmd, /*   */
      beep_cmd, /* ! */
      beep_cmd, /* " */
      beep_cmd, /* # */
      beep_cmd, /* $ */
      beep_cmd, /* % */
      beep_cmd, /* & */
      beep_cmd, /* ' */
      beep_cmd, /* ( */
      beep_cmd, /* ) */
      beep_cmd, /* * */
      beep_cmd, /* + */
      beep_cmd, /* , */
      beep_cmd, /* - */
      beep_cmd, /* . */
      beep_cmd, /* / */
      digit_arg_cmd, /* 0 */
      digit_arg_cmd, /* 1 */
      digit_arg_cmd, /* 2 */
      digit_arg_cmd, /* 3 */
      digit_arg_cmd, /* 4 */
      digit_arg_cmd, /* 5 */
      digit_arg_cmd, /* 6 */
      digit_arg_cmd, /* 7 */
      digit_arg_cmd, /* 8 */
      digit_arg_cmd, /* 9 */
      beep_cmd, /* : */
      beep_cmd, /* ; */
      beep_cmd, /* < */
      beep_cmd, /* = */
      beep_cmd, /* > */
      beep_cmd, /* ? */
      beep_cmd, /* @ */
      beep_cmd, /* A */
      beep_cmd, /* B */
      beep_cmd, /* C */
      beep_cmd, /* D */
      beep_cmd, /* E */
      beep_cmd, /* F */
      beep_cmd, /* G */
      beep_cmd, /* H */
      beep_cmd, /* I */
      beep_cmd, /* J */
      beep_cmd, /* K */
      beep_cmd, /* L */
      beep_cmd, /* M */
      beep_cmd, /* N */
      one_window_cmd, /* O */
      beep_cmd, /* P */
      exit_cmd, /* Q */
      beep_cmd, /* R */
      sys_spawn_cmd, /* S */
      beep_cmd, /* T */
      beep_cmd, /* U */
      del_window_cmd, /* V */
      beep_cmd, /* W */
      two_window_cmd, /* X */
      beep_cmd, /* Y */
      beep_cmd, /* Z */
      beep_cmd, /* [ */
      beep_cmd, /* \ */
      beep_cmd, /* ] */
      beep_cmd, /* ^ */
      beep_cmd, /* _ */
      beep_cmd, /* ` */
      beep_cmd, /* a */
      beep_cmd, /* b */
      beep_cmd, /* c */
      beep_cmd, /* d */
      beep_cmd, /* e */
      beep_cmd, /* f */
      beep_cmd, /* g */
      beep_cmd, /* h */
      beep_cmd, /* i */
      beep_cmd, /* j */
      beep_cmd, /* k */
      beep_cmd, /* l */
      beep_cmd, /* m */
      beep_cmd, /* n */
      one_window_cmd, /* o */
      beep_cmd, /* p */
      exit_cmd, /* q */
      beep_cmd, /* r */
      sys_spawn_cmd, /* s */
      beep_cmd, /* t */
      beep_cmd, /* u */
      del_window_cmd, /* v */
      beep_cmd, /* w */
      two_window_cmd, /* x */
      beep_cmd, /* y */
      beep_cmd, /* z */
      beep_cmd, /* { */
      beep_cmd, /* | */
      beep_cmd, /* } */
      beep_cmd, /* ~ */
      beep_cmd  /* ^? */
  };

void execute_key()
{
    char ch;
    int r,c;
    c = CURS_COL - COLUMN + 1;
    r = CURS_ROW;
    if (MINI_BUF[0] != '\0') put_message();
    if (r < 1) r = 1;
    else if (r > (WIN->bot - WIN->top + 1))
      r = WIN->bot - WIN->top + 1;
    if (c > SCREEN_WIDTH) c = SCREEN_WIDTH;
    else if (c < 1) c = 1;
    goto_rc(r,c);
    fflush(stdout);
    DIGIT_ARG = (int *) NULL;
    ch = getkey();
    if (MINI_BUF[0] != '\0') clear_minibuffer();
    LAST_CHAR = ch;
    (*root_map[ (int) ch ])();
}

void ctrl_x_map_cmd()
{
    char ch;

    ch = getkey();
    (*ctrl_x_map[ (int) ch ])();
}

void ctrl_k_map_cmd()
{
    char ch;

    ch = getkey();
    (*ctrl_k_map[ (int) ch ])();
}

void ctrl_w_map_cmd()
{
    char ch;

    ch = getkey();
    (*ctrl_w_map[ (int) ch ])();
}

void O_map_cmd()
{
    char ch;

    ch = getkey();
    LAST_CHAR = ch;
    (*esc_O_map[ (int) ch ])();
}

void esc_map_cmd()
{
    char ch;

    ch = getkey();
    LAST_CHAR = ch;
    (*escape_map[ (int) ch ])();
}

/* weird sequences of form ^[[n~ where n is an integer */
void dec_extended_map_cmd()
{
    char ch, numstr[5];
    int i, num;
    
    ch = LAST_CHAR;  /* should be integer */
    i = 0;
    numstr[i++] = ch;
 
    while (ch = getkey(), isdigit(ch)) numstr[i++] = ch;
    if (ch == '~')
      {
          numstr[i++] =  '\0';
          sscanf(numstr,"%d",&num);
          switch (num)
            {
              case 5:
                page_up_cmd(); break; /* prev screen */
              case 6:
                page_down_cmd(); break; /* next screen */
              case 1:
                search_cmd(); break; /* find */
              case 4:
                set_mark_cmd(); break; /* select */
              case 2:   
                goto_mark_cmd(); break; /* insert here */
              case 28:
                help_cmd(); break; /* Help */
              case 29:  /* do */
                extended_cmd_cmd(); break;
              default:
                beep_cmd(); break;
            }
      }
    else beep_cmd();
}

/* weird sequences of form ^[[n~ where n is an integer */
void pf1_esc_map_cmd()
{
    char ch, numstr[5];
    int i, num;
    
    LAST_CHAR = ch = getkey();
    switch (ch)
	{
	case 'O':
	    LAST_CHAR = ch = getkey();
	    switch (ch)
		{
		case 't': /* KP4 */
		    end_of_buffer_cmd(); break;
		case 'u': /* KP5 */
		    top_of_buffer_cmd(); break;
		case 'w': /* KP7 */
		    extended_cmd_cmd(); break;
		case 'n': /* KP7 */
		    goto_mark_cmd(); break;
		case 'R': /* PF3 */
		    edt_find_cmd(); break;
		default :
		    beep_cmd(); break;
		}
	    break;
	case '[':
	    LAST_CHAR = ch = getkey();
	    switch (ch)
		{
		case 'A':
		    other_window_cmd(); break;
		case 'B':
		    other_window_cmd(); break;
		case 'C':
		    page_left_cmd(); break;
		case 'D':
		    page_right_cmd(); break;
		default :
		    beep_cmd(); break;
		};
	    break;
	default :
            beep_cmd(); break;
	}
}

void pf1_map_cmd()
{
    char ch;

    ch = getkey();
    LAST_CHAR = ch;
    (*pf1_map[ (int) ch ])();
}

void beep_cmd()
{
    fputc('\007',stdout);
}

void page_down_cmd()
{
    int n = 1;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    update_windows(C_LINE + n * (WIN->bot - WIN->top + 1));
}
void page_up_cmd()
{
    int n = 1;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    update_windows(C_LINE - n * (WIN->bot - WIN->top + 1));
}

void page_right_cmd()
{
    int n = 1;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    COLUMN = COLUMN + n * 59;
    update_windows(C_LINE);
}

void page_left_cmd()
{
    int n = 1;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    COLUMN = COLUMN - n * 59;
    update_windows(C_LINE);
}

void next_line_cmd()
{
    int n = 1;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    update_windows(C_LINE + n);
}

void previous_line_cmd()
{
    int n = 1;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    update_windows(C_LINE - n);
}

void top_of_buffer_cmd()
{
    update_windows(1);
}

void end_of_buffer_cmd()
{
    update_windows(NUM_LINES);
}

extern void sys_spawn_cmd()
{
    int update = 0;
    reset_tty();
    reset_display();
    fflush(stdout);
#ifdef VMS
    if (LAST_CHAR == '\032') exit(0);
    if (do_shell_command()) update = 1; /* scroll region reset by message facility */
#else                          
    killpg(getpgrp(0),18);
    update = 1;
#endif
    init_tty();
    if (update) redraw_display();
}

void redraw_cmd()
{
    redraw_display();
}

void goto_line_cmd()
{
    int n = C_LINE;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    else
      {
          MINI_BUF[0] = 0;
          if (!read_from_minibuffer("Line: ", MINI_BUF)) return;
          sscanf(MINI_BUF,"%d",&n);
          MINI_BUF[0] = 0;
      }
    update_windows(n);
}

void goto_percent_cmd()
{
    unsigned char *pos;
    int n;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    else
      {
          MINI_BUF[0] = 0;
          if (!read_from_minibuffer("%: ", MINI_BUF)) return;
          sscanf(MINI_BUF,"%d",&n);
          MINI_BUF[0] = 0;
      }
    if (n < 0) n = 0; else if (n > 100) n = 100;
    pos = BEG + (int) (n * (int) (EOB - BEG)) / 100;
    n = what_line(pos);
    update_windows(n);
}

void extended_key_cmd()
{
    if (-1 == do_extended_key()) exit_cmd();
}

void extended_cmd_cmd()
{
    if (-1 == do_extended_cmd()) exit_cmd();
}

void set_mark_cmd()
{
    BUF->mark = C_LINE;
    message("Mark Set.",0);
}

void goto_mark_cmd()
{
    int mark = BUF->mark;
    BUF->mark = C_LINE;
    update_window(mark);
    message("Mark Set.",0);
}

void one_window_cmd()
{
    one_window();
}

void two_window_cmd()
{
    two_windows();
}

void del_window_cmd()
{
    delete_window();
}

void other_window_cmd()
{
    int n = 1;
    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
    other_window(n);
}


void find_next_cmd()
{
    int col, line, n = 1;
    unsigned char *pos;
    
    if (DIGIT_ARG != NULL) n = *DIGIT_ARG;
    line = search(CURS_POS + SEARCH_DIR, n, &col);
    if (line < 1) return;
    pos = CURS_POS;
    if ((line < WIN->beg_line) || (line > WIN->beg_line + WIN->bot - WIN->top))
      update_window(line);
    CURS_POS = pos;
    CURS_ROW = line - C_LINE + 1;
    CURS_COL = col;
}

void search_cmd()
{
    SEARCH_DIR = 1;
    if (read_from_minibuffer("Search: ",SEARCH_STR) == -1)
      return;
    CURS_POS = C_POS;
    find_next_cmd();
}

void search_back_cmd()
{
    SEARCH_DIR = -1;
    if (read_from_minibuffer("Search: ",SEARCH_STR) == -1)
      return;
    find_next_cmd();
}

void help_cmd()
{
    do_help_command();
}

void find_file_cmd()
{
    user_get_file();
}

void time_cmd()
{
    message(get_time(),0);
}

void exit_cmd()
{
    reset_tty();
    reset_display();
#ifndef  VMS
    fputc('\n',stdout);
#endif    
    exit(0);
}

void digit_arg_cmd()
{
    char num[15], ch;
    int j = 0;
    static int digits;
    
    num[j++] = LAST_CHAR;
    ch = getkey();
    while ((ch >= '0') && (ch <= '9'))
      {
          num[j++] = ch;
          ch = getkey();
      }
    
    if (((j == 1) && (LAST_CHAR != '-')) || (j > 1))
      {
          num[j] = '\0';
          sscanf(num,"%d",&digits);
          DIGIT_ARG = &digits;
      }
    LAST_CHAR = ch;
    (*root_map[ (int) ch ])();
}

    
void toggle_width_cmd()
{
    if (SCREEN_WIDTH == 80)
      {
          if (!RESTORE_WIDTH_TO) RESTORE_WIDTH_TO = 80;
          set_width(132, 1);
      }          
    else if (SCREEN_WIDTH == 132)
      {
          if (!RESTORE_WIDTH_TO) RESTORE_WIDTH_TO = 132;
          set_width(80, 1);
      }          
}

void edt_forward_cmd()
{
    EDT_DIRECTION = 1;
}

void edt_back_cmd()
{
    EDT_DIRECTION = 0;
}

void edt_page_cmd()
{
    if (EDT_DIRECTION == 0)
	{
	    page_up_cmd();
	}
    else
	{
	    page_down_cmd();
	}
}

void edt_line_cmd()
{
    if (EDT_DIRECTION == 0)
	{
	    previous_line_cmd();
	}
    else
	{
	    next_line_cmd();
	}
}

void edt_find_cmd()
{
    if (EDT_DIRECTION == 0)
	{
	    search_back_cmd();
	}
    else
	{
	    search_cmd();
	}
}

void edt_find_next_cmd()
{
    if (EDT_DIRECTION == 0)
	{
	    SEARCH_DIR = -1;
	}
    else
	{
	    SEARCH_DIR = 1;
	}
    find_next_cmd();
}

