xref: /aosp_15_r20/external/coreboot/payloads/libpayload/curses/curses.priv.h (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /****************************************************************************
2  * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc.              *
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  *  Author: Zeyd M. Ben-Halim <[email protected]> 1992,1995               *
31  *     and: Eric S. Raymond <[email protected]>                         *
32  *     and: Thomas E. Dickey                        1996-on                 *
33  ****************************************************************************/
34 
35 /*
36  * $Id: curses.priv.h,v 1.314 2006/12/10 00:55:14 tom Exp $
37  *
38  *	curses.priv.h
39  *
40  *	Header file for curses library objects which are private to
41  *	the library.
42  *
43  */
44 
45 #ifndef _CURSES_PRIV_H
46 #define _CURSES_PRIV_H 1
47 
48 //// #include <ncurses_dll.h>
49 
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53 
54 //// #include <ncurses_cfg.h>
55 
56 #if USE_RCS_IDS
57 #define MODULE_ID(id) static const char Ident[] = id;
58 #else
59 #define MODULE_ID(id) /*nothing*/
60 #endif
61 
62 #include <stdlib.h>
63 #include <string.h>
64 #include <sys/types.h>
65 
66 #if HAVE_UNISTD_H
67 #include <unistd.h>
68 #endif
69 
70 //// #if HAVE_SYS_BSDTYPES_H
71 //// #include <sys/bsdtypes.h>	/* needed for ISC */
72 //// #endif
73 
74 #if HAVE_LIMITS_H
75 # include <limits.h>
76 //// #elif HAVE_SYS_PARAM_H
77 //// # include <sys/param.h>
78 #endif
79 ////
80 //// #include <assert.h>
81 #include <stdio.h>
82 
83 #include <errno.h>
84 
85 #if DECL_ERRNO
86 extern int errno;
87 #endif
88 
89 //// #include <nc_panel.h>
90 ////
91 //// /* Some systems have a broken 'select()', but workable 'poll()'.  Use that */
92 //// #if HAVE_WORKING_POLL
93 //// #define USE_FUNC_POLL 1
94 //// #if HAVE_POLL_H
95 //// #include <poll.h>
96 //// #else
97 //// #include <sys/poll.h>
98 //// #endif
99 //// #else
100 //// #define USE_FUNC_POLL 0
101 //// #endif
102 ////
103 //// /* include signal.h before curses.h to work-around defect in glibc 2.1.3 */
104 //// #include <signal.h>
105 
106 /* Alessandro Rubini's GPM (general-purpose mouse) */
107 #if HAVE_LIBGPM && HAVE_GPM_H
108 #define USE_GPM_SUPPORT 1
109 #else
110 #define USE_GPM_SUPPORT 0
111 #endif
112 
113 /* QNX mouse support */
114 #if defined(__QNX__) && !defined(__QNXNTO__)
115 #define USE_QNX_MOUSE 1
116 #else
117 #define USE_QNX_MOUSE 0
118 #endif
119 
120 /* EMX mouse support */
121 #ifdef __EMX__
122 #define USE_EMX_MOUSE 1
123 #else
124 #define USE_EMX_MOUSE 0
125 #endif
126 
127 #define DEFAULT_MAXCLICK 166
128 #define EV_MAX		8	/* size of mouse circular event queue */
129 
130 /*
131  * If we don't have signals to support it, don't add a sigwinch handler.
132  * In any case, resizing is an extended feature.  Use it if we've got it.
133  */
134 #if !NCURSES_EXT_FUNCS
135 #undef HAVE_SIZECHANGE
136 #define HAVE_SIZECHANGE 0
137 #endif
138 
139 #if HAVE_SIZECHANGE && defined(SIGWINCH)
140 #define USE_SIZECHANGE 1
141 #else
142 #define USE_SIZECHANGE 0
143 #undef USE_SIGWINCH
144 #define USE_SIGWINCH 0
145 #endif
146 
147 /*
148  * If desired, one can configure this, disabling environment variables that
149  * point to custom terminfo/termcap locations.
150  */
151 #ifdef USE_ROOT_ENVIRON
152 #define use_terminfo_vars() 1
153 #else
154 #define use_terminfo_vars() _nc_env_access()
155 extern NCURSES_EXPORT(int) _nc_env_access (void);
156 #endif
157 
158 /*
159  * Not all platforms have memmove; some have an equivalent bcopy.  (Some may
160  * have neither).
161  */
162 #if USE_OK_BCOPY
163 #define memmove(d,s,n) bcopy(s,d,n)
164 #elif USE_MY_MEMMOVE
165 #define memmove(d,s,n) _nc_memmove(d,s,n)
166 extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t);
167 #endif
168 
169 /*
170  * Scroll hints are useless when hashmap is used
171  */
172 //// #if !USE_SCROLL_HINTS
173 //// #if !USE_HASHMAP
174 //// #define USE_SCROLL_HINTS 1
175 //// #else
176 //// #define USE_SCROLL_HINTS 0
177 //// #endif
178 //// #endif
179 
180 #if USE_SCROLL_HINTS
181 #define if_USE_SCROLL_HINTS(stmt) stmt
182 #else
183 #define if_USE_SCROLL_HINTS(stmt) /*nothing*/
184 #endif
185 
186 /*
187  * Note:  ht/cbt expansion flakes out randomly under Linux 1.1.47, but only
188  * when we're throwing control codes at the screen at high volume.  To see
189  * this, re-enable USE_HARD_TABS and run worm for a while.  Other systems
190  * probably don't want to define this either due to uncertainties about tab
191  * delays and expansion in raw mode.
192  */
193 
194 struct tries {
195 	struct tries    *child;     /* ptr to child.  NULL if none          */
196 	struct tries    *sibling;   /* ptr to sibling.  NULL if none        */
197 	unsigned char    ch;        /* character at this node               */
198 	unsigned short   value;     /* code of string so far.  0 if none.   */
199 };
200 
201 /*
202  * Common/troublesome character definitions
203  */
204 #define L_BRACE '{'
205 #define R_BRACE '}'
206 #define S_QUOTE '\''
207 #define D_QUOTE '"'
208 
209 #define VT_ACSC "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~"
210 
211 /*
212  * Structure for palette tables
213  */
214 
215 typedef struct
216 {
217     short red, green, blue;	/* what color_content() returns */
218     short r, g, b;		/* params to init_color() */
219     int init;			/* true if we called init_color() */
220 }
221 color_t;
222 
223 #define MAXCOLUMNS    135
224 #define MAXLINES      66
225 #define FIFO_SIZE     MAXCOLUMNS+2  /* for nocbreak mode input */
226 
227 #define ACS_LEN       128
228 
229 #define WINDOWLIST struct _win_list
230 
231 #if USE_WIDEC_SUPPORT
232 #define _nc_bkgd    _bkgrnd
233 #else
234 #undef _XOPEN_SOURCE_EXTENDED
235 #define _nc_bkgd    _bkgd
236 #define wgetbkgrnd(win, wch)	*wch = win->_bkgd
237 #define wbkgrnd	    wbkgd
238 #endif
239 
240 //// #include <curses.h>	/* we'll use -Ipath directive to get the right one! */
241 //// #include <term.h>
242 //// #include <term_entry.h>
243 //// #include <nc_tparm.h>
244 
245 #if NCURSES_EXT_COLORS && USE_WIDEC_SUPPORT
246 #define if_EXT_COLORS(stmt)	stmt
247 #define NetPair(value,p)	(value).ext_color = (p), \
248 				AttrOf(value) &= ALL_BUT_COLOR, \
249 				AttrOf(value) |= (A_COLOR & COLOR_PAIR((p > 255) ? 255 : p))
250 #define SetPair(value,p)	(value).ext_color = (p)
251 #define GetPair(value)		(value).ext_color
252 #define unColor(n)		(AttrOf(n) & ALL_BUT_COLOR)
253 #define GET_WINDOW_PAIR(w)	(w)->_color
254 #define SET_WINDOW_PAIR(w,p)	(w)->_color = (p)
255 #define SameAttrOf(a,b)		(AttrOf(a) == AttrOf(b) && GetPair(a) == GetPair(b))
256 #define VIDATTR(attr, pair)	vid_attr(attr, pair, 0)
257 #else
258 #define if_EXT_COLORS(stmt)	/* nothing */
259 #define SetPair(value,p)	RemAttr(value, A_COLOR), \
260 				SetAttr(value, AttrOf(value) | (A_COLOR & COLOR_PAIR(p)))
261 #define GetPair(value)		PAIR_NUMBER(AttrOf(value))
262 #define unColor(n)		(AttrOf(n) & ALL_BUT_COLOR)
263 #define GET_WINDOW_PAIR(w)	PAIR_NUMBER(WINDOW_ATTRS(w))
264 #define SET_WINDOW_PAIR(w,p)	WINDOW_ATTRS(w) &= ALL_BUT_COLOR, \
265 				WINDOW_ATTRS(w) |= (A_COLOR & COLOR_PAIR(p))
266 #define SameAttrOf(a,b)		(AttrOf(a) == AttrOf(b))
267 #define VIDATTR(attr, pair)	vidattr(attr)
268 #endif
269 
270 #define WINDOW_ATTRS(w)		((w)->_attrs)
271 
272 #define SCREEN_ATTRS(s)		(*((s)->_current_attr))
273 #define GET_SCREEN_PAIR(s)	GetPair(SCREEN_ATTRS(s))
274 #define SET_SCREEN_PAIR(s,p)	SetPair(SCREEN_ATTRS(s), p)
275 
276 /*
277  * Definitions for color pairs
278  */
279 typedef unsigned colorpair_t;	/* type big enough to store PAIR_OF() */
280 #define C_SHIFT 9		/* we need more bits than there are colors */
281 #define C_MASK			((1 << C_SHIFT) - 1)
282 #define PAIR_OF(fg, bg)		((((fg) & C_MASK) << C_SHIFT) | ((bg) & C_MASK))
283 #define isDefaultColor(c)	((c) >= COLOR_DEFAULT || (c) < 0)
284 
285 #define COLOR_DEFAULT		C_MASK
286 
287 #if defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T)
288 
289 #undef NCURSES_CH_T		/* this is not a termlib feature */
290 #define NCURSES_CH_T void	/* ...but we need a pointer in SCREEN */
291 
292 #endif	/* USE_TERMLIB */
293 
294 #ifndef USE_TERMLIB
295 struct ldat
296 {
297 	NCURSES_CH_T	*text;		/* text of the line */
298 	NCURSES_SIZE_T	firstchar;	/* first changed character in the line */
299 	NCURSES_SIZE_T	lastchar;	/* last changed character in the line */
300 	NCURSES_SIZE_T	oldindex;	/* index of the line at last update */
301 };
302 #endif	/* USE_TERMLIB */
303 
304 typedef enum {
305 	M_XTERM	= -1		/* use xterm's mouse tracking? */
306 	,M_NONE = 0		/* no mouse device */
307 #if USE_GPM_SUPPORT
308 	,M_GPM			/* use GPM */
309 #endif
310 #if USE_SYSMOUSE
311 	,M_SYSMOUSE		/* FreeBSD sysmouse on console */
312 #endif
313 } MouseType;
314 
315 /*
316  * Structures for scrolling.
317  */
318 
319 typedef struct {
320 	unsigned long hashval;
321 	int oldcount, newcount;
322 	int oldindex, newindex;
323 } HASHMAP;
324 
325 /*
326  * Structures for soft labels.
327  */
328 
329 struct _SLK;
330 
331 #ifndef USE_TERMLIB
332 
333 typedef struct
334 {
335 	char *ent_text;		/* text for the label */
336 	char *form_text;	/* formatted text (left/center/...) */
337 	int ent_x;		/* x coordinate of this field */
338 	char dirty;		/* this label has changed */
339 	char visible;		/* field is visible */
340 } slk_ent;
341 
342 typedef struct _SLK {
343 	char dirty;		/* all labels have changed */
344 	char hidden;		/* soft labels are hidden */
345 	WINDOW *win;
346 	slk_ent *ent;
347 	short  maxlab;		/* number of available labels */
348 	short  labcnt;		/* number of allocated labels */
349 	short  maxlen;		/* length of labels */
350 	NCURSES_CH_T attr;	/* soft label attribute */
351 } SLK;
352 
353 #endif	/* USE_TERMLIB */
354 
355 typedef	struct {
356 	int	line;		/* lines to take, < 0 => from bottom*/
357 	int	(*hook)(WINDOW *, int); /* callback for user	    */
358 	WINDOW *w;		/* maybe we need this for cleanup   */
359 } ripoff_t;
360 
361 #if USE_GPM_SUPPORT
362 #undef buttons			/* term.h defines this, and gpm uses it! */
363 #include <gpm.h>
364 
365 #ifdef HAVE_LIBDL
366 /* link dynamically to GPM */
367 typedef int *TYPE_gpm_fd;
368 typedef int (*TYPE_Gpm_Open) (Gpm_Connect *, int);
369 typedef int (*TYPE_Gpm_Close) (void);
370 typedef int (*TYPE_Gpm_GetEvent) (Gpm_Event *);
371 
372 #define my_gpm_fd       SP->_mouse_gpm_fd
373 #define my_Gpm_Open     SP->_mouse_Gpm_Open
374 #define my_Gpm_Close    SP->_mouse_Gpm_Close
375 #define my_Gpm_GetEvent SP->_mouse_Gpm_GetEvent
376 #else
377 /* link statically to GPM */
378 #define my_gpm_fd       &gpm_fd
379 #define my_Gpm_Open     Gpm_Open
380 #define my_Gpm_Close    Gpm_Close
381 #define my_Gpm_GetEvent Gpm_GetEvent
382 #endif /* HAVE_LIBDL */
383 #endif /* USE_GPM_SUPPORT */
384 
385 /*
386  * The SCREEN structure.
387  */
388 
389 struct screen {
390 	int		_ifd;		/* input file ptr for screen	    */
391 	FILE		*_ofp;		/* output file ptr for screen	    */
392 	char		*_setbuf;	/* buffered I/O for output	    */
393 	bool		_filtered;	/* filter() was called		    */
394 	bool		_buffered;	/* setvbuf uses _setbuf data	    */
395 	int		_checkfd;	/* filedesc for typeahead check	    */
396 	//// TERMINAL	*_term;		/* terminal type information	    */
397 	short		_lines;		/* screen lines			    */
398 	short		_columns;	/* screen columns		    */
399 
400 	short		_lines_avail;	/* lines available for stdscr	    */
401 	short		_topstolen;	/* lines stolen from top	    */
402 	ripoff_t	_rippedoff[5];	/* list of lines stolen		    */
403 	int		_rip_count;	/* ...and total lines stolen	    */
404 
405 	WINDOW		*_curscr;	/* current screen		    */
406 	WINDOW		*_newscr;	/* virtual screen to be updated to  */
407 	WINDOW		*_stdscr;	/* screen's full-window context	    */
408 
409 	struct tries	*_keytry;	/* "Try" for use with keypad mode   */
410 	struct tries	*_key_ok;	/* Disabled keys via keyok(,FALSE)  */
411 	bool		_tried;		/* keypad mode was initialized	    */
412 	bool		_keypad_on;	/* keypad mode is currently on	    */
413 
414 	bool		_called_wgetch;	/* check for recursion in wgetch()  */
415 	int		_fifo[FIFO_SIZE];	/* input push-back buffer   */
416 	short		_fifohead,	/* head of fifo queue		    */
417 			_fifotail,	/* tail of fifo queue		    */
418 			_fifopeek,	/* where to peek for next char	    */
419 			_fifohold;	/* set if breakout marked	    */
420 
421 	int		_endwin;	/* are we out of window mode?	    */
422 	NCURSES_CH_T	*_current_attr; /* holds current attributes set	    */
423 	int		_coloron;	/* is color enabled?		    */
424 	int		_color_defs;	/* are colors modified		    */
425 	int		_cursor;	/* visibility of the cursor	    */
426 	int		_cursrow;	/* physical cursor row		    */
427 	int		_curscol;	/* physical cursor column	    */
428 	bool		_notty;		/* true if we cannot switch non-tty */
429 	int		_nl;		/* True if NL -> CR/NL is on	    */
430 	int		_raw;		/* True if in raw mode		    */
431 	int		_cbreak;	/* 1 if in cbreak mode		    */
432 					/* > 1 if in halfdelay mode	    */
433 	int		_echo;		/* True if echo on		    */
434 	int		_use_meta;	/* use the meta key?		    */
435 	struct _SLK	*_slk;		/* ptr to soft key struct / NULL    */
436 	int		slk_format;	/* selected format for this screen  */
437 	/* cursor movement costs; units are 10ths of milliseconds */
438 #if NCURSES_NO_PADDING
439 	int		_no_padding;	/* flag to set if padding disabled  */
440 #endif
441 	int		_char_padding;	/* cost of character put	    */
442 	int		_cr_cost;	/* cost of (carriage_return)	    */
443 	int		_cup_cost;	/* cost of (cursor_address)	    */
444 	int		_home_cost;	/* cost of (cursor_home)	    */
445 	int		_ll_cost;	/* cost of (cursor_to_ll)	    */
446 #if USE_HARD_TABS
447 	int		_ht_cost;	/* cost of (tab)		    */
448 	int		_cbt_cost;	/* cost of (backtab)		    */
449 #endif /* USE_HARD_TABS */
450 	int		_cub1_cost;	/* cost of (cursor_left)	    */
451 	int		_cuf1_cost;	/* cost of (cursor_right)	    */
452 	int		_cud1_cost;	/* cost of (cursor_down)	    */
453 	int		_cuu1_cost;	/* cost of (cursor_up)		    */
454 	int		_cub_cost;	/* cost of (parm_cursor_left)	    */
455 	int		_cuf_cost;	/* cost of (parm_cursor_right)	    */
456 	int		_cud_cost;	/* cost of (parm_cursor_down)	    */
457 	int		_cuu_cost;	/* cost of (parm_cursor_up)	    */
458 	int		_hpa_cost;	/* cost of (column_address)	    */
459 	int		_vpa_cost;	/* cost of (row_address)	    */
460 	/* used in tty_update.c, must be chars */
461 	int		_ed_cost;	/* cost of (clr_eos)		    */
462 	int		_el_cost;	/* cost of (clr_eol)		    */
463 	int		_el1_cost;	/* cost of (clr_bol)		    */
464 	int		_dch1_cost;	/* cost of (delete_character)	    */
465 	int		_ich1_cost;	/* cost of (insert_character)	    */
466 	int		_dch_cost;	/* cost of (parm_dch)		    */
467 	int		_ich_cost;	/* cost of (parm_ich)		    */
468 	int		_ech_cost;	/* cost of (erase_chars)	    */
469 	int		_rep_cost;	/* cost of (repeat_char)	    */
470 	int		_hpa_ch_cost;	/* cost of (column_address)	    */
471 	int		_cup_ch_cost;	/* cost of (cursor_address)	    */
472 	int		_cuf_ch_cost;	/* cost of (parm_cursor_right)	    */
473 	int		_inline_cost;	/* cost of inline-move		    */
474 	int		_smir_cost;	/* cost of (enter_insert_mode)	    */
475 	int		_rmir_cost;	/* cost of (exit_insert_mode)	    */
476 	int		_ip_cost;	/* cost of (insert_padding)	    */
477 	/* used in lib_mvcur.c */
478 	char *		_address_cursor;
479 	/* used in tty_update.c */
480 	int		_scrolling;	/* 1 if terminal's smart enough to  */
481 
482 	/* used in lib_color.c */
483 	color_t		*_color_table;	/* screen's color palette	     */
484 	int		_color_count;	/* count of colors in palette	     */
485 	colorpair_t	*_color_pairs;	/* screen's color pair list	     */
486 	int		_pair_count;	/* count of color pairs		     */
487 #if NCURSES_EXT_FUNCS
488 	bool		_default_color; /* use default colors		     */
489 	bool		_has_sgr_39_49; /* has ECMA default color support    */
490 	int		_default_fg;	/* assumed default foreground	     */
491 	int		_default_bg;	/* assumed default background	     */
492 #endif
493 	chtype		_ok_attributes; /* valid attributes for terminal     */
494 	chtype		_xmc_suppress;	/* attributes to suppress if xmc     */
495 	chtype		_xmc_triggers;	/* attributes to process if xmc	     */
496 	chtype *	_acs_map;	/* the real alternate-charset map    */
497 	bool *		_screen_acs_map;
498 
499 	/* used in lib_vidattr.c */
500 	bool		_use_rmso;	/* true if we may use 'rmso'	     */
501 	bool		_use_rmul;	/* true if we may use 'rmul'	     */
502 
503 	/*
504 	 * These data correspond to the state of the idcok() and idlok()
505 	 * functions.  A caveat is in order here:  the XSI and SVr4
506 	 * documentation specify that these functions apply to the window which
507 	 * is given as an argument.  However, ncurses implements this logic
508 	 * only for the newscr/curscr update process, _not_ per-window.
509 	 */
510 	bool		_nc_sp_idlok;
511 	bool		_nc_sp_idcok;
512 #define _nc_idlok SP->_nc_sp_idlok
513 #define _nc_idcok SP->_nc_sp_idcok
514 
515 #ifdef NCURSES_MOUSE_VERSION
516 	/*
517 	 * These are the data that support the mouse interface.
518 	 */
519 	bool		_mouse_initialized;
520 	MouseType	_mouse_type;
521 	int		_maxclick;
522 	bool		(*_mouse_event) (SCREEN *);
523 	bool		(*_mouse_inline)(SCREEN *);
524 	bool		(*_mouse_parse) (int);
525 	void		(*_mouse_resume)(SCREEN *);
526 	void		(*_mouse_wrap)	(SCREEN *);
527 	int		_mouse_fd;	/* file-descriptor, if any */
528 	bool		_mouse_active;	/* true if initialized */
529 	mmask_t		_mouse_mask;
530 	NCURSES_CONST char *_mouse_xtermcap; /* string to enable/disable mouse */
531 	MEVENT		_mouse_events[EV_MAX];	/* hold the last mouse event seen */
532 	MEVENT		*_mouse_eventp;	/* next free slot in event queue */
533 #endif
534 
535 #if USE_GPM_SUPPORT
536 	bool		_mouse_gpm_loaded;
537 	bool		_mouse_gpm_found;
538 #ifdef HAVE_LIBDL
539 	TYPE_gpm_fd	_mouse_gpm_fd;
540 	TYPE_Gpm_Open	_mouse_Gpm_Open;
541 	TYPE_Gpm_Close	_mouse_Gpm_Close;
542 	TYPE_Gpm_GetEvent _mouse_Gpm_GetEvent;
543 #endif
544 	Gpm_Connect	_mouse_gpm_connect;
545 #endif /* USE_GPM_SUPPORT */
546 
547 #if USE_EMX_MOUSE
548 	int		_emxmouse_wfd;
549 	int		_emxmouse_thread;
550 	int		_emxmouse_activated;
551 	char		_emxmouse_buttons[4];
552 #endif
553 
554 #if USE_SYSMOUSE
555 	MEVENT		_sysmouse_fifo[FIFO_SIZE];
556 	int		_sysmouse_head;
557 	int		_sysmouse_tail;
558 	int		_sysmouse_char_width;	/* character width */
559 	int		_sysmouse_char_height;	/* character height */
560 	int		_sysmouse_old_buttons;
561 	int		_sysmouse_new_buttons;
562 #endif
563 
564 	/*
565 	 * This supports automatic resizing
566 	 */
567 #if USE_SIZECHANGE
568 	int		(*_resize)(int,int);
569 #endif
570 
571 	/*
572 	 * These are data that support the proper handling of the panel stack on an
573 	 * per screen basis.
574 	 */
575 	//// struct panelhook _panelHook;
576 	/*
577 	 * Linked-list of all windows, to support '_nc_resizeall()' and
578 	 * '_nc_freeall()'
579 	 */
580 	WINDOWLIST	*_nc_sp_windows;
581 #define _nc_windows SP->_nc_sp_windows
582 
583 	bool		_sig_winch;
584 	SCREEN		*_next_screen;
585 
586 	/* hashes for old and new lines */
587 	unsigned long	*oldhash, *newhash;
588 	HASHMAP		*hashtab;
589 	int		hashtab_len;
590 
591 	bool		_cleanup;	/* cleanup after int/quit signal */
592 	int		(*_outch)(int); /* output handler if not putc */
593 
594 	int		_legacy_coding;	/* see use_legacy_coding() */
595 
596 	/*
597 	 * ncurses/ncursesw are the same up to this point.
598 	 */
599 #if USE_WIDEC_SUPPORT
600 	/* recent versions of 'screen' have partially-working support for
601 	 * UTF-8, but do not permit ACS at the same time (see tty_update.c).
602 	 */
603 	bool		_screen_acs_fix;
604 #endif
605 };
606 
607 extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain;
608 
609 	WINDOWLIST {
610 	WINDOW	win;	/* first, so WINDOW_EXT() works */
611 	WINDOWLIST *next;
612 #ifdef _XOPEN_SOURCE_EXTENDED
613 	char addch_work[(MB_LEN_MAX * 9) + 1];
614 	unsigned addch_used;	/* number of bytes in addch_work[] */
615 	int addch_x;		/* x-position for addch_work[] */
616 	int addch_y;		/* y-position for addch_work[] */
617 #endif
618 };
619 
620 #define WINDOW_EXT(win,field) (((WINDOWLIST *)(win))->field)
621 
622 /* usually in <limits.h> */
623 #ifndef UCHAR_MAX
624 #define UCHAR_MAX 255
625 #endif
626 
627 /* The terminfo source is assumed to be 7-bit ASCII */
628 #define is7bits(c)	((unsigned)(c) < 128)
629 
630 /* Checks for isprint() should be done on 8-bit characters (non-wide) */
631 #define is8bits(c)	((unsigned)(c) <= UCHAR_MAX)
632 
633 #ifndef min
634 #define min(a,b)	((a) > (b)  ?  (b)  :  (a))
635 #endif
636 
637 #ifndef max
638 #define max(a,b)	((a) < (b)  ?  (b)  :  (a))
639 #endif
640 
641 /* usually in <unistd.h> */
642 #ifndef STDIN_FILENO
643 #define STDIN_FILENO 0
644 #endif
645 
646 #ifndef STDOUT_FILENO
647 #define STDOUT_FILENO 1
648 #endif
649 
650 #ifndef STDERR_FILENO
651 #define STDERR_FILENO 2
652 #endif
653 
654 #ifndef EXIT_SUCCESS
655 #define EXIT_SUCCESS 0
656 #endif
657 
658 #ifndef EXIT_FAILURE
659 #define EXIT_FAILURE 1
660 #endif
661 
662 #ifndef R_OK
663 #define	R_OK	4		/* Test for read permission.  */
664 #endif
665 #ifndef W_OK
666 #define	W_OK	2		/* Test for write permission.  */
667 #endif
668 #ifndef X_OK
669 #define	X_OK	1		/* Test for execute permission.  */
670 #endif
671 #ifndef F_OK
672 #define	F_OK	0		/* Test for existence.  */
673 #endif
674 
675 #if HAVE_FCNTL_H
676 //// #include <fcntl.h>		/* may define O_BINARY	*/
677 #endif
678 
679 #ifndef O_BINARY
680 #define O_BINARY 0
681 #endif
682 
683 #ifdef TRACE
684 #define TRACE_OUTCHARS(n) _nc_outchars += (n);
685 #else
686 #define TRACE_OUTCHARS(n) /* nothing */
687 #endif
688 
689 #define UChar(c)	((unsigned char)(c))
690 #define ChCharOf(c)	((c) & (chtype)A_CHARTEXT)
691 #define ChAttrOf(c)	((c) & (chtype)A_ATTRIBUTES)
692 
693 #ifndef MB_LEN_MAX
694 #define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */
695 #endif
696 
697 #if USE_WIDEC_SUPPORT /* { */
698 #define isEILSEQ(status) ((status == (size_t)-1) && (errno == EILSEQ))
699 
700 #define init_mb(state)	memset(&state, 0, sizeof(state))
701 
702 #if NCURSES_EXT_COLORS
703 #define NulColor	, 0
704 #else
705 #define NulColor	/* nothing */
706 #endif
707 
708 #define NulChar		0,0,0,0	/* FIXME: see CCHARW_MAX */
709 #define CharOf(c)	((c).chars[0])
710 #define AttrOf(c)	((c).attr)
711 #define AddAttr(c,a)	AttrOf(c) |= ((a) & A_ATTRIBUTES)
712 #define RemAttr(c,a)	AttrOf(c) &= ~((a) & A_ATTRIBUTES)
713 #define SetAttr(c,a)	AttrOf(c) = ((a) & A_ATTRIBUTES)
714 #define NewChar2(c,a)	{ a, { c, NulChar } NulColor }
715 #define NewChar(ch)	NewChar2(ChCharOf(ch), ChAttrOf(ch))
716 #define CharEq(a,b)	(!memcmp(&(a), &(b), sizeof(a)))
717 #define SetChar(ch,c,a) do {							    \
718 			    NCURSES_CH_T *_cp = &ch;				    \
719 			    memset(_cp, 0, sizeof(ch));				    \
720 			    _cp->chars[0] = (c);					    \
721 			    _cp->attr = (a);					    \
722 			    if_EXT_COLORS(SetPair(ch, PAIR_NUMBER(a)));		    \
723 			} while (0)
724 #define CHREF(wch)	(&wch)
725 #define CHDEREF(wch)	(*wch)
726 #define ARG_CH_T	NCURSES_CH_T *
727 #define CARG_CH_T	const NCURSES_CH_T *
728 #define PUTC_DATA	char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \
729 			mbstate_t PUT_st; wchar_t PUTC_ch
730 #define PUTC_INIT	init_mb (PUT_st)
731 #define PUTC(ch,b)	do { if(!isWidecExt(ch)) {				    \
732 			if (Charable(ch)) {					    \
733 			    fputc(CharOf(ch), b);				    \
734 			    TRACE_OUTCHARS(1);					    \
735 			} else {						    \
736 			    PUTC_INIT;						    \
737 			    for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {	    \
738 				PUTC_ch = (ch).chars[PUTC_i];			    \
739 				if (PUTC_ch == L'\0')				    \
740 				    break;					    \
741 				PUTC_n = wcrtomb(PUTC_buf,			    \
742 						 (ch).chars[PUTC_i], &PUT_st);	    \
743 				if (PUTC_n <= 0) {				    \
744 				    if (PUTC_ch && is8bits(PUTC_ch) && PUTC_i == 0) \
745 					putc(PUTC_ch,b);			    \
746 				    break;					    \
747 				}						    \
748 				fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b);	    \
749 			    }							    \
750 			    TRACE_OUTCHARS(PUTC_i);				    \
751 			} } } while (0)
752 
753 #define BLANK		{ WA_NORMAL, {' '} NulColor }
754 #define ZEROS		{ WA_NORMAL, {'\0'} NulColor }
755 #define ISBLANK(ch)	((ch).chars[0] == L' ' && (ch).chars[1] == L'\0')
756 
757 	/*
758 	 * Wide characters cannot be represented in the A_CHARTEXT mask of
759 	 * attr_t's but an application might have set a narrow character there.
760 	 * But even in that case, it would only be a printable character, or
761 	 * zero.  Otherwise we can use those bits to tell if a cell is the
762 	 * first or extension part of a wide character.
763 	 */
764 #define WidecExt(ch)	(AttrOf(ch) & A_CHARTEXT)
765 #define isWidecBase(ch)	(WidecExt(ch) == 1)
766 #define isWidecExt(ch)	(WidecExt(ch) > 1 && WidecExt(ch) < 32)
767 #define SetWidecExt(dst, ext)	AttrOf(dst) &= ~A_CHARTEXT,		\
768 				AttrOf(dst) |= (ext + 1)
769 
770 #define if_WIDEC(code)  code
771 #define Charable(ch)	((SP != 0 && SP->_legacy_coding)		\
772 			 || (AttrOf(ch) & A_ALTCHARSET)			\
773 			 || (!isWidecExt(ch) &&				\
774 			     (ch).chars[1] == L'\0' &&			\
775 			     _nc_is_charable(CharOf(ch))))
776 
777 #define L(ch)		L ## ch
778 #else /* }{ */
779 #define CharOf(c)	ChCharOf(c)
780 #define AttrOf(c)	ChAttrOf(c)
781 #define AddAttr(c,a)	c |= (a)
782 #define RemAttr(c,a)	c &= ~((a) & A_ATTRIBUTES)
783 #define SetAttr(c,a)	c = ((c) & ~A_ATTRIBUTES) | (a)
784 #define NewChar(ch)	(ch)
785 #define NewChar2(c,a)	((c) | (a))
786 #define CharEq(a,b)	((a) == (b))
787 #define SetChar(ch,c,a)	ch = (c) | (a)
788 #define CHREF(wch)	wch
789 #define CHDEREF(wch)	wch
790 #define ARG_CH_T	NCURSES_CH_T
791 #define CARG_CH_T	NCURSES_CH_T
792 #define PUTC_DATA	int data = 0
793 #define PUTC(ch,b)	do { data = CharOf(ch); putc(data,b); } while (0)
794 
795 #define BLANK		(' '|A_NORMAL)
796 #define ZEROS		('\0'|A_NORMAL)
797 #define ISBLANK(ch)	(CharOf(ch) == ' ')
798 
799 #define isWidecExt(ch)	(0)
800 #define if_WIDEC(code) /* nothing */
801 
802 #define L(ch)		ch
803 #endif /* } */
804 
805 #define AttrOfD(ch)	AttrOf(CHDEREF(ch))
806 #define CharOfD(ch)	CharOf(CHDEREF(ch))
807 #define SetChar2(wch,ch)    SetChar(wch,ChCharOf(ch),ChAttrOf(ch))
808 
809 #define BLANK_ATTR	A_NORMAL
810 #define BLANK_TEXT	L(' ')
811 
812 #define CHANGED     -1
813 
814 #define LEGALYX(w, y, x) \
815 	      ((w) != 0 && \
816 		((x) >= 0 && (x) <= (w)->_maxx && \
817 		 (y) >= 0 && (y) <= (w)->_maxy))
818 
819 #define CHANGED_CELL(line,col) \
820 	if (line->firstchar == _NOCHANGE) \
821 		line->firstchar = line->lastchar = col; \
822 	else if ((col) < line->firstchar) \
823 		line->firstchar = col; \
824 	else if ((col) > line->lastchar) \
825 		line->lastchar = col
826 
827 #define CHANGED_RANGE(line,start,end) \
828 	if (line->firstchar == _NOCHANGE \
829 	 || line->firstchar > (start)) \
830 		line->firstchar = start; \
831 	if (line->lastchar == _NOCHANGE \
832 	 || line->lastchar < (end)) \
833 		line->lastchar = end
834 
835 #define CHANGED_TO_EOL(line,start,end) \
836 	if (line->firstchar == _NOCHANGE \
837 	 || line->firstchar > (start)) \
838 		line->firstchar = start; \
839 	line->lastchar = end
840 
841 #define SIZEOF(v) (sizeof(v)/sizeof(v[0]))
842 
843 #define FreeIfNeeded(p)  if ((p) != 0) free(p)
844 
845 /* FreeAndNull() is not a comma-separated expression because some compilers
846  * do not accept a mixture of void with values.
847  */
848 #define FreeAndNull(p)   free(p); p = 0
849 
850 //// #include <nc_alloc.h>
851 
852 /*
853  * TTY bit definition for converting tabs to spaces.
854  */
855 #ifdef TAB3
856 # define OFLAGS_TABS TAB3	/* POSIX specifies TAB3 */
857 #else
858 # ifdef XTABS
859 #  define OFLAGS_TABS XTABS	/* XTABS is usually the "same" */
860 # else
861 #  ifdef OXTABS
862 #   define OFLAGS_TABS OXTABS	/* the traditional BSD equivalent */
863 #  else
864 #   define OFLAGS_TABS 0
865 #  endif
866 # endif
867 #endif
868 
869 /*
870  * Prefixes for call/return points of library function traces.  We use these to
871  * instrument the public functions so that the traces can be easily transformed
872  * into regression scripts.
873  */
874 #define T_CALLED(fmt) "called {" fmt
875 #define T_CREATE(fmt) "create :" fmt
876 #define T_RETURN(fmt) "return }" fmt
877 
878 #ifdef TRACE
879 
880 #define START_TRACE() \
881 	if ((_nc_tracing & TRACE_MAXIMUM) == 0) { \
882 	    int t = _nc_getenv_num("NCURSES_TRACE"); \
883 	    if (t >= 0) \
884 		trace((unsigned) t); \
885 	}
886 
887 #define TR(n, a)	if (_nc_tracing & (n)) _tracef a
888 #define T(a)		TR(TRACE_CALLS, a)
889 #define TPUTS_TRACE(s)	_nc_tputs_trace = s;
890 #define TRACE_RETURN(value,type) return _nc_retrace_##type(value)
891 
892 #define returnAttr(code)	TRACE_RETURN(code,attr_t)
893 #define returnBits(code)	TRACE_RETURN(code,unsigned)
894 #define returnBool(code)	TRACE_RETURN(code,bool)
895 #define returnCPtr(code)	TRACE_RETURN(code,cptr)
896 #define returnCVoidPtr(code)	TRACE_RETURN(code,cvoid_ptr)
897 #define returnChar(code)	TRACE_RETURN(code,chtype)
898 #define returnCode(code)	TRACE_RETURN(code,int)
899 #define returnPtr(code)		TRACE_RETURN(code,ptr)
900 #define returnSP(code)		TRACE_RETURN(code,sp)
901 #define returnVoid		T((T_RETURN(""))); return
902 #define returnVoidPtr(code)	TRACE_RETURN(code,void_ptr)
903 #define returnWin(code)		TRACE_RETURN(code,win)
904 
905 extern NCURSES_EXPORT(NCURSES_BOOL)     _nc_retrace_bool (NCURSES_BOOL);
906 extern NCURSES_EXPORT(NCURSES_CONST void *) _nc_retrace_cvoid_ptr (NCURSES_CONST void *);
907 extern NCURSES_EXPORT(SCREEN *)         _nc_retrace_sp (SCREEN *);
908 extern NCURSES_EXPORT(WINDOW *)         _nc_retrace_win (WINDOW *);
909 extern NCURSES_EXPORT(attr_t)           _nc_retrace_attr_t (attr_t);
910 extern NCURSES_EXPORT(char *)           _nc_retrace_ptr (char *);
911 extern NCURSES_EXPORT(char *)           _nc_trace_ttymode(TTY *tty);
912 extern NCURSES_EXPORT(char *)           _nc_varargs (const char *, va_list);
913 extern NCURSES_EXPORT(chtype)           _nc_retrace_chtype (chtype);
914 extern NCURSES_EXPORT(const char *)     _nc_altcharset_name(attr_t, chtype);
915 extern NCURSES_EXPORT(const char *)     _nc_retrace_cptr (const char *);
916 extern NCURSES_EXPORT(int)              _nc_retrace_int (int);
917 extern NCURSES_EXPORT(unsigned)         _nc_retrace_unsigned (unsigned);
918 extern NCURSES_EXPORT(void *)           _nc_retrace_void_ptr (void *);
919 extern NCURSES_EXPORT(void)             _nc_fifo_dump (void);
920 extern NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace;
921 extern NCURSES_EXPORT_VAR(long)         _nc_outchars;
922 extern NCURSES_EXPORT_VAR(unsigned)     _nc_tracing;
923 
924 #if USE_WIDEC_SUPPORT
925 extern NCURSES_EXPORT(const char *) _nc_viswbuf2 (int, const wchar_t *);
926 extern NCURSES_EXPORT(const char *) _nc_viswbufn (const wchar_t *, int);
927 #endif
928 
929 extern NCURSES_EXPORT(const char *) _nc_viscbuf2 (int, const NCURSES_CH_T *, int);
930 extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int);
931 
932 #else /* !TRACE */
933 
934 #define START_TRACE() /* nothing */
935 
936 #define T(a)
937 #define TR(n, a)
938 #define TPUTS_TRACE(s)
939 
940 #define returnAttr(code)	return code
941 #define returnBits(code)	return code
942 #define returnBool(code)	return code
943 #define returnCPtr(code)	return code
944 #define returnCVoidPtr(code)	return code
945 #define returnChar(code)	return code
946 #define returnCode(code)	return code
947 #define returnPtr(code)		return code
948 #define returnSP(code)		return code
949 #define returnVoid		return
950 #define returnVoidPtr(code)	return code
951 #define returnWin(code)		return code
952 
953 #endif /* TRACE/!TRACE */
954 
955 /*
956  * Return-codes for tgetent() and friends.
957  */
958 #define TGETENT_YES  1		/* entry is found */
959 #define TGETENT_NO   0		/* entry is not found */
960 #define TGETENT_ERR -1		/* an error occurred */
961 
962 extern NCURSES_EXPORT(const char *) _nc_visbuf2 (int, const char *);
963 extern NCURSES_EXPORT(const char *) _nc_visbufn (const char *, int);
964 
965 #define empty_module(name) \
966 extern	NCURSES_EXPORT(void) name (void); \
967 	NCURSES_EXPORT(void) name (void) { }
968 
969 #define ALL_BUT_COLOR ((chtype)~(A_COLOR))
970 #define NONBLANK_ATTR (A_NORMAL|A_BOLD|A_DIM|A_BLINK)
971 #define XMC_CHANGES(c) ((c) & SP->_xmc_suppress)
972 
973 #define toggle_attr_on(S,at) {\
974    if (PAIR_NUMBER(at) > 0) {\
975       (S) = ((S) & ALL_BUT_COLOR) | (at);\
976    } else {\
977       (S) |= (at);\
978    }\
979    TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));}
980 
981 #define toggle_attr_off(S,at) {\
982    if (PAIR_NUMBER(at) > 0) {\
983       (S) &= ~(at|A_COLOR);\
984    } else {\
985       (S) &= ~(at);\
986    }\
987    TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));}
988 
989 #define DelCharCost(count) \
990 		((parm_dch != 0) \
991 		? SP->_dch_cost \
992 		: ((delete_character != 0) \
993 			? (SP->_dch1_cost * count) \
994 			: INFINITY))
995 
996 #define InsCharCost(count) \
997 		((parm_ich != 0) \
998 		? SP->_ich_cost \
999 		: ((enter_insert_mode && exit_insert_mode) \
1000 		  ? SP->_smir_cost + SP->_rmir_cost + (SP->_ip_cost * count) \
1001 		  : ((insert_character != 0) \
1002 		    ? ((SP->_ich1_cost + SP->_ip_cost) * count) \
1003 		    : INFINITY)))
1004 
1005 #if USE_XMC_SUPPORT
1006 #define UpdateAttrs(c)	if (!SameAttrOf(SCREEN_ATTRS(SP), c)) { \
1007 				attr_t chg = AttrOf(SCREEN_ATTRS(SP)); \
1008 				VIDATTR(AttrOf(c), GetPair(c)); \
1009 				if (magic_cookie_glitch > 0 \
1010 				 && XMC_CHANGES((chg ^ AttrOf(SCREEN_ATTRS(SP))))) { \
1011 					T(("%s @%d before glitch %d,%d", \
1012 						__FILE__, __LINE__, \
1013 						SP->_cursrow, \
1014 						SP->_curscol)); \
1015 					_nc_do_xmc_glitch(chg); \
1016 				} \
1017 			}
1018 #else
1019 #define UpdateAttrs(c)	if (!SameAttrOf(SCREEN_ATTRS(SP), c)) \
1020 				VIDATTR(AttrOf(c), GetPair(c));
1021 #endif
1022 
1023 /*
1024  * Macros to make additional parameter to implement wgetch_events()
1025  */
1026 #ifdef NCURSES_WGETCH_EVENTS
1027 #define EVENTLIST_0th(param) param
1028 #define EVENTLIST_1st(param) param
1029 #define EVENTLIST_2nd(param) , param
1030 #else
1031 #define EVENTLIST_0th(param) void
1032 #define EVENTLIST_1st(param) /* nothing */
1033 #define EVENTLIST_2nd(param) /* nothing */
1034 #endif
1035 
1036 #if NCURSES_EXPANDED && NCURSES_EXT_FUNCS
1037 
1038 #undef  toggle_attr_on
1039 #define toggle_attr_on(S,at) _nc_toggle_attr_on(&(S), at)
1040 extern NCURSES_EXPORT(void) _nc_toggle_attr_on (attr_t *, attr_t);
1041 
1042 #undef  toggle_attr_off
1043 #define toggle_attr_off(S,at) _nc_toggle_attr_off(&(S), at)
1044 extern NCURSES_EXPORT(void) _nc_toggle_attr_off (attr_t *, attr_t);
1045 
1046 #undef  DelCharCost
1047 #define DelCharCost(count) _nc_DelCharCost(count)
1048 extern NCURSES_EXPORT(int) _nc_DelCharCost (int);
1049 
1050 #undef  InsCharCost
1051 #define InsCharCost(count) _nc_InsCharCost(count)
1052 extern NCURSES_EXPORT(int) _nc_InsCharCost (int);
1053 
1054 #undef  UpdateAttrs
1055 #define UpdateAttrs(c) _nc_UpdateAttrs(c)
1056 extern NCURSES_EXPORT(void) _nc_UpdateAttrs (NCURSES_CH_T);
1057 
1058 #else
1059 
1060 extern NCURSES_EXPORT(void) _nc_expanded (void);
1061 
1062 #endif
1063 
1064 #if !HAVE_GETCWD
1065 #define getcwd(buf,len) getwd(buf)
1066 #endif
1067 
1068 /* charable.c */
1069 #if USE_WIDEC_SUPPORT
1070 extern NCURSES_EXPORT(bool) _nc_is_charable(wchar_t);
1071 extern NCURSES_EXPORT(int) _nc_to_char(wint_t);
1072 extern NCURSES_EXPORT(wint_t) _nc_to_widechar(int);
1073 #endif
1074 
1075 /* doupdate.c */
1076 #if USE_XMC_SUPPORT
1077 extern NCURSES_EXPORT(void) _nc_do_xmc_glitch (attr_t);
1078 #endif
1079 
1080 /* hardscroll.c */
1081 #if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG)
1082 extern NCURSES_EXPORT(void) _nc_linedump (void);
1083 #endif
1084 
1085 /* lib_acs.c */
1086 extern NCURSES_EXPORT(void) _nc_init_acs (void);	/* corresponds to traditional 'init_acs()' */
1087 extern NCURSES_EXPORT(int) _nc_msec_cost (const char *const, int);  /* used by 'tack' program */
1088 
1089 /* lib_addch.c */
1090 #if USE_WIDEC_SUPPORT
1091 NCURSES_EXPORT(int) _nc_build_wch(WINDOW *win, ARG_CH_T ch);
1092 #endif
1093 
1094 /* lib_addstr.c */
1095 #if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB)
1096 extern NCURSES_EXPORT(int) _nc_wchstrlen(const cchar_t *);
1097 #endif
1098 
1099 /* lib_color.c */
1100 extern NCURSES_EXPORT(bool) _nc_reset_colors(void);
1101 
1102 /* lib_getch.c */
1103 extern NCURSES_EXPORT(int) _nc_wgetch(WINDOW *, unsigned long *, int EVENTLIST_2nd(_nc_eventlist *));
1104 
1105 /* lib_insch.c */
1106 extern NCURSES_EXPORT(int) _nc_insert_ch(WINDOW *, chtype);
1107 
1108 /* lib_mvcur.c */
1109 #define INFINITY	1000000	/* cost: too high to use */
1110 
1111 extern NCURSES_EXPORT(void) _nc_mvcur_init (void);
1112 extern NCURSES_EXPORT(void) _nc_mvcur_resume (void);
1113 extern NCURSES_EXPORT(void) _nc_mvcur_wrap (void);
1114 
1115 extern NCURSES_EXPORT(int) _nc_scrolln (int, int, int, int);
1116 
1117 extern NCURSES_EXPORT(void) _nc_screen_init (void);
1118 extern NCURSES_EXPORT(void) _nc_screen_resume (void);
1119 extern NCURSES_EXPORT(void) _nc_screen_wrap (void);
1120 
1121 /* lib_mouse.c */
1122 extern NCURSES_EXPORT(int) _nc_has_mouse (void);
1123 
1124 /* lib_mvcur.c */
1125 #define INFINITY	1000000	/* cost: too high to use */
1126 #define BAUDBYTE	9	/* 9 = 7 bits + 1 parity + 1 stop */
1127 
1128 /* lib_setup.c */
1129 extern NCURSES_EXPORT(char *) _nc_get_locale(void);
1130 extern NCURSES_EXPORT(int) _nc_unicode_locale(void);
1131 extern NCURSES_EXPORT(int) _nc_locale_breaks_acs(void);
1132 extern NCURSES_EXPORT(int) _nc_setupterm(NCURSES_CONST char *, int, int *, bool);
1133 
1134 /* lib_tstp.c */
1135 #if USE_SIGWINCH
1136 extern NCURSES_EXPORT(int) _nc_handle_sigwinch(int);
1137 #else
1138 #define _nc_handle_sigwinch(a) /* nothing */
1139 #endif
1140 
1141 /* lib_wacs.c */
1142 #if USE_WIDEC_SUPPORT
1143 extern NCURSES_EXPORT(void) _nc_init_wacs(void);
1144 #endif
1145 
1146 typedef struct {
1147     char *s_head;	/* beginning of the string (may be null) */
1148     char *s_tail;	/* end of the string (may be null) */
1149     size_t s_size;	/* current remaining size available */
1150     size_t s_init;	/* total size available */
1151 } string_desc;
1152 
1153 /* strings.c */
1154 extern NCURSES_EXPORT(string_desc *) _nc_str_init (string_desc *, char *, size_t);
1155 extern NCURSES_EXPORT(string_desc *) _nc_str_null (string_desc *, size_t);
1156 extern NCURSES_EXPORT(string_desc *) _nc_str_copy (string_desc *, string_desc *);
1157 extern NCURSES_EXPORT(bool) _nc_safe_strcat (string_desc *, const char *);
1158 extern NCURSES_EXPORT(bool) _nc_safe_strcpy (string_desc *, const char *);
1159 
1160 #if !HAVE_STRSTR
1161 #define strstr _nc_strstr
1162 extern NCURSES_EXPORT(char *) _nc_strstr (const char *, const char *);
1163 #endif
1164 
1165 /* safe_sprintf.c */
1166 extern NCURSES_EXPORT(char *) _nc_printf_string (const char *, va_list);
1167 
1168 /* tries.c */
1169 extern NCURSES_EXPORT(void) _nc_add_to_try (struct tries **, const char *, unsigned);
1170 extern NCURSES_EXPORT(char *) _nc_expand_try (struct tries *, unsigned, int *, size_t);
1171 extern NCURSES_EXPORT(int) _nc_remove_key (struct tries **, unsigned);
1172 extern NCURSES_EXPORT(int) _nc_remove_string (struct tries **, const char *);
1173 
1174 /* elsewhere ... */
1175 //// extern NCURSES_EXPORT(ENTRY *) _nc_delink_entry(ENTRY *, TERMTYPE *);
1176 extern NCURSES_EXPORT(WINDOW *) _nc_makenew (int, int, int, int, int);
1177 extern NCURSES_EXPORT(char *) _nc_trace_buf (int, size_t);
1178 extern NCURSES_EXPORT(char *) _nc_trace_bufcat (int, const char *);
1179 extern NCURSES_EXPORT(int) _nc_access (const char *, int);
1180 extern NCURSES_EXPORT(int) _nc_baudrate (int);
1181 extern NCURSES_EXPORT(int) _nc_freewin (WINDOW *);
1182 extern NCURSES_EXPORT(int) _nc_getenv_num (const char *);
1183 extern NCURSES_EXPORT(int) _nc_keypad (bool);
1184 extern NCURSES_EXPORT(int) _nc_ospeed (int);
1185 extern NCURSES_EXPORT(int) _nc_outch (int);
1186 //// extern NCURSES_EXPORT(int) _nc_read_termcap_entry (const char *const, TERMTYPE *const);
1187 extern NCURSES_EXPORT(int) _nc_setupscreen (int, int, FILE *, bool, int);
1188 extern NCURSES_EXPORT(int) _nc_timed_wait(int, int, int * EVENTLIST_2nd(_nc_eventlist *));
1189 extern NCURSES_EXPORT(void) _nc_do_color (short, short, bool, int (*)(int));
1190 extern NCURSES_EXPORT(void) _nc_flush (void);
1191 //// extern NCURSES_EXPORT(void) _nc_free_entry(ENTRY *, TERMTYPE *);
1192 extern NCURSES_EXPORT(void) _nc_freeall (void);
1193 extern NCURSES_EXPORT(void) _nc_hash_map (void);
1194 extern NCURSES_EXPORT(void) _nc_init_keytry (void);
1195 extern NCURSES_EXPORT(void) _nc_keep_tic_dir (const char *);
1196 extern NCURSES_EXPORT(void) _nc_make_oldhash (int i);
1197 extern NCURSES_EXPORT(void) _nc_scroll_oldhash (int n, int top, int bot);
1198 extern NCURSES_EXPORT(void) _nc_scroll_optimize (void);
1199 extern NCURSES_EXPORT(void) _nc_set_buffer (FILE *, bool);
1200 extern NCURSES_EXPORT(void) _nc_signal_handler (bool);
1201 extern NCURSES_EXPORT(void) _nc_synchook (WINDOW *);
1202 extern NCURSES_EXPORT(void) _nc_trace_tries (struct tries *);
1203 
1204 #if NO_LEAKS
1205 extern NCURSES_EXPORT(void) _nc_alloc_entry_leaks(void);
1206 extern NCURSES_EXPORT(void) _nc_captoinfo_leaks(void);
1207 extern NCURSES_EXPORT(void) _nc_comp_scan_leaks(void);
1208 extern NCURSES_EXPORT(void) _nc_keyname_leaks(void);
1209 extern NCURSES_EXPORT(void) _nc_tgetent_leaks(void);
1210 #endif
1211 
1212 #ifndef USE_TERMLIB
1213 extern NCURSES_EXPORT(NCURSES_CH_T) _nc_render (WINDOW *, NCURSES_CH_T);
1214 extern NCURSES_EXPORT(int) _nc_waddch_nosync (WINDOW *, const NCURSES_CH_T);
1215 extern NCURSES_EXPORT(void) _nc_scroll_window (WINDOW *, int const, NCURSES_SIZE_T const, NCURSES_SIZE_T const, NCURSES_CH_T);
1216 #endif
1217 
1218 #if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB)
1219 #ifdef linux
1220 extern NCURSES_EXPORT(size_t) _nc_wcrtomb (char *, wchar_t, mbstate_t *);
1221 #else
1222 #define _nc_wcrtomb(s,wc,ps) wcrtomb(s,wc,ps)
1223 #endif
1224 #endif
1225 
1226 #if USE_SIZECHANGE
1227 extern NCURSES_EXPORT(void) _nc_update_screensize (void);
1228 #endif
1229 
1230 #if HAVE_RESIZETERM
1231 extern NCURSES_EXPORT(void) _nc_resize_margins (WINDOW *);
1232 #else
1233 #define _nc_resize_margins(wp) /* nothing */
1234 #endif
1235 
1236 #ifdef NCURSES_WGETCH_EVENTS
1237 extern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *);
1238 #else
1239 #define wgetch_events(win, evl) wgetch(win)
1240 #define wgetnstr_events(win, str, maxlen, evl) wgetnstr(win, str, maxlen)
1241 #endif
1242 
1243 /*
1244  * Not everyone has vsscanf(), but we'd like to use it for scanw().
1245  */
1246 #if !HAVE_VSSCANF
1247 extern int vsscanf(const char *str, const char *format, va_list __arg);
1248 #endif
1249 
1250 /* scroll indices */
1251 extern NCURSES_EXPORT_VAR(int *) _nc_oldnums;
1252 
1253 #define USE_SETBUF_0 0
1254 
1255 #define NC_BUFFERED(flag) _nc_set_buffer(SP->_ofp, flag)
1256 
1257 #define NC_OUTPUT ((SP != 0) ? SP->_ofp : stdout)
1258 
1259 /*
1260  * On systems with a broken linker, define 'SP' as a function to force the
1261  * linker to pull in the data-only module with 'SP'.
1262  */
1263 #if BROKEN_LINKER
1264 #define SP _nc_screen()
1265 extern NCURSES_EXPORT(SCREEN *) _nc_screen (void);
1266 extern NCURSES_EXPORT(int) _nc_alloc_screen (void);
1267 extern NCURSES_EXPORT(void) _nc_set_screen (SCREEN *);
1268 #else
1269 /* current screen is private data; avoid possible linking conflicts too */
1270 extern NCURSES_EXPORT_VAR(SCREEN *) SP;
1271 #define _nc_alloc_screen() ((SP = typeCalloc(SCREEN, 1)) != 0)
1272 #define _nc_set_screen(sp) SP = sp
1273 #endif
1274 
1275 /*
1276  * We don't want to use the lines or columns capabilities internally, because
1277  * if the application is running multiple screens under X, it's quite possible
1278  * they could all have type xterm but have different sizes!  So...
1279  */
1280 #define screen_lines	SP->_lines
1281 #define screen_columns	SP->_columns
1282 
1283 extern NCURSES_EXPORT_VAR(int) _nc_slk_format;  /* != 0 if slk_init() called */
1284 extern NCURSES_EXPORT(int) _nc_slk_initialize (WINDOW *, int);
1285 
1286 /*
1287  * Some constants related to SLK's
1288  */
1289 #define MAX_SKEY_OLD	   8	/* count of soft keys */
1290 #define MAX_SKEY_LEN_OLD   8	/* max length of soft key text */
1291 #define MAX_SKEY_PC       12    /* This is what most PC's have */
1292 #define MAX_SKEY_LEN_PC    5
1293 
1294 /* Macro to check whether or not we use a standard format */
1295 #define SLK_STDFMT(fmt) (fmt < 3)
1296 /* Macro to determine height of label window */
1297 #define SLK_LINES(fmt)  (SLK_STDFMT(fmt) ? 1 : ((fmt) - 2))
1298 
1299 #define MAX_SKEY(fmt)     (SLK_STDFMT(fmt)? MAX_SKEY_OLD : MAX_SKEY_PC)
1300 #define MAX_SKEY_LEN(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_LEN_OLD : MAX_SKEY_LEN_PC)
1301 
1302 extern NCURSES_EXPORT(int) _nc_ripoffline (int line, int (*init)(WINDOW *,int));
1303 
1304 /*
1305  * Common error messages
1306  */
1307 #define MSG_NO_MEMORY "Out of memory"
1308 #define MSG_NO_INPUTS "Premature EOF"
1309 
1310 #ifdef __cplusplus
1311 }
1312 #endif
1313 
1314 #endif /* CURSES_PRIV_H */
1315