xref: /aosp_15_r20/prebuilts/build-tools/common/bison/skeletons/location.cc (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker # C++ skeleton for Bison
2*cda5da8dSAndroid Build Coastguard Worker 
3*cda5da8dSAndroid Build Coastguard Worker # Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
4*cda5da8dSAndroid Build Coastguard Worker 
5*cda5da8dSAndroid Build Coastguard Worker # This program is free software: you can redistribute it and/or modify
6*cda5da8dSAndroid Build Coastguard Worker # it under the terms of the GNU General Public License as published by
7*cda5da8dSAndroid Build Coastguard Worker # the Free Software Foundation, either version 3 of the License, or
8*cda5da8dSAndroid Build Coastguard Worker # (at your option) any later version.
9*cda5da8dSAndroid Build Coastguard Worker #
10*cda5da8dSAndroid Build Coastguard Worker # This program is distributed in the hope that it will be useful,
11*cda5da8dSAndroid Build Coastguard Worker # but WITHOUT ANY WARRANTY; without even the implied warranty of
12*cda5da8dSAndroid Build Coastguard Worker # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*cda5da8dSAndroid Build Coastguard Worker # GNU General Public License for more details.
14*cda5da8dSAndroid Build Coastguard Worker #
15*cda5da8dSAndroid Build Coastguard Worker # You should have received a copy of the GNU General Public License
16*cda5da8dSAndroid Build Coastguard Worker # along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*cda5da8dSAndroid Build Coastguard Worker 
18*cda5da8dSAndroid Build Coastguard Worker m4_pushdef([b4_copyright_years],
19*cda5da8dSAndroid Build Coastguard Worker            [2002-2015, 2018-2021])
20*cda5da8dSAndroid Build Coastguard Worker 
21*cda5da8dSAndroid Build Coastguard Worker 
22*cda5da8dSAndroid Build Coastguard Worker # b4_location_file
23*cda5da8dSAndroid Build Coastguard Worker # ----------------
24*cda5da8dSAndroid Build Coastguard Worker # Name of the file containing the position/location class,
25*cda5da8dSAndroid Build Coastguard Worker # if we want this file.
26*cda5da8dSAndroid Build Coastguard Worker b4_percent_define_check_file([b4_location_file],
27*cda5da8dSAndroid Build Coastguard Worker                              [[api.location.file]],
28*cda5da8dSAndroid Build Coastguard Worker                              b4_header_if([[location.hh]]))
29*cda5da8dSAndroid Build Coastguard Worker 
30*cda5da8dSAndroid Build Coastguard Worker # b4_location_include
31*cda5da8dSAndroid Build Coastguard Worker # -------------------
32*cda5da8dSAndroid Build Coastguard Worker # If location.hh is to be generated, the name under which should it be
33*cda5da8dSAndroid Build Coastguard Worker # included.
34*cda5da8dSAndroid Build Coastguard Worker #
35*cda5da8dSAndroid Build Coastguard Worker # b4_location_path
36*cda5da8dSAndroid Build Coastguard Worker # ----------------
37*cda5da8dSAndroid Build Coastguard Worker # The path to use for the CPP guard.
38*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([b4_location_file],
39*cda5da8dSAndroid Build Coastguard Worker [m4_define([b4_location_include],
40*cda5da8dSAndroid Build Coastguard Worker            [b4_percent_define_get([[api.location.include]],
41*cda5da8dSAndroid Build Coastguard Worker                                   ["b4_location_file"])])
42*cda5da8dSAndroid Build Coastguard Worker  m4_define([b4_location_path],
43*cda5da8dSAndroid Build Coastguard Worker            b4_percent_define_get([[api.location.include]],
44*cda5da8dSAndroid Build Coastguard Worker                                  ["b4_mapped_dir_prefix[]b4_location_file"]))
45*cda5da8dSAndroid Build Coastguard Worker  m4_define([b4_location_path],
46*cda5da8dSAndroid Build Coastguard Worker            m4_substr(m4_defn([b4_location_path]), 1, m4_eval(m4_len(m4_defn([b4_location_path])) - 2)))
47*cda5da8dSAndroid Build Coastguard Worker  ])
48*cda5da8dSAndroid Build Coastguard Worker 
49*cda5da8dSAndroid Build Coastguard Worker 
50*cda5da8dSAndroid Build Coastguard Worker # b4_position_file
51*cda5da8dSAndroid Build Coastguard Worker # ----------------
52*cda5da8dSAndroid Build Coastguard Worker # Name of the file containing the position class, if we want this file.
53*cda5da8dSAndroid Build Coastguard Worker b4_header_if(
54*cda5da8dSAndroid Build Coastguard Worker   [b4_required_version_if(
55*cda5da8dSAndroid Build Coastguard Worker     [30200], [],
56*cda5da8dSAndroid Build Coastguard Worker     [m4_ifdef([b4_location_file],
57*cda5da8dSAndroid Build Coastguard Worker               [m4_define([b4_position_file], [position.hh])])])])
58*cda5da8dSAndroid Build Coastguard Worker 
59*cda5da8dSAndroid Build Coastguard Worker 
60*cda5da8dSAndroid Build Coastguard Worker 
61*cda5da8dSAndroid Build Coastguard Worker # b4_location_define
62*cda5da8dSAndroid Build Coastguard Worker # ------------------
63*cda5da8dSAndroid Build Coastguard Worker # Define the position and location classes.
64*cda5da8dSAndroid Build Coastguard Worker m4_define([b4_location_define],
65*cda5da8dSAndroid Build Coastguard Worker [[  /// A point in a source file.
66*cda5da8dSAndroid Build Coastguard Worker   class position
67*cda5da8dSAndroid Build Coastguard Worker   {
68*cda5da8dSAndroid Build Coastguard Worker   public:
69*cda5da8dSAndroid Build Coastguard Worker     /// Type for file name.
70*cda5da8dSAndroid Build Coastguard Worker     typedef ]b4_percent_define_get([[api.filename.type]])[ filename_type;
71*cda5da8dSAndroid Build Coastguard Worker     /// Type for line and column numbers.
72*cda5da8dSAndroid Build Coastguard Worker     typedef int counter_type;
73*cda5da8dSAndroid Build Coastguard Worker ]m4_ifdef([b4_location_constructors], [[
74*cda5da8dSAndroid Build Coastguard Worker     /// Construct a position.
75*cda5da8dSAndroid Build Coastguard Worker     explicit position (filename_type* f = YY_NULLPTR,
76*cda5da8dSAndroid Build Coastguard Worker                        counter_type l = ]b4_location_initial_line[,
77*cda5da8dSAndroid Build Coastguard Worker                        counter_type c = ]b4_location_initial_column[)
78*cda5da8dSAndroid Build Coastguard Worker       : filename (f)
79*cda5da8dSAndroid Build Coastguard Worker       , line (l)
80*cda5da8dSAndroid Build Coastguard Worker       , column (c)
81*cda5da8dSAndroid Build Coastguard Worker     {}
82*cda5da8dSAndroid Build Coastguard Worker 
83*cda5da8dSAndroid Build Coastguard Worker ]])[
84*cda5da8dSAndroid Build Coastguard Worker     /// Initialization.
85*cda5da8dSAndroid Build Coastguard Worker     void initialize (filename_type* fn = YY_NULLPTR,
86*cda5da8dSAndroid Build Coastguard Worker                      counter_type l = ]b4_location_initial_line[,
87*cda5da8dSAndroid Build Coastguard Worker                      counter_type c = ]b4_location_initial_column[)
88*cda5da8dSAndroid Build Coastguard Worker     {
89*cda5da8dSAndroid Build Coastguard Worker       filename = fn;
90*cda5da8dSAndroid Build Coastguard Worker       line = l;
91*cda5da8dSAndroid Build Coastguard Worker       column = c;
92*cda5da8dSAndroid Build Coastguard Worker     }
93*cda5da8dSAndroid Build Coastguard Worker 
94*cda5da8dSAndroid Build Coastguard Worker     /** \name Line and Column related manipulators
95*cda5da8dSAndroid Build Coastguard Worker      ** \{ */
96*cda5da8dSAndroid Build Coastguard Worker     /// (line related) Advance to the COUNT next lines.
97*cda5da8dSAndroid Build Coastguard Worker     void lines (counter_type count = 1)
98*cda5da8dSAndroid Build Coastguard Worker     {
99*cda5da8dSAndroid Build Coastguard Worker       if (count)
100*cda5da8dSAndroid Build Coastguard Worker         {
101*cda5da8dSAndroid Build Coastguard Worker           column = ]b4_location_initial_column[;
102*cda5da8dSAndroid Build Coastguard Worker           line = add_ (line, count, ]b4_location_initial_line[);
103*cda5da8dSAndroid Build Coastguard Worker         }
104*cda5da8dSAndroid Build Coastguard Worker     }
105*cda5da8dSAndroid Build Coastguard Worker 
106*cda5da8dSAndroid Build Coastguard Worker     /// (column related) Advance to the COUNT next columns.
107*cda5da8dSAndroid Build Coastguard Worker     void columns (counter_type count = 1)
108*cda5da8dSAndroid Build Coastguard Worker     {
109*cda5da8dSAndroid Build Coastguard Worker       column = add_ (column, count, ]b4_location_initial_column[);
110*cda5da8dSAndroid Build Coastguard Worker     }
111*cda5da8dSAndroid Build Coastguard Worker     /** \} */
112*cda5da8dSAndroid Build Coastguard Worker 
113*cda5da8dSAndroid Build Coastguard Worker     /// File name to which this position refers.
114*cda5da8dSAndroid Build Coastguard Worker     filename_type* filename;
115*cda5da8dSAndroid Build Coastguard Worker     /// Current line number.
116*cda5da8dSAndroid Build Coastguard Worker     counter_type line;
117*cda5da8dSAndroid Build Coastguard Worker     /// Current column number.
118*cda5da8dSAndroid Build Coastguard Worker     counter_type column;
119*cda5da8dSAndroid Build Coastguard Worker 
120*cda5da8dSAndroid Build Coastguard Worker   private:
121*cda5da8dSAndroid Build Coastguard Worker     /// Compute max (min, lhs+rhs).
122*cda5da8dSAndroid Build Coastguard Worker     static counter_type add_ (counter_type lhs, counter_type rhs, counter_type min)
123*cda5da8dSAndroid Build Coastguard Worker     {
124*cda5da8dSAndroid Build Coastguard Worker       return lhs + rhs < min ? min : lhs + rhs;
125*cda5da8dSAndroid Build Coastguard Worker     }
126*cda5da8dSAndroid Build Coastguard Worker   };
127*cda5da8dSAndroid Build Coastguard Worker 
128*cda5da8dSAndroid Build Coastguard Worker   /// Add \a width columns, in place.
129*cda5da8dSAndroid Build Coastguard Worker   inline position&
130*cda5da8dSAndroid Build Coastguard Worker   operator+= (position& res, position::counter_type width)
131*cda5da8dSAndroid Build Coastguard Worker   {
132*cda5da8dSAndroid Build Coastguard Worker     res.columns (width);
133*cda5da8dSAndroid Build Coastguard Worker     return res;
134*cda5da8dSAndroid Build Coastguard Worker   }
135*cda5da8dSAndroid Build Coastguard Worker 
136*cda5da8dSAndroid Build Coastguard Worker   /// Add \a width columns.
137*cda5da8dSAndroid Build Coastguard Worker   inline position
138*cda5da8dSAndroid Build Coastguard Worker   operator+ (position res, position::counter_type width)
139*cda5da8dSAndroid Build Coastguard Worker   {
140*cda5da8dSAndroid Build Coastguard Worker     return res += width;
141*cda5da8dSAndroid Build Coastguard Worker   }
142*cda5da8dSAndroid Build Coastguard Worker 
143*cda5da8dSAndroid Build Coastguard Worker   /// Subtract \a width columns, in place.
144*cda5da8dSAndroid Build Coastguard Worker   inline position&
145*cda5da8dSAndroid Build Coastguard Worker   operator-= (position& res, position::counter_type width)
146*cda5da8dSAndroid Build Coastguard Worker   {
147*cda5da8dSAndroid Build Coastguard Worker     return res += -width;
148*cda5da8dSAndroid Build Coastguard Worker   }
149*cda5da8dSAndroid Build Coastguard Worker 
150*cda5da8dSAndroid Build Coastguard Worker   /// Subtract \a width columns.
151*cda5da8dSAndroid Build Coastguard Worker   inline position
152*cda5da8dSAndroid Build Coastguard Worker   operator- (position res, position::counter_type width)
153*cda5da8dSAndroid Build Coastguard Worker   {
154*cda5da8dSAndroid Build Coastguard Worker     return res -= width;
155*cda5da8dSAndroid Build Coastguard Worker   }
156*cda5da8dSAndroid Build Coastguard Worker ]b4_percent_define_flag_if([[define_location_comparison]], [[
157*cda5da8dSAndroid Build Coastguard Worker   /// Compare two position objects.
158*cda5da8dSAndroid Build Coastguard Worker   inline bool
159*cda5da8dSAndroid Build Coastguard Worker   operator== (const position& pos1, const position& pos2)
160*cda5da8dSAndroid Build Coastguard Worker   {
161*cda5da8dSAndroid Build Coastguard Worker     return (pos1.line == pos2.line
162*cda5da8dSAndroid Build Coastguard Worker             && pos1.column == pos2.column
163*cda5da8dSAndroid Build Coastguard Worker             && (pos1.filename == pos2.filename
164*cda5da8dSAndroid Build Coastguard Worker                 || (pos1.filename && pos2.filename
165*cda5da8dSAndroid Build Coastguard Worker                     && *pos1.filename == *pos2.filename)));
166*cda5da8dSAndroid Build Coastguard Worker   }
167*cda5da8dSAndroid Build Coastguard Worker 
168*cda5da8dSAndroid Build Coastguard Worker   /// Compare two position objects.
169*cda5da8dSAndroid Build Coastguard Worker   inline bool
170*cda5da8dSAndroid Build Coastguard Worker   operator!= (const position& pos1, const position& pos2)
171*cda5da8dSAndroid Build Coastguard Worker   {
172*cda5da8dSAndroid Build Coastguard Worker     return !(pos1 == pos2);
173*cda5da8dSAndroid Build Coastguard Worker   }
174*cda5da8dSAndroid Build Coastguard Worker ]])[
175*cda5da8dSAndroid Build Coastguard Worker   /** \brief Intercept output stream redirection.
176*cda5da8dSAndroid Build Coastguard Worker    ** \param ostr the destination output stream
177*cda5da8dSAndroid Build Coastguard Worker    ** \param pos a reference to the position to redirect
178*cda5da8dSAndroid Build Coastguard Worker    */
179*cda5da8dSAndroid Build Coastguard Worker   template <typename YYChar>
180*cda5da8dSAndroid Build Coastguard Worker   std::basic_ostream<YYChar>&
181*cda5da8dSAndroid Build Coastguard Worker   operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
182*cda5da8dSAndroid Build Coastguard Worker   {
183*cda5da8dSAndroid Build Coastguard Worker     if (pos.filename)
184*cda5da8dSAndroid Build Coastguard Worker       ostr << *pos.filename << ':';
185*cda5da8dSAndroid Build Coastguard Worker     return ostr << pos.line << '.' << pos.column;
186*cda5da8dSAndroid Build Coastguard Worker   }
187*cda5da8dSAndroid Build Coastguard Worker 
188*cda5da8dSAndroid Build Coastguard Worker   /// Two points in a source file.
189*cda5da8dSAndroid Build Coastguard Worker   class location
190*cda5da8dSAndroid Build Coastguard Worker   {
191*cda5da8dSAndroid Build Coastguard Worker   public:
192*cda5da8dSAndroid Build Coastguard Worker     /// Type for file name.
193*cda5da8dSAndroid Build Coastguard Worker     typedef position::filename_type filename_type;
194*cda5da8dSAndroid Build Coastguard Worker     /// Type for line and column numbers.
195*cda5da8dSAndroid Build Coastguard Worker     typedef position::counter_type counter_type;
196*cda5da8dSAndroid Build Coastguard Worker ]m4_ifdef([b4_location_constructors], [
197*cda5da8dSAndroid Build Coastguard Worker     /// Construct a location from \a b to \a e.
198*cda5da8dSAndroid Build Coastguard Worker     location (const position& b, const position& e)
199*cda5da8dSAndroid Build Coastguard Worker       : begin (b)
200*cda5da8dSAndroid Build Coastguard Worker       , end (e)
201*cda5da8dSAndroid Build Coastguard Worker     {}
202*cda5da8dSAndroid Build Coastguard Worker 
203*cda5da8dSAndroid Build Coastguard Worker     /// Construct a 0-width location in \a p.
204*cda5da8dSAndroid Build Coastguard Worker     explicit location (const position& p = position ())
205*cda5da8dSAndroid Build Coastguard Worker       : begin (p)
206*cda5da8dSAndroid Build Coastguard Worker       , end (p)
207*cda5da8dSAndroid Build Coastguard Worker     {}
208*cda5da8dSAndroid Build Coastguard Worker 
209*cda5da8dSAndroid Build Coastguard Worker     /// Construct a 0-width location in \a f, \a l, \a c.
210*cda5da8dSAndroid Build Coastguard Worker     explicit location (filename_type* f,
211*cda5da8dSAndroid Build Coastguard Worker                        counter_type l = ]b4_location_initial_line[,
212*cda5da8dSAndroid Build Coastguard Worker                        counter_type c = ]b4_location_initial_column[)
213*cda5da8dSAndroid Build Coastguard Worker       : begin (f, l, c)
214*cda5da8dSAndroid Build Coastguard Worker       , end (f, l, c)
215*cda5da8dSAndroid Build Coastguard Worker     {}
216*cda5da8dSAndroid Build Coastguard Worker 
217*cda5da8dSAndroid Build Coastguard Worker ])[
218*cda5da8dSAndroid Build Coastguard Worker     /// Initialization.
219*cda5da8dSAndroid Build Coastguard Worker     void initialize (filename_type* f = YY_NULLPTR,
220*cda5da8dSAndroid Build Coastguard Worker                      counter_type l = ]b4_location_initial_line[,
221*cda5da8dSAndroid Build Coastguard Worker                      counter_type c = ]b4_location_initial_column[)
222*cda5da8dSAndroid Build Coastguard Worker     {
223*cda5da8dSAndroid Build Coastguard Worker       begin.initialize (f, l, c);
224*cda5da8dSAndroid Build Coastguard Worker       end = begin;
225*cda5da8dSAndroid Build Coastguard Worker     }
226*cda5da8dSAndroid Build Coastguard Worker 
227*cda5da8dSAndroid Build Coastguard Worker     /** \name Line and Column related manipulators
228*cda5da8dSAndroid Build Coastguard Worker      ** \{ */
229*cda5da8dSAndroid Build Coastguard Worker   public:
230*cda5da8dSAndroid Build Coastguard Worker     /// Reset initial location to final location.
231*cda5da8dSAndroid Build Coastguard Worker     void step ()
232*cda5da8dSAndroid Build Coastguard Worker     {
233*cda5da8dSAndroid Build Coastguard Worker       begin = end;
234*cda5da8dSAndroid Build Coastguard Worker     }
235*cda5da8dSAndroid Build Coastguard Worker 
236*cda5da8dSAndroid Build Coastguard Worker     /// Extend the current location to the COUNT next columns.
237*cda5da8dSAndroid Build Coastguard Worker     void columns (counter_type count = 1)
238*cda5da8dSAndroid Build Coastguard Worker     {
239*cda5da8dSAndroid Build Coastguard Worker       end += count;
240*cda5da8dSAndroid Build Coastguard Worker     }
241*cda5da8dSAndroid Build Coastguard Worker 
242*cda5da8dSAndroid Build Coastguard Worker     /// Extend the current location to the COUNT next lines.
243*cda5da8dSAndroid Build Coastguard Worker     void lines (counter_type count = 1)
244*cda5da8dSAndroid Build Coastguard Worker     {
245*cda5da8dSAndroid Build Coastguard Worker       end.lines (count);
246*cda5da8dSAndroid Build Coastguard Worker     }
247*cda5da8dSAndroid Build Coastguard Worker     /** \} */
248*cda5da8dSAndroid Build Coastguard Worker 
249*cda5da8dSAndroid Build Coastguard Worker 
250*cda5da8dSAndroid Build Coastguard Worker   public:
251*cda5da8dSAndroid Build Coastguard Worker     /// Beginning of the located region.
252*cda5da8dSAndroid Build Coastguard Worker     position begin;
253*cda5da8dSAndroid Build Coastguard Worker     /// End of the located region.
254*cda5da8dSAndroid Build Coastguard Worker     position end;
255*cda5da8dSAndroid Build Coastguard Worker   };
256*cda5da8dSAndroid Build Coastguard Worker 
257*cda5da8dSAndroid Build Coastguard Worker   /// Join two locations, in place.
258*cda5da8dSAndroid Build Coastguard Worker   inline location&
259*cda5da8dSAndroid Build Coastguard Worker   operator+= (location& res, const location& end)
260*cda5da8dSAndroid Build Coastguard Worker   {
261*cda5da8dSAndroid Build Coastguard Worker     res.end = end.end;
262*cda5da8dSAndroid Build Coastguard Worker     return res;
263*cda5da8dSAndroid Build Coastguard Worker   }
264*cda5da8dSAndroid Build Coastguard Worker 
265*cda5da8dSAndroid Build Coastguard Worker   /// Join two locations.
266*cda5da8dSAndroid Build Coastguard Worker   inline location
267*cda5da8dSAndroid Build Coastguard Worker   operator+ (location res, const location& end)
268*cda5da8dSAndroid Build Coastguard Worker   {
269*cda5da8dSAndroid Build Coastguard Worker     return res += end;
270*cda5da8dSAndroid Build Coastguard Worker   }
271*cda5da8dSAndroid Build Coastguard Worker 
272*cda5da8dSAndroid Build Coastguard Worker   /// Add \a width columns to the end position, in place.
273*cda5da8dSAndroid Build Coastguard Worker   inline location&
274*cda5da8dSAndroid Build Coastguard Worker   operator+= (location& res, location::counter_type width)
275*cda5da8dSAndroid Build Coastguard Worker   {
276*cda5da8dSAndroid Build Coastguard Worker     res.columns (width);
277*cda5da8dSAndroid Build Coastguard Worker     return res;
278*cda5da8dSAndroid Build Coastguard Worker   }
279*cda5da8dSAndroid Build Coastguard Worker 
280*cda5da8dSAndroid Build Coastguard Worker   /// Add \a width columns to the end position.
281*cda5da8dSAndroid Build Coastguard Worker   inline location
282*cda5da8dSAndroid Build Coastguard Worker   operator+ (location res, location::counter_type width)
283*cda5da8dSAndroid Build Coastguard Worker   {
284*cda5da8dSAndroid Build Coastguard Worker     return res += width;
285*cda5da8dSAndroid Build Coastguard Worker   }
286*cda5da8dSAndroid Build Coastguard Worker 
287*cda5da8dSAndroid Build Coastguard Worker   /// Subtract \a width columns to the end position, in place.
288*cda5da8dSAndroid Build Coastguard Worker   inline location&
289*cda5da8dSAndroid Build Coastguard Worker   operator-= (location& res, location::counter_type width)
290*cda5da8dSAndroid Build Coastguard Worker   {
291*cda5da8dSAndroid Build Coastguard Worker     return res += -width;
292*cda5da8dSAndroid Build Coastguard Worker   }
293*cda5da8dSAndroid Build Coastguard Worker 
294*cda5da8dSAndroid Build Coastguard Worker   /// Subtract \a width columns to the end position.
295*cda5da8dSAndroid Build Coastguard Worker   inline location
296*cda5da8dSAndroid Build Coastguard Worker   operator- (location res, location::counter_type width)
297*cda5da8dSAndroid Build Coastguard Worker   {
298*cda5da8dSAndroid Build Coastguard Worker     return res -= width;
299*cda5da8dSAndroid Build Coastguard Worker   }
300*cda5da8dSAndroid Build Coastguard Worker ]b4_percent_define_flag_if([[define_location_comparison]], [[
301*cda5da8dSAndroid Build Coastguard Worker   /// Compare two location objects.
302*cda5da8dSAndroid Build Coastguard Worker   inline bool
303*cda5da8dSAndroid Build Coastguard Worker   operator== (const location& loc1, const location& loc2)
304*cda5da8dSAndroid Build Coastguard Worker   {
305*cda5da8dSAndroid Build Coastguard Worker     return loc1.begin == loc2.begin && loc1.end == loc2.end;
306*cda5da8dSAndroid Build Coastguard Worker   }
307*cda5da8dSAndroid Build Coastguard Worker 
308*cda5da8dSAndroid Build Coastguard Worker   /// Compare two location objects.
309*cda5da8dSAndroid Build Coastguard Worker   inline bool
310*cda5da8dSAndroid Build Coastguard Worker   operator!= (const location& loc1, const location& loc2)
311*cda5da8dSAndroid Build Coastguard Worker   {
312*cda5da8dSAndroid Build Coastguard Worker     return !(loc1 == loc2);
313*cda5da8dSAndroid Build Coastguard Worker   }
314*cda5da8dSAndroid Build Coastguard Worker ]])[
315*cda5da8dSAndroid Build Coastguard Worker   /** \brief Intercept output stream redirection.
316*cda5da8dSAndroid Build Coastguard Worker    ** \param ostr the destination output stream
317*cda5da8dSAndroid Build Coastguard Worker    ** \param loc a reference to the location to redirect
318*cda5da8dSAndroid Build Coastguard Worker    **
319*cda5da8dSAndroid Build Coastguard Worker    ** Avoid duplicate information.
320*cda5da8dSAndroid Build Coastguard Worker    */
321*cda5da8dSAndroid Build Coastguard Worker   template <typename YYChar>
322*cda5da8dSAndroid Build Coastguard Worker   std::basic_ostream<YYChar>&
323*cda5da8dSAndroid Build Coastguard Worker   operator<< (std::basic_ostream<YYChar>& ostr, const location& loc)
324*cda5da8dSAndroid Build Coastguard Worker   {
325*cda5da8dSAndroid Build Coastguard Worker     location::counter_type end_col
326*cda5da8dSAndroid Build Coastguard Worker       = 0 < loc.end.column ? loc.end.column - 1 : 0;
327*cda5da8dSAndroid Build Coastguard Worker     ostr << loc.begin;
328*cda5da8dSAndroid Build Coastguard Worker     if (loc.end.filename
329*cda5da8dSAndroid Build Coastguard Worker         && (!loc.begin.filename
330*cda5da8dSAndroid Build Coastguard Worker             || *loc.begin.filename != *loc.end.filename))
331*cda5da8dSAndroid Build Coastguard Worker       ostr << '-' << loc.end.filename << ':' << loc.end.line << '.' << end_col;
332*cda5da8dSAndroid Build Coastguard Worker     else if (loc.begin.line < loc.end.line)
333*cda5da8dSAndroid Build Coastguard Worker       ostr << '-' << loc.end.line << '.' << end_col;
334*cda5da8dSAndroid Build Coastguard Worker     else if (loc.begin.column < end_col)
335*cda5da8dSAndroid Build Coastguard Worker       ostr << '-' << end_col;
336*cda5da8dSAndroid Build Coastguard Worker     return ostr;
337*cda5da8dSAndroid Build Coastguard Worker   }
338*cda5da8dSAndroid Build Coastguard Worker ]])
339*cda5da8dSAndroid Build Coastguard Worker 
340*cda5da8dSAndroid Build Coastguard Worker 
341*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([b4_position_file], [[
342*cda5da8dSAndroid Build Coastguard Worker ]b4_output_begin([b4_dir_prefix], [b4_position_file])[
343*cda5da8dSAndroid Build Coastguard Worker ]b4_generated_by[
344*cda5da8dSAndroid Build Coastguard Worker // Starting with Bison 3.2, this file is useless: the structure it
345*cda5da8dSAndroid Build Coastguard Worker // used to define is now defined in "]b4_location_file[".
346*cda5da8dSAndroid Build Coastguard Worker //
347*cda5da8dSAndroid Build Coastguard Worker // To get rid of this file:
348*cda5da8dSAndroid Build Coastguard Worker // 1. add '%require "3.2"' (or newer) to your grammar file
349*cda5da8dSAndroid Build Coastguard Worker // 2. remove references to this file from your build system
350*cda5da8dSAndroid Build Coastguard Worker // 3. if you used to include it, include "]b4_location_file[" instead.
351*cda5da8dSAndroid Build Coastguard Worker 
352*cda5da8dSAndroid Build Coastguard Worker #include ]b4_location_include[
353*cda5da8dSAndroid Build Coastguard Worker ]b4_output_end[
354*cda5da8dSAndroid Build Coastguard Worker ]])
355*cda5da8dSAndroid Build Coastguard Worker 
356*cda5da8dSAndroid Build Coastguard Worker 
357*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([b4_location_file], [[
358*cda5da8dSAndroid Build Coastguard Worker ]b4_output_begin([b4_dir_prefix], [b4_location_file])[
359*cda5da8dSAndroid Build Coastguard Worker ]b4_copyright([Locations for Bison parsers in C++])[
360*cda5da8dSAndroid Build Coastguard Worker /**
361*cda5da8dSAndroid Build Coastguard Worker  ** \file ]b4_location_path[
362*cda5da8dSAndroid Build Coastguard Worker  ** Define the ]b4_namespace_ref[::location class.
363*cda5da8dSAndroid Build Coastguard Worker  */
364*cda5da8dSAndroid Build Coastguard Worker 
365*cda5da8dSAndroid Build Coastguard Worker ]b4_cpp_guard_open([b4_location_path])[
366*cda5da8dSAndroid Build Coastguard Worker 
367*cda5da8dSAndroid Build Coastguard Worker # include <iostream>
368*cda5da8dSAndroid Build Coastguard Worker # include <string>
369*cda5da8dSAndroid Build Coastguard Worker 
370*cda5da8dSAndroid Build Coastguard Worker ]b4_null_define[
371*cda5da8dSAndroid Build Coastguard Worker 
372*cda5da8dSAndroid Build Coastguard Worker ]b4_namespace_open[
373*cda5da8dSAndroid Build Coastguard Worker ]b4_location_define[
374*cda5da8dSAndroid Build Coastguard Worker ]b4_namespace_close[
375*cda5da8dSAndroid Build Coastguard Worker ]b4_cpp_guard_close([b4_location_path])[
376*cda5da8dSAndroid Build Coastguard Worker ]b4_output_end[
377*cda5da8dSAndroid Build Coastguard Worker ]])
378*cda5da8dSAndroid Build Coastguard Worker 
379*cda5da8dSAndroid Build Coastguard Worker 
380*cda5da8dSAndroid Build Coastguard Worker m4_popdef([b4_copyright_years])
381