Initial import from FreeBSD RELENG_4:
[dragonfly.git] / usr.bin / xlint / lint2 / lint2.h
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"