home *** CD-ROM | disk | FTP | other *** search
/ Shareware 1 2 the Maxx / sw_1.zip / sw_1 / OS2 / BEAV132X.ZIP / TTYKBD.C < prev    next >
C/C++ Source or Header  |  1992-01-06  |  19KB  |  469 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_ebcdic_mode[];
  64. extern    char    MSG_hex_mode[];
  65. extern    char    MSG_back_del_unit[];
  66. extern    char    MSG_octal_mode[];
  67. extern    char    MSG_display_version[];
  68. extern    char    MSG_unit_size1[];
  69. extern    char    MSG_unit_size2[];
  70. extern    char    MSG_unit_size4[];
  71. extern    char    MSG_reposition_window[];
  72. extern    char    MSG_set_mark[];
  73. extern    char    MSG_goto_eob[];
  74. extern    char    MSG_goto_bob[];
  75. extern    char    MSG_next_buff[];
  76. extern    char    MSG_prev_buff[];
  77. extern    char    MSG_query_replace[];
  78. extern    char    MSG_display_bindings[];
  79. extern    char    MSG_auto_save[];
  80. extern    char    MSG_back_unit[];
  81. extern    char    MSG_compare[];
  82. extern    char    MSG_forw_del_unit[];
  83. extern    char    MSG_forw_unit[];
  84. extern    char    MSG_link_windows[];
  85. extern    char    MSG_print[];
  86. extern    char    MSG_back_search[];
  87. extern    char    MSG_forw_search[];
  88. extern    char    MSG_back_page[];
  89. extern    char    MSG_copy_region[];
  90. extern    char    MSG_extended_command[];
  91. extern    char    MSG_up_window[];
  92. extern    char    MSG_search_again[];
  93. extern    char    MSG_bind_to_key[];
  94. extern    char    MSG_file_visit_split[];
  95. extern    char    MSG_yank_buffer[];
  96. extern    char    MSG_save_region[];
  97. extern    char    MSG_use_buffer_split[];
  98. extern    char    MSG_no_f_tb[];
  99.  
  100. #define SPECIAL 0x1F            /* Special keys         */
  101.  
  102. typedef    struct  key_name_array
  103. {
  104.     int     key_code;
  105.     char    *func_name_str;
  106.     char    *key_name_str;
  107. }   KEY_NAME_ARRAY;
  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 | 0x80, MSG_bind_to_key, "Indent",
  129.         /*  KCTRL | 0x81, NULL, "Page", */
  130.     KCTRL | 0x82, MSG_reposition_window, "Center",
  131.         /*  KCTRL | 0x83, NULL, "DecTab", */
  132.     /*  KCTRL | 0x84, NULL, "Format", */
  133.     /*  KCTRL | 0x85, NULL, "Merge", */
  134.     /*  KCTRL | 0x86, NULL, "Note", */
  135.     KCTRL | 0x87, MSG_set_mark, "Stop",
  136.         KCTRL | 0x88, MSG_forw_search, "Search",
  137.         KCTRL | 0x89, MSG_yank, "Replace",
  138.         KCTRL | 0x8A, MSG_copy_region, "Copy",
  139.         KCTRL | 0x8B, MSG_kill_region, "Move",
  140.         KCTRL | 0x8C, MSG_extended_command, "Command",
  141.         KCTRL | 0x8D, MSG_forw_window, "UpDown",
  142.         /*  KCTRL | 0x8E, NULL, "BlankKey", */
  143.     KCTRL | 0x8F, MSG_goto_line, "GoTo",
  144.         /*  KCTRL | 0x90, NULL, "Sh-Indent", */
  145.     /*  KCTRL | 0x91, NULL, "Sh-Page", */
  146.     /*  KCTRL | 0x92, NULL, "Sh-Center", */
  147.     /*  KCTRL | 0x93, NULL, "Sh-DecTab", */
  148.     /*  KCTRL | 0x94, NULL, "Sh-Format", */
  149.     /*  KCTRL | 0x95, NULL, "Sh-Merge", */
  150.     /*  KCTRL | 0x96, NULL, "Sh-Note", */
  151.     /*  KCTRL | 0x97, NULL, "Sh-Stop", */
  152.     KCTRL | 0x98, MSG_search_again, "Sh-Search",
  153.         KCTRL | 0x99, MSG_query_replace, "Sh-Replace",
  154.         /*  KCTRL | 0x9A, NULL, "Sh-Copy", */
  155.     /*  KCTRL | 0x9B, NULL, "Sh-Move", */
  156.     /*  KCTRL | 0x9C, NULL, "Sh-Command", */
  157.     KCTRL | 0x9D, MSG_split_window, "Sh-UpDown",
  158.         /*  KCTRL | 0x9E, NULL, "Sh-BlankKey", */
  159.     /*  KCTRL | 0x9F, NULL, "Sh-GoTo", */
  160.     KCTRL | 0xC0, MSG_back_line, "North",
  161.         KCTRL | 0xC1, MSG_forw_char, "East",
  162.         KCTRL | 0xC2, MSG_forw_line, "South",
  163.         KCTRL | 0xC3, MSG_back_char, "West",
  164.         KCTRL | 0xC4, MSG_byte_shift, "Home",
  165.         /*  KCTRL | 0xC5, NULL, "Execute", */
  166.     KCTRL | 0xC6, MSG_ins_toggle, "Insert",
  167.         KCTRL | 0xC7, MSG_forw_del_char, "Delete",
  168.         KCTRL | 0xC8, MSG_back_page, "PrevPage",
  169.         KCTRL | 0xC9, MSG_forw_page, "NextPage",
  170.         /*  KCTRL | 0xCB, NULL, "Erase", */
  171.     /*  KCTRL | 0xCD, NULL, "BackTab", */
  172.     /*  KCTRL | 0xD0, NULL, "Sh-North", */
  173.     KCTRL | 0xD1, MSG_forw_unit, "Sh-East",
  174.         /*  KCTRL | 0xD2, NULL, "Sh-South", */
  175.     KCTRL | 0xD3, MSG_back_unit, "Sh-West",
  176.         /*  KCTRL | 0xD4, NULL, "Sh-Home", */
  177.     KCTRL | 0xD5, MSG_execute_macro, "Sh-Execute",
  178.         /*  KCTRL | 0xD6, NULL, "Sh-Insert", */
  179.     KCTRL | 0xD7, MSG_forw_del_unit, "Sh-Delete",
  180.         KCTRL | 0xD8, MSG_goto_bob, "Sh-PrevPage",
  181.         KCTRL | 0xD9, MSG_goto_eob, "Sh-NextPage",
  182.         /*  KCTRL | 0xDB, NULL, "Sh-Erase", */
  183.     /*  KCTRL | 0xDC, NULL, "Sh-Tab", */
  184.     /*  KCTRL | 0xDD, NULL, "Sh-BackTab", */
  185.     KCTRL | 0xE0, MSG_abort, "Cancel",
  186.         KMETA | KCTRL | 0xE0, MSG_abort, "Cancel",
  187.         KCTLX | KCTRL | 0xE0, MSG_abort, "Ctl-X Cancel",
  188.         KCTRL | 0xE1, MSG_display_bindings, "Help",
  189.         /*  KCTRL | 0xE2, NULL, "Glossary", */
  190.     KCTRL | 0xE3, MSG_print, "Print",
  191.         KCTRL | 0xF1, MSG_help, "Sh-Help",
  192.         /*  KCTRL | 0xF2, NULL, "Sh-Glossary", */
  193.     /*  KCTRL | 0xF3, 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 | 0x800 | 0x3B, MSG_display_bindings, "F1",
  202.             KCTLX | 0x800 | 0x3C, MSG_set_mark,         "F2",
  203.             KCTLX | 0x800 | 0x3D, MSG_forw_search,      "F3",
  204.             KCTLX | 0x800 | 0x3E, MSG_search_again,     "F4",
  205.             KCTLX | 0x800 | 0x3F, MSG_query_replace,    "F5",
  206.             KCTLX | 0x800 | 0x40, MSG_yank,             "F6",
  207.             KCTLX | 0x800 | 0x41, MSG_copy_region,      "F7",
  208.             KCTLX | 0x800 | 0x42, MSG_kill_region,      "F8",
  209.             KCTLX | 0x800 | 0x43, MSG_goto_line,        "F9",
  210.             KCTLX | 0x800 | 0x44, NULL,                 "F10",
  211.             KCTLX | 0x800 | 0x85, NULL,                 "F11",
  212.             KCTLX | 0x800 | 0x86, NULL,                 "F12",
  213.             KCTLX | 0x800 | 0x54, MSG_help,             "Sh-F1",
  214.             KCTLX | 0x800 | 0x55, MSG_file_read,        "Sh-F2",
  215.             KCTLX | 0x800 | 0x56, MSG_file_save,        "Sh-F3",
  216.             KCTLX | 0x800 | 0x57, MSG_file_visit,       "Sh-F4",
  217.             KCTLX | 0x800 | 0x58, MSG_file_write,       "Sh-F5",
  218.             KCTLX | 0x800 | 0x59, MSG_flush_all,        "Sh-F6",
  219.             KCTLX | 0x800 | 0x5A, MSG_set_file_name,    "Sh-F7",
  220.             KCTLX | 0x800 | 0x5B, MSG_file_insert,      "Sh-F8",
  221.             KCTLX | 0x800 | 0x5C, MSG_exit_flush_all,   "Sh-F9",
  222.             KCTLX | 0x800 | 0x5D, MSG_quit,             "Sh-F10",
  223.             KCTLX | 0x800 | 0x87, NULL,                 "Sh-F11",
  224.             KCTLX | 0x800 | 0x88, NULL,                 "Sh-F12",
  225.             KCTLX | 0x800 | 0x5E, MSG_display_buffers,  "Ctl-F1",
  226.             KCTLX | 0x800 | 0x5F, MSG_use_buffer,       "Ctl-F2",
  227.             KCTLX | 0x800 | 0x60, MSG_kill_buffer,      "Ctl-F3",
  228.             KCTLX | 0x800 | 0x61, MSG_next_buff,        "Ctl-F4",
  229.             KCTLX | 0x800 | 0x62, MSG_prev_buff,        "Ctl-F5",
  230.             KCTLX | 0x800 | 0x63, MSG_yank_buffer,      "Ctl-F6",
  231.             KCTLX | 0x800 | 0x64, MSG_set_file_name,    "Ctl-F7",
  232.             KCTLX | 0x800 | 0x65, MSG_file_insert,      "Ctl-F8",
  233.             KCTLX | 0x800 | 0x66, MSG_exit_flush_all,   "Ctl-F9",
  234.             KCTLX | 0x800 | 0x67, MSG_quit,             "Ctl-F10",
  235.             KCTLX | 0x800 | 0x89, NULL,                 "Ctl-F11",
  236.             KCTLX | 0x800 | 0x8A, NULL,                 "Ctl-F12",
  237.             KCTLX | 0x800 | 0x68, NULL,                 "Alt-F1",
  238.             KCTLX | 0x800 | 0x69, NULL,                 "Alt-F2",
  239.             KCTLX | 0x800 | 0x6A, NULL,                 "Alt-F3",
  240.             KCTLX | 0x800 | 0x6B, NULL,                 "Alt-F4",
  241.             KCTLX | 0x800 | 0x6C, NULL,                 "Alt-F5",
  242.             KCTLX | 0x800 | 0x6D, NULL,                 "Alt-F6",
  243.             KCTLX | 0x800 | 0x6E, NULL,                 "Alt-F7",
  244.             KCTLX | 0x800 | 0x6F, NULL,                 "Alt-F8",
  245.             KCTLX | 0x800 | 0x70, NULL,                 "Alt-F9",
  246.             KCTLX | 0x800 | 0x71, NULL,                 "Alt-F10",
  247.             KCTLX | 0x800 | 0x8B, NULL,                 "Alt-F11",
  248.             KCTLX | 0x800 | 0x8C, NULL,                 "Alt-F12",
  249.             KCTLX | 0x800 | 0x48, MSG_back_line,        "North",
  250.             KCTLX | 0x800 | 0x4D, MSG_forw_char,        "East",
  251.             KCTLX | 0x800 | 0x50, MSG_forw_line,        "South",
  252.             KCTLX | 0x800 | 0x4B, MSG_back_char,        "West",
  253.             KCTLX | 0x800 | 0x8D, MSG_back_line,        "Ctl-North",
  254.             KCTLX | 0x800 | 0x74, MSG_forw_unit,        "Ctl-East",
  255.             KCTLX | 0x800 | 0x91, MSG_forw_line,        "Ctl-South",
  256.             KCTLX | 0x800 | 0x73, MSG_back_unit,        "Ctl-West",
  257.             KCTLX | 0x800 | 0x98, NULL,                 "Alt-North",
  258.             KCTLX | 0x800 | 0x9D, NULL,                 "Alt-East",
  259.             KCTLX | 0x800 | 0xA0, NULL,                 "Alt-South",
  260.             KCTLX | 0x800 | 0x9B, NULL,                 "Alt-West",
  261.             KCTLX | 0x800 | 0x49, MSG_back_page,        "PageDown",
  262.             KCTLX | 0x800 | 0x51, MSG_forw_page,        "PageUp",
  263.             KCTLX | 0x800 | 0x47, MSG_goto_bob,         "Home",
  264.             KCTLX | 0x800 | 0x4F, MSG_goto_eob,         "End",
  265.             KCTLX | 0x800 | 0x4C, NULL,                 "Center",
  266.             KCTLX | 0x800 | 0x76, MSG_forw_window,      "Ctl-PageDown",
  267.             KCTLX | 0x800 | 0x84, MSG_back_window,      "Ctl-PageUp",
  268.             KCTLX | 0x800 | 0x77, MSG_goto_bob,         "Ctl-Home",
  269.             KCTLX | 0x800 | 0x75, MSG_goto_eob,         "Ctl-End",
  270.             KCTLX | 0x800 | 0x8F, NULL,                 "Ctl-Center",
  271.             KCTLX | 0x800 | 0xA1, NULL,                 "Alt-PageDown",
  272.             KCTLX | 0x800 | 0x99, NULL,                 "Alt-PageUp",
  273.             KCTLX | 0x800 | 0x97, NULL,                 "Alt-Home",
  274.             KCTLX | 0x800 | 0x9F, NULL,                 "Alt-End",
  275.             KCTLX | 0x800 | 0x52, MSG_ins_toggle,       "Insert",
  276.             KCTLX | 0x800 | 0x53, MSG_forw_del_char,    "Delete",
  277.             KCTLX | 0x800 | 0x92, NULL,                 "Ctl-Insert",
  278.             KCTLX | 0x800 | 0x93, NULL,                 "Ctl-Delete",
  279.             KCTLX | 0x800 | 0xA2, NULL,                 "Alt-Insert",
  280.             KCTLX | 0x800 | 0xA3, NULL,                 "Alt-Delete",
  281.             KCTLX | 0x800 | 0x72, MSG_print,            "Ctl-Print",
  282.             KCTLX | 0x800 | 0x0F, NULL,                 "Sh-Tab",
  283.             KCTLX | 0x800 | 0x94, NULL,                 "Ctl-Tab",
  284.             KCTLX | 0x800 | 0xA5, NULL,                 "Alt-Tab",
  285.             KCTLX | 0x800 | 0x95, NULL,                 "Ctrl-Num/",
  286.             KCTLX | 0x800 | 0x96, NULL,                 "Ctrl-Num*",
  287.             KCTLX | 0x800 | 0x8E, NULL,                 "Ctrl-Num-",
  288.             KCTLX | 0x800 | 0x90, NULL,                 "Ctrl-Num+",
  289.             KCTLX | 0x800 | 0xA4, NULL,                 "Alt-Num/",
  290.             KCTLX | 0x800 | 0x37, NULL,                 "Alt-Num*",
  291.             KCTLX | 0x800 | 0x4A, NULL,                 "Alt-Num-",
  292.             KCTLX | 0x800 | 0x4E, NULL,                 "Alt-Num+",
  293.             KCTLX | 0x800 | 0xA6, NULL,                 "Alt-NumEnter",
  294.             KCTLX | 0x800 | 0x01, NULL,                 "Alt-Esc",
  295.             KCTLX | 0x800 | 0x1C, NULL,                 "Alt-Enter",
  296.             KCTLX | 0x800 | 0x0E, NULL,                 "Alt-Backspace",
  297.             KCTLX | 0x800 | 0x1E, NULL,                 "Alt-A",
  298.             KCTLX | 0x800 | 0x30, NULL,                 "Alt-B",
  299.             KCTLX | 0x800 | 0x2E, NULL,                 "Alt-C",
  300.             KCTLX | 0x800 | 0x20, NULL,                 "Alt-D",
  301.             KCTLX | 0x800 | 0x12, NULL,                 "Alt-E",
  302.             KCTLX | 0x800 | 0x21, NULL,                 "Alt-F",
  303.             KCTLX | 0x800 | 0x22, NULL,                 "Alt-G",
  304.             KCTLX | 0x800 | 0x23, NULL,                 "Alt-H",
  305.             KCTLX | 0x800 | 0x17, NULL,                 "Alt-I",
  306.             KCTLX | 0x800 | 0x24, NULL,                 "Alt-J",
  307.             KCTLX | 0x800 | 0x25, NULL,                 "Alt-K",
  308.             KCTLX | 0x800 | 0x26, NULL,                 "Alt-L",
  309.             KCTLX | 0x800 | 0x32, NULL,                 "Alt-M",
  310.             KCTLX | 0x800 | 0x31, NULL,                 "Alt-N",
  311.             KCTLX | 0x800 | 0x18, NULL,                 "Alt-O",
  312.             KCTLX | 0x800 | 0x19, NULL,                 "Alt-P",
  313.             KCTLX | 0x800 | 0x10, NULL,                 "Alt-Q",
  314.             KCTLX | 0x800 | 0x13, NULL,                 "Alt-R",
  315.             KCTLX | 0x800 | 0x1F, NULL,                 "Alt-S",
  316.             KCTLX | 0x800 | 0x14, NULL,                 "Alt-T",
  317.             KCTLX | 0x800 | 0x16, NULL,                 "Alt-U",
  318.             KCTLX | 0x800 | 0x2F, NULL,                 "Alt-V",
  319.             KCTLX | 0x800 | 0x11, NULL,                 "Alt-W",
  320.             KCTLX | 0x800 | 0x2D, NULL,                 "Alt-X",
  321.             KCTLX | 0x800 | 0x15, NULL,                 "Alt-Y",
  322.             KCTLX | 0x800 | 0x2C, NULL,                 "Alt-Z",
  323.             KCTLX | 0x800 | 0x78, NULL,                 "Alt-1",
  324.             KCTLX | 0x800 | 0x79, NULL,                 "Alt-2",
  325.             KCTLX | 0x800 | 0x7A, NULL,                 "Alt-3",
  326.             KCTLX | 0x800 | 0x7B, NULL,                 "Alt-4",
  327.             KCTLX | 0x800 | 0x7C, NULL,                 "Alt-5",
  328.             KCTLX | 0x800 | 0x7D, NULL,                 "Alt-6",
  329.             KCTLX | 0x800 | 0x7E, NULL,                 "Alt-7",
  330.             KCTLX | 0x800 | 0x7F, NULL,                 "Alt-8",
  331.             KCTLX | 0x800 | 0x80, NULL,                 "Alt-9",
  332.             KCTLX | 0x800 | 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 11 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 ungetkey (k)
  345. int k;
  346. {
  347.     unkey = k;
  348. }
  349.  
  350. int     getkbd ()
  351. {
  352.     register int    c;
  353.  
  354.     if (unkey == KRANDOM)       /* jam */
  355.         c = ttgetc ();
  356.     else
  357.     {
  358.         c = unkey;
  359.         unkey = KRANDOM;
  360.     }
  361.     if (c == SPECIAL)
  362.     {
  363.         c = ttgetc ();
  364.         if ((c == 0xCD) || (c == 0xDD))/* Backtab is meta */
  365.             return (METACH);
  366.         return (c | KCTRL);
  367.     }
  368.     if (c == 0 || c == 0xE0)
  369.     {
  370.         c = ttgetc ();
  371.         return (c | 0x800 | KCTLX);
  372.     }
  373.     return (c);
  374. }
  375.  
  376.  
  377. /*
  378.  * Terminal specific keymap initialization.
  379.  * Attach the special keys to the appropriate built
  380.  * in functions.
  381.  * As is the case of all the keymap routines, errors
  382.  * are very fatal.
  383.  */
  384. void ttykeymapinit ()
  385. {
  386. #ifdef MSDOS
  387.     KEY_NAME_ARRAY  *ptr;
  388.     int     i;
  389.     char    buf[NCOL];
  390.     if (wang_pc)
  391.         ptr = wang_keys;
  392.  
  393.     if (ibm_pc)
  394.         ptr = ibm_keys;
  395.  
  396.     if (!wang_pc && !ibm_pc)
  397.         return;
  398.  
  399.     i = 0;
  400.     while (ptr -> key_code != 0)
  401.     {
  402.         if (ptr -> func_name_str != NULL)
  403.             keydup (ptr -> key_code, ptr -> func_name_str);
  404.         ptr++;
  405.         i++;
  406.     }
  407.     sprintf (buf, MSG_sp_key, i);
  408.     writ_echo (buf);
  409. #endif
  410. #ifdef OS2
  411.     KEY_NAME_ARRAY  *ptr;
  412.     int     i;
  413.     char    buf[NCOL];
  414.         ptr = ibm_keys;
  415.         i = 0;
  416.         while (ptr -> key_code != 0)
  417.         {
  418.             if (ptr -> func_name_str != NULL)
  419.                 keydup (ptr -> key_code, ptr -> func_name_str);
  420.             ptr++;
  421.             i++;
  422.         }
  423.      /* sprintf (buf, MSG_sp_key, i);
  424.         writ_echo (buf); */
  425. #endif
  426. }
  427. /*
  428. *   Search key name array for given key code.
  429. *   return pointer to key name.
  430. */
  431. char    *keystrings (key)
  432. int     key;
  433. {
  434. #ifdef MSDOS
  435.     KEY_NAME_ARRAY  *ptr;
  436.  
  437.     if (wang_pc)
  438.         ptr = wang_keys;
  439.  
  440.     if (ibm_pc)
  441.         ptr = ibm_keys;
  442.  
  443.     if (!wang_pc && !ibm_pc)
  444.         return(NULL);
  445.  
  446.     while (ptr -> key_code != 0)
  447.         {
  448.         if (key == ptr -> key_code)
  449.             {
  450.             return (ptr -> key_name_str);
  451.             }
  452.         ptr++;
  453.         }
  454. #endif
  455. #ifdef OS2
  456.     KEY_NAME_ARRAY  *ptr = ibm_keys;
  457.  
  458.     while (ptr -> key_code != 0)
  459.     {
  460.         if (key == ptr -> key_code)
  461.         {
  462.             return (ptr -> key_name_str);
  463.         }
  464.         ptr++;
  465.     }
  466. #endif
  467.     return (NULL);
  468. }
  469.