xref: /freebsd/contrib/ncurses/include/tic.h (revision 0e3d540892016a47f6a68ec9ba2879d35ce5f7c2)
10e3d5408SPeter Wemm /****************************************************************************
20e3d5408SPeter Wemm  * Copyright (c) 1998 Free Software Foundation, Inc.                        *
30e3d5408SPeter Wemm  *                                                                          *
40e3d5408SPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
50e3d5408SPeter Wemm  * copy of this software and associated documentation files (the            *
60e3d5408SPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
70e3d5408SPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
80e3d5408SPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
90e3d5408SPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
100e3d5408SPeter Wemm  * furnished to do so, subject to the following conditions:                 *
110e3d5408SPeter Wemm  *                                                                          *
120e3d5408SPeter Wemm  * The above copyright notice and this permission notice shall be included  *
130e3d5408SPeter Wemm  * in all copies or substantial portions of the Software.                   *
140e3d5408SPeter Wemm  *                                                                          *
150e3d5408SPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
160e3d5408SPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
170e3d5408SPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
180e3d5408SPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
190e3d5408SPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
200e3d5408SPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
210e3d5408SPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
220e3d5408SPeter Wemm  *                                                                          *
230e3d5408SPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
240e3d5408SPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
250e3d5408SPeter Wemm  * sale, use or other dealings in this Software without prior written       *
260e3d5408SPeter Wemm  * authorization.                                                           *
270e3d5408SPeter Wemm  ****************************************************************************/
280e3d5408SPeter Wemm 
290e3d5408SPeter Wemm /****************************************************************************
300e3d5408SPeter Wemm  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
310e3d5408SPeter Wemm  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
320e3d5408SPeter Wemm  ****************************************************************************/
330e3d5408SPeter Wemm 
340e3d5408SPeter Wemm /*
350e3d5408SPeter Wemm  *	tic.h - Global variables and structures for the terminfo
360e3d5408SPeter Wemm  *			compiler.
370e3d5408SPeter Wemm  *
380e3d5408SPeter Wemm  */
390e3d5408SPeter Wemm 
400e3d5408SPeter Wemm #ifndef __TIC_H
410e3d5408SPeter Wemm #define __TIC_H
420e3d5408SPeter Wemm 
430e3d5408SPeter Wemm #ifdef __cplusplus
440e3d5408SPeter Wemm extern "C" {
450e3d5408SPeter Wemm #endif
460e3d5408SPeter Wemm 
470e3d5408SPeter Wemm #include <curses.h>	/* for the _tracef() prototype, ERR/OK, bool defs */
480e3d5408SPeter Wemm 
490e3d5408SPeter Wemm /*
500e3d5408SPeter Wemm ** The format of compiled terminfo files is as follows:
510e3d5408SPeter Wemm **
520e3d5408SPeter Wemm **		Header (12 bytes), containing information given below
530e3d5408SPeter Wemm **		Names Section, containing the names of the terminal
540e3d5408SPeter Wemm **		Boolean Section, containing the values of all of the
550e3d5408SPeter Wemm **				boolean capabilities
560e3d5408SPeter Wemm **				A null byte may be inserted here to make
570e3d5408SPeter Wemm **				sure that the Number Section begins on an
580e3d5408SPeter Wemm **				even word boundary.
590e3d5408SPeter Wemm **		Number Section, containing the values of all of the numeric
600e3d5408SPeter Wemm **				capabilities, each as a short integer
610e3d5408SPeter Wemm **		String Section, containing short integer offsets into the
620e3d5408SPeter Wemm **				String Table, one per string capability
630e3d5408SPeter Wemm **		String Table, containing the actual characters of the string
640e3d5408SPeter Wemm **				capabilities.
650e3d5408SPeter Wemm **
660e3d5408SPeter Wemm **	NOTE that all short integers in the file are stored using VAX/PDP-style
670e3d5408SPeter Wemm **	byte-order, i.e., least-significant byte first.
680e3d5408SPeter Wemm **
690e3d5408SPeter Wemm **	There is no structure definition here because it would only confuse
700e3d5408SPeter Wemm **	matters.  Terminfo format is a raw byte layout, not a structure
710e3d5408SPeter Wemm **	dump.  If you happen to be on a little-endian machine with 16-bit
720e3d5408SPeter Wemm **	shorts that requires no padding between short members in a struct,
730e3d5408SPeter Wemm **	then there is a natural C structure that captures the header, but
740e3d5408SPeter Wemm **	not very helpfully.
750e3d5408SPeter Wemm */
760e3d5408SPeter Wemm 
770e3d5408SPeter Wemm #define MAGIC		0432	/* first two bytes of a compiled entry */
780e3d5408SPeter Wemm 
790e3d5408SPeter Wemm /*
800e3d5408SPeter Wemm  * The "maximum" here is misleading; XSI guarantees minimum values, which a
810e3d5408SPeter Wemm  * given implementation may exceed.
820e3d5408SPeter Wemm  */
830e3d5408SPeter Wemm #define MAX_NAME_SIZE	512	/* maximum legal name field size (XSI:127) */
840e3d5408SPeter Wemm #define MAX_ENTRY_SIZE	4096	/* maximum legal entry size */
850e3d5408SPeter Wemm 
860e3d5408SPeter Wemm /* The maximum size of individual name or alias is guaranteed in XSI to
870e3d5408SPeter Wemm  * be 14, since that corresponds to the older filename lengths.  Newer
880e3d5408SPeter Wemm  * systems allow longer aliases, though not many terminal descriptions
890e3d5408SPeter Wemm  * are written to use them.
900e3d5408SPeter Wemm  */
910e3d5408SPeter Wemm #if HAVE_LONG_FILE_NAMES
920e3d5408SPeter Wemm #define MAX_ALIAS	32	/* POSIX minimum for PATH_MAX */
930e3d5408SPeter Wemm #else
940e3d5408SPeter Wemm #define MAX_ALIAS	14	/* SVr3 filename length */
950e3d5408SPeter Wemm #endif
960e3d5408SPeter Wemm 
970e3d5408SPeter Wemm /* location of user's personal info directory */
980e3d5408SPeter Wemm #define PRIVATE_INFO	"%s/.terminfo"	/* plug getenv("HOME") into %s */
990e3d5408SPeter Wemm 
1000e3d5408SPeter Wemm #ifdef TRACE
1010e3d5408SPeter Wemm #define DEBUG(n, a)	if (_nc_tracing & (1 << (n - 1))) _tracef a
1020e3d5408SPeter Wemm #else
1030e3d5408SPeter Wemm #define DEBUG(n, a)	/*nothing*/
1040e3d5408SPeter Wemm #endif
1050e3d5408SPeter Wemm 
1060e3d5408SPeter Wemm extern unsigned _nc_tracing;
1070e3d5408SPeter Wemm extern void _nc_tracef(char *, ...) GCC_PRINTFLIKE(1,2);
1080e3d5408SPeter Wemm extern const char *_nc_visbuf(const char *);
1090e3d5408SPeter Wemm 
1100e3d5408SPeter Wemm /*
1110e3d5408SPeter Wemm  * These are the types of tokens returned by the scanner.  The first
1120e3d5408SPeter Wemm  * three are also used in the hash table of capability names.  The scanner
1130e3d5408SPeter Wemm  * returns one of these values after loading the specifics into the global
1140e3d5408SPeter Wemm  * structure curr_token.
1150e3d5408SPeter Wemm  */
1160e3d5408SPeter Wemm 
1170e3d5408SPeter Wemm #define BOOLEAN 0		/* Boolean capability */
1180e3d5408SPeter Wemm #define NUMBER 1		/* Numeric capability */
1190e3d5408SPeter Wemm #define STRING 2		/* String-valued capability */
1200e3d5408SPeter Wemm #define CANCEL 3		/* Capability to be cancelled in following tc's */
1210e3d5408SPeter Wemm #define NAMES  4		/* The names for a terminal type */
1220e3d5408SPeter Wemm #define UNDEF  5		/* Undefined */
1230e3d5408SPeter Wemm 
1240e3d5408SPeter Wemm #define NO_PUSHBACK	-1	/* used in pushtype to indicate no pushback */
1250e3d5408SPeter Wemm 
1260e3d5408SPeter Wemm 	/*
1270e3d5408SPeter Wemm 	 *	The global structure in which the specific parts of a
1280e3d5408SPeter Wemm 	 *	scanned token are returned.
1290e3d5408SPeter Wemm 	 *
1300e3d5408SPeter Wemm 	 */
1310e3d5408SPeter Wemm 
1320e3d5408SPeter Wemm struct token
1330e3d5408SPeter Wemm {
1340e3d5408SPeter Wemm 	char	*tk_name;		/* name of capability */
1350e3d5408SPeter Wemm 	int	tk_valnumber;	/* value of capability (if a number) */
1360e3d5408SPeter Wemm 	char	*tk_valstring;	/* value of capability (if a string) */
1370e3d5408SPeter Wemm };
1380e3d5408SPeter Wemm 
1390e3d5408SPeter Wemm extern	struct token	_nc_curr_token;
1400e3d5408SPeter Wemm 
1410e3d5408SPeter Wemm 	/*
1420e3d5408SPeter Wemm 	 * List of keynames with their corresponding code.
1430e3d5408SPeter Wemm 	 */
1440e3d5408SPeter Wemm struct kn {
1450e3d5408SPeter Wemm 	const char *name;
1460e3d5408SPeter Wemm 	int code;
1470e3d5408SPeter Wemm };
1480e3d5408SPeter Wemm 
1490e3d5408SPeter Wemm extern const struct kn _nc_key_names[];
1500e3d5408SPeter Wemm 
1510e3d5408SPeter Wemm 	/*
1520e3d5408SPeter Wemm 	 * Offsets to string capabilities, with the corresponding functionkey
1530e3d5408SPeter Wemm 	 * codes.
1540e3d5408SPeter Wemm 	 */
1550e3d5408SPeter Wemm struct tinfo_fkeys {
1560e3d5408SPeter Wemm 	unsigned offset;
1570e3d5408SPeter Wemm 	chtype code;
1580e3d5408SPeter Wemm 	};
1590e3d5408SPeter Wemm 
1600e3d5408SPeter Wemm extern struct tinfo_fkeys _nc_tinfo_fkeys[];
1610e3d5408SPeter Wemm 
1620e3d5408SPeter Wemm 	/*
1630e3d5408SPeter Wemm 	 * The file comp_captab.c contains an array of these structures, one
1640e3d5408SPeter Wemm 	 * per possible capability.  These are indexed by a hash table array of
1650e3d5408SPeter Wemm 	 * pointers to the same structures for use by the parser.
1660e3d5408SPeter Wemm 	 */
1670e3d5408SPeter Wemm 
1680e3d5408SPeter Wemm struct name_table_entry
1690e3d5408SPeter Wemm {
1700e3d5408SPeter Wemm 	const char *nte_name;	/* name to hash on */
1710e3d5408SPeter Wemm 	int	nte_type;	/* BOOLEAN, NUMBER or STRING */
1720e3d5408SPeter Wemm 	short	nte_index;	/* index of associated variable in its array */
1730e3d5408SPeter Wemm 	short	nte_link;	/* index in table of next hash, or -1 */
1740e3d5408SPeter Wemm };
1750e3d5408SPeter Wemm 
1760e3d5408SPeter Wemm struct alias
1770e3d5408SPeter Wemm {
1780e3d5408SPeter Wemm 	const char	*from;
1790e3d5408SPeter Wemm 	const char	*to;
1800e3d5408SPeter Wemm 	const char	*source;
1810e3d5408SPeter Wemm };
1820e3d5408SPeter Wemm 
1830e3d5408SPeter Wemm extern const struct name_table_entry * const _nc_info_hash_table[];
1840e3d5408SPeter Wemm extern const struct name_table_entry * const _nc_cap_hash_table[];
1850e3d5408SPeter Wemm 
1860e3d5408SPeter Wemm extern const struct alias _nc_capalias_table[];
1870e3d5408SPeter Wemm extern const struct alias _nc_infoalias_table[];
1880e3d5408SPeter Wemm 
1890e3d5408SPeter Wemm extern const struct name_table_entry	*_nc_get_table(bool);
1900e3d5408SPeter Wemm extern const struct name_table_entry	* const *_nc_get_hash_table(bool);
1910e3d5408SPeter Wemm 
1920e3d5408SPeter Wemm #define NOTFOUND	((struct name_table_entry *) 0)
1930e3d5408SPeter Wemm 
1940e3d5408SPeter Wemm /* out-of-band values for representing absent capabilities */
1950e3d5408SPeter Wemm #define ABSENT_BOOLEAN		-1
1960e3d5408SPeter Wemm #define ABSENT_NUMERIC		-1
1970e3d5408SPeter Wemm #define ABSENT_STRING		(char *)0
1980e3d5408SPeter Wemm 
1990e3d5408SPeter Wemm /* out-of-band values for representing cancels */
2000e3d5408SPeter Wemm #define CANCELLED_BOOLEAN	(char)(-2)
2010e3d5408SPeter Wemm #define CANCELLED_NUMERIC	-2
2020e3d5408SPeter Wemm #define CANCELLED_STRING	(char *)-1
2030e3d5408SPeter Wemm 
2040e3d5408SPeter Wemm #define VALID_BOOLEAN(s) ((s) >= 0)
2050e3d5408SPeter Wemm #define VALID_NUMERIC(s) ((s) >= 0)
2060e3d5408SPeter Wemm #define VALID_STRING(s) ((s) != CANCELLED_STRING && (s) != ABSENT_STRING)
2070e3d5408SPeter Wemm 
2080e3d5408SPeter Wemm /* termcap entries longer than this may break old binaries */
2090e3d5408SPeter Wemm #define MAX_TERMCAP_LENGTH	1023
2100e3d5408SPeter Wemm 
2110e3d5408SPeter Wemm /* this is a documented limitation of terminfo */
2120e3d5408SPeter Wemm #define MAX_TERMINFO_LENGTH	4096
2130e3d5408SPeter Wemm 
2140e3d5408SPeter Wemm #ifndef TERMINFO
2150e3d5408SPeter Wemm #define TERMINFO "/usr/share/terminfo"
2160e3d5408SPeter Wemm #endif
2170e3d5408SPeter Wemm 
2180e3d5408SPeter Wemm /* comp_hash.c: name lookup */
2190e3d5408SPeter Wemm struct name_table_entry	const *_nc_find_entry(const char *,
2200e3d5408SPeter Wemm 				    const struct name_table_entry *const *);
2210e3d5408SPeter Wemm struct name_table_entry const *_nc_find_type_entry(const char *,
2220e3d5408SPeter Wemm 					 int,
2230e3d5408SPeter Wemm 					 const struct name_table_entry *);
2240e3d5408SPeter Wemm 
2250e3d5408SPeter Wemm /* comp_scan.c: lexical analysis */
2260e3d5408SPeter Wemm extern int  _nc_get_token(void);
2270e3d5408SPeter Wemm extern void _nc_push_token(int);
2280e3d5408SPeter Wemm extern void _nc_reset_input(FILE *, char *);
2290e3d5408SPeter Wemm extern void _nc_panic_mode(char);
2300e3d5408SPeter Wemm extern int _nc_curr_line;
2310e3d5408SPeter Wemm extern int _nc_curr_col;
2320e3d5408SPeter Wemm extern long _nc_curr_file_pos;
2330e3d5408SPeter Wemm extern long _nc_comment_start, _nc_comment_end;
2340e3d5408SPeter Wemm extern int _nc_syntax;
2350e3d5408SPeter Wemm extern long _nc_start_line;
2360e3d5408SPeter Wemm #define SYN_TERMINFO	0
2370e3d5408SPeter Wemm #define SYN_TERMCAP	1
2380e3d5408SPeter Wemm 
2390e3d5408SPeter Wemm /* comp_error.c: warning & abort messages */
2400e3d5408SPeter Wemm extern void _nc_set_source(const char *const name);
2410e3d5408SPeter Wemm extern void _nc_get_type(char *name);
2420e3d5408SPeter Wemm extern void _nc_set_type(const char *const name);
2430e3d5408SPeter Wemm extern void _nc_syserr_abort(const char *const,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
2440e3d5408SPeter Wemm extern void _nc_err_abort(const char *const,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
2450e3d5408SPeter Wemm extern void _nc_warning(const char *const,...) GCC_PRINTFLIKE(1,2);
2460e3d5408SPeter Wemm extern bool _nc_suppress_warnings;
2470e3d5408SPeter Wemm 
2480e3d5408SPeter Wemm /* comp_expand.c: expand string into readable form */
2490e3d5408SPeter Wemm extern char *_nc_tic_expand(const char *, bool, int);
2500e3d5408SPeter Wemm 
2510e3d5408SPeter Wemm /* comp_scan.c: decode string from readable form */
2520e3d5408SPeter Wemm extern char _nc_trans_string(char *);
2530e3d5408SPeter Wemm 
2540e3d5408SPeter Wemm /* captoinfo.c: capability conversion */
2550e3d5408SPeter Wemm extern char *_nc_captoinfo(const char *, const char *, int const);
2560e3d5408SPeter Wemm extern char *_nc_infotocap(const char *, const char *, int const);
2570e3d5408SPeter Wemm 
2580e3d5408SPeter Wemm /* lib_tputs.c */
2590e3d5408SPeter Wemm extern int _nc_nulls_sent;		/* Add one for every null sent */
2600e3d5408SPeter Wemm 
2610e3d5408SPeter Wemm /* comp_main.c: compiler main */
2620e3d5408SPeter Wemm extern const char *_nc_progname;
2630e3d5408SPeter Wemm 
2640e3d5408SPeter Wemm /* read_entry.c */
2650e3d5408SPeter Wemm extern const char *_nc_tic_dir(const char *);
2660e3d5408SPeter Wemm 
2670e3d5408SPeter Wemm /* write_entry.c */
2680e3d5408SPeter Wemm extern int _nc_tic_written(void);
2690e3d5408SPeter Wemm 
2700e3d5408SPeter Wemm #ifdef __cplusplus
2710e3d5408SPeter Wemm }
2720e3d5408SPeter Wemm #endif
2730e3d5408SPeter Wemm 
2740e3d5408SPeter Wemm #endif /* __TIC_H */
275