2 ** Splint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2003 University of Virginia,
4 ** Massachusetts Institute of Technology
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.
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.
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
28 # include "splintMacros.nf"
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
;
54 void typeIdSet_destroyMod (void)
55 /*@globals killed tistable, tistableentries@*/
59 for (i
= 0; i
< tistableentries
; i
++)
61 usymIdSet_free (tistable
[i
]);
68 void typeIdSet_dumpTable (FILE *fout
)
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
));
86 static /*@unused@*/ void tistable_printOut (void)
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
));
104 void typeIdSet_loadTable (FILE *fin
)
106 char *s
= mstring_create (MAX_DUMP_LINE_LENGTH
);
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
;
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
;
143 static void tistable_addDirectEntry (/*@only@*/ usymIdSet s
)
145 if (tistablefree
== 0)
150 tistable
[tistableentries
] = s
;
155 static int tistable_addEntry (/*@only@*/ usymIdSet s
)
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@*/
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
);
186 typeIdSet
typeIdSet_emptySet (void)
188 if (tistableentries
== 0)
190 int val
= tistable_addEntry (usymIdSet_new ());
195 llassert (usymIdSet_isUndefined (tistable
[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
)
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
))));
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
)))
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
))
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
)
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
)
291 else if (t2
== typeIdSet_undefined
)
297 return (tistable_addEntry (usymIdSet_newUnion (tistable_fetch (t1
),
298 tistable_fetch (t2
))));