/*
** Splint - annotation-assisted static program checker
** Copyright (C) 1994-2003 University of Virginia,
** Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the
** Free Software Foundation; either version 2 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but
** WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** General Public License for more details.
**
** The GNU General Public License is available from http://www.gnu.org/ or
** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
** MA 02111-1307, USA.
**
** For information on splint: info@splint.org
** To report a bug: splint-bug@splint.org
** For more information: http://www.splint.org
*/
/*
** mtDeclarationPiece.c
*/
# include "splintMacros.nf"
# include "basic.h"
static mtDeclarationPiece
mtDeclarationPiece_create (mtPieceKind kind, /*@null@*/ /*@only@*/ void *node)
{
mtDeclarationPiece res = (mtDeclarationPiece) dmalloc (sizeof (*res));
res->kind = kind;
res->node = node;
return res;
}
extern mtDeclarationPiece mtDeclarationPiece_createContext (mtContextNode node) /*@*/
{
return mtDeclarationPiece_create (MTP_CONTEXT, (void *) node);
}
extern mtDeclarationPiece mtDeclarationPiece_createValues (mtValuesNode node) /*@*/
{
return mtDeclarationPiece_create (MTP_VALUES, (void *) node);
}
extern mtDeclarationPiece mtDeclarationPiece_createDefaults (mtDefaultsNode node) /*@*/
{
return mtDeclarationPiece_create (MTP_DEFAULTS, (void *) node);
}
extern mtDeclarationPiece mtDeclarationPiece_createValueDefault (mttok node) /*@*/
{
llassert (mttok_isIdentifier (node));
return mtDeclarationPiece_create (MTP_DEFAULTVALUE, (void *) node);
}
extern mtDeclarationPiece mtDeclarationPiece_createAnnotations (mtAnnotationsNode node) /*@*/
{
return mtDeclarationPiece_create (MTP_ANNOTATIONS, (void *) node);
}
extern mtDeclarationPiece mtDeclarationPiece_createMerge (mtMergeNode node) /*@*/
{
return mtDeclarationPiece_create (MTP_MERGE, (void *) node);
}
extern mtDeclarationPiece mtDeclarationPiece_createTransfers (mtTransferClauseList node) /*@*/
{
return mtDeclarationPiece_create (MTP_TRANSFERS, (void *) node);
}
extern mtDeclarationPiece mtDeclarationPiece_createPreconditions (mtTransferClauseList node) /*@*/
{
return mtDeclarationPiece_create (MTP_PRECONDITIONS, (void *) node);
}
mtDeclarationPiece mtDeclarationPiece_createPostconditions (mtTransferClauseList node) /*@*/
{
return mtDeclarationPiece_create (MTP_POSTCONDITIONS, (void *) node);
}
mtDeclarationPiece mtDeclarationPiece_createLosers (mtLoseReferenceList node) /*@*/
{
return mtDeclarationPiece_create (MTP_LOSERS, (void *) node);
}
/*@only@*/ cstring mtDeclarationPiece_unparse (mtDeclarationPiece p)
{
if (mtDeclarationPiece_isUndefined (p))
{
return cstring_undefined;
}
switch (p->kind)
{
case MTP_CONTEXT:
/*@access mtContextNode@*/
return mtContextNode_unparse ((mtContextNode) p->node);
/*@noaccess mtContextNode@*/
case MTP_VALUES:
/*@access mtValuesNode@*/
return mtValuesNode_unparse ((mtValuesNode) p->node);
/*@noaccess mtValuesNode@*/
case MTP_DEFAULTS:
/*@access mtDefaultsNode@*/
return mtDefaultsNode_unparse ((mtDefaultsNode) p->node);
/*@noaccess mtDefaultsNode@*/
case MTP_DEFAULTVALUE:
/*@access mttok@*/
return message ("default %q", mttok_getText ((mttok) p->node));
/*@noaccess mttok@*/
case MTP_ANNOTATIONS:
/*@access mtAnnotationsNode@*/
return mtAnnotationsNode_unparse ((mtAnnotationsNode) p->node);
/*@noaccess mtAnnotationsNode@*/
case MTP_MERGE:
/*@access mtMergeNode@*/
return mtMergeNode_unparse ((mtMergeNode) p->node);
/*@noaccess mtMergeNode@*/
case MTP_TRANSFERS:
case MTP_PRECONDITIONS:
case MTP_POSTCONDITIONS:
/*@access mtTransferClauseList@*/
return mtTransferClauseList_unparse ((mtTransferClauseList) p->node);
/*@noaccess mtTransferClauseList@*/
case MTP_LOSERS:
/*@access mtLoseReferenceList@*/
return mtLoseReferenceList_unparse ((mtLoseReferenceList) p->node);
/*@noaccess mtLoseReferenceList@*/
case MTP_DEAD:
return cstring_makeLiteral ("Dead Piece");
}
BADBRANCHRET (cstring_undefined);
}
extern bool mtDeclarationPiece_matchKind (mtDeclarationPiece p, mtPieceKind kind) /*@*/
{
if (mtDeclarationPiece_isDefined (p))
{
return (p->kind == kind);
}
else
{
return FALSE;
}
}
extern mtContextNode mtDeclarationPiece_getContext (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_CONTEXT);
/*@-abstract@*/
return (mtContextNode) node->node;
/*@=abstract@*/
}
extern mtContextNode mtDeclarationPiece_stealContext (mtDeclarationPiece node)
{
mtContextNode res;
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_CONTEXT);
/*@-abstract@*/
res = (mtContextNode) node->node;
/*@=abstract@*/
node->kind = MTP_DEAD;
node->node = NULL;
return res;
}
extern mtDefaultsNode mtDeclarationPiece_getDefaults (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_DEFAULTS);
/*@-abstract@*/
return (mtDefaultsNode) node->node;
/*@=abstract@*/
}
extern cstring mtDeclarationPiece_getDefaultValue (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_DEFAULTVALUE);
/*@-abstract@*/
return mttok_observeText ((mttok) node->node);
/*@=abstract@*/
}
extern mtAnnotationsNode mtDeclarationPiece_getAnnotations (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_ANNOTATIONS);
/*@-abstract@*/
return (mtAnnotationsNode) node->node;
/*@=abstract@*/
}
extern mtMergeNode mtDeclarationPiece_getMerge (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_MERGE);
/*@-abstract@*/
return (mtMergeNode) node->node;
/*@=abstract@*/
}
extern mtTransferClauseList mtDeclarationPiece_getTransfers (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_TRANSFERS);
/*@-abstract@*/
return (mtTransferClauseList) node->node;
/*@=abstract@*/
}
extern mtTransferClauseList mtDeclarationPiece_getPreconditions (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_PRECONDITIONS);
/*@-abstract@*/
return (mtTransferClauseList) node->node;
/*@=abstract@*/
}
extern mtTransferClauseList mtDeclarationPiece_getPostconditions (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_POSTCONDITIONS);
/*@-abstract@*/
return (mtTransferClauseList) node->node;
/*@=abstract@*/
}
extern mtLoseReferenceList mtDeclarationPiece_getLosers (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_LOSERS);
/*@-abstract@*/
return (mtLoseReferenceList) node->node;
/*@=abstract@*/
}
extern mtValuesNode mtDeclarationPiece_getValues (mtDeclarationPiece node)
{
llassert (mtDeclarationPiece_isDefined (node));
llassert (node->kind == MTP_VALUES);
/*@-abstract@*/
return (mtValuesNode) node->node;
/*@=abstract@*/
}
extern void mtDeclarationPiece_free (/*@only@*/ mtDeclarationPiece node)
{
if (node != NULL)
{
switch (node->kind)
{
case MTP_DEAD:
llassert (node->node == NULL);
break;
case MTP_CONTEXT:
/*@access mtContextNode@*/
mtContextNode_free ((mtContextNode) node->node);
break;
/*@noaccess mtContextNode@*/
case MTP_VALUES:
/*@access mtValuesNode@*/
mtValuesNode_free ((mtValuesNode) node->node);
break;
/*@noaccess mtValuesNode@*/
case MTP_DEFAULTS:
/*@access mtDefaultsNode@*/
mtDefaultsNode_free ((mtDefaultsNode) node->node);
break;
/*@noaccess mtDefaultsNode@*/
case MTP_DEFAULTVALUE:
/*@access mttok@*/
mttok_free ((mttok) node->node);
break;
/*@noaccess mttok@*/
case MTP_ANNOTATIONS:
/*@access mtAnnotationsNode@*/
mtAnnotationsNode_free ((mtAnnotationsNode) node->node);
break;
/*@noaccess mtAnnotationsNode@*/
case MTP_MERGE:
/*@access mtMergeNode@*/
mtMergeNode_free ((mtMergeNode) node->node);
break;
/*@noaccess mtMergeNode@*/
case MTP_TRANSFERS:
case MTP_PRECONDITIONS:
case MTP_POSTCONDITIONS:
/*@access mtTransferClauseList@*/
mtTransferClauseList_free ((mtTransferClauseList) node->node);
break;
/*@noaccess mtTransferClauseList@*/
case MTP_LOSERS:
/*@access mtLoseReferenceList@*/
mtLoseReferenceList_free ((mtLoseReferenceList) node->node);
break;
/*@noaccess mtLoseReferenceList@*/
}
sfree (node);
}
}
syntax highlighted by Code2HTML, v. 0.9.1