Some consistency changes to library & headers flags.
[splint-patched.git] / src / typeIdSet.c
blob0bfb0369a6200679ad4001ea572d397de9f5198b
1 /*
2 ** Splint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2003 University of Virginia,
4 ** Massachusetts Institute of Technology
5 **
6 ** This program is free software; you can redistribute it and/or modify it
7 ** under the terms of the GNU General Public License as published by the
8 ** Free Software Foundation; either version 2 of the License, or (at your
9 ** option) any later version.
10 **
11 ** This program is distributed in the hope that it will be useful, but
12 ** WITHOUT ANY WARRANTY; without even the implied warranty of
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ** General Public License for more details.
15 **
16 ** The GNU General Public License is available from http://www.gnu.org/ or
17 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18 ** MA 02111-1307, USA.
20 ** For information on splint: info@splint.org
21 ** To report a bug: splint-bug@splint.org
22 ** For more information: http://www.splint.org
25 ** typeIdSet.c
28 # include "splintMacros.nf"
29 # include "basic.h"
31 /*@constant int TISTABLEBASESIZE;@*/
32 # define TISTABLEBASESIZE LARGEBASESIZE
34 static int tistableentries = 0;
35 static int tistablefree = 0;
36 typedef /*@only@*/ usymIdSet o_usymIdSet;
37 static /*@only@*/ o_usymIdSet *tistable;
38 static void tistable_addDirectEntry (/*@only@*/ usymIdSet p_s)
39 /*@modifies tistable, tistableentries, tistablefree@*/;
41 void typeIdSet_initMod (void)
42 /*@globals undef tistable;@*/
43 /*@modifies tistable, tistablefree;@*/
45 llassert (tistableentries == 0 && tistablefree == 0);
47 tistablefree = TISTABLEBASESIZE;
48 tistable = (usymIdSet *) dmalloc (sizeof (tistable) * tistablefree);
49 tistable[0] = usymIdSet_undefined;
50 tistableentries = 1;
51 tistablefree--;
54 void typeIdSet_destroyMod (void)
55 /*@globals killed tistable, tistableentries@*/
57 int i;
59 for (i = 0; i < tistableentries; i++)
61 usymIdSet_free (tistable[i]);
64 sfree (tistable);
65 tistableentries = 0;
68 void typeIdSet_dumpTable (FILE *fout)
70 int i;
73 ** Don't dump 0th entry
76 for (i = 1; i < tistableentries; i++)
78 cstring s = usymIdSet_dump (tistable[i]);
80 fprintf (fout, "%s\n", cstring_toCharsSafe (s));
81 cstring_free (s);
85 # if 0
86 static /*@unused@*/ void tistable_printOut (void)
88 int i;
91 ** Don't dump 0th entry
94 for (i = 1; i < tistableentries; i++)
96 cstring s = usymIdSet_unparse (tistable[i]);
98 fprintf (g_warningstream, "%d: %s\n", i, cstring_toCharsSafe (s));
99 cstring_free (s);
102 # endif
104 void typeIdSet_loadTable (FILE *fin)
106 char *s = mstring_create (MAX_DUMP_LINE_LENGTH);
107 char *os = s;
109 llassert (tistableentries == 1);
111 s = reader_readLine (fin, s, MAX_DUMP_LINE_LENGTH);
113 while (s != NULL && *s != ';')
115 usymIdSet u = usymIdSet_undump (&s);
117 llassert (*s == '\0' || *s == '\n');
119 tistable_addDirectEntry (u);
120 s = reader_readLine (fin, os, MAX_DUMP_LINE_LENGTH);
124 static void tistable_grow (void)
126 o_usymIdSet *oldtable = tistable;
127 int newsize = tistableentries + TISTABLEBASESIZE;
128 int i;
130 llassert (tistablefree == 0);
132 tistable = (usymIdSet *) dmalloc (sizeof (tistable) * newsize);
134 for (i = 0; i < tistableentries; i++)
136 tistable[i] = oldtable[i];
139 tistablefree = TISTABLEBASESIZE;
140 sfree (oldtable);
143 static void tistable_addDirectEntry (/*@only@*/ usymIdSet s)
145 if (tistablefree == 0)
147 tistable_grow ();
150 tistable[tistableentries] = s;
151 tistableentries++;
152 tistablefree--;
155 static int tistable_addEntry (/*@only@*/ usymIdSet s)
157 int i;
160 for (i = 0; i < tistableentries; i++)
162 if (usymIdSet_compare (tistable[i], s) == 0)
164 /*@access usymIdSet@*/
165 llassert (i == 0 || s != tistable[i]);
166 /*@noaccess usymIdSet@*/
168 usymIdSet_free (s);
169 return i;
173 tistable_addDirectEntry (s);
174 return (tistableentries - 1);
177 static /*@observer@*/ usymIdSet tistable_fetch (typeIdSet t)
178 /*@globals tistableentries, tistable@*/
179 /*@modifies nothing;@*/
181 llassert (t >= 0 && t < tistableentries);
183 return tistable[t];
186 typeIdSet typeIdSet_emptySet (void)
188 if (tistableentries == 0)
190 int val = tistable_addEntry (usymIdSet_new ());
192 llassert (val == 0);
195 llassert (usymIdSet_isUndefined (tistable[0]));
196 return 0;
199 bool typeIdSet_member (typeIdSet t, typeId el)
201 usymIdSet u = tistable_fetch (t);
202 return usymIdSet_member (u, typeId_toUsymId (el));
205 bool typeIdSet_isEmpty (typeIdSet t)
207 return (t == 0);
210 typeIdSet typeIdSet_single (typeId t)
212 return (tistable_addEntry (usymIdSet_single (typeId_toUsymId (t))));
215 typeIdSet typeIdSet_singleOpt (typeId t)
217 if (typeId_isValid (t))
219 return (tistable_addEntry (usymIdSet_single (typeId_toUsymId (t))));
221 else
223 return typeIdSet_empty;
227 typeIdSet typeIdSet_insert (typeIdSet t, typeId el)
229 usymIdSet u = tistable_fetch (t);
231 if (usymIdSet_member (u, typeId_toUsymId (el)))
233 return t;
235 else
237 return (tistable_addEntry (usymIdSet_add (u, typeId_toUsymId (el))));
241 typeIdSet typeIdSet_removeFresh (typeIdSet t, typeId el)
243 return (tistable_addEntry (usymIdSet_removeFresh (tistable_fetch (t), typeId_toUsymId (el))));
246 cstring typeIdSet_unparse (typeIdSet t)
248 return (usymIdSet_unparse (tistable_fetch (t)));
251 int typeIdSet_compare (typeIdSet t1, typeIdSet t2)
253 return (int_compare (t1, t2));
256 typeIdSet typeIdSet_subtract (typeIdSet s, typeIdSet t)
258 if (typeIdSet_isEmpty (t))
260 return s;
262 else
264 return (tistable_addEntry (usymIdSet_subtract (tistable_fetch (s),
265 tistable_fetch (t))));
269 cstring typeIdSet_dump (typeIdSet t)
271 return (message ("%d", t));
274 typeIdSet typeIdSet_undump (char **s)
276 int i;
279 i = reader_getInt (s);
281 llassert (i >= 0 && i < tistableentries);
282 return (typeIdSet) i;
285 typeIdSet typeIdSet_union (typeIdSet t1, typeIdSet t2)
287 if (t1 == typeIdSet_undefined)
289 return t2;
291 else if (t2 == typeIdSet_undefined)
293 return t1;
295 else
297 return (tistable_addEntry (usymIdSet_newUnion (tistable_fetch (t1),
298 tistable_fetch (t2))));