]> git.saurik.com Git - bison.git/blame - src/location.h
carets: properly display when no line feed is present
[bison.git] / src / location.h
CommitLineData
0c15323d 1/* Locations for Bison
7d424de1 2
34136e65 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
92822aff
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
56c5eca9
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
12cf133f
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
e9690142
JD
76 && a.line == b.line
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
a99ec53e 91# define GRAM_LTYPE location
0c15323d 92
a99ec53e 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,
e9690142 99 boundary *cur, char const *token, size_t size);
e9071366 100
66381412
AR
101/* Print location to file. Return number of actually printed
102 characters. */
103unsigned location_print (FILE *out, location loc);
8f759107 104
3f5d1b2c
TR
105/* Free any allocated ressources and close any open file handles that are
106 left-over by the usage of location_caret. */
107void cleanup_caret (void);
108
109/* Output to OUT the line and caret corresponding to location LOC. */
110void location_caret (FILE *out, location loc);
111
12cf133f
AD
112/* Return -1, 0, 1, depending whether a is before, equal, or
113 after b. */
114static inline int
115location_cmp (location a, location b)
116{
117 int res = boundary_cmp (a.start, b.start);
118 if (!res)
119 res = boundary_cmp (a.end, b.end);
120 return res;
121}
122
3fc65ead
JD
123/* LOC_STR must be formatted as `file:line.column', it will be modified. */
124void boundary_set_from_string (boundary *bound, char *loc_str);
125
8f759107 126#endif /* ! defined LOCATION_H_ */