tic.h revision 76726
1/****************************************************************************
2 * Copyright (c) 1998-2000 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 <zmbenhal@netcom.com> 1992,1995               *
31 *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
32 ****************************************************************************/
33
34/*
35 * $Id: tic.h,v 1.38 2001/03/11 15:12:08 tom Exp $
36 *	tic.h - Global variables and structures for the terminfo
37 *			compiler.
38 */
39
40#ifndef __TIC_H
41#define __TIC_H
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47#include <curses.h>	/* for the _tracef() prototype, ERR/OK, bool defs */
48
49/*
50** The format of compiled terminfo files is as follows:
51**
52**		Header (12 bytes), containing information given below
53**		Names Section, containing the names of the terminal
54**		Boolean Section, containing the values of all of the
55**				boolean capabilities
56**				A null byte may be inserted here to make
57**				sure that the Number Section begins on an
58**				even word boundary.
59**		Number Section, containing the values of all of the numeric
60**				capabilities, each as a short integer
61**		String Section, containing short integer offsets into the
62**				String Table, one per string capability
63**		String Table, containing the actual characters of the string
64**				capabilities.
65**
66**	NOTE that all short integers in the file are stored using VAX/PDP-style
67**	byte-order, i.e., least-significant byte first.
68**
69**	There is no structure definition here because it would only confuse
70**	matters.  Terminfo format is a raw byte layout, not a structure
71**	dump.  If you happen to be on a little-endian machine with 16-bit
72**	shorts that requires no padding between short members in a struct,
73**	then there is a natural C structure that captures the header, but
74**	not very helpfully.
75*/
76
77#define MAGIC		0432	/* first two bytes of a compiled entry */
78
79/*
80 * The "maximum" here is misleading; XSI guarantees minimum values, which a
81 * given implementation may exceed.
82 */
83#define MAX_NAME_SIZE	512	/* maximum legal name field size (XSI:127) */
84#define MAX_ENTRY_SIZE	4096	/* maximum legal entry size */
85
86/* The maximum size of individual name or alias is guaranteed in XSI to
87 * be 14, since that corresponds to the older filename lengths.  Newer
88 * systems allow longer aliases, though not many terminal descriptions
89 * are written to use them.
90 */
91#if HAVE_LONG_FILE_NAMES
92#define MAX_ALIAS	32	/* POSIX minimum for PATH_MAX */
93#else
94#define MAX_ALIAS	14	/* SVr3 filename length */
95#endif
96
97/* location of user's personal info directory */
98#define PRIVATE_INFO	"%s/.terminfo"	/* plug getenv("HOME") into %s */
99
100/*
101 * Some traces are designed to be used via tic's verbose option (and similar in
102 * infocmp and toe) rather than the 'trace()' function.  So we use the bits
103 * above the normal trace() parameter as a debug-level.
104 */
105
106#define MAX_DEBUG_LEVEL 15
107#define DEBUG_LEVEL(n)	((n) << 12)	/* see TRACE_MAXIMUM */
108
109#define set_trace_level(n) \
110 	_nc_tracing &= DEBUG_LEVEL(MAX_DEBUG_LEVEL), \
111	_nc_tracing |= DEBUG_LEVEL(n)
112
113#ifdef TRACE
114#define DEBUG(n, a)	if (_nc_tracing >= DEBUG_LEVEL(n)) _tracef a
115#else
116#define DEBUG(n, a)	/*nothing*/
117#endif
118
119extern NCURSES_EXPORT_VAR(unsigned) _nc_tracing;
120extern NCURSES_EXPORT(void) _nc_tracef (char *, ...) GCC_PRINTFLIKE(1,2);
121extern NCURSES_EXPORT(const char *) _nc_visbuf (const char *);
122
123/*
124 * These are the types of tokens returned by the scanner.  The first
125 * three are also used in the hash table of capability names.  The scanner
126 * returns one of these values after loading the specifics into the global
127 * structure curr_token.
128 */
129
130#define BOOLEAN 0		/* Boolean capability */
131#define NUMBER 1		/* Numeric capability */
132#define STRING 2		/* String-valued capability */
133#define CANCEL 3		/* Capability to be cancelled in following tc's */
134#define NAMES  4		/* The names for a terminal type */
135#define UNDEF  5		/* Undefined */
136
137#define NO_PUSHBACK	-1	/* used in pushtype to indicate no pushback */
138
139	/*
140	 *	The global structure in which the specific parts of a
141	 *	scanned token are returned.
142	 *
143	 */
144
145struct token
146{
147	char	*tk_name;		/* name of capability */
148	int	tk_valnumber;	/* value of capability (if a number) */
149	char	*tk_valstring;	/* value of capability (if a string) */
150};
151
152extern NCURSES_EXPORT_VAR(struct token)	_nc_curr_token;
153
154	/*
155	 * List of keynames with their corresponding code.
156	 */
157struct kn {
158	const char *name;
159	int code;
160};
161
162extern NCURSES_EXPORT_VAR(const struct kn) _nc_key_names[];
163
164	/*
165	 * Offsets to string capabilities, with the corresponding functionkey
166	 * codes.
167	 */
168struct tinfo_fkeys {
169	unsigned offset;
170	chtype code;
171	};
172
173#if	BROKEN_LINKER
174
175#define	_nc_tinfo_fkeys	_nc_tinfo_fkeysf()
176extern NCURSES_EXPORT(struct tinfo_fkeys *) _nc_tinfo_fkeysf (void);
177
178#else
179
180extern NCURSES_EXPORT_VAR(struct tinfo_fkeys) _nc_tinfo_fkeys[];
181
182#endif
183
184	/*
185	 * The file comp_captab.c contains an array of these structures, one
186	 * per possible capability.  These are indexed by a hash table array of
187	 * pointers to the same structures for use by the parser.
188	 */
189
190struct name_table_entry
191{
192	const char *nte_name;	/* name to hash on */
193	int	nte_type;	/* BOOLEAN, NUMBER or STRING */
194	short	nte_index;	/* index of associated variable in its array */
195	short	nte_link;	/* index in table of next hash, or -1 */
196};
197
198struct alias
199{
200	const char	*from;
201	const char	*to;
202	const char	*source;
203};
204
205extern NCURSES_EXPORT_VAR(int) _nc_tparm_err;
206
207extern NCURSES_EXPORT_VAR(const struct name_table_entry * const) _nc_info_hash_table[];
208extern NCURSES_EXPORT_VAR(const struct name_table_entry * const) _nc_cap_hash_table[];
209
210extern NCURSES_EXPORT_VAR(const struct alias) _nc_capalias_table[];
211extern NCURSES_EXPORT_VAR(const struct alias) _nc_infoalias_table[];
212
213extern NCURSES_EXPORT(const struct name_table_entry *) _nc_get_table (bool);
214extern NCURSES_EXPORT(const struct name_table_entry * const *) _nc_get_hash_table (bool);
215
216#define NOTFOUND	((struct name_table_entry *) 0)
217
218/* out-of-band values for representing absent capabilities */
219#define ABSENT_BOOLEAN		-1
220#define ABSENT_NUMERIC		-1
221#define ABSENT_STRING		(char *)0
222
223/* out-of-band values for representing cancels */
224#define CANCELLED_BOOLEAN	(char)(-2)
225#define CANCELLED_NUMERIC	-2
226#define CANCELLED_STRING	(char *)-1
227
228#define VALID_BOOLEAN(s) ((s) >= 0)
229#define VALID_NUMERIC(s) ((s) >= 0)
230#define VALID_STRING(s) ((s) != CANCELLED_STRING && (s) != ABSENT_STRING)
231
232/* termcap entries longer than this may break old binaries */
233#define MAX_TERMCAP_LENGTH	1023
234
235/* this is a documented limitation of terminfo */
236#define MAX_TERMINFO_LENGTH	4096
237
238#ifndef TERMINFO
239#define TERMINFO "/usr/share/terminfo"
240#endif
241
242/* access.c */
243extern NCURSES_EXPORT(char *) _nc_basename (char *);
244
245/* comp_hash.c: name lookup */
246extern NCURSES_EXPORT(struct name_table_entry const *) _nc_find_entry
247	(const char *, const struct name_table_entry *const *);
248extern NCURSES_EXPORT(struct name_table_entry const *) _nc_find_type_entry
249	(const char *, int, const struct name_table_entry *);
250
251/* comp_scan.c: lexical analysis */
252extern NCURSES_EXPORT(int)  _nc_get_token (bool);
253extern NCURSES_EXPORT(void) _nc_panic_mode (char);
254extern NCURSES_EXPORT(void) _nc_push_token (int);
255extern NCURSES_EXPORT(void) _nc_reset_input (FILE *, char *);
256extern NCURSES_EXPORT_VAR(int) _nc_curr_col;
257extern NCURSES_EXPORT_VAR(int) _nc_curr_line;
258extern NCURSES_EXPORT_VAR(int) _nc_syntax;
259extern NCURSES_EXPORT_VAR(long) _nc_comment_end;
260extern NCURSES_EXPORT_VAR(long) _nc_comment_start;
261extern NCURSES_EXPORT_VAR(long) _nc_curr_file_pos;
262extern NCURSES_EXPORT_VAR(long) _nc_start_line;
263#define SYN_TERMINFO	0
264#define SYN_TERMCAP	1
265
266/* comp_error.c: warning & abort messages */
267extern NCURSES_EXPORT(void) _nc_set_source (const char *const name);
268extern NCURSES_EXPORT(void) _nc_get_type (char *name);
269extern NCURSES_EXPORT(void) _nc_set_type (const char *const name);
270extern NCURSES_EXPORT(void) _nc_syserr_abort (const char *const,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
271extern NCURSES_EXPORT(void) _nc_err_abort (const char *const,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
272extern NCURSES_EXPORT(void) _nc_warning (const char *const,...) GCC_PRINTFLIKE(1,2);
273extern NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings;
274
275/* comp_expand.c: expand string into readable form */
276extern NCURSES_EXPORT(char *) _nc_tic_expand (const char *, bool, int);
277
278/* comp_scan.c: decode string from readable form */
279extern NCURSES_EXPORT(char) _nc_trans_string (char *, char *);
280
281/* captoinfo.c: capability conversion */
282extern NCURSES_EXPORT(char *) _nc_captoinfo (const char *, const char *, int const);
283extern NCURSES_EXPORT(char *) _nc_infotocap (const char *, const char *, int const);
284
285/* lib_tputs.c */
286extern NCURSES_EXPORT_VAR(int) _nc_nulls_sent;		/* Add one for every null sent */
287
288/* comp_main.c: compiler main */
289extern const char * _nc_progname;
290
291/* read_entry.c */
292extern NCURSES_EXPORT(const char *) _nc_tic_dir (const char *);
293
294/* write_entry.c */
295extern NCURSES_EXPORT(int) _nc_tic_written (void);
296
297#ifdef __cplusplus
298}
299#endif
300
301#endif /* __TIC_H */
302