home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / beav1402.zip / ttykbd.c < prev    next >
Text File  |  1993-04-16  |  16KB  |  473 lines

  1. /*
  2.  *      Wang PC keyboard handler
  3.  */
  4. #include    "def.h"
  5.  
  6. extern char MSG_sp_key[];
  7. extern char MSG_byte_shift[];
  8. extern char MSG_back_char[];
  9. extern char MSG_quit[];
  10. extern char MSG_forw_del_char[];
  11. extern char MSG_toggle_swap[];
  12. extern char MSG_forw_char[];
  13. extern char MSG_abort[];
  14. extern char MSG_ins_self[];
  15. extern char MSG_back_del_char[];
  16. extern char MSG_refresh[];
  17. extern char MSG_forw_line[];
  18. extern char MSG_back_line[];
  19. extern char MSG_quote[];
  20. extern char MSG_recall[];
  21. extern char MSG_twiddle[];
  22. extern char MSG_forw_page[];
  23. extern char MSG_kill_region[];
  24. extern char MSG_yank[];
  25. extern char MSG_down_window[];
  26. extern char MSG_ins_toggle[];
  27. extern char MSG_display_buffers[];
  28. extern char MSG_quit[];
  29. extern char MSG_exit_flush_all[];
  30. extern char MSG_set_file_name[];
  31. extern char MSG_file_insert[];
  32. extern char MSG_buf_size_lock[];
  33. extern char MSG_flush_all[];
  34. extern char MSG_down_window[];
  35. extern char MSG_up_window[];
  36. extern char MSG_file_read[];
  37. extern char MSG_file_save[];
  38. extern char MSG_file_visit[];
  39. extern char MSG_file_write[];
  40. extern char MSG_swap_dot_and_mark[];
  41. extern char MSG_shrink_window[];
  42. extern char MSG_display_position[];
  43. extern char MSG_start_macro[];
  44. extern char MSG_end_macro[];
  45. extern char MSG_help[];
  46. extern char MSG_only_window[];
  47. extern char MSG_split_window[];
  48. extern char MSG_use_buffer[];
  49. extern char MSG_spawn_cli[];
  50. extern char MSG_execute_macro[];
  51. extern char MSG_goto_line[];
  52. extern char MSG_ins_unit[];
  53. extern char MSG_kill_buffer[];
  54. extern char MSG_load_bindings[];
  55. extern char MSG_forw_window[];
  56. extern char MSG_back_window[];
  57. extern char MSG_view_file[];
  58. extern char MSG_enlarge_window[];
  59. extern char MSG_ascii_mode[];
  60. extern char MSG_binary_mode[];
  61. extern char MSG_buffer_name[];
  62. extern char MSG_decimal_mode[];
  63. extern char MSG_hex_mode[];
  64. extern char MSG_back_del_unit[];
  65. extern char MSG_octal_mode[];
  66. extern char MSG_display_version[];
  67. extern char MSG_unit_size1[];
  68. extern char MSG_unit_size2[];
  69. extern char MSG_unit_size4[];
  70. extern char MSG_reposition_window[];
  71. extern char MSG_set_mark[];
  72. extern char MSG_goto_eob[];
  73. extern char MSG_goto_bob[];
  74. extern char MSG_next_buff[];
  75. extern char MSG_prev_buff[];
  76. extern char MSG_query_replace[];
  77. extern char MSG_display_bindings[];
  78. extern char MSG_auto_save[];
  79. extern char MSG_back_unit[];
  80. extern char MSG_compare[];
  81. extern char MSG_forw_del_unit[];
  82. extern char MSG_forw_unit[];
  83. extern char MSG_link_windows[];
  84. extern char MSG_print[];
  85. extern char MSG_back_search[];
  86. extern char MSG_forw_search[];
  87. extern char MSG_back_page[];
  88. extern char MSG_copy_region[];
  89. extern char MSG_extended_command[];
  90. extern char MSG_up_window[];
  91. extern char MSG_search_again[];
  92. extern char MSG_bind_to_key[];
  93. extern char MSG_file_visit_split[];
  94. extern char MSG_yank_buffer[];
  95. extern char MSG_save_region[];
  96. extern char MSG_use_buffer_split[];
  97. extern char MSG_no_f_tb[];
  98.  
  99. #define SPECIAL 0x1F        /* Special keys         */
  100.  
  101. typedef struct key_name_array
  102. {
  103.     int key_code;
  104.     char *func_name_str;
  105.     char *key_name_str;
  106. } KEY_NAME_ARRAY;
  107.  
  108. #if MSDOS
  109. extern bool wang_pc;
  110. extern bool ibm_pc;
  111. #endif
  112. /*
  113.  * The keyboard's special characters, those things that are prefixed with
  114.  * a 0x1F, are placed into the keyboard tables as KCTRL || 0x800 || x, for some
  115.  * x i.e. they have both the control and 0x800 bits set, so they won't conflict
  116.  * with anything else on the keyboard.
  117.  */
  118.  
  119.  
  120. /*
  121.  * Names for the keys with basic keycode
  122.  * between KFIRST and KLAST (inclusive). This is used by
  123.  * the key name routine in "kbd.c".
  124.  */
  125. #if MSDOS
  126. KEY_NAME_ARRAY wang_keys[] =
  127. {
  128.     KCTRL | KFIRST | 0x00, MSG_bind_to_key, "Indent",
  129.  /*  KCTRL | KFIRST | 0x01, NULL, "Page", */
  130.     KCTRL | KFIRST | 0x02, MSG_reposition_window, "Center",
  131.  /*  KCTRL | KFIRST | 0x03, NULL, "DecTab", */
  132.  /*  KCTRL | KFIRST | 0x04, NULL, "Format", */
  133.  /*  KCTRL | KFIRST | 0x05, NULL, "Merge", */
  134.  /*  KCTRL | KFIRST | 0x06, NULL, "Note", */
  135.     KCTRL | KFIRST | 0x07, MSG_set_mark, "Stop",
  136.     KCTRL | KFIRST | 0x08, MSG_forw_search, "Search",
  137.     KCTRL | KFIRST | 0x09, MSG_yank, "Replace",
  138.     KCTRL | KFIRST | 0x0A, MSG_copy_region, "Copy",
  139.     KCTRL | KFIRST | 0x0B, MSG_kill_region, "Move",
  140.     KCTRL | KFIRST | 0x0C, MSG_extended_command, "Command",
  141.     KCTRL | KFIRST | 0x0D, MSG_forw_window, "UpDown",
  142.  /*  KCTRL | KFIRST | 0x0E, NULL, "BlankKey", */
  143.     KCTRL | KFIRST | 0x0F, MSG_goto_line, "GoTo",
  144.  /*  KCTRL | KFIRST | 0x10, NULL, "Sh-Indent", */
  145.  /*  KCTRL | KFIRST | 0x11, NULL, "Sh-Page", */
  146.  /*  KCTRL | KFIRST | 0x12, NULL, "Sh-Center", */
  147.  /*  KCTRL | KFIRST | 0x13, NULL, "Sh-DecTab", */
  148.  /*  KCTRL | KFIRST | 0x14, NULL, "Sh-Format", */
  149.  /*  KCTRL | KFIRST | 0x15, NULL, "Sh-Merge", */
  150.  /*  KCTRL | KFIRST | 0x16, NULL, "Sh-Note", */
  151.  /*  KCTRL | KFIRST | 0x17, NULL, "Sh-Stop", */
  152.     KCTRL | KFIRST | 0x18, MSG_search_again, "Sh-Search",
  153.     KCTRL | KFIRST | 0x19, MSG_query_replace, "Sh-Replace",
  154.  /*  KCTRL | KFIRST | 0x1A, NULL, "Sh-Copy", */
  155.  /*  KCTRL | KFIRST | 0x1B, NULL, "Sh-Move", */
  156.  /*  KCTRL | KFIRST | 0x1C, NULL, "Sh-Command", */
  157.     KCTRL | KFIRST | 0x1D, MSG_split_window, "Sh-UpDown",
  158.  /*  KCTRL | KFIRST | 0x1E, NULL, "Sh-BlankKey", */
  159.  /*  KCTRL | KFIRST | 0x1F, NULL, "Sh-GoTo", */
  160.     KCTRL | KFIRST | 0x40, MSG_back_line, "North",
  161.     KCTRL | KFIRST | 0x41, MSG_forw_char, "East",
  162.     KCTRL | KFIRST | 0x42, MSG_forw_line, "South",
  163.     KCTRL | KFIRST | 0x43, MSG_back_char, "West",
  164.     KCTRL | KFIRST | 0x44, MSG_byte_shift, "Home",
  165.  /*  KCTRL | KFIRST | 0x45, NULL, "Execute", */
  166.     KCTRL | KFIRST | 0x46, MSG_ins_toggle, "Insert",
  167.     KCTRL | KFIRST | 0x47, MSG_forw_del_char, "Delete",
  168.     KCTRL | KFIRST | 0x48, MSG_back_page, "PrevPage",
  169.     KCTRL | KFIRST | 0x49, MSG_forw_page, "NextPage",
  170.  /*  KCTRL | KFIRST | 0x4B, NULL, "Erase", */
  171.  /*  KCTRL | KFIRST | 0x4D, NULL, "BackTab", */
  172.  /*  KCTRL | KFIRST | 0x50, NULL, "Sh-North", */
  173.     KCTRL | KFIRST | 0x51, MSG_forw_unit, "Sh-East",
  174.  /*  KCTRL | KFIRST | 0x52, NULL, "Sh-South", */
  175.     KCTRL | KFIRST | 0x53, MSG_back_unit, "Sh-West",
  176.  /*  KCTRL | KFIRST | 0x54, NULL, "Sh-Home", */
  177.     KCTRL | KFIRST | 0x55, MSG_execute_macro, "Sh-Execute",
  178.  /*  KCTRL | KFIRST | 0x56, NULL, "Sh-Insert", */
  179.     KCTRL | KFIRST | 0x57, MSG_forw_del_unit, "Sh-Delete",
  180.     KCTRL | KFIRST | 0x58, MSG_goto_bob, "Sh-PrevPage",
  181.     KCTRL | KFIRST | 0x59, MSG_goto_eob, "Sh-NextPage",
  182.  /*  KCTRL | KFIRST | 0x5B, NULL, "Sh-Erase", */
  183.  /*  KCTRL | KFIRST | 0x5C, NULL, "Sh-Tab", */
  184.  /*  KCTRL | KFIRST | 0x5D, NULL, "Sh-BackTab", */
  185.     KCTRL | KFIRST | 0x60, MSG_abort, "Cancel",
  186.     KMETA | KCTRL | KFIRST | 0x60, MSG_abort, "Cancel",
  187.     KCTLX | KCTRL | KFIRST | 0x60, MSG_abort, "Ctl-X Cancel",
  188.     KCTRL | KFIRST | 0x61, MSG_display_bindings, "Help",
  189.  /*  KCTRL | KFIRST | 0x62, NULL, "Glossary", */
  190.     KCTRL | KFIRST | 0x63, MSG_print, "Print",
  191.     KCTRL | KFIRST | 0x71, MSG_help, "Sh-Help",
  192.  /*  KCTRL | KFIRST | 0x72, NULL, "Sh-Glossary", */
  193.  /*  KCTRL | KFIRST | 0x73, NULL, "Sh-Print", */
  194.     0, NULL, NULL
  195. };
  196. #endif
  197.  
  198. #if defined(MSDOS) || defined(OS2)
  199. KEY_NAME_ARRAY ibm_keys[] =
  200. {
  201.     KCTLX | KFIRST | 0x3B, MSG_display_bindings, "F1",
  202.     KCTLX | KFIRST | 0x3C, MSG_set_mark, "F2",
  203.     KCTLX | KFIRST | 0x3D, MSG_forw_search, "F3",
  204.     KCTLX | KFIRST | 0x3E, MSG_search_again, "F4",
  205.     KCTLX | KFIRST | 0x3F, MSG_query_replace, "F5",
  206.     KCTLX | KFIRST | 0x40, MSG_yank, "F6",
  207.     KCTLX | KFIRST | 0x41, MSG_copy_region, "F7",
  208.     KCTLX | KFIRST | 0x42, MSG_kill_region, "F8",
  209.     KCTLX | KFIRST | 0x43, MSG_goto_line, "F9",
  210.     KCTLX | KFIRST | 0x44, NULL, "F10",
  211.     KCTLX | KFIRST | 0x85, NULL, "F11",
  212.     KCTLX | KFIRST | 0x86, NULL, "F12",
  213.     KCTLX | KFIRST | 0x54, MSG_help, "Sh-F1",
  214.     KCTLX | KFIRST | 0x55, MSG_file_read, "Sh-F2",
  215.     KCTLX | KFIRST | 0x56, MSG_file_save, "Sh-F3",
  216.     KCTLX | KFIRST | 0x57, MSG_file_visit, "Sh-F4",
  217.     KCTLX | KFIRST | 0x58, MSG_file_write, "Sh-F5",
  218.     KCTLX | KFIRST | 0x59, MSG_flush_all, "Sh-F6",
  219.     KCTLX | KFIRST | 0x5A, MSG_set_file_name, "Sh-F7",
  220.     KCTLX | KFIRST | 0x5B, MSG_file_insert, "Sh-F8",
  221.     KCTLX | KFIRST | 0x5C, MSG_exit_flush_all, "Sh-F9",
  222.     KCTLX | KFIRST | 0x5D, MSG_quit, "Sh-F10",
  223.     KCTLX | KFIRST | 0x87, NULL, "Sh-F11",
  224.     KCTLX | KFIRST | 0x88, NULL, "Sh-F12",
  225.     KCTLX | KFIRST | 0x5E, MSG_display_buffers, "Ctl-F1",
  226.     KCTLX | KFIRST | 0x5F, MSG_use_buffer, "Ctl-F2",
  227.     KCTLX | KFIRST | 0x60, MSG_kill_buffer, "Ctl-F3",
  228.     KCTLX | KFIRST | 0x61, MSG_next_buff, "Ctl-F4",
  229.     KCTLX | KFIRST | 0x62, MSG_prev_buff, "Ctl-F5",
  230.     KCTLX | KFIRST | 0x63, MSG_yank_buffer, "Ctl-F6",
  231.     KCTLX | KFIRST | 0x64, MSG_set_file_name, "Ctl-F7",
  232.     KCTLX | KFIRST | 0x65, MSG_file_insert, "Ctl-F8",
  233.     KCTLX | KFIRST | 0x66, MSG_exit_flush_all, "Ctl-F9",
  234.     KCTLX | KFIRST | 0x67, MSG_quit, "Ctl-F10",
  235.     KCTLX | KFIRST | 0x89, NULL, "Ctl-F11",
  236.     KCTLX | KFIRST | 0x8A, NULL, "Ctl-F12",
  237.     KCTLX | KFIRST | 0x68, NULL, "Alt-F1",
  238.     KCTLX | KFIRST | 0x69, NULL, "Alt-F2",
  239.     KCTLX | KFIRST | 0x6A, NULL, "Alt-F3",
  240.     KCTLX | KFIRST | 0x6B, NULL, "Alt-F4",
  241.     KCTLX | KFIRST | 0x6C, NULL, "Alt-F5",
  242.     KCTLX | KFIRST | 0x6D, NULL, "Alt-F6",
  243.     KCTLX | KFIRST | 0x6E, NULL, "Alt-F7",
  244.     KCTLX | KFIRST | 0x6F, NULL, "Alt-F8",
  245.     KCTLX | KFIRST | 0x70, NULL, "Alt-F9",
  246.     KCTLX | KFIRST | 0x71, NULL, "Alt-F10",
  247.     KCTLX | KFIRST | 0x8B, NULL, "Alt-F11",
  248.     KCTLX | KFIRST | 0x8C, NULL, "Alt-F12",
  249.     KCTLX | KFIRST | 0x48, MSG_back_line, "North",
  250.     KCTLX | KFIRST | 0x4D, MSG_forw_char, "East",
  251.     KCTLX | KFIRST | 0x50, MSG_forw_line, "South",
  252.     KCTLX | KFIRST | 0x4B, MSG_back_char, "West",
  253.     KCTLX | KFIRST | 0x8D, MSG_back_line, "Ctl-North",
  254.     KCTLX | KFIRST | 0x74, MSG_forw_unit, "Ctl-East",
  255.     KCTLX | KFIRST | 0x91, MSG_forw_line, "Ctl-South",
  256.     KCTLX | KFIRST | 0x73, MSG_back_unit, "Ctl-West",
  257.     KCTLX | KFIRST | 0x98, NULL, "Alt-North",
  258.     KCTLX | KFIRST | 0x9D, NULL, "Alt-East",
  259.     KCTLX | KFIRST | 0xA0, NULL, "Alt-South",
  260.     KCTLX | KFIRST | 0x9B, NULL, "Alt-West",
  261.     KCTLX | KFIRST | 0x49, MSG_back_page, "PageDown",
  262.     KCTLX | KFIRST | 0x51, MSG_forw_page, "PageUp",
  263.     KCTLX | KFIRST | 0x47, MSG_goto_bob, "Home",
  264.     KCTLX | KFIRST | 0x4F, MSG_goto_eob, "End",
  265.     KCTLX | KFIRST | 0x4C, NULL, "Center",
  266.     KCTLX | KFIRST | 0x76, MSG_forw_window, "Ctl-PageDown",
  267.     KCTLX | KFIRST | 0x84, MSG_back_window, "Ctl-PageUp",
  268.     KCTLX | KFIRST | 0x77, MSG_goto_bob, "Ctl-Home",
  269.     KCTLX | KFIRST | 0x75, MSG_goto_eob, "Ctl-End",
  270.     KCTLX | KFIRST | 0x8F, NULL, "Ctl-Center",
  271.     KCTLX | KFIRST | 0xA1, NULL, "Alt-PageDown",
  272.     KCTLX | KFIRST | 0x99, NULL, "Alt-PageUp",
  273.     KCTLX | KFIRST | 0x97, NULL, "Alt-Home",
  274.     KCTLX | KFIRST | 0x9F, NULL, "Alt-End",
  275.     KCTLX | KFIRST | 0x52, MSG_ins_toggle, "Insert",
  276.     KCTLX | KFIRST | 0x53, MSG_forw_del_char, "Delete",
  277.     KCTLX | KFIRST | 0x92, NULL, "Ctl-Insert",
  278.     KCTLX | KFIRST | 0x93, NULL, "Ctl-Delete",
  279.     KCTLX | KFIRST | 0xA2, NULL, "Alt-Insert",
  280.     KCTLX | KFIRST | 0xA3, NULL, "Alt-Delete",
  281.     KCTLX | KFIRST | 0x72, MSG_print, "Ctl-Print",
  282.     KCTLX | KFIRST | 0x0F, NULL, "Sh-Tab",
  283.     KCTLX | KFIRST | 0x94, NULL, "Ctl-Tab",
  284.     KCTLX | KFIRST | 0xA5, NULL, "Alt-Tab",
  285.     KCTLX | KFIRST | 0x95, NULL, "Ctrl-Num/",
  286.     KCTLX | KFIRST | 0x96, NULL, "Ctrl-Num*",
  287.     KCTLX | KFIRST | 0x8E, NULL, "Ctrl-Num-",
  288.     KCTLX | KFIRST | 0x90, NULL, "Ctrl-Num+",
  289.     KCTLX | KFIRST | 0xA4, NULL, "Alt-Num/",
  290.     KCTLX | KFIRST | 0x37, NULL, "Alt-Num*",
  291.     KCTLX | KFIRST | 0x4A, NULL, "Alt-Num-",
  292.     KCTLX | KFIRST | 0x4E, NULL, "Alt-Num+",
  293.     KCTLX | KFIRST | 0xA6, NULL, "Alt-NumEnter",
  294.     KCTLX | KFIRST | 0x01, NULL, "Alt-Esc",
  295.     KCTLX | KFIRST | 0x1C, NULL, "Alt-Enter",
  296.     KCTLX | KFIRST | 0x0E, NULL, "Alt-Backspace",
  297.     KCTLX | KFIRST | 0x1E, NULL, "Alt-A",
  298.     KCTLX | KFIRST | 0x30, NULL, "Alt-B",
  299.     KCTLX | KFIRST | 0x2E, NULL, "Alt-C",
  300.     KCTLX | KFIRST | 0x20, NULL, "Alt-D",
  301.     KCTLX | KFIRST | 0x12, NULL, "Alt-E",
  302.     KCTLX | KFIRST | 0x21, NULL, "Alt-F",
  303.     KCTLX | KFIRST | 0x22, NULL, "Alt-G",
  304.     KCTLX | KFIRST | 0x23, NULL, "Alt-H",
  305.     KCTLX | KFIRST | 0x17, NULL, "Alt-I",
  306.     KCTLX | KFIRST | 0x24, NULL, "Alt-J",
  307.     KCTLX | KFIRST | 0x25, NULL, "Alt-K",
  308.     KCTLX | KFIRST | 0x26, NULL, "Alt-L",
  309.     KCTLX | KFIRST | 0x32, NULL, "Alt-M",
  310.     KCTLX | KFIRST | 0x31, NULL, "Alt-N",
  311.     KCTLX | KFIRST | 0x18, NULL, "Alt-O",
  312.     KCTLX | KFIRST | 0x19, NULL, "Alt-P",
  313.     KCTLX | KFIRST | 0x10, NULL, "Alt-Q",
  314.     KCTLX | KFIRST | 0x13, NULL, "Alt-R",
  315.     KCTLX | KFIRST | 0x1F, NULL, "Alt-S",
  316.     KCTLX | KFIRST | 0x14, NULL, "Alt-T",
  317.     KCTLX | KFIRST | 0x16, NULL, "Alt-U",
  318.     KCTLX | KFIRST | 0x2F, NULL, "Alt-V",
  319.     KCTLX | KFIRST | 0x11, NULL, "Alt-W",
  320.     KCTLX | KFIRST | 0x2D, NULL, "Alt-X",
  321.     KCTLX | KFIRST | 0x15, NULL, "Alt-Y",
  322.     KCTLX | KFIRST | 0x2C, NULL, "Alt-Z",
  323.     KCTLX | KFIRST | 0x78, NULL, "Alt-1",
  324.     KCTLX | KFIRST | 0x79, NULL, "Alt-2",
  325.     KCTLX | KFIRST | 0x7A, NULL, "Alt-3",
  326.     KCTLX | KFIRST | 0x7B, NULL, "Alt-4",
  327.     KCTLX | KFIRST | 0x7C, NULL, "Alt-5",
  328.     KCTLX | KFIRST | 0x7D, NULL, "Alt-6",
  329.     KCTLX | KFIRST | 0x7E, NULL, "Alt-7",
  330.     KCTLX | KFIRST | 0x7F, NULL, "Alt-8",
  331.     KCTLX | KFIRST | 0x80, NULL, "Alt-9",
  332.     KCTLX | KFIRST | 0x81, NULL, "Alt-0",
  333.     0, NULL, NULL
  334. };
  335. #endif
  336. /*
  337.  * Read in a key, doing the low level mapping
  338.  * of ASCII code to 12 bit code.  This level deals with
  339.  * mapping the special keys into their spots in the C1
  340.  * control area.  The C0 controls go right through, and
  341.  * get remapped by "getkey".
  342.  */
  343. static int unkey = KRANDOM;    /* jam - for ungetkey */
  344. void
  345. ungetkey (k)
  346.     int k;
  347. {
  348.     unkey = k;
  349. }
  350.  
  351. int
  352. getkbd ()
  353. {
  354.     register int c;
  355.  
  356.     if (unkey == KRANDOM)    /* jam */
  357.     c = ttgetc ();
  358.     else
  359.     {
  360.     c = unkey;
  361.     unkey = KRANDOM;
  362.     }
  363.     if (c == SPECIAL)
  364.     {
  365.     c = ttgetc ();
  366.     if ((c == 0xCD) || (c == 0xDD))    /* Backtab is meta */
  367.         return (METACH);
  368.     return (c | KCTRL);
  369.     }
  370.     if (c == 0 || c == 0xE0)
  371.     {
  372.     c = ttgetc ();
  373.     return (c | KFIRST | KCTLX);
  374.     }
  375.     return (c);
  376. }
  377.  
  378. /*
  379.  * Terminal specific keymap initialization.
  380.  * Attach the special keys to the appropriate built
  381.  * in functions.
  382.  * As is the case of all the keymap routines, errors
  383.  * are very fatal.
  384.  */
  385. void
  386. ttykeymapinit ()
  387. {
  388. #ifdef MSDOS
  389.     KEY_NAME_ARRAY *ptr;
  390.     int i;
  391.     char buf[NCOL];
  392.     if (wang_pc)
  393.     ptr = wang_keys;
  394.  
  395.     if (ibm_pc)
  396.     ptr = ibm_keys;
  397.  
  398.     if (!wang_pc && !ibm_pc)
  399.     return;
  400.  
  401.     i = 0;
  402.     while (ptr->key_code != 0)
  403.     {
  404.     if (ptr->func_name_str != NULL)
  405.         keydup (ptr->key_code, ptr->func_name_str);
  406.     ptr++;
  407.     i++;
  408.     }
  409.     sprintf (buf, MSG_sp_key, i);
  410.     writ_echo (buf);
  411. #endif
  412. #ifdef OS2
  413.     KEY_NAME_ARRAY *ptr;
  414.     int i;
  415.     char buf[NCOL];
  416.     ptr = ibm_keys;
  417.     i = 0;
  418.     while (ptr->key_code != 0)
  419.     {
  420.     if (ptr->func_name_str != NULL)
  421.         keydup (ptr->key_code, ptr->func_name_str);
  422.     ptr++;
  423.     i++;
  424.     }
  425.     /* sprintf (buf, MSG_sp_key, i);
  426.     writ_echo (buf); */
  427. #endif
  428. }
  429.  
  430. /*
  431. *   Search key name array for given key code.
  432. *   return pointer to key name.
  433. */
  434. char *
  435. keystrings (key)
  436.     int key;
  437. {
  438. #ifdef MSDOS
  439.     KEY_NAME_ARRAY *ptr;
  440.  
  441.     if (wang_pc)
  442.     ptr = wang_keys;
  443.  
  444.     if (ibm_pc)
  445.     ptr = ibm_keys;
  446.  
  447.     if (!wang_pc && !ibm_pc)
  448.     return (NULL);
  449.  
  450.     while (ptr->key_code != 0)
  451.     {
  452.     if (key == ptr->key_code)
  453.     {
  454.         return (ptr->key_name_str);
  455.     }
  456.     ptr++;
  457.     }
  458. #endif
  459. #ifdef OS2
  460.     KEY_NAME_ARRAY *ptr = ibm_keys;
  461.  
  462.     while (ptr->key_code != 0)
  463.     {
  464.     if (key == ptr->key_code)
  465.     {
  466.         return (ptr->key_name_str);
  467.     }
  468.     ptr++;
  469.     }
  470. #endif
  471.     return (NULL);
  472. }
  473.