Don't fail if the file flags of source and copied symlinks don't match.
[dragonfly.git] / contrib / ncurses-5.4 / tack / init.c
blobee9d70139808f6152068384e1807fbf77502a30f
1 /*
2 ** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
3 **
4 ** This file is part of TACK.
5 **
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)
9 ** any later version.
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.
21 /* initialization and wrapup code */
23 #include <tack.h>
25 MODULE_ID("$Id: init.c,v 1.4 2003/09/20 19:40:57 tom Exp $")
27 #if NCURSES_VERSION_MAJOR >= 5 || NCURSES_VERSION_PATCH >= 981219
28 #define _nc_get_curterm(p) _nc_get_tty_mode(p)
29 #endif
31 FILE *debug_fp;
32 char temp[1024];
33 char tty_basename[64];
35 void
36 put_name(const char *cap, const char *name)
37 { /* send the cap name followed by the cap */
38 if (cap) {
39 ptext(name);
40 tc_putp(cap);
44 static void
45 report_cap(const char *tag, const char *s)
46 { /* expand the cap or print *** missing *** */
47 int i;
49 ptext(tag);
50 for (i = char_count; i < 13; i++) {
51 putchp(' ');
53 put_str(" = ");
54 if (s) {
55 putln(expand(s));
56 } else {
57 putln("*** missing ***");
62 void
63 reset_init(void)
64 { /* send the reset and init strings */
65 int i;
67 ptext("Terminal reset");
68 i = char_count;
69 put_name(reset_1string, " (rs1)");
70 put_name(reset_2string, " (rs2)");
71 /* run the reset file */
72 if (reset_file && reset_file[0]) {
73 FILE *fp;
74 int ch;
76 can_test("rf", FLAG_TESTED);
77 if ((fp = fopen(reset_file, "r"))) { /* send the reset file */
78 sprintf(temp, " (rf) %s", reset_file);
79 ptextln(temp);
80 while (1) {
81 ch = getc(fp);
82 if (ch == EOF)
83 break;
84 put_this(ch);
86 fclose(fp);
87 } else {
88 sprintf(temp, "\nCannot open reset file (rf) %s", reset_file);
89 ptextln(temp);
92 put_name(reset_3string, " (rs3)");
93 if (i != char_count) {
94 put_crlf();
96 ptext(" init");
97 put_name(init_1string, " (is1)");
98 put_name(init_2string, " (is2)");
99 if (set_tab && clear_all_tabs && init_tabs != 8) {
100 put_crlf();
101 tc_putp(clear_all_tabs);
102 for (char_count = 0; char_count < columns; char_count++) {
103 put_this(' ');
104 if ((char_count & 7) == 7) {
105 tc_putp(set_tab);
108 put_cr();
110 /* run the initialization file */
111 if (init_file && init_file[0]) {
112 FILE *fp;
113 int ch;
115 can_test("if", FLAG_TESTED);
116 if ((fp = fopen(init_file, "r"))) { /* send the init file */
117 sprintf(temp, " (if) %s", init_file);
118 ptextln(temp);
119 while (1) {
120 ch = getc(fp);
121 if (ch == EOF)
122 break;
123 put_this(ch);
125 fclose(fp);
126 } else {
127 sprintf(temp, "\nCannot open init file (if) %s", init_file);
128 ptextln(temp);
131 if (init_prog) {
132 can_test("iprog", FLAG_TESTED);
133 (void) system(init_prog);
135 put_name(init_3string, " (is3)");
137 fflush(stdout);
141 ** display_basic()
143 ** display the basic terminal definitions
145 void
146 display_basic(void)
148 put_str("Name: ");
149 putln(ttytype);
151 report_cap("\\r ^M (cr)", carriage_return);
152 report_cap("\\n ^J (ind)", scroll_forward);
153 report_cap("\\b ^H (cub1)", cursor_left);
154 report_cap("\\t ^I (ht)", tab);
155 /* report_cap("\\f ^L (ff)", form_feed); */
156 if (newline) {
157 /* OK if missing */
158 report_cap(" (nel)", newline);
160 report_cap(" (clear)", clear_screen);
161 if (!cursor_home && cursor_address) {
162 report_cap("(cup) (home)", tparm(cursor_address, 0, 0));
163 } else {
164 report_cap(" (home)", cursor_home);
166 #ifdef user9
167 report_cap("ENQ (u9)", user9);
168 #endif
169 #ifdef user8
170 report_cap("ACK (u8)", user8);
171 #endif
173 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);
174 putln(temp);
178 ** curses_setup(exec_name)
180 ** Startup ncurses
182 void
183 curses_setup(
184 char *exec_name)
186 int status;
187 static TERMTYPE term;
188 char tty_filename[2048];
190 tty_init();
193 See if the terminal is in the terminfo data base. This call has
194 two useful benefits, 1) it returns the filename of the terminfo entry,
195 and 2) it searches only terminfo's. This allows us to abort before
196 ncurses starts scanning the termcap file.
198 if ((status = _nc_read_entry(tty_basename, tty_filename, &term)) == 0) {
199 const TERMTYPE *fallback = _nc_fallback(tty_basename);
201 if (fallback) {
202 term = *fallback;
203 sprintf(tty_filename, "(fallback)%s", tty_basename);
204 status = 1;
205 } else {
206 fprintf(stderr, "Terminal not found: TERM=%s\n", tty_basename);
207 show_usage(exec_name);
208 exit(1);
211 if (status == -1) {
212 fprintf(stderr, "Terminfo database is inaccessible\n");
213 exit(1);
217 This call will load the terminfo data base and set the cur-term
218 variable. Only terminals that actually exist will get here so its
219 OK to ignore errors. This is a good thing since ncurses does not
220 permit (os) or (gn) to be set.
222 setupterm(tty_basename, 1, &status);
225 Get the current terminal definitions. This must be done before
226 getting the baudrate.
228 _nc_get_curterm(&cur_term->Nttyb);
229 tty_baud_rate = baudrate();
230 tty_cps = (tty_baud_rate << 1) / tty_frame_size;
232 /* set up the defaults */
233 replace_mode = TRUE;
234 scan_mode = 0;
235 char_count = 0;
236 select_delay_type = debug_level = 0;
237 char_mask = (meta_on && meta_on[0] == '\0') ? ALLOW_PARITY : STRIP_PARITY;
238 /* Don't change the XON/XOFF modes yet. */
239 select_xon_xoff = initial_stty_query(TTY_XON_XOFF) ? 1 : needs_xon_xoff;
241 fflush(stdout); /* flush any output */
242 tty_set();
244 go_home(); /* set can_go_home */
245 put_clear(); /* set can_clear_screen */
247 if (send_reset_init) {
248 reset_init();
252 I assume that the reset and init strings may not have the correct
253 pads. (Because that part of the test comes much later.) Because
254 of this, I allow the terminal some time to catch up.
256 fflush(stdout); /* waste some time */
257 sleep(1); /* waste more time */
258 charset_can_test();
259 can_test("lines cols cr nxon rf if iprog rmp smcup rmcup", FLAG_CAN_TEST);
260 edit_init(); /* initialize the edit data base */
262 if (send_reset_init && enter_ca_mode) {
263 tc_putp(enter_ca_mode);
264 put_clear(); /* just in case we switched pages */
266 put_crlf();
267 ptext("Using terminfo from: ");
268 ptextln(tty_filename);
269 put_crlf();
271 if (tty_can_sync == SYNC_NEEDED) {
272 verify_time();
275 display_basic();
279 ** bye_kids(exit-condition)
281 ** Shutdown the terminal, clear the signals, and exit
283 void
284 bye_kids(int n)
285 { /* reset the tty and exit */
286 ignoresig();
287 if (send_reset_init) {
288 if (exit_ca_mode) {
289 tc_putp(exit_ca_mode);
291 if (initial_stty_query(TTY_XON_XOFF)) {
292 if (enter_xon_mode) {
293 tc_putp(enter_xon_mode);
295 } else if (exit_xon_mode) {
296 tc_putp(exit_xon_mode);
299 if (debug_fp) {
300 fclose(debug_fp);
302 if (log_fp) {
303 fclose(log_fp);
305 tty_reset();
306 fclose(stdin);
307 fclose(stdout);
308 fclose(stderr);
309 if (not_a_tty)
310 sleep(1);
311 exit(n);