2 ** LCLint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2001 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 lclint: lclint-request@cs.virginia.edu
21 ** To report a bug: lclint-bug@cs.virginia.edu
22 ** For more information: http://lclint.cs.virginia.edu
28 # include "lclintMacros.nf"
30 # include "mtgrammar.h"
32 static warnClause warnClause_createAux (/*@only@*/ fileloc loc,
33 /*@only@*/ flagSpec flag,
34 /*@only@*/ exprNode msg)
36 warnClause res = (warnClause) dmalloc (sizeof (*res));
45 extern warnClause warnClause_create (lltok tok, flagSpec flag, exprNode msg)
48 DPRINTF (("Create warn message: %s/ %s ",
49 flagSpec_unparse (flag), exprNode_unparse(msg)));
51 res = warnClause_createAux (lltok_stealLoc (tok),
57 extern flagSpec warnClause_getFlag (warnClause w)
62 extern cstring warnClause_unparse (warnClause w)
64 if (warnClause_isDefined (w))
66 return message ("<%q> %s",
67 flagSpec_unparse (w->flag), exprNode_unparse (w->msg));
71 return cstring_undefined;
75 extern bool warnClause_hasMessage (warnClause w)
77 return warnClause_isDefined (w) && exprNode_isDefined (w->msg)
78 && cstring_isDefined (multiVal_forceString (exprNode_getValue (w->msg)));
81 extern /*@observer@*/ cstring warnClause_getMessage (warnClause w)
83 if (warnClause_isDefined (w) && exprNode_isDefined (w->msg)) {
84 llassert (exprNode_knownStringValue (w->msg));
85 return multiVal_forceString (exprNode_getValue (w->msg));
87 return cstring_undefined;
92 extern void warnClause_free (warnClause w)
94 if (warnClause_isDefined (w))
96 flagSpec_free (w->flag);
97 exprNode_free (w->msg);
98 fileloc_free (w->loc);
104 warnClause_dump (warnClause wc)
106 cstring st = cstring_undefined;
108 llassert (!cstring_containsChar (warnClause_getMessage (wc), '#'));
110 if (warnClause_hasMessage (wc))
112 llassert (cstring_firstChar (warnClause_getMessage (wc)) != '.');
113 st = message ("%q#%s#", flagSpec_dump (wc->flag), warnClause_getMessage (wc));
117 st = message ("%q#.#", flagSpec_dump (wc->flag));
124 warnClause_undump (char **s)
130 DPRINTF (("Undump: %s", *s));
131 flag = flagSpec_undump (s);
132 DPRINTF (("Here: %s", *s));
133 reader_checkChar (s, '#');
134 DPRINTF (("Here: %s", *s));
136 if (reader_optCheckChar (s, '.'))
138 msg = cstring_undefined;
142 msg = reader_readUntil (s, '#');
145 DPRINTF (("Here: %s", *s));
146 reader_checkChar (s, '#');
148 emsg = exprNode_rawStringLiteral (msg, fileloc_copy (g_currentloc));
150 return warnClause_createAux (fileloc_copy (g_currentloc), flag, emsg);