/*
** Splint - annotation-assisted static program checker
-** Copyright (C) 1994-2002 University of Virginia,
+** Copyright (C) 1994-2003 University of Virginia,
** Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
# include "splintMacros.nf"
# include "basic.h"
-static qual qual_createPlainAux (int i)
+static qual qual_createPlainAux (int i) /*@*/
{
qual res = (qual) dmalloc (sizeof (*res));
res->kind = (quenum) i;
return res;
}
-extern qual qual_createPlain (quenum q)
+static qual qtable[QU_LAST];
+static bool isinit = FALSE;
+
+extern void qual_initMod (void)
{
- static bool isinit = FALSE;
- static qual qtable[QU_LAST];
+ int i = (int) QU_UNKNOWN;
+ llassert (!isinit);
+
+ while (i < (int) QU_LAST) {
+ qtable[i] = qual_createPlainAux (i);
+ i++;
+ }
+
+ isinit = TRUE;
+}
- if (!isinit) {
- int i = (int) QU_UNKNOWN;
+static void qual_free (qual p_q) ;
+
+extern void qual_destroyMod (void)
+{
+ if (isinit)
+ {
+ int i = (int) QU_UNKNOWN;
+ isinit = FALSE;
- while (i < (int) QU_LAST) {
- qtable[i] = qual_createPlainAux (i);
- i++;
+ while (i < (int) QU_LAST) {
+ qual_free (qtable[i]);
+ i++;
+ }
}
+}
- isinit = TRUE;
- }
+static void qual_free (qual q)
+{
+ llassert (!isinit);
+ sfree (q);
+}
+extern qual qual_createPlain (quenum q)
+{
+ llassert (isinit);
llassert (q != QU_USERANNOT && q < QU_LAST);
return qtable[(int) q];
}
{
case QU_UNKNOWN: return cstring_makeLiteralTemp ("unknown");
case QU_ABSTRACT: return cstring_makeLiteralTemp ("abstract");
+ case QU_NUMABSTRACT:return cstring_makeLiteralTemp ("numabstract");
case QU_CONCRETE: return cstring_makeLiteralTemp ("concrete");
case QU_MUTABLE: return cstring_makeLiteralTemp ("mutable");
case QU_IMMUTABLE: return cstring_makeLiteralTemp ("immutable");
BADEXIT;
}
+qual qual_abstractFromCodeChar (char c)
+{
+ switch (c) {
+ case '-': return qual_createUnknown ();
+ case 'a': return qual_createAbstract ();
+ case 'n': return qual_createNumAbstract ();
+ case 'c': return qual_createConcrete ();
+ BADDEFAULT;
+ }
+}
+
+char qual_abstractCode (qual q)
+{
+ switch (q->kind) {
+ case QU_UNKNOWN: return '-';
+ case QU_ABSTRACT: return 'a';
+ case QU_NUMABSTRACT: return 'n';
+ case QU_CONCRETE: return 'c';
+ BADDEFAULT;
+ }
+}
+
extern bool qual_match (qual q1, qual q2)
{
if (q1->kind == q2->kind) {
return q->info;
}
-/* Cannot call qual_create after this... */
-
-# if 0
-static void qual_free (qual q)
-{
- llassert (FALSE);
- sfree (q);
-}
-# endif
-
extern cstring qual_dump (qual q)
{
+ llassert (isinit);
+
if (q->kind == QU_USERANNOT)
{
return message ("%d.%s",
extern qual qual_undump (char **s)
{
quenum q = (quenum) reader_getInt (s);
+ llassert (isinit);
if (q == QU_USERANNOT)
{