lint2.h revision 1.1
1/*
2 * Copyright (c) 1994, 1995 Jochen Pohl
3 * All Rights Reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *      This product includes software developed by Jochen Pohl for
16 *	The NetBSD Project.
17 * 4. The name of the author may not be used to endorse or promote products
18 *    derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 *	$Id: lint2.h,v 1.1 1995/07/03 20:56:38 cgd Exp $
32 */
33
34#include "lint.h"
35
36/*
37 * Types are described by structures of type type_t.
38 */
39typedef	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 */
73typedef	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 */
86typedef	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 */
103typedef	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 */
139typedef	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 */
152typedef	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 */
160typedef	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