/*
** 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
*/
/*
** flagMarker.c
*/
# include "splintMacros.nf"
# include "basic.h"
flagMarker flagMarker_createLocalSet (flagcode code, ynm set, fileloc loc)
{
flagMarker c = (flagMarker) dmalloc (sizeof (*c));
c->kind = FMK_LOCALSET;
c->code = code;
c->info.set = set;
c->loc = fileloc_copy (loc);
return c;
}
flagMarker flagMarker_createSuppress (flagcode code, fileloc loc)
{
flagMarker c = (flagMarker) dmalloc (sizeof (*c));
c->kind = FMK_SUPPRESS;
c->code = code;
c->loc = fileloc_copy (loc);
return c;
}
flagMarker flagMarker_createIgnoreOn (fileloc loc)
{
flagMarker c = (flagMarker) dmalloc (sizeof (*c));
c->kind = FMK_IGNOREON;
c->code = INVALID_FLAG;
c->loc = fileloc_copy (loc);
return c;
}
flagMarker flagMarker_createIgnoreCount (int count, fileloc loc)
{
flagMarker c = (flagMarker) dmalloc (sizeof (*c));
c->kind = FMK_IGNORECOUNT;
c->code = INVALID_FLAG;
c->info.nerrors = count;
c->loc = fileloc_copy (loc);
DPRINTF (("Create ignore count: %s", flagMarker_unparse (c)));
return c;
}
flagMarker flagMarker_createIgnoreOff (fileloc loc)
{
flagMarker c = (flagMarker) dmalloc (sizeof (*c));
c->kind = FMK_IGNOREOFF;
c->code = INVALID_FLAG;
c->loc = fileloc_copy (loc);
return c;
}
ynm flagMarker_getSet (flagMarker f)
{
llassert (f->kind == FMK_LOCALSET);
return f->info.set;
}
flagcode flagMarker_getCode (flagMarker f)
{
llassert (f->kind == FMK_LOCALSET|| f->kind == FMK_SUPPRESS);
return f->code;
}
int flagMarker_getCount (flagMarker f)
{
llassert (f->kind == FMK_IGNORECOUNT);
return f->info.nerrors;
}
bool flagMarker_equal (flagMarker f1, flagMarker f2)
{
if (f1->kind != f2->kind)
{
return FALSE;
}
if (!fileloc_equal (f1->loc, f2->loc))
{
return FALSE;
}
switch (f1->kind)
{
case FMK_LOCALSET:
return (f1->info.set == f2->info.set
&& flagcode_equal (f1->code, f2->code));
case FMK_IGNORECOUNT:
return (f1->info.nerrors == f2->info.nerrors);
case FMK_IGNOREON:
case FMK_IGNOREOFF:
return TRUE;
case FMK_SUPPRESS:
return (flagcode_equal (f1->code, f2->code));
}
BADBRANCHRET (FALSE);
}
cstring flagMarker_unparse (flagMarker c)
{
switch (c->kind)
{
case FMK_LOCALSET:
return (message ("%q: %s%s",
fileloc_unparse (c->loc), ynm_unparseCode (c->info.set),
flagcode_unparse (c->code)));
case FMK_IGNORECOUNT:
return (message ("%q: ignore count %d",
fileloc_unparse (c->loc), c->info.nerrors));
case FMK_IGNOREON:
return (message ("%q: ignore on",
fileloc_unparse (c->loc)));
case FMK_IGNOREOFF:
return (message ("%q: ignore off",
fileloc_unparse (c->loc)));
case FMK_SUPPRESS:
return (message ("%q: suppress %s",
fileloc_unparse (c->loc),
flagcode_unparse (c->code)));
}
BADBRANCHRET (cstring_undefined);
}
void flagMarker_free (/*@only@*/ flagMarker c)
{
fileloc_free (c->loc); /* evans 2001-03-24: Splint caught this... */
sfree (c);
}
bool flagMarker_sameFile (flagMarker c, fileloc loc)
{
return (fileloc_almostSameFile (c->loc, loc));
}
/*
** return true if loc is before c->loc
*/
bool flagMarker_beforeMarker (flagMarker c, fileloc loc)
{
return (!fileloc_notAfter (c->loc, loc));
}
syntax highlighted by Code2HTML, v. 0.9.1