Newsgroups: comp.sources.misc From: dan%step.uucp@uunet.uu.net (Daniel Weaver) Subject: v25i027: ted - Terminfo/termcap test program, Part02/07 Message-ID: <1991Nov6.041550.4839@sparky.imd.sterling.com> X-Md4-Signature: dc1c4a30e7cf5b0a2e9e362610d95c16 Date: Wed, 6 Nov 1991 04:15:50 GMT Approved: kent@sparky.imd.sterling.com Submitted-by: dan%step.uucp@uunet.uu.net (Daniel Weaver) Posting-number: Volume 25, Issue 27 Archive-name: ted/part02 Environment: UNIX #! /bin/sh # This is a shell archive. Remove anything before this line, then feed it # into a shell via "sh file" or similar. To overwrite existing files, # type "sh file -c". # The tool that generated this appeared in the comp.sources.unix newsgroup; # send mail to comp-sources-unix@uunet.uu.net if you want that tool. # If this archive is complete, you will see the following message at the end: # "End of archive 2 (of 7)." # Contents: pad.c sysdep.c # Wrapped by dan@step on Fri Nov 1 11:28:24 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'pad.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'pad.c'\" else echo shar: Extracting \"'pad.c'\" \(40122 characters\) sed "s/^X//" >'pad.c' <<'END_OF_FILE' X/* X** This software is Copyright (c) 1991 by Daniel Weaver. X** X** Permission is hereby granted to copy, distribute or otherwise X** use any part of this package as long as you do not try to make X** money from it or pretend that you wrote it. This copyright X** notice must be maintained in any copy made. X** X** Use of this software constitutes acceptance for use in an AS IS X** condition. There are NO warranties with regard to this software. X** In no event shall the author be liable for any damages whatsoever X** arising out of or in connection with the use or performance of this X** software. Any use of this software is at the user's own risk. X** X** If you make modifications to this software that you feel X** increases it usefulness for the rest of the community, please X** email the changes, enhancements, bug fixes as well as any and X** all ideas to me. This software is going to be maintained and X** enhanced as deemed necessary by the community. X*/ X/* test the pad counts on the terminal */ X X#include "curses.h" X#include "ted.h" X X#define SELECT1(a) (!cap_select || strcmp(cap_select, a) == 0) X Xstatic char every_line[] = "This text should be on every line."; Xstatic char all_lines[] = "All lines should be the same. "; Xstatic char above_line[] = "The above line should be all X's. "; Xchar letters[] = "AbCdefghiJklmNopQrStuVwXyZ"; X Xstatic char *clr_test_name[CLEAR_TEST_MAX] = { X "full page", "sparse page", "short lines", "one full line", X "one short line"}; X Xstatic char **DF_scroll_forward, **DF_newline; Xstatic char **DF_cursor_left, **DF_tab; X X#ifdef ACCO XFILE *fpacco; X#endif X Xstatic void Xloop_test(cap, name, long_name) Xchar **cap, *name, *long_name; X { /* exercise one capability (a common case) */ X int i; X X if (begin_test(cap, name, long_name, NULL, FALSE)) X do { X go_home(); X do { X page_loop(); X for (i = 1; i < columns; i++) { X char_max -= pad_sent; ++ops; X putp(*cap); putchp(letter); X if (char_sent > char_max) break; X } X } while (char_sent < char_max); X home_down(); X } while(end_test(NULL, 0)); X } X X Xstatic void Xclear_pad(is_clear) Xint is_clear; X { /* run the clear screen tests (also clear-to-end-of-screen) */ X char *end_message; X int j, k; X X for (j = 0; j < CLEAR_TEST_MAX; j++) clr_test_value[j] = 32767; X clear_select = auto_right_margin ? 0 : 1; X skip_next = FALSE; X#ifdef SVR3 X if (enter_am_mode) X { X putp(enter_am_mode); X clear_select = 0; X } X#endif X augment = is_clear ? lines : lines - 1; X for ( ; clear_select < CLEAR_TEST_MAX; clear_select++) { X do { X if (augment > lines || is_clear || !cursor_address) X augment = lines; X else X { X if (augment <= 1) augment = 2; X if (augment < lines) X { X put_clear(); X ptext("This line should not be erased (ed)"); X } X } X short_subject(reps = augment); X switch (clear_select) { X case 0: X end_message = "All the dots should line up. "; X if (reps > rated_lines) reps = rated_lines; X break; X case 1: X end_message = "\r\n"; X if (cursor_down) break; X clear_select++; X case 2: X end_message = "\r\n"; X if (newline) break; X clear_select++; X case 3: X case 4: X end_message = "\r\n"; X break; X } X while(char_sent < char_max) { X if (is_clear) put_clear(); X else X { X if (augment == lines) go_home(); X else tputs(tcup(cursor_address, X lines - reps, 0), X lines - reps, putch); X tputs(clr_eos, reps, putch); X } X char_max -= pad_sent; ++ops; X switch (clear_select) { X case 0: /* full screen test */ X for (j = 1; j < reps; j++) { X for (k = 0; k < columns; k++) X if (k & 0xF) put_this(letter); X else put_this('.'); X } X break; X case 1: /* sparse screen test */ X for (j = columns - reps; j > 2; j--) X put_this(letter); X for (j = 2; j < reps; j++) { X putp(cursor_down); X put_this(letter); X } X break; X case 2: /* short lines */ X for (j = 2; j < reps; j++) { X put_this(letter); X putp(newline); X } X put_this(letter); X break; X case 3: /* one full line */ X for (j = columns - 5; j > 1; j--) X put_this(letter); X break; X case 4: /* one short line */ X put_str("Erase this!"); X break; X } X NEXT_LETTER; X } X } while(end_test(end_message, 1)); X if (clear_select < CLEAR_TEST_MAX && time_pad && enq_ack()) ; X if (skip_next | stop_testing) break; X } X k = 0; X for (j = 0; j < CLEAR_TEST_MAX; j++) { X if (clr_test_value[j] != 32767) X { X k++; X sprintf(temp, "(%s) %s", current_test, clr_test_name[j]); X ptext(temp); X put_dec(" %d.%d milliseconds", clr_test_value[j]); X sprintf(temp, " %d reps", clr_test_reps[j]); X ptext(temp); X put_crlf(); X } X } X if (k) (void) wait_here(); X} X X Xstatic void Xsetup_cap(n1, v1, nn, vn) Xchar *n1, **v1, *nn, **vn; X { /* select single or multiple caps for (ind) (ri) (il) (dl) */ X if (!*vn || (*v1 && augment == 1)) X { X ced_name[0] = n1; X ced_value[0] = v1; X reps = 0; X augment = 1; X } X else X { X if (augment >= lines) augment = lines - 1; X ced_name[0] = nn; X ced_value[0] = vn; X reps = augment; X } X capper = enter_cap(current_test = ced_name[0], *ced_value[0]); X milli_pad = cap_list[capper].cur_plain; X milli_reps = cap_list[capper].cur_star; X sprintf(done_test, "Done. (%s)", current_test); X short_subject(reps); X } X X Xstatic void Xrin_pad() X { /* test reverse scroll */ X int i; X X if (begin_test(&parm_rindex, "rin", "scroll reverse n lines", X NULL, FALSE)) augment = lines - 1; X else X if (begin_test(&scroll_reverse, "ri", "scroll reverse", X "rin", FALSE)) augment = 1; X else return; X X do { X setup_cap("ri", &scroll_reverse, "rin", &parm_rindex); X go_home(); X for (i = 1; char_sent < char_max; ++i) { X char_max -= pad_sent; ++ops; X sprintf(temp, "%d\r", i); X put_str(temp); X if (scroll_reverse && augment == 1) X putp(scroll_reverse); X else tputs(tparm(parm_rindex, reps), reps, putch); X } X put_str("This line should be on the bottom.\r"); X if (scroll_reverse && augment == 1) X for (i = 1; i < lines; i++) { X ++ops; X putp(scroll_reverse); X } X else tputs(tparm(parm_rindex, lines - 1), lines - 1, putch); X sprintf(temp, "\nScroll reverse %d line%s. ", augment, X augment == 1 ? "" : "s"); X } while(end_test(temp, 1)); X } X X Xstatic void Xil_pad() X { /* test insert line */ X int i; X X if (begin_test(&parm_insert_line, "il", "insert n lines", X NULL, TRUE)) augment = lines - 1; X else X if (begin_test(&insert_line, "il1", "insert line", "il", FALSE)) X augment = 1; X else return; X X do { X setup_cap("il1", &insert_line, "il", &parm_insert_line); X go_home(); X for (i = 1; char_sent < char_max; ++i) { X char_max -= pad_sent; ++ops; X sprintf(temp, "%d\r", i); X put_str(temp); X if (reps) X tputs(tparm(parm_insert_line, reps), reps, putch); X else putp(insert_line); X } X put_str("This line should be on the bottom.\r"); X if (reps) X tputs(tparm(parm_insert_line, lines - 1), lines - 1, putch); X else X for (i = 1; i < lines; i++) { X ++ops; X putp(insert_line); X } X sprintf(temp, "Insert %d line%s. ", augment, X augment == 1 ? "" : "s"); X } while(end_test(temp, 1)); X } X X Xstatic void Xindn_pad() X { /* test scroll forward */ X int i; X X if (begin_test(&parm_index, "indn", "scroll n lines", X NULL, FALSE)) augment = lines - 1; X else X if (begin_test(DF_scroll_forward, "ind", "scroll forward", X "indn", FALSE)) augment = 1; X else return; X X do { X setup_cap("ind", DF_scroll_forward, "indn", &parm_index); X /* go to the bottom of the screen */ X home_down(); X for (i = 1; char_sent < char_max; ++i) { X char_max -= pad_sent; ++ops; X sprintf(temp, "%d\r", i); X put_str(temp); X if (augment > 1) X tputs(tparm(parm_index, reps), reps, putch); X else X put_ind(); X } X put_str("This line should be on the top.\r"); X if (augment == 1) X for (i = 1; i < lines; i++) { X ++ops; X put_ind(); X } X else tputs(tparm(parm_index, lines - 1), lines - 1, putch); X go_home(); X sprintf(temp, "\nScroll forward %d line%s. ", augment, X augment == 1 ? "" : "s"); X } while(end_test(temp, 1)); X } X X Xstatic void Xdl_pad() X { /* test delete lines */ X int i; X X if (begin_test(&parm_delete_line, "dl", "delete n lines", X NULL, TRUE)) augment = lines - 1; X else X if (begin_test(&delete_line, "dl1", "delete line", "dl", TRUE)) X augment = 1; X else return; X X do { X setup_cap("dl1", &delete_line, "dl", &parm_delete_line); X go_home(); X for (i = 0; char_sent < char_max; ++i) { X char_max -= pad_sent; ++ops; X sprintf(temp, "%d\r", i); X if ((i & 0x7f) == 0 && augment < lines - 1) X { X go_home(); X putln(temp); X } X put_str(temp); X if (reps) tputs(delete_line, reps, putch); X else putp(delete_line); X } X home_down(); X put_str("This line should be on the top."); X go_home(); X if (reps) X tputs(tparm(parm_delete_line, lines - 1), lines - 1, putch); X else X for (i = 1; i < lines; i++) { X ++ops; X putp(delete_line); X } X sprintf(temp, "\nDelete %d line%s. ", augment, X augment == 1 ? "" : "s"); X } while(end_test(temp, 1)); X } X X Xvoid Xtest_pad(cap) Xchar *cap; /* capability to be tested, NULL if test all */ X { X int i, j, k, l, csr_not_tested, hzcc; X int scroll_chars, scroll_ms_delay; X char *s; X X if (tty_can_sync == 1) verify_time(); X control_init(); X put_clear(); X X cap_tested = 0; cap_select = cap; X hzcc = columns * 8 / 10; /* horizontal character count */ X X /* set up default caps for translate mode */ X DF_tab = translate_mode ? &tab : &TM_tab; X DF_newline = (translate_mode && newline) ? &newline : &TM_newline; X DF_cursor_left = (translate_mode && cursor_left) X ? &cursor_left : &TM_cursor_left; X#ifdef SVR3 X DF_scroll_forward = ((translate_mode && scroll_forward) X || over_strike) ? &scroll_forward : &TM_scroll_forward; X#else X DF_scroll_forward = (translate_mode && scroll_forward) X ? &scroll_forward : &TM_scroll_forward; X#endif X X#ifdef ACCO X /* open the results file for multi_test() */ X fpacco = fopen("ted.acco", "w"); X#endif X X /* findout how much the scroll delay will effect the results */ X capper = enter_cap("ind", *DF_scroll_forward); X milli_pad = scroll_ms_delay = cap_list[capper].cur_plain; X short_subject(0); X scroll_chars = pad_sent; X X if (reset_1string) X loop_test(&reset_1string, "rs1", "reset string 1"); X if (reset_2string) X loop_test(&reset_2string, "rs2", "reset string 2"); X if (reset_3string) X loop_test(&reset_3string, "rs3", "reset string 3"); X X#ifdef SVR3 X /* the reset strings may dink with the XON/XOFF modes */ X if (select_xon_xoff == 0 && exit_xon_mode) putp(exit_xon_mode); X if (select_xon_xoff == 1 && enter_xon_mode) putp(enter_xon_mode); X#endif X if (init_1string) X loop_test(&init_1string, "is1", "init string 1"); X if (init_2string) X loop_test(&init_2string, "is2", "init string 2"); X if (init_3string) X loop_test(&init_3string, "is3", "init string 3"); X X#ifdef SVR3 X can_test("(rmxon)(smxon)"); X if (select_xon_xoff == 0 && exit_xon_mode) X if (SELECT1("rmxon")) X loop_test(&exit_xon_mode, "rmxon", "exit xon/xoff mode"); X else putp(exit_xon_mode); X if (select_xon_xoff == 1 && enter_xon_mode) putp(enter_xon_mode); X#endif X can_test("(smcup)(rmcup)"); X if (enter_ca_mode) putp(enter_ca_mode); X X if (!can_clear_screen && !stop_testing) X { X ptextln("(clear) clear screen not present"); X ptext("pad processing terminated..."); X (void) wait_here(); X return; X } X X if (can_go_home && auto_right_margin && X multi_test(NULL, FALSE, 1, 0, 0, 1, "home", &cursor_home)) X { X /* truly brain damaged terminals will fail this test X because they cannot accept data at full rate */ X capper = -2; X do { X while(char_sent < char_max) { X go_home(); X for (j = 1; j < rated_lines; j++) { X for (k = 0; k < columns; k++) X if (k & 0xF) put_this(letter); X else put_this('.'); X } X ops += (lines - 1) + columns; X NEXT_LETTER; X } X } while(end_test("All the dots should line up. ", 1)); X } X if (can_go_home && X multi_test(NULL, FALSE, 1, 0, 4, 2, X "home", &cursor_home, "nel", DF_newline)) X do { X while(char_sent < char_max) { X go_home(); X for (j = 1; j < rated_lines; j++) { X char_max -= pad_sent; ++ops; X for (k = 2; k < columns; k++) X if (k & 0xF) putchp(letter); X else putchp('.'); X put_crlf(); X } X NEXT_LETTER; X } X } while(end_test("All the dots should line up. ", 1)); X if (begin_test(&clear_screen, "clear", "clear screen", X NULL, FALSE)) clear_pad(TRUE); X if (begin_test(&clr_eos, "ed", "clear to end of screen", X NULL, FALSE)) clear_pad(FALSE); X augment = hzcc; X if (begin_test(&erase_chars, "ech", "erase characters", X NULL, FALSE)) X do { X go_home(); X if (augment > columns - 2) augment = columns - 2; X short_subject(reps = augment); X for (i = 2; i < lines; i++) { X char_max -= pad_sent; ++ops; X for (j = 0; j <= reps; j++) putchp(letter); X put_cr(); X tputs(tparm(erase_chars, reps), reps, putch); X put_crlf(); X if (test_count == 0 && char_sent > char_max) break; X } X for (i = 1; i <= reps; i++) putchp(' '); X putchp(letter); put_crlf(); X NEXT_LETTER; X } while(end_test(all_lines, 0)); X#ifdef SVR3 X augment = hzcc; X if (begin_test(&clr_bol, "el1", "clear to beginning of line", X NULL, TRUE) && X acco_pad("cub1", *DF_cursor_left) && X acco_pad("cub1", *DF_cursor_left) && X acco_pad("nel", *DF_newline)) X do { X go_home(); X if (augment > columns - 2) augment = columns - 2; X short_subject(reps = augment); X for (i = 2; i < lines; i++) { X char_max -= pad_sent; ++ops; X for (j = 0; j <= reps; j++) putchp(letter); X putp(*DF_cursor_left); X putp(*DF_cursor_left); X tputs(clr_bol, reps, putch); X put_crlf(); X if (test_count == 0 && char_sent > char_max) break; X } X for (i = 1; i <= reps; i++) putchp(' '); X putchp(letter); put_crlf(); X NEXT_LETTER; X } while(end_test(all_lines, 0)); X#endif X augment = hzcc / 10; X if (begin_test(&clr_eol, "el", "clear to end of line", X NULL, FALSE) && acco_pad("nel", *DF_newline)) X do { X go_home(); X if (augment > hzcc) augment = hzcc; X for (i = 2; i < lines; i++) { X char_max -= pad_sent; ++ops; X for (j = -1; j < augment; j++) putchp(letter); X put_cr(); X putchp(letter); X putp(clr_eol); X put_crlf(); X if (test_count == 0 && char_sent > char_max) break; X } X putchp(letter); put_crlf(); X NEXT_LETTER; X } while(end_test(all_lines, 0)); X if (multi_test("(smdc) or (rmdc) delete mode", FALSE, 0, 7, 6, 2, X "smdc", &enter_delete_mode, X "rmdc", &exit_delete_mode)) X do { X page_loop(); X for (i = 1; i < columns; i++) { X char_max -= pad_sent; ++ops; X putp(enter_delete_mode); X putp(exit_delete_mode); X putchp(letter); X } X if (char_sent > char_max) home_down(); X } while(end_test(NULL, 0)); X augment = hzcc; X if (multi_test("(dch) delete characters", TRUE, 4, 0, 14, 3, X "smdc", &enter_delete_mode, "dch", &parm_dch, X "rmdc", &exit_delete_mode) && X acco_pad(NULL, *DF_newline)) X { X do { X if (augment > hzcc) augment = hzcc; X short_subject(reps = augment); X go_home(); X for (i = 2; i < lines; i++) { X char_max -= pad_sent; ++ops; X for (j = 0; j <= reps; j++) putchp(letter); X put_cr(); X putp(enter_delete_mode); X tputs(tparm(parm_dch, reps), reps, putch); X putp(exit_delete_mode); X put_crlf(); X if (test_count == 0 && char_sent > char_max) break; X } X putchp(letter); X put_crlf(); X NEXT_LETTER; X } while(end_test(all_lines, 1)); X putp(exit_delete_mode); X } X else /* no need to test both */ X if (multi_test("(dch1) delete one character", TRUE, 0x1e, 0, 2, 4, X "dch1", &delete_character, "dch", &parm_dch, X "smdc", &enter_delete_mode, "rmdc", &exit_delete_mode)) X do { X if (augment > hzcc) augment = hzcc; X if (augment < 1) augment = 1; X go_home(); X for (i = 2; i < lines; i++) { X for (j = -1; j < augment; j++) putchp(letter); X put_cr(); X putp(enter_delete_mode); X for (j = 0; j < augment; j++) { X char_max -= pad_sent; ++ops; X putp(delete_character); X } X putp(exit_delete_mode); X put_crlf(); X if (test_count == 0 && char_sent > char_max) break; X } X putchp(letter); put_crlf(); X NEXT_LETTER; X } while(end_test(all_lines, 0)); X if (multi_test("(smir) or (rmir) insert mode", FALSE, 0, 7, 6, 2, X "smir", &enter_insert_mode, X "rmir", &exit_insert_mode)) X do { X page_loop(); X for (i = 1; i < columns; i++) { X char_max -= pad_sent; ++ops; X putp(enter_insert_mode); X putp(exit_insert_mode); X putchp(letter); X } X if (char_sent > char_max) home_down(); X } while(end_test(NULL, 0)); X augment = j = columns * 9 / 10; X if (multi_test("(ich) insert n characters", TRUE, 4, 0, 14, 3, X "smir", &enter_insert_mode, X "ich", &parm_ich, X "rmir", &exit_insert_mode) && X acco_pad(NULL, *DF_newline) && X acco_pad(NULL, *DF_newline)) X { X do { X if (augment > j) augment = j; X short_subject(reps = augment); X go_home(); X for (i = 2; i < lines; i++) { X char_max -= pad_sent; ++ops; X putchp(letter); X put_cr(); X putp(enter_insert_mode); X replace_mode = 0; X tputs(tparm(parm_ich, reps), reps, putch); X putp(exit_insert_mode); replace_mode = 1; X put_crlf(); X if (test_count == 0 && char_sent > char_max) break; X } X for (i = 0; i < reps; i++) putchp(' '); X putchp(letter); NEXT_LETTER; X put_crlf(); X } while(end_test(all_lines, 1)); X putp(exit_insert_mode); X } X if (multi_test("(smir) (ich1) (rmir) insert character mode", X FALSE, 0xC, 0x13, 0xC, 4, X "smir", &enter_insert_mode, X "ich1", &insert_character, "ip", &insert_padding, X "rmir", &exit_insert_mode)) X { X if (!insert_padding && !insert_character) X { X (void) acco_pad(NULL, enter_insert_mode); X (void) acco_pad(NULL, exit_insert_mode); X } X l = columns * 9 / 10; X do { X put_clear(); X for (i = 2; i < lines; i++) { X putchp(letter); X put_cr(); X putp(enter_insert_mode); replace_mode = 0; X if (!insert_padding && !insert_character) X { /* only enter/exit is needed */ X char_max -= pad_sent; ++ops; X for (j = 0; j < l; j++) putchp('.'); X } X else X for (j = 0; j < l; j++) { X char_max -= pad_sent; ++ops; X putp(insert_character); X putchp('.'); putp(insert_padding); X } X putp(exit_insert_mode); replace_mode = 1; X put_crlf(); X if (test_count == 0 && char_sent > char_max) break; X } X for (j = 0; j < l; j++) putchp('.'); X putchp(letter); NEXT_LETTER; X put_crlf(); X } while(end_test(all_lines, 0)); X putp(exit_insert_mode); X } X if (!enter_insert_mode && !exit_insert_mode && X !enter_delete_mode && !exit_delete_mode && X multi_test("(ich1) or (dch1) insert/delete character", X FALSE, 0, 7, 6, 2, X "ich1", &insert_character, "dch1", &delete_character)) X do { X ptext("\rThis line should not be garbled. It should be left justified."); X put_cr(); char_sent = 0; X while(char_sent < char_max) { X char_max -= pad_sent; ++ops; X putp(insert_character); X putp(delete_character); X } X } while(end_test("\n", 0)); X augment = columns * 9 / 10; X if (begin_test(&repeat_char, "rep", "repeat character", X NULL, TRUE)) X do { X if (augment > columns - 2) augment = columns - 2; X if (augment < 2) augment = 2; X short_subject(reps = augment); X do { X go_home(); X for (i = 2; i < lines; i++) { X char_max -= pad_sent; ++ops; X tputs(tparm(repeat_char, letter, reps), reps, putch); X char_count = reps; X put_crlf(); X } X for (j = 0; j < reps; j++) putchp(letter); X put_crlf(); NEXT_LETTER; X } while(char_sent < char_max); X } while(end_test(all_lines, 0)); X if (begin_test(&cursor_address, "cup", "cursor address", X NULL, FALSE)) X do { /* the delay repeat factor is probably wrong */ X l = (columns - 4) >> 1; X for (i = 1; i + i + 2 < lines; i++) { X for (j = 0; j <= l; j++) { X char_max -= pad_sent; ops += 4; X s = tcup(cursor_address, i, j); X tputs(s, lines, putch); putchp(letter); X s = tcup(cursor_address, i, l + l + 1 - j); X tputs(s, l + l, putch); putchp(letter); X s = tcup(cursor_address, lines - i, j); X tputs(s, lines, putch); putchp(letter); X s = tcup(cursor_address, lines - i, l + l + 1 - j); X tputs(s, l + l, putch); putchp(letter); X } X if (char_sent > char_max) break; X } X NEXT_LETTER; X s = tcup(cursor_address, lines / 2, char_count = l - 6); X tputs(s, columns / 2, putch); X } while(end_test(NULL, 1)); X if (begin_test(&down_half_line, "hd", "down half line", X NULL, TRUE)) X do { X for (i = 1; i < columns; i += 2) { X for (j = 1; j < i; ++j) putchp(' '); X putp(down_half_line); X for (k = lines + lines; k > 4; k--) { X if (j++ >= columns) break; X char_max -= pad_sent; ++ops; X putp(down_half_line); X putchp(letter); X } X go_home(); X if (char_sent > char_max) break; X } X NEXT_LETTER; X } while(end_test(NULL, 1)); X if (begin_test(&up_half_line, "hu", "up half line", X NULL, TRUE)) X do { X for (i = 1; i < columns; i += 2) { X home_down(); X for (j = 1; j < i; ++j) putchp(' '); X putp(up_half_line); X for (k = lines + lines; k > 4; k--) { X if (j++ >= columns) break; X char_max -= pad_sent; ++ops; X putp(up_half_line); X putchp(letter); X } X if (char_sent > char_max) break; X } X go_home(); X NEXT_LETTER; X } while(end_test(NULL, 1)); X rin_pad(); X indn_pad(); X if (multi_test("(sc) or (rc) save/restore cursor", X FALSE, 0, 7, 6, 2, X "sc", &save_cursor, "rc", &restore_cursor)) X do { X page_loop(); X for (i = 1; i < columns; i++) { X char_max -= pad_sent; ++ops; X putp(save_cursor); putchp(letter); X putp(restore_cursor); putchp('X'); X } X if (char_sent > char_max) home_down(); X } while(end_test(above_line, 0)); X augment = (lines + 1) / 2; X if (change_scroll_region && X multi_test(NULL, FALSE, 1, 0, 2, 2, X "ind", DF_scroll_forward, "csr", &change_scroll_region)) X { X do { X if (augment < 2) augment = 2; X putp(tparm(change_scroll_region, lines - augment, X lines - 1)); X /* go to the bottom of the screen */ X home_down(); X for (i = 0; char_sent < char_max; ++i) { X char_max -= pad_sent; ++ops; X sprintf(temp, "%d\r", i); X put_str(temp); X put_ind(); X } X ptextln("(csr) is broken."); X ++ops; X for (i = augment; i > 1; i--) { X ++ops; X put_ind(); X } X } while(end_test(NULL, 0)); X putp(tparm(change_scroll_region, 0, lines - 1)); X put_clear(); X } X can_test("csr"); X csr_not_tested = 1; X if (save_cursor && restore_cursor && change_scroll_region && X multi_test(NULL, FALSE, 1, 0, 14, 3, X "sc", &save_cursor, X "csr", &change_scroll_region, X "rc", &restore_cursor)) X { X csr_not_tested = 0; X do { X page_loop(); X for (i = 1; i < columns; i++) { X char_max -= pad_sent; ++ops; X putp(save_cursor); putchp(letter); X putp(tparm(change_scroll_region, 0, lines - 1)); X putp(restore_cursor); putchp('X'); X } X if (char_sent > char_max) home_down(); X } while(end_test(above_line, 0)); X /* scroll delay times will corrupt the "time_pad" test */ X if (!time_pad || (scroll_ms_delay == 0 && enq_ack())) X do { X for (i = 0; i < lines; i++) { X char_max -= pad_sent; ++ops; X for (j = lines - i; j > 0; j--) { X put_crlf(); X char_max -= scroll_chars; X } X putp(save_cursor); X putp(tparm(change_scroll_region, i, lines - 1)); X putp(restore_cursor); X put_str(every_line); X } X putp(save_cursor); X putp(tparm(change_scroll_region, 0, lines - 1)); X putp(restore_cursor); X } while(end_test(" ", 0)); X } X if (cursor_address && change_scroll_region && X (scroll_ms_delay == 0 || !time_pad) && X multi_test(NULL, FALSE, 1, 0, 6, 2, X "cup", &cursor_address, "csr", &change_scroll_region)) X do { /* this test uses (cup) and (ind) */ X for (i = 0; i < lines; i++) { X char_max -= pad_sent; ++ops; X for (j = lines - i; j > 0; j--) { X put_crlf(); X char_max -= scroll_chars; X } X putp(tparm(change_scroll_region, i, lines - 1)); X s = tcup(cursor_address, lines - 1, 0); X tputs(s, lines, putch); X put_str(every_line); X } X putp(tparm(change_scroll_region, 0, lines - 1)); X s = tcup(cursor_address, lines - 1, strlen(every_line)); X tputs(s, lines, putch); X csr_not_tested = 0; X } while(end_test(" ", 0)); X if (SELECT1("csr") && !stop_testing) X if (csr_not_tested) X { X if (change_scroll_region) X ptextln("(sc) (rc) (cup) missing, (csr) change_scroll_region not tested"); X else ptextln("(csr) change_scroll_region not present"); X if (!time_pad) (void) wait_here(); X cap_tested = 1; X } X else /* reset the scroll region */ X { /* just in case we screwed it up */ X putp(tparm(change_scroll_region, 0, lines - 1)); X home_down(); X } X dl_pad(); X il_pad(); X if (multi_test("(il1) or (dl1) insert/delete line", X TRUE, 0, 7, 6, 2, X "il1", &insert_line, "dl1", &delete_line)) X do { X putln("\rThis text is written on the first line."); X putln("It is followed by this sentence."); X putln("(((("); X ptext("It has come to my attention that some people are"); X ptext(" running this diagnostic without actually reading"); X ptext(" the content of the messages printed on the"); X ptext(" screen. This lack of regard for the literary"); X ptext(" talent of the programmer will not be tolerated"); X ptext(" in the future. For all you know this message"); X ptext(" could change and you would never notice. But I"); X ptext(" did not in fact change the message therefore it"); X ptext(" is permissible to omit reading of this message."); X put_crlf(); X i = line_count - 1; X go_home(); X put_newlines(2); char_sent = 0; X while(char_sent < char_max) { X char_max -= pad_sent; ++ops; X putp(insert_line); X put_str("))))"); X put_cr(); X putp(delete_line); X } X put_newlines(i); X } while(end_test(NULL, 0)); X if (begin_test(DF_tab, "ht", "tab", NULL, TRUE)) X do { X /* it is not allways possible to test tabs with X caps that do not already have padding. X The following test uses a mixed bag of tests X in order to aviod this problem. X Note: I do not scroll */ X if (auto_right_margin && can_go_home) X for (i = 1, go_home(); i < lines; i++) { X for (j = 8; j < columns; j += 8) { X char_max -= pad_sent; ++ops; X put_str("\t"); X } X put_str("A "); X } X if (cursor_down && can_go_home) X for (i = 1, go_home(); i < lines; i++) { X for (j = 8; j < columns; j += 8) { X char_max -= pad_sent; ++ops; X put_str("\t"); X } X put_str("D\r"); X putp(cursor_down); X } X if (cursor_address) X for (i = 1; i < lines; i++) { X s = tcup(cursor_address, i - 1, 0); X tputs(s, lines, putch); X for (j = 8; j < columns; j += 8) { X char_max -= pad_sent; ++ops; X put_str("\t"); X } X put_str("C"); X } X go_home(); X for (i = 1; i < lines; i++) { X for (j = 8; j < columns; j += 8) { X char_max -= pad_sent; ++ops; X put_str("\t"); X } X putln("N"); X } X } while(end_test("A-(am) D-(cud1) C-(cup) N-(nel) ", 0)); X /* In terminals that emulate non-hidden attributes X with hidden attributes, the amount of time that it takes X to fill the screen with an attribute is nontrivial. X The following test is designed to catch those delays */ X if (multi_test("(smso) or (rmso) enter/exit standout mode", X FALSE, 0, 7, 6, 2, X "smso", &enter_standout_mode, "rmso", &exit_standout_mode)) X do { X page_loop(); X j = magic_cookie_glitch > 0 ? magic_cookie_glitch : 0; X for (i = 2 + j + j; i < columns; ) { X char_max -= pad_sent; ++ops; X put_mode(enter_standout_mode); i += j + j + 2; X putchp('X'); X put_mode(exit_standout_mode); X putchp('X'); X } X if (char_sent > char_max) home_down(); X } while(end_test(above_line, 0)); X if (multi_test("(smacs) or (rmacs) enter/exit alt charset mode", X FALSE, 0, 7, 6, 2, X "smacs", &enter_alt_charset_mode, X "rmacs", &exit_alt_charset_mode)) X do { X /* test enter even if exit is missing */ X page_loop(); X j = magic_cookie_glitch > 0 ? magic_cookie_glitch : 0; X for (i = 2 + j + j; i < columns; ) { X char_max -= pad_sent; ++ops; X put_mode(enter_alt_charset_mode); X i += j + j + 2; X putchp(letter); X put_mode(exit_alt_charset_mode); X putchp(letter); X } X if (char_sent > char_max) home_down(); X } while(end_test(NULL, 0)); X loop_test(&flash_screen, "flash", "flash screen"); X loop_test(&keypad_xmit, "smkx", "keypad transmit"); X loop_test(&keypad_local, "rmkx", "exit keypad transmit"); X loop_test(&meta_on, "smm", "turn on meta mode"); X loop_test(&meta_off, "rmm", "turn off meta mode"); X X pad_time(clear_screen, &i, &j); X if (!stop_testing && clear_screen && !xon_xoff && (i + j) != 0 X && SELECT1("clear")) X { X char *clr = liberated(clear_screen); X X ptext("If you would like to see if the terminal will really lock up."); X ptext(" I will send the clear screen sequence without the pads."); X ptext(" Type yes to trash your terminal: "); X milli_pad = milli_reps = char_sent = 0; X char_max = full_test; X (void) acco_pad(NULL, clear_screen); X if (getchp(STRIP_PARITY) == 'y') X do { X while(char_sent < char_max) { X char_max -= pad_sent; ++ops; X put_str("Erase this!"); X putp(clr); X } X ptextln("\nIf you can read this you probably have your terminal set for xon/xoff."); X } while(end_test(NULL, 0)); X } X#ifdef ACCO X /* close the results file for multi_test() */ X if (fpacco) fclose(fpacco); X#endif X } END_OF_FILE if test 40122 -ne `wc -c <'pad.c'`; then echo shar: \"'pad.c'\" unpacked with wrong size! fi # end of 'pad.c' fi if test -f 'sysdep.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sysdep.c'\" else echo shar: Extracting \"'sysdep.c'\" \(11601 characters\) sed "s/^X//" >'sysdep.c' <<'END_OF_FILE' X/* X** This software is Copyright (c) 1991 by Daniel Weaver. X** X** Permission is hereby granted to copy, distribute or otherwise X** use any part of this package as long as you do not try to make X** money from it or pretend that you wrote it. This copyright X** notice must be maintained in any copy made. X** X** Use of this software constitutes acceptance for use in an AS IS X** condition. There are NO warranties with regard to this software. X** In no event shall the author be liable for any damages whatsoever X** arising out of or in connection with the use or performance of this X** software. Any use of this software is at the user's own risk. X** X** If you make modifications to this software that you feel X** increases it usefulness for the rest of the community, please X** email the changes, enhancements, bug fixes as well as any and X** all ideas to me. This software is going to be maintained and X** enhanced as deemed necessary by the community. X*/ X/* X * Operating system dependant functions. Such as special tty handler X * modes. X */ X X#include X#if defined(vax) || defined(_AIX) X#include X#else X#include X#endif X#include X#include X#include "ted.h" X X/* The appropriate speeds for various termio settings. */ Xint speeds[] = X { X 0, /* B0, */ X 50, /* B50, */ X 75, /* B75, */ X 110, /* B110, */ X 134, /* B134, */ X 150, /* B150, */ X 200, /* B200, */ X 300, /* B300, */ X 600, /* B600, */ X 1200, /* B1200, */ X 1800, /* B1800, */ X 2400, /* B2400, */ X 4800, /* B4800, */ X 9600, /* B9600, */ X 19200, /* EXTA, */ X 38400, /* EXTB, */ X 0, X }; X X/* error report location for ioctl's */ Xextern int errno; X X#ifdef ICANON /* ATT UNIX */ X#define SLEEP(x) X#define TTY_IS_NOECHO !(new_modes.c_lflag & ECHO) X#define TTY_IS_OUT_TRANS (new_modes.c_oflag & OPOST) X#define TTY_IS_CHAR_MODE !(new_modes.c_lflag & ICANON) X Xstruct termio old_modes, new_modes; X Xtty_raw(minch, mask) Xint minch, mask; X { /* set tty to raw noecho */ X new_modes = old_modes; X#ifdef SELECT X new_modes.c_cc[VMIN]=1; X#else X new_modes.c_cc[VMIN]=minch; X#endif X new_modes.c_cc[VTIME]=2; X new_modes.c_lflag &= X ~(ISIG|ICANON|XCASE|ECHO|ECHOE|ECHOK|ECHONL); X#ifdef LOBLK X new_modes.c_lflag &= ~LOBLK; X#endif X new_modes.c_oflag &= ~(OPOST|OLCUC|TABDLY); X if (mask == ALLOW_PARITY) X { X new_modes.c_cflag &= ~(CSIZE|PARENB|HUPCL); X new_modes.c_cflag |= CS8; X } X new_modes.c_iflag &= X ~(IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL| X IUCLC|IXON|IXANY|IXOFF); X if (not_a_tty) return; X ioctl(fileno(stdin), TCSETAW, &new_modes); X } X X Xint Xtty_meta_prep() X { /* print a warning before the meta key test */ X if (not_a_tty) return 0; X if ((old_modes.c_cflag & CSIZE) == CS8) return 0; X ptext("The meta key test must be run with the"); X ptext(" terminal set for 8 data bits. Two stop bits"); X ptext(" may also be needed for correct display. I will"); X ptext(" transmit 8 bit data but if the terminal is set for"); X ptext(" 7 bit data, garbage may appear on the screen."); X return 1; X } X X Xtty_set() X { /* set tty to special modes */ X new_modes = old_modes; X new_modes.c_cc[VMIN]=1; X new_modes.c_cc[VTIME]=1; X new_modes.c_lflag &= ~(ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHONL); X new_modes.c_oflag &= ~(ONLCR|OCRNL|ONLRET|OFILL); X if (char_mask == ALLOW_PARITY) new_modes.c_iflag &= ~ISTRIP; X switch (select_xon_xoff) { X case 0: X new_modes.c_iflag &= ~(IXON|IXOFF); X break; X case 1: X#if sequent X /* the sequent System V emulation is broken */ X new_modes = old_modes; X new_modes.c_cc[VEOL] = 6; /* control F (ACK) */ X#endif X new_modes.c_iflag |= IXON | IXOFF; X break; X } X switch (select_delay_type) { X case 0: X new_modes.c_oflag &= X ~(NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY); X break; X case 1: X new_modes.c_oflag &= X ~(NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY); X new_modes.c_oflag |= NL1 | CR2; X break; X } X if (!(new_modes.c_oflag & ~OPOST)) new_modes.c_oflag &= ~OPOST; X if (not_a_tty) return; X ioctl(fileno(stdin), TCSETAW, &new_modes); X } X X Xtty_reset() X { /* reset the tty to the original modes */ X fflush(stdout); X if (not_a_tty) return; X ioctl(fileno(stdin), TCSETAW, &old_modes); X } X X Xtty_init() X { /* ATT terminal init */ X int flags; X X#ifdef F_GETFL X flags = fcntl(fileno(stdin), F_GETFL, 0); X nodelay_read = flags & O_NDELAY; X#else X nodelay_read = FALSE; X#endif X not_a_tty = FALSE; X if (ioctl(fileno(stdin), TCGETA, &old_modes) == -1) X { X if (errno == ENOTTY) X { X tty_frame_size = 20; X not_a_tty = TRUE; X return; X } X printf("ioctl error: %d\n", errno); X exit(1); X } X /* if TAB3 is set then setterm() wipes out tabs (ht) */ X new_modes = old_modes; X new_modes.c_oflag &= ~TABDLY; X if (ioctl(fileno(stdin), TCSETAW, &new_modes) == -1) X { X printf("ioctl error: %d\n", errno); X exit(1); X } X#ifdef sequent X /* the sequent ATT emulation is broken soooo. */ X old_modes.c_cflag &= ~(CSIZE | CSTOPB); X old_modes.c_cflag |= CS7 | PARENB; X#endif X catchsig(); X tty_baud_rate = speeds[old_modes.c_cflag & CBAUD]; X switch (old_modes.c_cflag & CSIZE) { X case CS5: tty_frame_size = 10; break; X case CS6: tty_frame_size = 12; break; X case CS7: tty_frame_size = 14; break; X case CS8: tty_frame_size = 16; break; X } X tty_frame_size += 2 + X ((old_modes.c_cflag & PARENB) ? 2 : 0) + X ((old_modes.c_cflag & CSTOPB) ? 4 : 2); X tty_abort = old_modes.c_cc[VINTR]; X } X X X#else /* berkeley */ X#define SLEEP(x) sleep(x) X#define TTY_IS_NOECHO !(new_modes.sg_flags & ECHO) X#define TTY_IS_OUT_TRANS ((new_modes.sg_flags & (CBREAK|RAW|CRMOD)) == CRMOD) X#define TTY_IS_CHAR_MODE ((new_modes.sg_flags & (CBREAK|RAW)) != 0) X Xstruct sgttyb old_modes, new_modes; X Xtty_raw(minch, mask) Xint minch, mask; X { /* set tty to raw noecho */ X fflush(stdout); X new_modes = old_modes; X new_modes.sg_flags |= RAW; X new_modes.sg_flags &= ~(ALLDELAY | ECHO | CRMOD | CBREAK); X if (not_a_tty) return; X ioctl(fileno(stdin), TIOCSETP, &new_modes); X } X Xint Xtty_meta_prep() X { /* print a warning before the meta key test */ X if (not_a_tty) return 0; X ptext("The meta key test must be run with the"); X ptext(" terminal set for 8 data bits. Two stop bits"); X ptext(" may also be needed for correct display."); X return 1; X } X Xextern short ospeed; X Xtty_set() X { /* set tty modes */ X fflush(stdout); X new_modes = old_modes; X new_modes.sg_flags &= ~(ECHO | CRMOD | CBREAK | RAW); X if (select_delay_type == 0 & select_xon_xoff == 0) X { X new_modes.sg_flags |= RAW; X } X else new_modes.sg_flags |= CBREAK; X switch (select_delay_type) { X case 0: X new_modes.sg_flags &= ~(ALLDELAY); X break; X case 1: X new_modes.sg_flags &= ~(ALLDELAY); X new_modes.sg_flags |= NL2 | CR1; X break; X } X#ifdef TANDEM X switch (select_xon_xoff) { X case 0: X new_modes.sg_flags &= ~TANDEM; X break; X case 1: X new_modes.sg_flags |= TANDEM; X break; X } X#endif X if (select_pads == 1) ospeed = -1; X if (not_a_tty) return; X ioctl(fileno(stdin), TIOCSETP, &new_modes); X } X X Xtty_reset() X { /* reset the tty to the original modes */ X fflush(stdout); X if (not_a_tty) return; X ioctl(fileno(stdin), TIOCSETP, &old_modes); X } X X Xtty_init() X { /* Berkeley Unix tty init */ X struct tchars tc; X X not_a_tty = nodelay_read = FALSE; X if (ioctl(fileno(stdin), TIOCGETC, &tc) == -1) X { X if (errno == ENOTTY) X { X not_a_tty = TRUE; X return; X } X printf("ioctl error: %d\n", errno); X exit(1); X } X tty_abort = tc.t_intrc; X if (ioctl(fileno(stdin), TIOCGETP, &old_modes) == -1) X { X printf("ioctl error: %d\n", errno); X exit(1); X } X catchsig(); X tty_baud_rate = speeds[old_modes.sg_ospeed]; X tty_frame_size = 22; /* 8 data bits, 2 stop bits, 1 start bit */ X tty_frame_size = 20; /* 8 data bits, 1 stop bit, 1 start bit */ X#ifdef vax X tty_frame_size = 21; /* 8 data bits, 1.5 stop bits, 1 start bit */ X#endif X if (ospeed < 0) ospeed = old_modes.sg_ospeed; X } X#endif X Xint Xstty_query(q) Xint q; X { /* return information about the terminal */ X switch (q) { X case TTY_NOECHO: X return TTY_IS_NOECHO; X case TTY_OUT_TRANS: X return TTY_IS_OUT_TRANS; X case TTY_CHAR_MODE: X return TTY_IS_CHAR_MODE; X } X } X X#ifdef SELECT Xint Xchar_ready() X{ X struct _timeval { X long tv_sec; X long tv_usec; X }; X int ifds, ofds, efds, n; X struct _timeval tv; X X ifds = 1 << fileno(stdin); X ofds = efds = 0; X tv.tv_sec = 0; X tv.tv_usec = 200000; X n = select(20, &ifds, &ofds, &efds, &tv); X return (n != 0); X} X#else X#ifdef FIONREAD Xint Xchar_ready() X { X int i, j; X X /* the following loop has to be tuned for each computer */ X for (j = 0; j < 1000; j++) { X ioctl(fileno(stdin), FIONREAD, &i); X if (i) return i; X } X return i; X } X#else X#define char_ready() 1 X#endif X#endif X X Xnite_nite() X { /* go to sleep */ X SLEEP(1); X } X X Xread_key(buf, max) Xchar *buf; Xint max; X { /* read one function key from the input stream */ X int got, ask; X char *s; X X *buf = '\0'; X s = buf; X fflush(stdout); X /* ATT unix may return 0 or 1, Berkeley Unix should be 1 */ X while (read(fileno(stdin), s, 1) == 0); X ++s; X --max; X while (max > 0 && (ask = char_ready())) { X if (ask > max) ask = max; X if (got = read(fileno(stdin), s, ask)) s += got; X else break; X max -= got; X } X *s = '\0'; X /* strip high order bits (if any) */ X for (s = buf; *s; *s++ &= char_mask); X } X X Xignoresig( ) X{ X /* ignore signals */ X signal(SIGINT, SIG_IGN); X signal(SIGHUP, SIG_IGN); X signal(SIGQUIT, SIG_IGN); X signal(SIGTERM, SIG_IGN); X} X X /* onintr( ) X * X * is the interrupt handling routine X * onintr turns off interrupts while doing clean-up X * X * onintr always exits fatally X */ X X Xonintr() X{ X ignoresig(); X tty_reset(); X exit(1); X} X X X /* catchsig( ) X * X * set up to field interrupts (via function onintr( )) X * so that if interrupted we can restore the correct terminal modes X * X * catchsig simply returns X */ X X Xcatchsig( ) X{ X /* EXTERNAL VARIABLE USED */ X extern onintr( ); X X if ((signal(SIGINT, SIG_IGN)) == SIG_DFL) X signal(SIGINT, onintr); X X if ((signal(SIGHUP, SIG_IGN)) == SIG_DFL) X signal(SIGHUP, onintr); X X if ((signal(SIGQUIT, SIG_IGN)) == SIG_DFL) X signal(SIGQUIT, onintr); X X if ((signal(SIGTERM, SIG_IGN)) == SIG_DFL) X signal(SIGTERM, onintr); X X} END_OF_FILE if test 11601 -ne `wc -c <'sysdep.c'`; then echo shar: \"'sysdep.c'\" unpacked with wrong size! fi # end of 'sysdep.c' fi echo shar: End of archive 2 \(of 7\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 6 7 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 7 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.