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