xref: /freebsd/contrib/ncurses/ncurses/term.priv.h (revision 21817992)
1 /****************************************************************************
2  * Copyright 2021-2023,2024 Thomas E. Dickey                                *
3  *                                                                          *
4  * Permission is hereby granted, free of charge, to any person obtaining a  *
5  * copy of this software and associated documentation files (the            *
6  * "Software"), to deal in the Software without restriction, including      *
7  * without limitation the rights to use, copy, modify, merge, publish,      *
8  * distribute, distribute with modifications, sublicense, and/or sell       *
9  * copies of the Software, and to permit persons to whom the Software is    *
10  * furnished to do so, subject to the following conditions:                 *
11  *                                                                          *
12  * The above copyright notice and this permission notice shall be included  *
13  * in all copies or substantial portions of the Software.                   *
14  *                                                                          *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22  *                                                                          *
23  * Except as contained in this notice, the name(s) of the above copyright   *
24  * holders shall not be used in advertising or otherwise to promote the     *
25  * sale, use or other dealings in this Software without prior written       *
26  * authorization.                                                           *
27  ****************************************************************************/
28 
29 /*
30  * $Id: term.priv.h,v 1.13 2024/03/02 20:43:06 tom Exp $
31  *
32  *	term.priv.h
33  *
34  *	Header file for terminfo library objects which are private to
35  *	the library.
36  */
37 
38 #ifndef _TERM_PRIV_H
39 #define _TERM_PRIV_H 1
40 /* *INDENT-OFF* */
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 #include <ncurses_cfg.h>
47 
48 #ifndef __NCURSES_H
49 #include <curses.h>
50 #endif
51 
52 #undef NCURSES_OPAQUE
53 #define NCURSES_INTERNALS 1
54 #define NCURSES_OPAQUE 0
55 
56 #if HAVE_LIMITS_H
57 # include <limits.h>		/* PATH_MAX, MB_LEN_MAX, etc */
58 #elif HAVE_SYS_PARAM_H
59 # include <sys/param.h>
60 #endif
61 
62 #include <signal.h>		/* sig_atomic_t */
63 #include <time.h>		/* time_t */
64 #include <term.h>		/* time_t */
65 
66 #ifdef USE_PTHREADS
67 #if USE_REENTRANT
68 #include <pthread.h>
69 #endif
70 #endif
71 
72 /*
73  * If not properly configured to use the system's limits.h, we get gcc's
74  * fallback for limits.h which sets MB_LEN_MAX to 1, which is never correct.
75  */
76 #if !HAVE_CONSISTENT_MB_LEN_MAX
77 #undef MB_LEN_MAX
78 #endif
79 
80 #ifndef MB_LEN_MAX
81 #define MB_LEN_MAX 16	/* should be >= MB_CUR_MAX, but that may be a function */
82 #endif
83 
84 #ifndef PATH_MAX
85 # if defined(_POSIX_PATH_MAX)
86 #  define PATH_MAX _POSIX_PATH_MAX
87 # elif defined(MAXPATHLEN)
88 #  define PATH_MAX MAXPATHLEN
89 # else
90 #  define PATH_MAX 255	/* the Posix minimum path-size */
91 # endif
92 #endif
93 
94 /*
95  * State of tparm().
96  */
97 #define STACKSIZE 20
98 
99 typedef struct {
100 	union {
101 		int	num;
102 		char *	str;
103 	} data;
104 	bool num_type;
105 } STACK_FRAME;
106 
107 #define NUM_VARS 26
108 
109 typedef struct {
110 	const char *	tparam_base;
111 
112 	STACK_FRAME	stack[STACKSIZE];
113 	int		stack_ptr;
114 
115 	char *		out_buff;
116 	size_t		out_size;
117 	size_t		out_used;
118 
119 	char *		fmt_buff;
120 	size_t		fmt_size;
121 
122 	int		static_vars[NUM_VARS];
123 #ifdef TRACE
124 	const char *	tname;
125 #endif
126 } TPARM_STATE;
127 
128 typedef struct {
129 	char *		text;
130 	size_t		size;
131 } TRACEBUF;
132 
133 typedef struct {
134 	const char *	name;
135 	char *		value;
136 } ITERATOR_VARS;
137 
138 /*
139  * Internals for term.h
140  */
141 typedef struct term {			/* describe an actual terminal */
142 	TERMTYPE	type;		/* terminal type description */
143 	short		Filedes;	/* file description being written to */
144 	TTY		Ottyb;		/* original state of the terminal */
145 	TTY		Nttyb;		/* current state of the terminal */
146 	int		_baudrate;	/* used to compute padding */
147 	char *		_termname;	/* used for termname() */
148 	TPARM_STATE	tparm_state;
149 #if NCURSES_EXT_COLORS
150 	TERMTYPE2	type2;		/* extended terminal type description */
151 #endif
152 #undef TERMINAL
153 } TERMINAL;
154 
155 /*
156  * Internals for soft-keys
157  */
158 typedef	struct {
159 	WINDOW *	win;		/* the window used in the hook      */
160 	int		line;		/* lines to take, < 0 => from bottom*/
161 	int		(*hook)(WINDOW *, int); /* callback for user	    */
162 } ripoff_t;
163 
164 /*
165  * Internals for tgetent
166  */
167 typedef struct {
168 	long		sequence;
169 	bool		last_used;
170 	char *		fix_sgr0;	/* this holds the filtered sgr0 string */
171 	char *		last_bufp;	/* help with fix_sgr0 leak */
172 	TERMINAL *	last_term;
173 } TGETENT_CACHE;
174 
175 #define TGETENT_MAX 4
176 
177 #include <term_entry.h>		/* dbdLAST */
178 
179 #ifdef USE_TERM_DRIVER
180 struct DriverTCB; /* Terminal Control Block forward declaration */
181 #endif
182 
183 /*
184  * Global data which is not specific to a screen.
185  */
186 typedef struct {
187 	SIG_ATOMIC_T	have_sigtstp;
188 	SIG_ATOMIC_T	have_sigwinch;
189 	SIG_ATOMIC_T	cleanup_nested;
190 
191 	bool		init_signals;
192 	bool		init_screen;
193 
194 	char *		comp_sourcename;
195 	char *		comp_termtype;
196 
197 	bool		have_tic_directory;
198 	bool		keep_tic_directory;
199 	const char *	tic_directory;
200 
201 	char *		dbi_list;
202 	int		dbi_size;
203 
204 	char *		first_name;
205 	char **		keyname_table;
206 	int		init_keyname;
207 
208 	int		slk_format;
209 
210 	int		getstr_limit;	/* getstr_limit based on POSIX LINE_MAX */
211 
212 	char *		safeprint_buf;
213 	size_t		safeprint_used;
214 
215 	TGETENT_CACHE	tgetent_cache[TGETENT_MAX];
216 	int		tgetent_index;
217 	long		tgetent_sequence;
218 	int		terminal_count;
219 
220 	char *		dbd_blob;	/* string-heap for dbd_list[] */
221 	char **		dbd_list;	/* distinct places to look for data */
222 	int		dbd_size;	/* length of dbd_list[] */
223 	time_t		dbd_time;	/* cache last updated */
224 	ITERATOR_VARS	dbd_vars[dbdLAST];
225 
226 #if HAVE_TSEARCH
227 	void *		cached_tparm;
228 	int		count_tparm;
229 #endif /* HAVE_TSEARCH */
230 
231 #ifdef USE_TERM_DRIVER
232 	int		(*term_driver)(struct DriverTCB*, const char*, int*);
233 #endif
234 
235 #define WINDOWLIST struct _win_list
236 
237 #ifndef USE_SP_WINDOWLIST
238 	WINDOWLIST *	_nc_windowlist;
239 #define WindowList(sp)	_nc_globals._nc_windowlist
240 #endif
241 
242 #if USE_HOME_TERMINFO
243 	char *		home_terminfo;
244 #endif
245 
246 #if !USE_SAFE_SPRINTF
247 	int		safeprint_cols;
248 	int		safeprint_rows;
249 #endif
250 
251 #ifdef USE_PTHREADS
252 	pthread_mutex_t	mutex_curses;
253 	pthread_mutex_t	mutex_prescreen;
254 	pthread_mutex_t	mutex_screen;
255 	pthread_mutex_t	mutex_update;
256 	pthread_mutex_t	mutex_tst_tracef;
257 	pthread_mutex_t	mutex_tracef;
258 	int		nested_tracef;
259 	int		use_pthreads;
260 #define _nc_use_pthreads	_nc_globals.use_pthreads
261 #if USE_PTHREADS_EINTR
262 	pthread_t	read_thread;	/* The reading thread */
263 #endif
264 #endif
265 #if USE_WIDEC_SUPPORT
266 	char		key_name[MB_LEN_MAX + 1];
267 #endif
268 
269 #ifdef TRACE
270 	bool		trace_opened;
271 	int		trace_level;
272 	FILE *		trace_fp;
273 	int		trace_fd;
274 
275 	char *		tracearg_buf;
276 	size_t		tracearg_used;
277 
278 	TRACEBUF *	tracebuf_ptr;
279 	size_t		tracebuf_used;
280 
281 	char		tracechr_buf[40];
282 
283 	char *		tracedmp_buf;
284 	size_t		tracedmp_used;
285 
286 	unsigned char *	tracetry_buf;
287 	size_t		tracetry_used;
288 
289 	char		traceatr_color_buf[2][80];
290 	int		traceatr_color_sel;
291 	int		traceatr_color_last;
292 #if !defined(USE_PTHREADS) && USE_REENTRANT
293 	int		nested_tracef;
294 #endif
295 #endif	/* TRACE */
296 
297 #if NO_LEAKS
298 	bool		leak_checking;
299 #endif
300 } NCURSES_GLOBALS;
301 
302 extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals;
303 
304 #define N_RIPS 5
305 
306 #ifdef USE_PTHREADS
307 typedef struct _prescreen_list {
308 	struct _prescreen_list *next;
309 	pthread_t	id;
310 	struct screen *	sp;
311 } PRESCREEN_LIST;
312 #endif
313 
314 /*
315  * Global data which can be swept up into a SCREEN when one is created.
316  * It may be modified before the next SCREEN is created.
317  */
318 typedef struct {
319 #ifdef USE_PTHREADS
320 	PRESCREEN_LIST *allocated;
321 #else
322 	struct screen * allocated;
323 #endif
324 	bool		use_env;
325 	bool		filter_mode;
326 	attr_t		previous_attr;
327 	TPARM_STATE	tparm_state;
328 	TTY *		saved_tty;	/* savetty/resetty information	  */
329 	bool		use_tioctl;
330 	NCURSES_SP_OUTC	_outch;		/* output handler if not putc */
331 #ifndef USE_SP_RIPOFF
332 	ripoff_t	rippedoff[N_RIPS];
333 	ripoff_t *	rsp;
334 #endif
335 #if NCURSES_NO_PADDING
336 	bool		_no_padding;	/* flag to set if padding disabled */
337 #endif
338 #if BROKEN_LINKER || USE_REENTRANT
339 	chtype *	real_acs_map;
340 	int		_LINES;
341 	int		_COLS;
342 	int		_TABSIZE;
343 	int		_ESCDELAY;
344 	TERMINAL *	_cur_term;
345 #endif
346 #ifdef TRACE
347 #if BROKEN_LINKER || USE_REENTRANT
348 	long		_outchars;
349 	const char *	_tputs_trace;
350 #endif
351 #endif
352 } NCURSES_PRESCREEN;
353 
354 extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen;
355 
356 extern NCURSES_EXPORT(void) _nc_free_tparm(TERMINAL*);
357 
358 #ifdef __cplusplus
359 }
360 #endif
361 
362 /* *INDENT-ON* */
363 
364 #endif /* _TERM_PRIV_H */
365