]> git.saurik.com Git - bison.git/blame - src/location.h
c++: locations: provide convenience constructors.
[bison.git] / src / location.h
CommitLineData
0c15323d 1/* Locations for Bison
6e30ede8 2
c932d613 3 Copyright (C) 2002, 2004-2012 Free Software Foundation, Inc.
0c15323d
AD
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
f16b0819 7 This program is free software: you can redistribute it and/or modify
0c15323d 8 it under the terms of the GNU General Public License as published by
f16b0819
PE
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
0c15323d 11
f16b0819 12 This program is distributed in the hope that it will be useful,
0c15323d
AD
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
f16b0819 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
0c15323d
AD
19
20#ifndef LOCATION_H_
21# define LOCATION_H_
22
dca81a78
PE
23# include "uniqstr.h"
24
8f759107
PE
25/* A boundary between two characters. */
26typedef struct
0c15323d 27{
8f759107 28 /* The name of the file that contains the boundary. */
dca81a78 29 uniqstr file;
8f759107 30
580c075d
JD
31 /* If nonnegative, the (origin-1) line that contains the boundary.
32 If this is INT_MAX, the line number has overflowed.
33
34 Meaningless and not displayed if negative.
35 */
8f759107
PE
36 int line;
37
5d3a1ecb
AD
38 /* If nonnegative, the (origin-1) column just after the boundary.
39 This is neither a byte count, nor a character count; it is a
40 column count. If this is INT_MAX, the column number has
41 overflowed.
42
43 Meaningless and not displayed if negative.
44 */
8f759107
PE
45 int column;
46
47} boundary;
48
e9071366
AD
49/* Set the position of \a a. */
50static inline void
51boundary_set (boundary *b, const char *f, int l, int c)
52{
db06f0ce
PE
53 b->file = f;
54 b->line = l;
55 b->column = c;
e9071366
AD
56}
57
95d176ff
AD
58/* Return -1, 0, 1, depending whether a is before, equal, or
59 after b. */
60static inline int
61boundary_cmp (boundary a, boundary b)
62{
63 int res = strcmp (a.file, b.file);
64 if (!res)
65 res = a.line - b.line;
66 if (!res)
67 res = a.column - b.column;
68 return res;
69}
70
8f759107
PE
71/* Return nonzero if A and B are equal boundaries. */
72static inline bool
73equal_boundaries (boundary a, boundary b)
74{
75 return (a.column == b.column
76 && a.line == b.line
dca81a78 77 && UNIQSTR_EQ (a.file, b.file));
8f759107
PE
78}
79
80/* A location, that is, a region of source code. */
81typedef struct
82{
83 /* Boundary just before the location starts. */
84 boundary start;
85
86 /* Boundary just after the location ends. */
87 boundary end;
88
69b8cc09 89} location;
8f759107 90
69b8cc09 91#define YYLTYPE location
0c15323d 92
28e52c0d 93#define EMPTY_LOCATION_INIT {{NULL, 0, 0}, {NULL, 0, 0}}
69b8cc09 94extern location const empty_location;
8f759107 95
e9071366
AD
96/* Set *LOC and adjust scanner cursor to account for token TOKEN of
97 size SIZE. */
98void location_compute (location *loc,
99 boundary *cur, char const *token, size_t size);
100
348f5608
AR
101/* Print location to file. Return number of actually printed
102 characters. */
103unsigned location_print (FILE *out, location loc);
8f759107 104
95d176ff
AD
105/* Return -1, 0, 1, depending whether a is before, equal, or
106 after b. */
107static inline int
108location_cmp (location a, location b)
109{
110 int res = boundary_cmp (a.start, b.start);
111 if (!res)
112 res = boundary_cmp (a.end, b.end);
113 return res;
114}
115
3fc65ead
JD
116/* LOC_STR must be formatted as `file:line.column', it will be modified. */
117void boundary_set_from_string (boundary *bound, char *loc_str);
118
8f759107 119#endif /* ! defined LOCATION_H_ */