2 ** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
4 ** This file is part of TACK.
6 ** TACK is free software; you can redistribute it and/or modify
7 ** it under the terms of the GNU General Public License as published by
8 ** the Free Software Foundation; either version 2, or (at your option)
11 ** TACK is distributed in the hope that it will be useful,
12 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ** GNU General Public License for more details.
16 ** You should have received a copy of the GNU General Public License
17 ** along with TACK; see the file COPYING. If not, write to
18 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 ** Boston, MA 02111-1307, USA.
24 MODULE_ID("$Id: fun.c,v 1.3 2000/03/04 20:29:21 tom Exp $")
27 * Test the function keys on the terminal. The code for echo tests
31 static void funkey_keys(struct test_list
*, int *, int *);
32 static void funkey_meta(struct test_list
*, int *, int *);
33 static void funkey_label(struct test_list
*, int *, int *);
34 static void funkey_prog(struct test_list
*, int *, int *);
35 static void funkey_local(struct test_list
*, int *, int *);
37 struct test_list funkey_test_list
[] = {
38 {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu
},
39 {MENU_CLEAR
+ FLAG_FUNCTION_KEY
, 0, 0, 0, "f) show a list of function keys", show_report
, 0},
40 {MENU_NEXT
| MENU_CLEAR
, 0, "smkx) (rmkx", 0,
41 "k) test function keys", funkey_keys
, 0},
42 {MENU_NEXT
, 10, "km", "smm rmm", 0, funkey_meta
, 0},
43 {MENU_NEXT
, 8, "nlab) (smln) (pln) (rmln", "lw lh", 0, funkey_label
, 0},
44 {MENU_NEXT
, 2, "pfx", 0, 0, funkey_prog
, 0},
45 {MENU_NEXT
, 2, "pfloc", 0, 0, funkey_local
, 0},
46 {MENU_LAST
, 0, 0, 0, 0, 0, 0}
49 static void printer_on(struct test_list
*, int *, int *);
50 static void printer_mc0(struct test_list
*, int *, int *);
52 struct test_list printer_test_list
[] = {
53 {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu
},
54 {MENU_NEXT
| MENU_CLEAR
, 0, "mc4) (mc5) (mc5i", 0, 0, printer_on
, 0},
55 {MENU_NEXT
| MENU_CLEAR
, 0, "mc0", 0, 0, printer_mc0
, 0},
56 {MENU_LAST
, 0, 0, 0, 0, 0, 0}
59 #define MAX_STRINGS STRCOUNT
61 /* scan code externals */
62 extern int scan_max
; /* length of longest scan code */
63 extern char **scan_up
, **scan_down
, **scan_name
;
64 extern int *scan_tested
, *scan_length
;
66 /* local definitions */
67 static const char *fk_name
[MAX_STRINGS
];
68 static char *fkval
[MAX_STRINGS
];
69 static char *fk_label
[MAX_STRINGS
]; /* function key labels (if any) */
70 static int fk_tested
[MAX_STRINGS
];
71 static int fkmax
= 1; /* length of longest key */
72 static int got_labels
= 0; /* true if we have some labels */
73 static int key_count
= 0;
76 /* unknown function keys */
78 static char *fk_unknown
[MAX_FK_UNK
];
79 static int fk_length
[MAX_FK_UNK
];
83 ** keys_tested(first-time, show-help, hex-output)
85 ** Display a list of the keys not tested.
100 putln("Function key labels:");
101 for (i
= 0; i
< key_count
; ++i
) {
103 sprintf(outbuf
, "%s %s",
104 fk_name
[i
] ? fk_name
[i
] : "??", fk_label
[i
]);
105 put_columns(outbuf
, strlen(outbuf
), 16);
111 putln("The following keys are not defined:");
112 for (i
= 0; i
< funk
; ++i
) {
113 put_columns(fk_unknown
[i
], fk_length
[i
], 16);
115 put_mode(exit_attribute_mode
);
119 putln("The following keys are defined:");
121 putln("The following keys have not been tested:");
124 for (i
= 0; scan_down
[i
]; i
++) {
125 if (!scan_tested
[i
]) {
127 strcpy(outbuf
, hex_expand_to(scan_down
[i
], 3));
129 strcpy(outbuf
, expand(scan_down
[i
]));
133 strcat(outbuf
, hex_expand_to(scan_up
[i
], 3));
135 strcat(outbuf
, expand(scan_up
[i
]));
138 l
= strlen(scan_name
[i
]);
139 if (((char_count
+ 16) & ~15) +
140 ((expand_chars
+ 7) & ~7) + l
>= columns
) {
143 if (char_count
+ 24 > columns
) {
145 } else if (char_count
) {
148 put_columns(outbuf
, expand_chars
, 16);
149 put_columns(scan_name
[i
], l
, 8);
153 for (i
= 0; i
< key_count
; i
++) {
156 strcpy(outbuf
, hex_expand_to(fkval
[i
], 3));
158 strcpy(outbuf
, expand(fkval
[i
]));
160 l
= strlen(fk_name
[i
]);
161 if (((char_count
+ 16) & ~15) +
162 ((expand_chars
+ 7) & ~7) + l
>= columns
) {
165 if (char_count
+ 24 > columns
) {
171 put_columns(outbuf
, expand_chars
, 16);
172 put_columns(fk_name
[i
], l
, 8);
178 ptextln("Hit any function key. Type 'end' to quit. Type ? to update the display.");
184 ** enter_key(name, value, label)
186 ** Enter a function key into the data base
198 fkmax
= fkmax
> j
? fkmax
: j
;
199 /* do not permit duplicates */
200 for (j
= 0; j
< key_count
; j
++) {
201 if (!strcmp(fk_name
[j
], name
)) {
205 fkval
[key_count
] = value
;
206 fk_tested
[key_count
] = 0;
207 fk_label
[key_count
] = lab
;
208 fk_name
[key_count
++] = name
;
218 { /* clear the line for a new function key line */
234 { /* return true if this is the end */
242 if (end_state
== 'e') {
250 if (end_state
== 'n') {
258 if (end_state
== 'l') {
268 return end_state
== 'd';
273 found_match(char *s
, int hx
, int cc
)
274 { /* return true if this string is a match */
282 for (j
= f
= 0; scan_down
[j
]; j
++) {
283 if (scan_length
[j
] == 0) {
286 if (!strncmp(s
, scan_down
[j
], scan_length
[j
])) {
287 if (!f
) { /* first match */
290 put_str(hex_expand_to(s
, 10));
292 put_str(expand_to(s
, 10));
296 (void) end_funky(scan_name
[j
][0]);
298 put_str(scan_name
[j
]);
301 if (strncmp(s
, scan_up
[j
], scan_length
[j
])) {
302 put_str(" scan down");
311 if (!strncmp(s
, scan_up
[j
], scan_length
[j
])) {
312 if (!f
) { /* first match */
315 put_str(hex_expand_to(s
, 10));
317 put_str(expand_to(s
, 10));
322 put_str(scan_name
[j
]);
332 for (j
= f
= 0; j
< key_count
; j
++) {
333 if (!strcmp(s
, fkval
[j
])) {
334 if (!f
) { /* first match */
337 put_str(hex_expand_to(s
, 10));
339 put_str(expand_to(s
, 10));
343 sprintf(outbuf
, " (%s)", fk_name
[j
]);
346 sprintf(outbuf
, " <%s>", fk_label
[j
]);
353 if (end_state
== '?') {
354 keys_tested(0, 1, hx
);
355 tty_raw(cc
, char_mask
);
363 found_exit(char *keybuf
, int hx
, int cc
)
364 { /* return true if the user wants to exit */
370 if (*keybuf
== '\0') {
374 /* break is a special case */
375 if (*keybuf
== '\0') {
378 ptext("Hit X to exit: ");
379 if (wait_here() == 'X') {
382 keys_tested(0, 1, hx
);
383 tty_raw(cc
, char_mask
);
386 /* is this the end? */
387 for (k
= 0; (j
= (keybuf
[k
] & STRIP_PARITY
)); k
++) {
393 j
= TRUE
; /* does he need an updated list? */
394 for (k
= 0; keybuf
[k
]; k
++) {
395 j
&= (keybuf
[k
] & STRIP_PARITY
) == '?';
397 if (j
|| end_state
== '?') {
398 keys_tested(0, 1, hx
);
399 tty_raw(cc
, char_mask
);
407 s
= hex_expand_to(keybuf
, 10);
409 s
= expand_to(keybuf
, 10);
411 sprintf(temp
, "%s Unknown", s
);
413 for (j
= 0; j
< MAX_FK_UNK
; j
++) {
415 fk_length
[funk
] = expand_chars
;
416 if ((fk_unknown
[funk
] = (char *)malloc(strlen(s
) + 1))) {
417 strcpy(fk_unknown
[funk
++], s
);
421 if (fk_length
[j
] == expand_chars
) {
422 if (!strcmp(fk_unknown
[j
], s
)) {
431 ** funkey_keys(test_list, status, ch)
433 ** Test function keys
444 tc_putp(keypad_xmit
);
446 keys_tested(1, 1, hex_out
); /* also clears screen */
452 tty_raw(0, char_mask
);
453 while (end_state
!= 'd') {
454 read_key(keybuf
, sizeof(keybuf
));
456 if (found_match(keybuf
, hex_out
, 0)) {
459 if (found_exit(keybuf
, hex_out
, 0)) {
464 tc_putp(keypad_local
);
466 keys_tested(0, 0, hex_out
);
467 ptext("Function key test ");
468 generic_done_message(t
, state
, ch
);
473 { /* print a warning before the meta key test */
477 if (initial_stty_query(TTY_8_BIT
)) {
480 ptext("The meta key test must be run with the");
481 ptext(" terminal set for 8 data bits. Two stop bits");
482 ptext(" may also be needed for correct display. I will");
483 ptext(" transmit 8 bit data but if the terminal is set for");
484 ptextln(" 7 bit data, garbage may appear on the screen.");
489 ** funkey_meta(test_list, status, ch)
491 ** Test meta key (km) (smm) (rmm)
504 if (char_mask
!= ALLOW_PARITY
) {
505 if (tty_meta_prep()) {
506 ptext("\nHit any key to continue > ");
511 ptext("Begin meta key test. (km) (smm) (rmm) Hit any key");
512 ptext(" with the meta key. The character will be");
513 ptext(" displayed in hex. If the meta key is working");
514 ptext(" then the most significant bit will be set. Type");
515 ptextln(" 'end' to exit.");
516 tty_raw(1, ALLOW_PARITY
);
519 for (i
= j
= k
= len
= 0; i
!= 'e' || j
!= 'n' || k
!= 'd';) {
522 k
= getchp(ALLOW_PARITY
);
526 if ((len
+= 3) >= columns
) {
530 sprintf(outbuf
, "%02X ", k
);
539 ptext("(km) Has-meta-key is not set. ");
541 generic_done_message(t
, state
, ch
);
545 ** funkey_label(test_list, status, ch)
547 ** Test labels (nlab) (smln) (pln) (rmln) (lw) (lh)
558 if (num_labels
== -1) {
559 ptextln("Your terminal has no labels. (nlab)");
561 sprintf(temp
, "Your terminal has %d labels (nlab) that are %d characters wide (lw) and %d lines high (lh)",
562 num_labels
, label_width
, label_height
);
564 ptextln(" Testing (smln) (pln) (rmln)");
568 if (label_width
<= 0) {
569 label_width
= sizeof(outbuf
) - 1;
571 for (i
= 1; i
<= num_labels
; i
++) {
572 sprintf(outbuf
, "L%d..............................", i
);
573 outbuf
[label_width
] = '\0';
574 tc_putp(tparm(plab_norm
, i
, outbuf
));
577 ptext("Hit any key to remove the labels: ");
582 generic_done_message(t
, state
, ch
);
586 ** funkey_prog(test_list, status, ch)
588 ** Test program function keys (pfx)
599 fk
= 1; /* use function key 1 for now */
601 /* test program function key */
603 "(pfx) Set function key %d to transmit abc\\n", fk
);
605 tc_putp(tparm(pkey_xmit
, fk
, "abc\n"));
606 sprintf(temp
, "Hit function key %d\n", fk
);
608 for (i
= 0; i
< 4; ++i
)
609 mm
[i
] = getchp(STRIP_PARITY
);
612 if (mm
[0] != 'a' || mm
[1] != 'b' || mm
[2] != 'c') {
613 sprintf(temp
, "Error string received was: %s", expand(mm
));
616 putln("Thank you\n");
620 tc_putp(tparm(pkey_xmit
, fk
, key_f1
));
623 ptextln("Function key transmit (pfx), not present.");
625 generic_done_message(t
, state
, ch
);
629 ** funkey_local(test_list, status, ch)
631 ** Test program local function keys (pfloc)
643 /* test local function key */
645 "(pfloc) Set function key %d to execute a clear and print \"Done!\"", fk
);
647 sprintf(temp
, "%sDone!", liberated(clear_screen
));
648 tc_putp(tparm(pkey_local
, fk
, temp
));
649 sprintf(temp
, "Hit function key %d. Then hit return.", fk
);
653 if (key_f1
&& pkey_xmit
) {
654 tc_putp(tparm(pkey_xmit
, fk
, key_f1
));
657 ptextln("Function key execute local (pfloc), not present.");
660 generic_done_message(t
, state
, ch
);
664 ** printer_on(test_list, status, ch)
666 ** Test printer on/off (mc4) (mc5) (mc5i)
674 if (!prtr_on
|| !prtr_off
) {
675 ptextln("Printer on/off missing. (mc5) (mc4)");
676 } else if (prtr_silent
) {
677 ptextln("Your printer is silent. (mc5i) is set.");
679 ptextln("This line should be on the printer but not your screen. (mc5)");
681 ptextln("This line should be only on the screen. (mc4)");
683 ptextln("Your printer is not silent. (mc5i) is reset.");
685 ptextln("This line should be on the printer and the screen. (mc5)");
687 ptextln("This line should only be on the screen. (mc4)");
689 generic_done_message(t
, state
, ch
);
693 ** printer_mc0(test_list, status, ch)
695 ** Test screen print (mc0)
704 ptext("I am going to send the contents of the screen to");
705 ptext(" the printer, then wait for a keystroke from you.");
706 ptext(" All of the text that appears on the screen");
707 ptextln(" should be printed. (mc0)");
708 tc_putp(print_screen
);
710 ptext("(mc0) Print-screen is not present. ");
712 generic_done_message(t
, state
, ch
);
718 { /* put up a pattern that will help count the
724 for (i
= 0; i
< 100; i
++) {
728 for (j
= i
/ 10; j
; j
--) {
731 put_this('0' + ((i
+ 1) % 10));
733 } else /* I assume it will scroll */ {
734 for (i
= 100; i
; i
--) {
735 sprintf(temp
, "\r\n%d", i
);
744 { /* put up a pattern that will help count the
749 for (i
= 0; i
< 20; i
++) {
750 for (j
= 1; j
< 10; j
++) {
760 ** Print the help text for the echo tests
765 ptextln("The following commands may also be entered:");
766 ptextln(" clear clear screen.");
767 ptextln(" columns print a test pattern to help count screen width.");
768 ptextln(" lines print a test pattern to help count screen length.");
769 ptextln(" end exit.");
770 ptextln(" echo redisplay last report.");
772 ptextln(" hex redisplay last report in hex.");
774 ptextln(" hex toggle hex display mode.");
776 ptextln(" help display this list.");
777 ptextln(" high toggle forced high bit (0x80).");
778 ptextln(" scan toggle scan mode.");
779 ptextln(" one echo one character after <cr> or <lf> as is. (report mode)");
780 ptextln(" two echo two characters after <cr> or <lf> as is.");
781 ptextln(" all echo all characters after <cr> or <lf> as is. (echo mode)");
785 ** tools_report(testlist, state, ch)
787 ** Run the echo tool and report tool
792 int *state GCC_UNUSED
,
795 int i
, j
, ch
, crp
, crx
, high_bit
, save_scan_mode
, hex_display
;
799 hex_display
= hex_out
;
801 if ((crx
= (t
->flags
& 255)) == 1) {
802 ptext("Characters after a CR or LF will be echoed as");
803 ptextln(" is. All other characters will be expanded.");
805 } else { /* echo test */
806 ptextln("Begin echo test.");
809 txt
[sizeof(txt
) - 1] = '\0';
810 save_scan_mode
= scan_mode
;
811 tty_raw(1, char_mask
);
812 for (i
= crp
= high_bit
= 0;;) {
813 ch
= getchp(char_mask
);
817 if (i
>= (int) sizeof(buf
) - 1) {
822 for (j
= 0; j
< (int) sizeof(txt
) - 1; j
++) {
825 txt
[sizeof(txt
) - 1] = ch
& STRIP_PARITY
;
826 if (crx
== 0) { /* echo test */
828 ptext(hex_expand_to(&buf
[i
- 1], 3));
830 tc_putch(ch
| high_bit
);
832 } else /* status report test */
833 if (ch
== '\n' || ch
== '\r') {
836 } else if (crp
++ < crx
) {
837 tc_putch(ch
| high_bit
);
839 put_str(expand(&buf
[i
- 1]));
841 if (!strncmp(&txt
[sizeof(txt
) - 7], "columns", 7)) {
846 if (!strncmp(&txt
[sizeof(txt
) - 5], "lines", 5)) {
851 if (!strncmp(&txt
[sizeof(txt
) - 5], "clear", 5)) {
856 if (!strncmp(&txt
[sizeof(txt
) - 4], "high", 4)) {
859 ptextln("\nParity bit set");
861 ptextln("\nParity bit reset");
864 if (!strncmp(&txt
[sizeof(txt
) - 4], "help", 4)) {
868 if (!strncmp(&txt
[sizeof(txt
) - 4], "echo", 4)) {
869 /* display the last status report */
870 /* clear bypass condition on Tek terminals */
875 put_str(expand(buf
));
877 if (save_scan_mode
&&
878 !strncmp(&txt
[sizeof(txt
) - 4], "scan", 4)) {
879 /* toggle scan mode */
880 scan_mode
= !scan_mode
;
882 if (!strncmp(&txt
[sizeof(txt
) - 3], "end", 3))
884 if (!strncmp(&txt
[sizeof(txt
) - 3], "hex", 3)) {
886 /* display the last status report in hex */
887 /* clear bypass condition on Tek terminals */
892 put_str(hex_expand_to(buf
, 3));
894 hex_display
= !hex_display
;
897 if (!strncmp(&txt
[sizeof(txt
) - 3], "two", 3))
899 if (!strncmp(&txt
[sizeof(txt
) - 3], "one", 3))
901 if (!strncmp(&txt
[sizeof(txt
) - 3], "all", 3))
904 scan_mode
= save_scan_mode
;
908 ptextln("End of status report test.");
910 ptextln("End of echo test.");