Home | History | Annotate | Line # | Download | only in lint2
lint2.h revision 1.3.2.1
      1  1.3.2.1  thorpej /*	$NetBSD: lint2.h,v 1.3.2.1 1997/11/04 21:42:46 thorpej 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.3.2.1  thorpej 	struct  hte *h_hte;	/* pointer to other htes (for renames */
    183      1.1      cgd } hte_t;
    184      1.1      cgd 
    185      1.1      cgd /* maps type indices into pointers to type structs */
    186      1.1      cgd #define TP(idx)		(tlst[idx])
    187      1.1      cgd 
    188      1.1      cgd #include "externs2.h"
    189