xref: /netbsd-src/usr.bin/xlint/lint2/lint2.h (revision 76dfffe33547c37f8bdd446e3e4ab0f3c16cea4b)
1 /*	$NetBSD: lint2.h,v 1.2 1995/07/03 21:24:49 cgd Exp $	*/
2 
3 /*
4  * Copyright (c) 1994, 1995 Jochen Pohl
5  * All Rights Reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Jochen Pohl for
18  *	The NetBSD Project.
19  * 4. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #include "lint.h"
35 
36 /*
37  * Types are described by structures of type type_t.
38  */
39 typedef	struct type {
40 	tspec_t	t_tspec;	/* type specifier */
41 	u_int	t_const : 1;	/* constant */
42 	u_int	t_volatile : 1;	/* volatile */
43 	u_int	t_vararg : 1;	/* function has variable number of arguments */
44 	u_int	t_isenum : 1;	/* enum type */
45 	u_int	t_proto : 1;	/* this is a prototype */
46 	u_int	t_istag : 1;	/* tag with _t_tag valid */
47 	u_int	t_istynam : 1;	/* tag with _t_tynam valid */
48 	union {
49 		int	_t_dim;		/* if the type is an ARRAY than this
50 					   is the dimension of the array. */
51 		struct	hte *_t_tag;	/* hash table entry of tag if
52 					   t_isenum, STRUCT or UNION */
53 		struct	hte *_t_tynam;	/* hash table entry of typename if
54 					   t_isenum, STRUCT or UNION */
55 		struct	type **_t_args;	/* list of argument types if this
56 					   is a prototype */
57 	} t_u;
58 	struct	type *t_subt;	/* indirected type (array element, pointed to
59 				   type, type of return value) */
60 } type_t;
61 
62 #define	t_dim	t_u._t_dim
63 #define	t_tag	t_u._t_tag
64 #define t_tynam	t_u._t_tynam
65 #define	t_args	t_u._t_args
66 
67 /*
68  * argument information
69  *
70  * Such a structure is created for each argument of a function call
71  * which is an integer constant or a constant string.
72  */
73 typedef	struct arginf {
74 	int	a_num;		/* # of argument (1..) */
75 	u_int	a_zero : 1;	/* argument is 0 */
76 	u_int	a_pcon : 1;	/* msb of argument is not set */
77 	u_int	a_ncon : 1;	/* msb of argument is set */
78 	u_int	a_fmt : 1;	/* a_fstrg points to format string */
79 	char	*a_fstrg;	/* format string */
80 	struct	arginf *a_nxt;	/* information for next const. argument */
81 } arginf_t;
82 
83 /*
84  * Keeps information about position in source file.
85  */
86 typedef	struct {
87 	u_short	p_src;		/* index of name of translation unit
88 				   (the name which was specified at the
89 				   command line) */
90 	u_short	p_line;		/* line number in p_src */
91 	u_short	p_isrc;		/* index of (included) file */
92 	u_short p_iline;	/* line number in p_iline */
93 } pos_t;
94 
95 /*
96  * Used for definitions and declarations
97  *
98  * To save memory, variable sized structures are used. If
99  * all s_va, s_prfl and s_scfl are not set, the memory allocated
100  * for a symbol is only large enough to keep the first member of
101  * struct sym, s_s.
102  */
103 typedef	struct sym {
104 	struct {
105 		pos_t	s_pos;		/* pos of def./decl. */
106 #ifndef lint
107 		u_int	s_def : 3;	/* DECL, TDEF or DEF */
108 #else
109 		def_t	s_def;
110 #endif
111 		u_int	s_rval : 1;	/* function has return value */
112 		u_int	s_osdef : 1;	/* old style function definition */
113 		u_int	s_static : 1;	/* symbol is static */
114 		u_int	s_va : 1;	/* check only first s_nva arguments */
115 		u_int	s_prfl : 1;	/* printflike */
116 		u_int	s_scfl : 1;	/* scanflike */
117 		u_short	s_type;		/* type */
118 		struct	sym *s_nxt;	/* next symbol with same name */
119 	} s_s;
120 	short	s_nva;
121 	short	s_nprfl;
122 	short	s_nscfl;
123 } sym_t;
124 
125 #define s_pos		s_s.s_pos
126 #define s_rval		s_s.s_rval
127 #define s_osdef		s_s.s_osdef
128 #define s_static	s_s.s_static
129 #define s_def		s_s.s_def
130 #define s_va		s_s.s_va
131 #define s_prfl		s_s.s_prfl
132 #define s_scfl		s_s.s_scfl
133 #define s_type		s_s.s_type
134 #define s_nxt		s_s.s_nxt
135 
136 /*
137  * Used to store informations about function calls.
138  */
139 typedef	struct fcall {
140 	pos_t	f_pos;		/* position of call */
141 	u_int	f_rused : 1;	/* return value used */
142 	u_int	f_rdisc : 1;	/* return value discarded (casted to void) */
143 	u_short	f_type;		/* types of expected return value and args */
144 	arginf_t *f_args;	/* information about constant arguments */
145 	struct	fcall *f_nxt;	/* next call of same function */
146 } fcall_t;
147 
148 /*
149  * Used to store information about usage of symbols other
150  * than for function calls.
151  */
152 typedef	struct usym {
153 	pos_t	u_pos;		/* position */
154 	struct	usym *u_nxt;	/* next usage */
155 } usym_t;
156 
157 /*
158  * hash table entry
159  */
160 typedef	struct hte {
161 	const	char *h_name;	/* name */
162 	u_int	h_used : 1;	/* symbol is used */
163 	u_int	h_def : 1;	/* symbol is defined */
164 	u_int	h_static : 1;	/* static symbol */
165 	sym_t	*h_syms;	/* declarations and definitions */
166 	sym_t	**h_lsym;	/* points to s_nxt of last decl./def. */
167 	fcall_t	*h_calls;	/* function calls */
168 	fcall_t	**h_lcall;	/* points to f_nxt of last call */
169 	usym_t	*h_usyms;	/* usage info */
170 	usym_t	**h_lusym;	/* points to u_nxt of last usage info */
171 	struct	hte *h_link;	/* next hte with same hash function */
172 } hte_t;
173 
174 /* maps type indices into pointers to type structs */
175 #define TP(idx)		(tlst[idx])
176 
177 #include "externs2.h"
178