aboutsummaryrefslogtreecommitdiff
path: root/contrib/ncurses/tack/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ncurses/tack/init.c')
-rw-r--r--contrib/ncurses/tack/init.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/contrib/ncurses/tack/init.c b/contrib/ncurses/tack/init.c
new file mode 100644
index 000000000000..e19493d6b50a
--- /dev/null
+++ b/contrib/ncurses/tack/init.c
@@ -0,0 +1,300 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2, or (at your option)
+** any later version.
+**
+** TACK is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+/* initialization and wrapup code */
+
+#include <tack.h>
+
+MODULE_ID("$Id: init.c,v 1.1 1999/04/18 01:05:23 tom Exp $")
+
+#if NCURSES_VERSION_MAJOR >= 5 || NCURSES_VERSION_PATCH >= 981219
+#define _nc_get_curterm(p) _nc_get_tty_mode(p)
+#endif
+
+FILE *debug_fp;
+char temp[1024];
+char tty_basename[64];
+
+void
+put_name(const char *cap, const char *name)
+{ /* send the cap name followed by the cap */
+ if (cap) {
+ ptext(name);
+ tc_putp(cap);
+ }
+}
+
+static void
+report_cap(const char *tag, const char *s)
+{ /* expand the cap or print *** missing *** */
+ int i;
+
+ ptext(tag);
+ for (i = char_count; i < 13; i++) {
+ putchp(' ');
+ }
+ put_str(" = ");
+ if (s) {
+ putln(expand(s));
+ } else {
+ putln("*** missing ***");
+ }
+}
+
+
+void
+reset_init(void)
+{ /* send the reset and init strings */
+ int i;
+
+ ptext("Terminal reset");
+ i = char_count;
+ put_name(reset_1string, " (rs1)");
+ put_name(reset_2string, " (rs2)");
+ /* run the reset file */
+ if (reset_file && reset_file[0]) {
+ FILE *fp;
+ int ch;
+
+ can_test("rf", FLAG_TESTED);
+ if ((fp = fopen(reset_file, "r"))) { /* send the reset file */
+ sprintf(temp, " (rf) %s", reset_file);
+ ptextln(temp);
+ while (1) {
+ ch = getc(fp);
+ if (ch == EOF)
+ break;
+ put_this(ch);
+ }
+ fclose(fp);
+ } else {
+ sprintf(temp, "\nCannot open reset file (rf) %s", reset_file);
+ ptextln(temp);
+ }
+ }
+ put_name(reset_3string, " (rs3)");
+ if (i != char_count) {
+ put_crlf();
+ }
+ ptext(" init");
+ put_name(init_1string, " (is1)");
+ put_name(init_2string, " (is2)");
+ if (set_tab && clear_all_tabs && init_tabs != 8) {
+ put_crlf();
+ tc_putp(clear_all_tabs);
+ for (char_count = 0; char_count < columns; char_count++) {
+ put_this(' ');
+ if ((char_count & 7) == 7) {
+ tc_putp(set_tab);
+ }
+ }
+ put_cr();
+ }
+ /* run the initialization file */
+ if (init_file && init_file[0]) {
+ FILE *fp;
+ int ch;
+
+ can_test("if", FLAG_TESTED);
+ if ((fp = fopen(init_file, "r"))) { /* send the init file */
+ sprintf(temp, " (if) %s", init_file);
+ ptextln(temp);
+ while (1) {
+ ch = getc(fp);
+ if (ch == EOF)
+ break;
+ put_this(ch);
+ }
+ fclose(fp);
+ } else {
+ sprintf(temp, "\nCannot open init file (if) %s", init_file);
+ ptextln(temp);
+ }
+ }
+ if (init_prog) {
+ can_test("iprog", FLAG_TESTED);
+ (void) system(init_prog);
+ }
+ put_name(init_3string, " (is3)");
+
+ fflush(stdout);
+}
+
+/*
+** display_basic()
+**
+** display the basic terminal definitions
+*/
+void
+display_basic(void)
+{
+ put_str("Name: ");
+ putln(ttytype);
+
+ report_cap("\\r ^M (cr)", carriage_return);
+ report_cap("\\n ^J (ind)", scroll_forward);
+ report_cap("\\b ^H (cub1)", cursor_left);
+ report_cap("\\t ^I (ht)", tab);
+/* report_cap("\\f ^L (ff)", form_feed); */
+ if (newline) {
+ /* OK if missing */
+ report_cap(" (nel)", newline);
+ }
+ report_cap(" (clear)", clear_screen);
+ if (!cursor_home && cursor_address) {
+ report_cap("(cup) (home)", tparm(cursor_address, 0, 0));
+ } else {
+ report_cap(" (home)", cursor_home);
+ }
+ report_cap("ENQ (u9)", user9);
+ report_cap("ACK (u8)", user8);
+
+ sprintf(temp, "\nTerminal size: %d x %d. Baud rate: %ld. Frame size: %d.%d", columns, lines, tty_baud_rate, tty_frame_size >> 1, (tty_frame_size & 1) * 5);
+ putln(temp);
+}
+
+/*
+** curses_setup(exec_name)
+**
+** Startup ncurses
+*/
+void
+curses_setup(
+ char *exec_name)
+{
+ int status;
+ static TERMTYPE term;
+ char tty_filename[2048];
+
+ tty_init();
+
+ /**
+ See if the terminal is in the terminfo data base. This call has
+ two useful benefits, 1) it returns the filename of the terminfo entry,
+ and 2) it searches only terminfo's. This allows us to abort before
+ ncurses starts scanning the termcap file.
+ **/
+ if ((status = _nc_read_entry(tty_basename, tty_filename, &term)) == 0) {
+ fprintf(stderr, "Terminal not found: TERM=%s\n", tty_basename);
+ show_usage(exec_name);
+ exit(1);
+ }
+ if (status == -1) {
+ fprintf(stderr, "Terminfo database is inaccessible\n");
+ exit(1);
+ }
+
+ /**
+ This call will load the terminfo data base and set the cur-term
+ variable. Only terminals that actually exist will get here so its
+ OK to ignore errors. This is a good thing since ncurses does not
+ permit (os) or (gn) to be set.
+ **/
+ setupterm(tty_basename, 1, &status);
+
+ /**
+ Get the current terminal definitions. This must be done before
+ getting the baudrate.
+ **/
+ _nc_get_curterm(&cur_term->Nttyb);
+ tty_baud_rate = baudrate();
+ tty_cps = (tty_baud_rate << 1) / tty_frame_size;
+
+ /* set up the defaults */
+ replace_mode = TRUE;
+ scan_mode = 0;
+ char_count = 0;
+ select_delay_type = debug_level = 0;
+ char_mask = (meta_on && meta_on[0] == '\0') ? ALLOW_PARITY : STRIP_PARITY;
+ /* Don't change the XON/XOFF modes yet. */
+ select_xon_xoff = initial_stty_query(TTY_XON_XOFF) ? 1 : needs_xon_xoff;
+
+ fflush(stdout); /* flush any output */
+ tty_set();
+
+ go_home(); /* set can_go_home */
+ put_clear(); /* set can_clear_screen */
+
+ if (send_reset_init) {
+ reset_init();
+ }
+
+ /*
+ I assume that the reset and init strings may not have the correct
+ pads. (Because that part of the test comes much later.) Because
+ of this, I allow the terminal some time to catch up.
+ */
+ fflush(stdout); /* waste some time */
+ sleep(1); /* waste more time */
+ charset_can_test();
+ can_test("lines cols cr nxon rf if iprog rmp", FLAG_CAN_TEST);
+ edit_init(); /* initialize the edit data base */
+
+ if (send_reset_init && enter_ca_mode) {
+ tc_putp(enter_ca_mode);
+ put_clear(); /* just in case we switched pages */
+ }
+ put_crlf();
+ ptext("Using terminfo from: ");
+ ptextln(tty_filename);
+ put_crlf();
+
+ if (tty_can_sync == SYNC_NEEDED) {
+ verify_time();
+ }
+
+ display_basic();
+}
+
+/*
+** bye_kids(exit-condition)
+**
+** Shutdown the terminal, clear the signals, and exit
+*/
+void
+bye_kids(int n)
+{ /* reset the tty and exit */
+ ignoresig();
+ if (send_reset_init) {
+ if (exit_ca_mode) {
+ tc_putp(exit_ca_mode);
+ }
+ if (initial_stty_query(TTY_XON_XOFF)) {
+ if (enter_xon_mode) {
+ tc_putp(enter_xon_mode);
+ }
+ } else if (exit_xon_mode) {
+ tc_putp(exit_xon_mode);
+ }
+ }
+ if (debug_fp) {
+ fclose(debug_fp);
+ }
+ if (log_fp) {
+ fclose(log_fp);
+ }
+ tty_reset();
+ fclose(stdin);
+ fclose(stdout);
+ fclose(stderr);
+ if (not_a_tty)
+ sleep(1);
+ exit(n);
+}