Files
bison/src/location.h
T
Alex Rozenman 66381412d9 Keep sub-messages aligned. Fix strings for translation.
* src/location.h: (location_print): Add return value.
	* src/location.c: (location_print): Return number of printed
	characters.
	* src/complain.h: Two new functions (complain_at_indent,
	warn_at_indent).
	* src/complain.cpp: Implement the alignment mechanism. Add new
	static variable (indent_ptr). Use and update it (error_message,
	complain_at_indent, warn_at_indent).
	* src/scan-code.l: Fix strings for translations. Use new *_indent
	functions (parse_ref, show_sub_messages).
	* NEWS (2.5): Add an announcement about named references.
2009-09-19 13:00:51 +03:00

120 lines
3.2 KiB
C

/* Locations for Bison
Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
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 3 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifndef LOCATION_H_
# define LOCATION_H_
# include "uniqstr.h"
/* A boundary between two characters. */
typedef struct
{
/* The name of the file that contains the boundary. */
uniqstr file;
/* If nonnegative, the (origin-1) line that contains the boundary.
If this is INT_MAX, the line number has overflowed.
Meaningless and not displayed if negative.
*/
int line;
/* If nonnegative, the (origin-1) column just after the boundary.
This is neither a byte count, nor a character count; it is a
column count. If this is INT_MAX, the column number has
overflowed.
Meaningless and not displayed if negative.
*/
int column;
} boundary;
/* Set the position of \a a. */
static inline void
boundary_set (boundary *b, const char *f, int l, int c)
{
b->file = f;
b->line = l;
b->column = c;
}
/* Return -1, 0, 1, depending whether a is before, equal, or
after b. */
static inline int
boundary_cmp (boundary a, boundary b)
{
int res = strcmp (a.file, b.file);
if (!res)
res = a.line - b.line;
if (!res)
res = a.column - b.column;
return res;
}
/* Return nonzero if A and B are equal boundaries. */
static inline bool
equal_boundaries (boundary a, boundary b)
{
return (a.column == b.column
&& a.line == b.line
&& UNIQSTR_EQ (a.file, b.file));
}
/* A location, that is, a region of source code. */
typedef struct
{
/* Boundary just before the location starts. */
boundary start;
/* Boundary just after the location ends. */
boundary end;
} location;
#define YYLTYPE location
#define EMPTY_LOCATION_INIT {{NULL, 0, 0}, {NULL, 0, 0}}
extern location const empty_location;
/* Set *LOC and adjust scanner cursor to account for token TOKEN of
size SIZE. */
void location_compute (location *loc,
boundary *cur, char const *token, size_t size);
/* Print location to file. Return number of actually printed
characters. */
unsigned location_print (FILE *out, location loc);
/* Return -1, 0, 1, depending whether a is before, equal, or
after b. */
static inline int
location_cmp (location a, location b)
{
int res = boundary_cmp (a.start, b.start);
if (!res)
res = boundary_cmp (a.end, b.end);
return res;
}
/* LOC_STR must be formatted as `file:line.column', it will be modified. */
void boundary_set_from_string (boundary *bound, char *loc_str);
#endif /* ! defined LOCATION_H_ */