/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by David A. Holland.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
void
place_addcolumns(struct place *p, unsigned cols)
{
unsigned newcol;
newcol = p->column + cols;
if (newcol < p->column) {
/* overflow (use the old place to complain) */
complain(p, "Column numbering overflow");
die();
}
p->column = newcol;
}
void
place_addlines(struct place *p, unsigned lines)
{
unsigned nextline;
nextline = p->line + lines;
if (nextline < p->line) {
/* overflow (use the old place to complain) */
complain(p, "Line numbering overflow");
die();
}
p->line = nextline;
}
const char *
place_getname(const struct place *p)
{
switch (p->type) {
case P_NOWHERE: return "<nowhere>";
case P_BUILTIN: return "<built-in>";
case P_COMMANDLINE: return "<command-line>";
case P_FILE: return p->file->name;
}
assert(0);
return NULL;
}
bool
place_samefile(const struct place *a, const struct place *b)
{
if (a->type != b->type) {
return false;
}
if (a->file != b->file) {
return false;
}
return true;
}
bool
place_eq(const struct place *a, const struct place *b)
{
if (!place_samefile(a, b)) {
return false;
}
if (a->line != b->line || a->column != b->column) {
return false;
}
return true;
}
static
void
place_printfrom(const struct place *p)
{
const struct place *from;
if (p->file == NULL) {
return;
}
from = &p->file->includedfrom;
if (from->type != P_NOWHERE) {
place_printfrom(from);
fprintf(stderr, "In file included from %s:%u:%u:\n",
place_getname(from), from->line, from->column);
}
}