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
25 ** mtDeclarationPiece.c
28 # include "lclintMacros.nf"
30 # include "mtgrammar.h"
32 static mtDeclarationPiece
33 mtDeclarationPiece_create (mtPieceKind kind, /*@null@*/ /*@only@*/ void *node)
35 mtDeclarationPiece res = (mtDeclarationPiece) dmalloc (sizeof (*res));
43 extern mtDeclarationPiece mtDeclarationPiece_createContext (mtContextNode node) /*@*/
45 return mtDeclarationPiece_create (MTP_CONTEXT, (void *) node);
48 extern mtDeclarationPiece mtDeclarationPiece_createValues (mtValuesNode node) /*@*/
50 return mtDeclarationPiece_create (MTP_VALUES, (void *) node);
53 extern mtDeclarationPiece mtDeclarationPiece_createDefaults (mtDefaultsNode node) /*@*/
55 return mtDeclarationPiece_create (MTP_DEFAULTS, (void *) node);
58 extern mtDeclarationPiece mtDeclarationPiece_createValueDefault (mttok node) /*@*/
60 llassert (mttok_isIdentifier (node));
61 return mtDeclarationPiece_create (MTP_DEFAULTVALUE, (void *) node);
64 extern mtDeclarationPiece mtDeclarationPiece_createAnnotations (mtAnnotationsNode node) /*@*/
66 return mtDeclarationPiece_create (MTP_ANNOTATIONS, (void *) node);
69 extern mtDeclarationPiece mtDeclarationPiece_createMerge (mtMergeNode node) /*@*/
71 return mtDeclarationPiece_create (MTP_MERGE, (void *) node);
74 extern mtDeclarationPiece mtDeclarationPiece_createTransfers (mtTransferClauseList node) /*@*/
76 return mtDeclarationPiece_create (MTP_TRANSFERS, (void *) node);
79 extern mtDeclarationPiece mtDeclarationPiece_createPreconditions (mtTransferClauseList node) /*@*/
81 return mtDeclarationPiece_create (MTP_PRECONDITIONS, (void *) node);
84 mtDeclarationPiece mtDeclarationPiece_createPostconditions (mtTransferClauseList node) /*@*/
86 return mtDeclarationPiece_create (MTP_POSTCONDITIONS, (void *) node);
89 mtDeclarationPiece mtDeclarationPiece_createLosers (mtLoseReferenceList node) /*@*/
91 return mtDeclarationPiece_create (MTP_LOSERS, (void *) node);
94 /*@only@*/ cstring mtDeclarationPiece_unparse (mtDeclarationPiece p)
96 if (mtDeclarationPiece_isUndefined (p))
98 return cstring_undefined;
104 /*@access mtContextNode@*/
105 return mtContextNode_unparse ((mtContextNode) p->node);
106 /*@noaccess mtContextNode@*/
108 /*@access mtValuesNode@*/
109 return mtValuesNode_unparse ((mtValuesNode) p->node);
110 /*@noaccess mtValuesNode@*/
112 /*@access mtDefaultsNode@*/
113 return mtDefaultsNode_unparse ((mtDefaultsNode) p->node);
114 /*@noaccess mtDefaultsNode@*/
115 case MTP_DEFAULTVALUE:
117 return message ("default %q", mttok_getText ((mttok) p->node));
119 case MTP_ANNOTATIONS:
120 /*@access mtAnnotationsNode@*/
121 return mtAnnotationsNode_unparse ((mtAnnotationsNode) p->node);
122 /*@noaccess mtAnnotationsNode@*/
124 /*@access mtMergeNode@*/
125 return mtMergeNode_unparse ((mtMergeNode) p->node);
126 /*@noaccess mtMergeNode@*/
128 case MTP_PRECONDITIONS:
129 case MTP_POSTCONDITIONS:
130 /*@access mtTransferClauseList@*/
131 return mtTransferClauseList_unparse ((mtTransferClauseList) p->node);
132 /*@noaccess mtTransferClauseList@*/
134 /*@access mtLoseReferenceList@*/
135 return mtLoseReferenceList_unparse ((mtLoseReferenceList) p->node);
136 /*@noaccess mtLoseReferenceList@*/
138 return cstring_makeLiteral ("Dead Piece");
144 extern bool mtDeclarationPiece_matchKind (mtDeclarationPiece p, mtPieceKind kind) /*@*/
146 if (mtDeclarationPiece_isDefined (p))
148 return (p->kind == kind);
156 extern mtContextNode mtDeclarationPiece_getContext (mtDeclarationPiece node)
158 llassert (mtDeclarationPiece_isDefined (node));
159 llassert (node->kind == MTP_CONTEXT);
162 return (mtContextNode) node->node;
166 extern mtContextNode mtDeclarationPiece_stealContext (mtDeclarationPiece node)
170 llassert (mtDeclarationPiece_isDefined (node));
171 llassert (node->kind == MTP_CONTEXT);
174 res = (mtContextNode) node->node;
176 node->kind = MTP_DEAD;
181 extern mtDefaultsNode mtDeclarationPiece_getDefaults (mtDeclarationPiece node)
183 llassert (mtDeclarationPiece_isDefined (node));
184 llassert (node->kind == MTP_DEFAULTS);
187 return (mtDefaultsNode) node->node;
191 extern cstring mtDeclarationPiece_getDefaultValue (mtDeclarationPiece node)
193 llassert (mtDeclarationPiece_isDefined (node));
194 llassert (node->kind == MTP_DEFAULTVALUE);
197 return mttok_observeText ((mttok) node->node);
201 extern mtAnnotationsNode mtDeclarationPiece_getAnnotations (mtDeclarationPiece node)
203 llassert (mtDeclarationPiece_isDefined (node));
204 llassert (node->kind == MTP_ANNOTATIONS);
207 return (mtAnnotationsNode) node->node;
211 extern mtMergeNode mtDeclarationPiece_getMerge (mtDeclarationPiece node)
213 llassert (mtDeclarationPiece_isDefined (node));
214 llassert (node->kind == MTP_MERGE);
217 return (mtMergeNode) node->node;
221 extern mtTransferClauseList mtDeclarationPiece_getTransfers (mtDeclarationPiece node)
223 llassert (mtDeclarationPiece_isDefined (node));
224 llassert (node->kind == MTP_TRANSFERS);
227 return (mtTransferClauseList) node->node;
231 extern mtTransferClauseList mtDeclarationPiece_getPreconditions (mtDeclarationPiece node)
233 llassert (mtDeclarationPiece_isDefined (node));
234 llassert (node->kind == MTP_PRECONDITIONS);
237 return (mtTransferClauseList) node->node;
241 extern mtTransferClauseList mtDeclarationPiece_getPostconditions (mtDeclarationPiece node)
243 llassert (mtDeclarationPiece_isDefined (node));
244 llassert (node->kind == MTP_POSTCONDITIONS);
247 return (mtTransferClauseList) node->node;
251 extern mtLoseReferenceList mtDeclarationPiece_getLosers (mtDeclarationPiece node)
253 llassert (mtDeclarationPiece_isDefined (node));
254 llassert (node->kind == MTP_LOSERS);
257 return (mtLoseReferenceList) node->node;
261 extern mtValuesNode mtDeclarationPiece_getValues (mtDeclarationPiece node)
263 llassert (mtDeclarationPiece_isDefined (node));
264 llassert (node->kind == MTP_VALUES);
267 return (mtValuesNode) node->node;
271 extern void mtDeclarationPiece_free (/*@only@*/ mtDeclarationPiece node)
278 llassert (node->node == NULL);
282 /*@access mtContextNode@*/
283 mtContextNode_free ((mtContextNode) node->node);
285 /*@noaccess mtContextNode@*/
287 /*@access mtValuesNode@*/
288 mtValuesNode_free ((mtValuesNode) node->node);
290 /*@noaccess mtValuesNode@*/
292 /*@access mtDefaultsNode@*/
293 mtDefaultsNode_free ((mtDefaultsNode) node->node);
295 /*@noaccess mtDefaultsNode@*/
296 case MTP_DEFAULTVALUE:
298 mttok_free ((mttok) node->node);
301 case MTP_ANNOTATIONS:
302 /*@access mtAnnotationsNode@*/
303 mtAnnotationsNode_free ((mtAnnotationsNode) node->node);
305 /*@noaccess mtAnnotationsNode@*/
307 /*@access mtMergeNode@*/
308 mtMergeNode_free ((mtMergeNode) node->node);
310 /*@noaccess mtMergeNode@*/
312 case MTP_PRECONDITIONS:
313 case MTP_POSTCONDITIONS:
314 /*@access mtTransferClauseList@*/
315 mtTransferClauseList_free ((mtTransferClauseList) node->node);
317 /*@noaccess mtTransferClauseList@*/
319 /*@access mtLoseReferenceList@*/
320 mtLoseReferenceList_free ((mtLoseReferenceList) node->node);
322 /*@noaccess mtLoseReferenceList@*/