/* $NetBSD: lint2.h,v 1.5 2000/06/14 06:49:23 cgd Exp $ */

/*
 * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
 * Copyright (c) 1994, 1995 Jochen Pohl
 * All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by Jochen Pohl for
 *	The NetBSD Project.
 * 4. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "lint.h"

/*
 * Types are described by structures of type type_t.
 */
typedef	struct type {
	tspec_t	t_tspec;	/* type specifier */
	u_int	t_const : 1;	/* constant */
	u_int	t_volatile : 1;	/* volatile */
	u_int	t_vararg : 1;	/* function has variable number of arguments */
	u_int	t_isenum : 1;	/* enum type */
	u_int	t_proto : 1;	/* this is a prototype */
	u_int	t_istag : 1;	/* tag with _t_tag valid */
	u_int	t_istynam : 1;	/* tag with _t_tynam valid */
	u_int	t_isuniqpos : 1; /* tag with _t_uniqpos valid */
	union {
		int	_t_dim;		/* if the type is an ARRAY than this
					   is the dimension of the array. */
		struct	hte *_t_tag;	/* hash table entry of tag if
					   t_isenum, STRUCT or UNION */
		struct	hte *_t_tynam;	/* hash table entry of typename if
					   t_isenum, STRUCT or UNION */
		struct {
			int p_line;
			short p_file;
			int p_uniq;
		} _t_uniqpos;		/* unique position, for untagged
					   untyped STRUCTs, UNIONS, and ENUMs,
					   if t_isuniqpos */
		struct	type **_t_args;	/* list of argument types if this
					   is a prototype */
	} t_u;
	struct	type *t_subt;	/* indirected type (array element, pointed to
				   type, type of return value) */
} type_t;

#define	t_dim		t_u._t_dim
#define	t_tag		t_u._t_tag
#define	t_tynam		t_u._t_tynam
#define	t_uniqpos	t_u._t_uniqpos
#define	t_args		t_u._t_args

/*
 * argument information
 *
 * Such a structure is created for each argument of a function call
 * which is an integer constant or a constant string.
 */
typedef	struct arginf {
	int	a_num;		/* # of argument (1..) */
	u_int	a_zero : 1;	/* argument is 0 */
	u_int	a_pcon : 1;	/* msb of argument is not set */
	u_int	a_ncon : 1;	/* msb of argument is set */
	u_int	a_fmt : 1;	/* a_fstrg points to format string */
	char	*a_fstrg;	/* format string */
	struct	arginf *a_nxt;	/* information for next const. argument */
} arginf_t;

/*
 * Keeps information about position in source file.
 */
typedef	struct {
	u_short	p_src;		/* index of name of translation unit
				   (the name which was specified at the
				   command line) */
	u_short	p_line;		/* line number in p_src */
	u_short	p_isrc;		/* index of (included) file */
	u_short p_iline;	/* line number in p_iline */
} pos_t;

/*
 * Used for definitions and declarations
 *
 * To save memory, variable sized structures are used. If
 * all s_va, s_prfl and s_scfl are not set, the memory allocated
 * for a symbol is only large enough to keep the first member of
 * struct sym, s_s.
 */
typedef	struct sym {
	struct {
		pos_t	s_pos;		/* pos of def./decl. */
#ifndef lint
		u_int	s_def : 3;	/* DECL, TDEF or DEF */
#else
		def_t	s_def;
#endif
		u_int	s_rval : 1;	/* function has return value */
		u_int	s_osdef : 1;	/* old style function definition */
		u_int	s_static : 1;	/* symbol is static */
		u_int	s_va : 1;	/* check only first s_nva arguments */
		u_int	s_prfl : 1;	/* printflike */
		u_int	s_scfl : 1;	/* scanflike */
		u_short	s_type;		/* type */
		struct	sym *s_nxt;	/* next symbol with same name */
	} s_s;
	short	s_nva;
	short	s_nprfl;
	short	s_nscfl;
} sym_t;

#define s_pos		s_s.s_pos
#define s_rval		s_s.s_rval
#define s_osdef		s_s.s_osdef
#define s_static	s_s.s_static
#define s_def		s_s.s_def
#define s_va		s_s.s_va
#define s_prfl		s_s.s_prfl
#define s_scfl		s_s.s_scfl
#define s_type		s_s.s_type
#define s_nxt		s_s.s_nxt

/*
 * Used to store informations about function calls.
 */
typedef	struct fcall {
	pos_t	f_pos;		/* position of call */
	u_int	f_rused : 1;	/* return value used */
	u_int	f_rdisc : 1;	/* return value discarded (casted to void) */
	u_short	f_type;		/* types of expected return value and args */
	arginf_t *f_args;	/* information about constant arguments */
	struct	fcall *f_nxt;	/* next call of same function */
} fcall_t;

/*
 * Used to store information about usage of symbols other
 * than for function calls.
 */
typedef	struct usym {
	pos_t	u_pos;		/* position */
	struct	usym *u_nxt;	/* next usage */
} usym_t;

/*
 * hash table entry
 */
typedef	struct hte {
	const	char *h_name;	/* name */
	u_int	h_used : 1;	/* symbol is used */
	u_int	h_def : 1;	/* symbol is defined */
	u_int	h_static : 1;	/* static symbol */
	sym_t	*h_syms;	/* declarations and definitions */
	sym_t	**h_lsym;	/* points to s_nxt of last decl./def. */
	fcall_t	*h_calls;	/* function calls */
	fcall_t	**h_lcall;	/* points to f_nxt of last call */
	usym_t	*h_usyms;	/* usage info */
	usym_t	**h_lusym;	/* points to u_nxt of last usage info */
	struct	hte *h_link;	/* next hte with same hash function */
	struct  hte *h_hte;	/* pointer to other htes (for renames */
} hte_t;

/* maps type indices into pointers to type structs */
#define TP(idx)		(tlst[idx])

#include "externs2.h"
