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
27 ** based on list_template.c
29 ** where T has T_equal (or change this) and T_unparse
34 # include "splintMacros.nf"
38 /*@constant int enumNameListBASESIZE;@*/
39 # define enumNameListBASESIZE SMALLBASESIZE
42 enumNameList_new (void)
44 enumNameList s
= (enumNameList
) dmalloc (sizeof (*s
));
47 s
->nspace
= enumNameListBASESIZE
;
48 s
->elements
= (enumName
*)
49 dmalloc (sizeof (*s
->elements
) * enumNameListBASESIZE
);
54 /*@only@*/ enumNameList
55 enumNameList_single (/*@keep@*/ enumName t
)
57 enumNameList s
= (enumNameList
) dmalloc (sizeof (*s
));
60 s
->nspace
= enumNameListBASESIZE
- 1;
61 s
->elements
= (enumName
*) dmalloc (sizeof (*s
->elements
) * enumNameListBASESIZE
);
68 enumNameList_match (enumNameList e1
, enumNameList e2
)
72 if (e1
->nelements
!= e2
->nelements
) return FALSE
;
74 for (i
= 0; i
< e1
->nelements
; i
++)
76 if (!cstring_equal (e1
->elements
[i
], e2
->elements
[i
]))
83 enumNameList_grow (enumNameList s
)
86 enumName
*newelements
;
88 s
->nspace
+= enumNameListBASESIZE
;
89 newelements
= (enumName
*) dmalloc (sizeof (*newelements
) * (s
->nelements
+ s
->nspace
));
91 if (newelements
== (enumName
*) 0)
93 llfatalerror (cstring_makeLiteral ("enumNameList_grow: out of memory!"));
96 for (i
= 0; i
< s
->nelements
; i
++)
98 newelements
[i
] = s
->elements
[i
];
102 s
->elements
= newelements
;
106 enumNameList_addh (enumNameList s
, /*@keep@*/ enumName el
)
109 enumNameList_grow (s
);
112 s
->elements
[s
->nelements
] = el
;
117 enumNameList_push (/*@returned@*/ enumNameList s
, /*@only@*/ enumName el
)
119 enumNameList_addh (s
, el
);
124 /*@only@*/ enumNameList
125 enumNameList_copy (enumNameList s
)
127 enumNameList r
= enumNameList_new ();
129 enumNameList_elements (s
, x
)
131 enumNameList_addh (r
, cstring_copy (x
));
132 } end_enumNameList_elements
;
139 enumNameList_member (enumNameList s
, cstring m
)
141 enumNameList_elements (s
, x
)
143 if (cstring_equal (m
, x
)) return TRUE
;
144 } end_enumNameList_elements
;
149 /*@only@*/ enumNameList
150 enumNameList_subtract (enumNameList source
, enumNameList del
)
152 enumNameList ret
= enumNameList_new ();
154 enumNameList_elements (source
, el
)
156 if (!enumNameList_member (del
, el
))
158 enumNameList_addh (ret
, cstring_copy (el
));
160 } end_enumNameList_elements
;
166 enumNameList_unparse (enumNameList s
)
169 cstring st
= cstring_undefined
;
171 for (i
= 0; i
< s
->nelements
; i
++)
175 st
= cstring_copy (s
->elements
[i
]);
179 st
= message ("%q, %s", st
, s
->elements
[i
]);
186 cstring
enumNameList_unparseBrief (enumNameList s
)
189 cstring st
= cstring_undefined
;
191 for (i
= 0; i
< s
->nelements
; i
++)
195 st
= cstring_copy (s
->elements
[i
]);
197 else if (i
== 3 && s
->nelements
> 5)
199 st
= message ("%q, ...", st
);
200 i
= s
->nelements
- 2;
204 st
= message ("%q, %s", st
, s
->elements
[i
]);
212 enumNameList_dump (enumNameList s
)
215 cstring st
= cstring_undefined
;
217 for (i
= 0; i
< s
->nelements
; i
++)
221 st
= cstring_copy (s
->elements
[i
]);
224 st
= message ("%q,%s", st
, s
->elements
[i
]);
229 /*@only@*/ enumNameList
230 enumNameList_undump (d_char
*s
)
232 enumNameList e
= enumNameList_new ();
240 char *t
= strchr (*s
, ',');
245 t
= strchr (*s
, '}');
249 llcontbug (message ("enumNameList_undump: bad line: %s", cstring_fromChars (*s
)));
257 enumNameList_addh (e
, cstring_fromChars (mstring_copy (*s
)));
267 enumNameList_free (enumNameList s
)
272 for (i
= 0; i
< s
->nelements
; i
++)
274 cstring_free (s
->elements
[i
]);