OpenCoverage

terminal.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/lib/readline/terminal.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* terminal.c -- controlling the terminal with termcap. */-
2-
3/* Copyright (C) 1996-2017 Free Software Foundation, Inc.-
4-
5 This file is part of the GNU Readline Library (Readline), a library-
6 for reading lines of text with interactive input and history editing. -
7-
8 Readline is free software: you can redistribute it and/or modify-
9 it under the terms of the GNU General Public License as published by-
10 the Free Software Foundation, either version 3 of the License, or-
11 (at your option) any later version.-
12-
13 Readline is distributed in the hope that it will be useful,-
14 but WITHOUT ANY WARRANTY; without even the implied warranty of-
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
16 GNU General Public License for more details.-
17-
18 You should have received a copy of the GNU General Public License-
19 along with Readline. If not, see <http://www.gnu.org/licenses/>.-
20*/-
21-
22#define READLINE_LIBRARY-
23-
24#if defined (HAVE_CONFIG_H)-
25# include <config.h>-
26#endif-
27-
28#include <sys/types.h>-
29#include "posixstat.h"-
30#include <fcntl.h>-
31#if defined (HAVE_SYS_FILE_H)-
32# include <sys/file.h>-
33#endif /* HAVE_SYS_FILE_H */-
34-
35#if defined (HAVE_UNISTD_H)-
36# include <unistd.h>-
37#endif /* HAVE_UNISTD_H */-
38-
39#if defined (HAVE_STDLIB_H)-
40# include <stdlib.h>-
41#else-
42# include "ansi_stdlib.h"-
43#endif /* HAVE_STDLIB_H */-
44-
45#if defined (HAVE_LOCALE_H)-
46# include <locale.h>-
47#endif-
48-
49#include <stdio.h>-
50-
51/* System-specific feature definitions and include files. */-
52#include "rldefs.h"-
53-
54#ifdef __MSDOS__-
55# include <pc.h>-
56#endif-
57-
58#include "rltty.h"-
59#if defined (HAVE_SYS_IOCTL_H)-
60# include <sys/ioctl.h> /* include for declaration of ioctl */-
61#endif-
62#include "tcap.h"-
63-
64/* Some standard library routines. */-
65#include "readline.h"-
66#include "history.h"-
67-
68#include "rlprivate.h"-
69#include "rlshell.h"-
70#include "xmalloc.h"-
71-
72#if defined (__MINGW32__)-
73# include <windows.h>-
74# include <wincon.h>-
75-
76static void _win_get_screensize PARAMS((int *, int *));-
77#endif-
78-
79#if defined (__EMX__)-
80static void _emx_get_screensize PARAMS((int *, int *));-
81#endif-
82-
83/* If the calling application sets this to a non-zero value, readline will-
84 use the $LINES and $COLUMNS environment variables to set its idea of the-
85 window size before interrogating the kernel. */-
86int rl_prefer_env_winsize = 0;-
87-
88/* If this is non-zero, readline will set LINES and COLUMNS in the-
89 environment when it handles SIGWINCH. */-
90int rl_change_environment = 1;-
91-
92/* **************************************************************** */-
93/* */-
94/* Terminal and Termcap */-
95/* */-
96/* **************************************************************** */-
97-
98#ifndef __MSDOS__-
99static char *term_buffer = (char *)NULL;-
100static char *term_string_buffer = (char *)NULL;-
101#endif-
102-
103static int tcap_initialized;-
104-
105#if !defined (__linux__) && !defined (NCURSES_VERSION)-
106# if defined (__EMX__) || defined (NEED_EXTERN_PC)-
107extern -
108# endif /* __EMX__ || NEED_EXTERN_PC */-
109char PC, *BC, *UP;-
110#endif /* !__linux__ && !NCURSES_VERSION */-
111-
112/* Some strings to control terminal actions. These are output by tputs (). */-
113char *_rl_term_clreol;-
114char *_rl_term_clrpag;-
115char *_rl_term_clrscroll;-
116char *_rl_term_cr;-
117char *_rl_term_backspace;-
118char *_rl_term_goto;-
119char *_rl_term_pc;-
120-
121/* Non-zero if we determine that the terminal can do character insertion. */-
122int _rl_terminal_can_insert = 0;-
123-
124/* How to insert characters. */-
125char *_rl_term_im;-
126char *_rl_term_ei;-
127char *_rl_term_ic;-
128char *_rl_term_ip;-
129char *_rl_term_IC;-
130-
131/* How to delete characters. */-
132char *_rl_term_dc;-
133char *_rl_term_DC;-
134-
135/* How to move forward a char, non-destructively */-
136char *_rl_term_forward_char;-
137-
138/* How to go up a line. */-
139char *_rl_term_up;-
140-
141/* A visible bell; char if the terminal can be made to flash the screen. */-
142static char *_rl_visible_bell;-
143-
144/* Non-zero means the terminal can auto-wrap lines. */-
145int _rl_term_autowrap = -1;-
146-
147/* Non-zero means that this terminal has a meta key. */-
148static int term_has_meta;-
149-
150/* The sequences to write to turn on and off the meta key, if this-
151 terminal has one. */-
152static char *_rl_term_mm;-
153static char *_rl_term_mo;-
154-
155/* The key sequences output by the arrow keys, if this terminal has any. */-
156static char *_rl_term_ku;-
157static char *_rl_term_kd;-
158static char *_rl_term_kr;-
159static char *_rl_term_kl;-
160-
161/* How to initialize and reset the arrow keys, if this terminal has any. */-
162static char *_rl_term_ks;-
163static char *_rl_term_ke;-
164-
165/* The key sequences sent by the Home and End keys, if any. */-
166static char *_rl_term_kh;-
167static char *_rl_term_kH;-
168static char *_rl_term_at7; /* @7 */-
169-
170/* Delete key */-
171static char *_rl_term_kD;-
172-
173/* Insert key */-
174static char *_rl_term_kI;-
175-
176/* Cursor control */-
177static char *_rl_term_vs; /* very visible */-
178static char *_rl_term_ve; /* normal */-
179-
180static void bind_termcap_arrow_keys PARAMS((Keymap));-
181-
182/* Variables that hold the screen dimensions, used by the display code. */-
183int _rl_screenwidth, _rl_screenheight, _rl_screenchars;-
184-
185/* Non-zero means the user wants to enable the keypad. */-
186int _rl_enable_keypad;-
187-
188/* Non-zero means the user wants to enable a meta key. */-
189int _rl_enable_meta = 1;-
190-
191#if defined (__EMX__)-
192static void-
193_emx_get_screensize (int *swp, int *shp)-
194{-
195 int sz[2];-
196-
197 _scrsize (sz);-
198-
199 if (swp)-
200 *swp = sz[0];-
201 if (shp)-
202 *shp = sz[1];-
203}-
204#endif-
205-
206#if defined (__MINGW32__)-
207static void-
208_win_get_screensize (int *swp, int *shp)-
209{-
210 HANDLE hConOut;-
211 CONSOLE_SCREEN_BUFFER_INFO scr;-
212-
213 hConOut = GetStdHandle (STD_OUTPUT_HANDLE);-
214 if (hConOut != INVALID_HANDLE_VALUE)-
215 {-
216 if (GetConsoleScreenBufferInfo (hConOut, &scr))-
217 {-
218 *swp = scr.dwSize.X;-
219 *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1;-
220 }-
221 }-
222}-
223#endif-
224-
225/* Get readline's idea of the screen size. TTY is a file descriptor open-
226 to the terminal. If IGNORE_ENV is true, we do not pay attention to the-
227 values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being-
228 non-null serve to check whether or not we have initialized termcap. */-
229void-
230_rl_get_screen_size (int tty, int ignore_env)-
231{-
232 char *ss;-
233#if defined (TIOCGWINSZ)-
234 struct winsize window_size;-
235#endif /* TIOCGWINSZ */-
236 int wr, wc;-
237-
238 wr = wc = -1;-
239#if defined (TIOCGWINSZ)-
240 if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
ioctl (tty, 0x...dow_size) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
241 {-
242 wc = (int) window_size.ws_col;-
243 wr = (int) window_size.ws_row;-
244 }
never executed: end of block
0
245#endif /* TIOCGWINSZ */-
246-
247#if defined (__EMX__)-
248 _emx_get_screensize (&wc, &wr);-
249#elif defined (__MINGW32__)-
250 _win_get_screensize (&wc, &wr);-
251#endif-
252-
253 if (ignore_env || rl_prefer_env_winsize == 0)
ignore_envDescription
TRUEnever evaluated
FALSEnever evaluated
rl_prefer_env_winsize == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
254 {-
255 _rl_screenwidth = wc;-
256 _rl_screenheight = wr;-
257 }
never executed: end of block
0
258 else-
259 _rl_screenwidth = _rl_screenheight = -1;
never executed: _rl_screenwidth = _rl_screenheight = -1;
0
260-
261 /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV-
262 is unset. If we prefer the environment, check it first before-
263 assigning the value returned by the kernel. */-
264 if (_rl_screenwidth <= 0)
_rl_screenwidth <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
265 {-
266 if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS")))
ignore_env == 0Description
TRUEnever evaluated
FALSEnever evaluated
(ss = sh_get_e...e ("COLUMNS"))Description
TRUEnever evaluated
FALSEnever evaluated
0
267 _rl_screenwidth = atoi (ss);
never executed: _rl_screenwidth = atoi (ss);
0
268-
269 if (_rl_screenwidth <= 0)
_rl_screenwidth <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
270 _rl_screenwidth = wc;
never executed: _rl_screenwidth = wc;
0
271-
272#if defined (__DJGPP__)-
273 if (_rl_screenwidth <= 0)-
274 _rl_screenwidth = ScreenCols ();-
275#else-
276 if (_rl_screenwidth <= 0 && term_string_buffer)
_rl_screenwidth <= 0Description
TRUEnever evaluated
FALSEnever evaluated
term_string_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
277 _rl_screenwidth = tgetnum ("co");
never executed: _rl_screenwidth = tgetnum ("co");
0
278#endif-
279 }
never executed: end of block
0
280-
281 /* Environment variable LINES overrides setting of "li" if IGNORE_ENV-
282 is unset. */-
283 if (_rl_screenheight <= 0)
_rl_screenheight <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
284 {-
285 if (ignore_env == 0 && (ss = sh_get_env_value ("LINES")))
ignore_env == 0Description
TRUEnever evaluated
FALSEnever evaluated
(ss = sh_get_e...lue ("LINES"))Description
TRUEnever evaluated
FALSEnever evaluated
0
286 _rl_screenheight = atoi (ss);
never executed: _rl_screenheight = atoi (ss);
0
287-
288 if (_rl_screenheight <= 0)
_rl_screenheight <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
289 _rl_screenheight = wr;
never executed: _rl_screenheight = wr;
0
290-
291#if defined (__DJGPP__)-
292 if (_rl_screenheight <= 0)-
293 _rl_screenheight = ScreenRows ();-
294#else-
295 if (_rl_screenheight <= 0 && term_string_buffer)
_rl_screenheight <= 0Description
TRUEnever evaluated
FALSEnever evaluated
term_string_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
296 _rl_screenheight = tgetnum ("li");
never executed: _rl_screenheight = tgetnum ("li");
0
297#endif-
298 }
never executed: end of block
0
299-
300 /* If all else fails, default to 80x24 terminal. */-
301 if (_rl_screenwidth <= 1)
_rl_screenwidth <= 1Description
TRUEnever evaluated
FALSEnever evaluated
0
302 _rl_screenwidth = 80;
never executed: _rl_screenwidth = 80;
0
303-
304 if (_rl_screenheight <= 0)
_rl_screenheight <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
305 _rl_screenheight = 24;
never executed: _rl_screenheight = 24;
0
306-
307 /* If we're being compiled as part of bash, set the environment-
308 variables $LINES and $COLUMNS to new values. Otherwise, just-
309 do a pair of putenv () or setenv () calls. */-
310 if (rl_change_environment)
rl_change_environmentDescription
TRUEnever evaluated
FALSEnever evaluated
0
311 sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth);
never executed: sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth);
0
312-
313 if (_rl_term_autowrap == 0)
_rl_term_autowrap == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
314 _rl_screenwidth--;
never executed: _rl_screenwidth--;
0
315-
316 _rl_screenchars = _rl_screenwidth * _rl_screenheight;-
317}
never executed: end of block
0
318-
319void-
320_rl_set_screen_size (int rows, int cols)-
321{-
322 if (_rl_term_autowrap == -1)
_rl_term_autowrap == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
323 _rl_init_terminal_io (rl_terminal_name);
never executed: _rl_init_terminal_io (rl_terminal_name);
0
324-
325 if (rows > 0)
rows > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
326 _rl_screenheight = rows;
never executed: _rl_screenheight = rows;
0
327 if (cols > 0)
cols > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
328 {-
329 _rl_screenwidth = cols;-
330 if (_rl_term_autowrap == 0)
_rl_term_autowrap == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
331 _rl_screenwidth--;
never executed: _rl_screenwidth--;
0
332 }
never executed: end of block
0
333-
334 if (rows > 0 || cols > 0)
rows > 0Description
TRUEnever evaluated
FALSEnever evaluated
cols > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
335 _rl_screenchars = _rl_screenwidth * _rl_screenheight;
never executed: _rl_screenchars = _rl_screenwidth * _rl_screenheight;
0
336}
never executed: end of block
0
337-
338void-
339rl_set_screen_size (int rows, int cols)-
340{-
341 _rl_set_screen_size (rows, cols);-
342}
never executed: end of block
0
343-
344void-
345rl_get_screen_size (int *rows, int *cols)-
346{-
347 if (rows)
rowsDescription
TRUEnever evaluated
FALSEnever evaluated
0
348 *rows = _rl_screenheight;
never executed: *rows = _rl_screenheight;
0
349 if (cols)
colsDescription
TRUEnever evaluated
FALSEnever evaluated
0
350 *cols = _rl_screenwidth;
never executed: *cols = _rl_screenwidth;
0
351}
never executed: end of block
0
352-
353void-
354rl_reset_screen_size (void)-
355{-
356 _rl_get_screen_size (fileno (rl_instream), 0);-
357}
never executed: end of block
0
358-
359void-
360_rl_sigwinch_resize_terminal (void)-
361{-
362 _rl_get_screen_size (fileno (rl_instream), 1);-
363}
never executed: end of block
0
364 -
365void-
366rl_resize_terminal (void)-
367{-
368 _rl_get_screen_size (fileno (rl_instream), 1);-
369 if (_rl_echoing_p)
_rl_echoing_pDescription
TRUEnever evaluated
FALSEnever evaluated
0
370 {-
371 if (CUSTOM_REDISPLAY_FUNC ())
(rl_redisplay_... rl_redisplay)Description
TRUEnever evaluated
FALSEnever evaluated
0
372 rl_forced_update_display ();
never executed: rl_forced_update_display ();
0
373 else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0)
(rl_readline_s...1000000)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
374 _rl_redisplay_after_sigwinch ();
never executed: _rl_redisplay_after_sigwinch ();
0
375 }
never executed: end of block
0
376}
never executed: end of block
0
377-
378struct _tc_string {-
379 const char * const tc_var;-
380 char **tc_value;-
381};-
382-
383/* This should be kept sorted, just in case we decide to change the-
384 search algorithm to something smarter. */-
385static const struct _tc_string tc_strings[] =-
386{-
387 { "@7", &_rl_term_at7 },-
388 { "DC", &_rl_term_DC },-
389 { "E3", &_rl_term_clrscroll },-
390 { "IC", &_rl_term_IC },-
391 { "ce", &_rl_term_clreol },-
392 { "cl", &_rl_term_clrpag },-
393 { "cr", &_rl_term_cr },-
394 { "dc", &_rl_term_dc },-
395 { "ei", &_rl_term_ei },-
396 { "ic", &_rl_term_ic },-
397 { "im", &_rl_term_im },-
398 { "kD", &_rl_term_kD }, /* delete */-
399 { "kH", &_rl_term_kH }, /* home down ?? */-
400 { "kI", &_rl_term_kI }, /* insert */-
401 { "kd", &_rl_term_kd },-
402 { "ke", &_rl_term_ke }, /* end keypad mode */-
403 { "kh", &_rl_term_kh }, /* home */-
404 { "kl", &_rl_term_kl },-
405 { "kr", &_rl_term_kr },-
406 { "ks", &_rl_term_ks }, /* start keypad mode */-
407 { "ku", &_rl_term_ku },-
408 { "le", &_rl_term_backspace },-
409 { "mm", &_rl_term_mm },-
410 { "mo", &_rl_term_mo },-
411 { "nd", &_rl_term_forward_char },-
412 { "pc", &_rl_term_pc },-
413 { "up", &_rl_term_up },-
414 { "vb", &_rl_visible_bell },-
415 { "vs", &_rl_term_vs },-
416 { "ve", &_rl_term_ve },-
417};-
418-
419#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))-
420-
421/* Read the desired terminal capability strings into BP. The capabilities-
422 are described in the TC_STRINGS table. */-
423static void-
424get_term_capabilities (char **bp)-
425{-
426#if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */-
427 register int i;-
428-
429 for (i = 0; i < NUM_TC_STRINGS; i++)
i < (sizeof (t...t _tc_string))Description
TRUEnever evaluated
FALSEnever evaluated
0
430 *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp);
never executed: *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp);
0
431#endif-
432 tcap_initialized = 1;-
433}
never executed: end of block
0
434-
435int-
436_rl_init_terminal_io (const char *terminal_name)-
437{-
438 const char *term;-
439 char *buffer;-
440 int tty, tgetent_ret;-
441-
442 term = terminal_name ? terminal_name : sh_get_env_value ("TERM");
terminal_nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
443 _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = _rl_term_clrscroll = (char *)NULL;-
444 tty = rl_instream ? fileno (rl_instream) : 0;
rl_instreamDescription
TRUEnever evaluated
FALSEnever evaluated
0
445-
446 if (term == 0)
term == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
447 term = "dumb";
never executed: term = "dumb";
0
448-
449#ifdef __MSDOS__-
450 _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;-
451 _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;-
452 _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;-
453 _rl_term_mm = _rl_term_mo = (char *)NULL;-
454 _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0;-
455 _rl_term_cr = "\r";-
456 _rl_term_backspace = (char *)NULL;-
457 _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL;-
458 _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL;-
459 _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL;-
460#if defined(HACK_TERMCAP_MOTION)-
461 _rl_term_forward_char = (char *)NULL;-
462#endif-
463-
464 _rl_get_screen_size (tty, 0);-
465#else /* !__MSDOS__ */-
466 /* I've separated this out for later work on not calling tgetent at all-
467 if the calling application has supplied a custom redisplay function,-
468 (and possibly if the application has supplied a custom input function). */-
469 if (CUSTOM_REDISPLAY_FUNC())
(rl_redisplay_... rl_redisplay)Description
TRUEnever evaluated
FALSEnever evaluated
0
470 {-
471 tgetent_ret = -1;-
472 }
never executed: end of block
0
473 else-
474 {-
475 if (term_string_buffer == 0)
term_string_buffer == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
476 term_string_buffer = (char *)xmalloc(2032);
never executed: term_string_buffer = (char *)xmalloc(2032);
0
477-
478 if (term_buffer == 0)
term_buffer == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
479 term_buffer = (char *)xmalloc(4080);
never executed: term_buffer = (char *)xmalloc(4080);
0
480-
481 buffer = term_string_buffer;-
482-
483 tgetent_ret = tgetent (term_buffer, term);-
484 }
never executed: end of block
0
485-
486 if (tgetent_ret <= 0)
tgetent_ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
487 {-
488 FREE (term_string_buffer);
never executed: free (term_string_buffer);
term_string_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
489 FREE (term_buffer);
never executed: free (term_buffer);
term_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
490 buffer = term_buffer = term_string_buffer = (char *)NULL;-
491-
492 _rl_term_autowrap = 0; /* used by _rl_get_screen_size */-
493-
494 /* Allow calling application to set default height and width, using-
495 rl_set_screen_size */-
496 if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
_rl_screenwidth <= 0Description
TRUEnever evaluated
FALSEnever evaluated
_rl_screenheight <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
497 {-
498#if defined (__EMX__)-
499 _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);-
500 _rl_screenwidth--;-
501#else /* !__EMX__ */-
502 _rl_get_screen_size (tty, 0);-
503#endif /* !__EMX__ */-
504 }
never executed: end of block
0
505-
506 /* Defaults. */-
507 if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
_rl_screenwidth <= 0Description
TRUEnever evaluated
FALSEnever evaluated
_rl_screenheight <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
508 {-
509 _rl_screenwidth = 79;-
510 _rl_screenheight = 24;-
511 }
never executed: end of block
0
512-
513 /* Everything below here is used by the redisplay code (tputs). */-
514 _rl_screenchars = _rl_screenwidth * _rl_screenheight;-
515 _rl_term_cr = "\r";-
516 _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;-
517 _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;-
518 _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;-
519 _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL;-
520 _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL;-
521 _rl_term_mm = _rl_term_mo = (char *)NULL;-
522 _rl_term_ve = _rl_term_vs = (char *)NULL;-
523 _rl_term_forward_char = (char *)NULL;-
524 _rl_terminal_can_insert = term_has_meta = 0;-
525-
526 /* Reasonable defaults for tgoto(). Readline currently only uses-
527 tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we-
528 change that later... */-
529 PC = '\0';-
530 BC = _rl_term_backspace = "\b";-
531 UP = _rl_term_up;-
532-
533 return 0;
never executed: return 0;
0
534 }-
535-
536 get_term_capabilities (&buffer);-
537-
538 /* Set up the variables that the termcap library expects the application-
539 to provide. */-
540 PC = _rl_term_pc ? *_rl_term_pc : 0;
_rl_term_pcDescription
TRUEnever evaluated
FALSEnever evaluated
0
541 BC = _rl_term_backspace;-
542 UP = _rl_term_up;-
543-
544 if (!_rl_term_cr)
!_rl_term_crDescription
TRUEnever evaluated
FALSEnever evaluated
0
545 _rl_term_cr = "\r";
never executed: _rl_term_cr = "\r";
0
546-
547 _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");
tgetflag ("am")Description
TRUEnever evaluated
FALSEnever evaluated
tgetflag ("xn")Description
TRUEnever evaluated
FALSEnever evaluated
0
548-
549 /* Allow calling application to set default height and width, using-
550 rl_set_screen_size */-
551 if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
_rl_screenwidth <= 0Description
TRUEnever evaluated
FALSEnever evaluated
_rl_screenheight <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
552 _rl_get_screen_size (tty, 0);
never executed: _rl_get_screen_size (tty, 0);
0
553-
554 /* "An application program can assume that the terminal can do-
555 character insertion if *any one of* the capabilities `IC',-
556 `im', `ic' or `ip' is provided." But we can't do anything if-
557 only `ip' is provided, so... */-
558 _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic);
_rl_term_ICDescription
TRUEnever evaluated
FALSEnever evaluated
_rl_term_imDescription
TRUEnever evaluated
FALSEnever evaluated
_rl_term_icDescription
TRUEnever evaluated
FALSEnever evaluated
0
559-
560 /* Check to see if this terminal has a meta key and clear the capability-
561 variables if there is none. */-
562 term_has_meta = tgetflag ("km") != 0;-
563 if (term_has_meta == 0)
term_has_meta == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
564 _rl_term_mm = _rl_term_mo = (char *)NULL;
never executed: _rl_term_mm = _rl_term_mo = (char *) ((void *)0) ;
0
565#endif /* !__MSDOS__ */-
566-
567 /* Attempt to find and bind the arrow keys. Do not override already-
568 bound keys in an overzealous attempt, however. */-
569-
570 bind_termcap_arrow_keys (emacs_standard_keymap);-
571-
572#if defined (VI_MODE)-
573 bind_termcap_arrow_keys (vi_movement_keymap);-
574 bind_termcap_arrow_keys (vi_insertion_keymap);-
575#endif /* VI_MODE */-
576-
577 return 0;
never executed: return 0;
0
578}-
579-
580/* Bind the arrow key sequences from the termcap description in MAP. */-
581static void-
582bind_termcap_arrow_keys (Keymap map)-
583{-
584 Keymap xkeymap;-
585-
586 xkeymap = _rl_keymap;-
587 _rl_keymap = map;-
588-
589 rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history);-
590 rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history);-
591 rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char);-
592 rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char);-
593-
594 rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */-
595 rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */-
596-
597 rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete);-
598-
599 _rl_keymap = xkeymap;-
600}
never executed: end of block
0
601-
602char *-
603rl_get_termcap (const char *cap)-
604{-
605 register int i;-
606-
607 if (tcap_initialized == 0)
tcap_initialized == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
608 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
609 for (i = 0; i < NUM_TC_STRINGS; i++)
i < (sizeof (t...t _tc_string))Description
TRUEnever evaluated
FALSEnever evaluated
0
610 {-
611 if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( tc_strings[i].tc_var ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( cap ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
tc_strings[i]....r[0] == cap[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
612 return *(tc_strings[i].tc_value);
never executed: return *(tc_strings[i].tc_value);
0
613 }
never executed: end of block
0
614 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
615}-
616-
617/* Re-initialize the terminal considering that the TERM/TERMCAP variable-
618 has changed. */-
619int-
620rl_reset_terminal (const char *terminal_name)-
621{-
622 _rl_screenwidth = _rl_screenheight = 0;-
623 _rl_init_terminal_io (terminal_name);-
624 return 0;
never executed: return 0;
0
625}-
626-
627/* A function for the use of tputs () */-
628#ifdef _MINIX-
629void-
630_rl_output_character_function (int c)-
631{-
632 putc (c, _rl_out_stream);-
633}-
634#else /* !_MINIX */-
635int-
636_rl_output_character_function (int c)-
637{-
638 return putc (c, _rl_out_stream);
never executed: return _IO_putc ( c , _rl_out_stream ) ;
0
639}-
640#endif /* !_MINIX */-
641-
642/* Write COUNT characters from STRING to the output stream. */-
643void-
644_rl_output_some_chars (const char *string, int count)-
645{-
646 fwrite (string, 1, count, _rl_out_stream);-
647}
never executed: end of block
0
648-
649/* Move the cursor back. */-
650int-
651_rl_backspace (int count)-
652{-
653 register int i;-
654-
655#ifndef __MSDOS__-
656 if (_rl_term_backspace)
_rl_term_backspaceDescription
TRUEnever evaluated
FALSEnever evaluated
0
657 for (i = 0; i < count; i++)
i < countDescription
TRUEnever evaluated
FALSEnever evaluated
0
658 tputs (_rl_term_backspace, 1, _rl_output_character_function);
never executed: tputs (_rl_term_backspace, 1, _rl_output_character_function);
0
659 else-
660#endif-
661 for (i = 0; i < count; i++)
i < countDescription
TRUEnever evaluated
FALSEnever evaluated
0
662 putc ('\b', _rl_out_stream);
never executed: _IO_putc ( '\b' , _rl_out_stream ) ;
0
663 return 0;
never executed: return 0;
0
664}-
665-
666/* Move to the start of the next line. */-
667int-
668rl_crlf (void)-
669{-
670#if defined (NEW_TTY_DRIVER) || defined (__MINT__)-
671 if (_rl_term_cr)-
672 tputs (_rl_term_cr, 1, _rl_output_character_function);-
673#endif /* NEW_TTY_DRIVER || __MINT__ */-
674 putc ('\n', _rl_out_stream);-
675 return 0;
never executed: return 0;
0
676}-
677-
678/* Ring the terminal bell. */-
679int-
680rl_ding (void)-
681{-
682 if (_rl_echoing_p)
_rl_echoing_pDescription
TRUEnever evaluated
FALSEnever evaluated
0
683 {-
684 switch (_rl_bell_preference)-
685 {-
686 case NO_BELL:
never executed: case 0:
0
687 default:
never executed: default:
0
688 break;
never executed: break;
0
689 case VISIBLE_BELL:
never executed: case 2:
0
690 if (_rl_visible_bell)
_rl_visible_bellDescription
TRUEnever evaluated
FALSEnever evaluated
0
691 {-
692#ifdef __DJGPP__-
693 ScreenVisualBell ();-
694#else-
695 tputs (_rl_visible_bell, 1, _rl_output_character_function);-
696#endif-
697 break;
never executed: break;
0
698 }-
699 /* FALLTHROUGH */-
700 case AUDIBLE_BELL:
code before this statement never executed: case 1:
never executed: case 1:
0
701 fprintf (stderr, "\007");-
702 fflush (stderr);-
703 break;
never executed: break;
0
704 }-
705 return (0);
never executed: return (0);
0
706 }-
707 return (-1);
never executed: return (-1);
0
708}-
709-
710/* **************************************************************** */-
711/* */-
712/* Controlling the Meta Key and Keypad */-
713/* */-
714/* **************************************************************** */-
715-
716static int enabled_meta = 0; /* flag indicating we enabled meta mode */-
717-
718void-
719_rl_enable_meta_key (void)-
720{-
721#if !defined (__DJGPP__)-
722 if (term_has_meta && _rl_term_mm)
term_has_metaDescription
TRUEnever evaluated
FALSEnever evaluated
_rl_term_mmDescription
TRUEnever evaluated
FALSEnever evaluated
0
723 {-
724 tputs (_rl_term_mm, 1, _rl_output_character_function);-
725 enabled_meta = 1;-
726 }
never executed: end of block
0
727#endif-
728}
never executed: end of block
0
729-
730void-
731_rl_disable_meta_key (void)-
732{-
733#if !defined (__DJGPP__)-
734 if (term_has_meta && _rl_term_mo && enabled_meta)
term_has_metaDescription
TRUEnever evaluated
FALSEnever evaluated
_rl_term_moDescription
TRUEnever evaluated
FALSEnever evaluated
enabled_metaDescription
TRUEnever evaluated
FALSEnever evaluated
0
735 {-
736 tputs (_rl_term_mo, 1, _rl_output_character_function);-
737 enabled_meta = 0;-
738 }
never executed: end of block
0
739#endif-
740}
never executed: end of block
0
741-
742void-
743_rl_control_keypad (int on)-
744{-
745#if !defined (__DJGPP__)-
746 if (on && _rl_term_ks)
onDescription
TRUEnever evaluated
FALSEnever evaluated
_rl_term_ksDescription
TRUEnever evaluated
FALSEnever evaluated
0
747 tputs (_rl_term_ks, 1, _rl_output_character_function);
never executed: tputs (_rl_term_ks, 1, _rl_output_character_function);
0
748 else if (!on && _rl_term_ke)
!onDescription
TRUEnever evaluated
FALSEnever evaluated
_rl_term_keDescription
TRUEnever evaluated
FALSEnever evaluated
0
749 tputs (_rl_term_ke, 1, _rl_output_character_function);
never executed: tputs (_rl_term_ke, 1, _rl_output_character_function);
0
750#endif-
751}
never executed: end of block
0
752-
753/* **************************************************************** */-
754/* */-
755/* Controlling the Cursor */-
756/* */-
757/* **************************************************************** */-
758-
759/* Set the cursor appropriately depending on IM, which is one of the-
760 insert modes (insert or overwrite). Insert mode gets the normal-
761 cursor. Overwrite mode gets a very visible cursor. Only does-
762 anything if we have both capabilities. */-
763void-
764_rl_set_cursor (int im, int force)-
765{-
766#ifndef __MSDOS__-
767 if (_rl_term_ve && _rl_term_vs)
_rl_term_veDescription
TRUEnever evaluated
FALSEnever evaluated
_rl_term_vsDescription
TRUEnever evaluated
FALSEnever evaluated
0
768 {-
769 if (force || im != rl_insert_mode)
forceDescription
TRUEnever evaluated
FALSEnever evaluated
im != rl_insert_modeDescription
TRUEnever evaluated
FALSEnever evaluated
0
770 {-
771 if (im == RL_IM_OVERWRITE)
im == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
772 tputs (_rl_term_vs, 1, _rl_output_character_function);
never executed: tputs (_rl_term_vs, 1, _rl_output_character_function);
0
773 else-
774 tputs (_rl_term_ve, 1, _rl_output_character_function);
never executed: tputs (_rl_term_ve, 1, _rl_output_character_function);
0
775 }-
776 }
never executed: end of block
0
777#endif-
778}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2