1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# C++ skeleton for Bison 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc. 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is free software: you can redistribute it and/or modify 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# it under the terms of the GNU General Public License as published by 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the Free Software Foundation, either version 3 of the License, or 8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# (at your option) any later version. 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This program is distributed in the hope that it will be useful, 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# but WITHOUT ANY WARRANTY; without even the implied warranty of 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# GNU General Public License for more details. 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# You should have received a copy of the GNU General Public License 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# along with this program. If not, see <http://www.gnu.org/licenses/>. 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wangb4_output_begin([b4_dir_prefix[]position.hh]) 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectb4_copyright([Positions for Bison parsers in C++], 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang [2002-2007, 2009-2012])[ 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/** 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang ** \file ]b4_dir_prefix[position.hh 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ** Define the ]b4_namespace_ref[::position class. 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project */ 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[ 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <algorithm> // std::max 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <iostream> 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <string> 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_null_define[ 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_namespace_open[ 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Abstract a position. 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project class position 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project public: 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang]m4_ifdef([b4_location_constructors], [[ 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Construct a position. 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULL, 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int l = ]b4_location_initial_line[u, 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int c = ]b4_location_initial_column[u) 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang : filename (f) 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang , line (l) 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang , column (c) 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])[ 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Initialization. 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULL, 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int l = ]b4_location_initial_line[u, 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int c = ]b4_location_initial_column[u) 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project filename = fn; 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang line = l; 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang column = c; 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /** \name Line and Column related manipulators 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** \{ */ 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// (line related) Advance to the COUNT next lines. 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang void lines (int count = 1) 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang column = ]b4_location_initial_column[u; 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project line += count; 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// (column related) Advance to the COUNT next columns. 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang void columns (int count = 1) 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang column = std::max (]b4_location_initial_column[u, column + count); 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /** \} */ 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// File name to which this position refers. 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang ]b4_percent_define_get([[filename_type]])[* filename; 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Current line number. 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int line; 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Current column number. 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int column; 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project }; 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Add and assign a position. 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline position& 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project operator+= (position& res, const int width) 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project res.columns (width); 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return res; 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Add two position objects. 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project inline const position 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project operator+ (const position& begin, const int width) 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project position res = begin; 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return res += width; 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Add and assign a position. 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline position& 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project operator-= (position& res, const int width) 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return res += -width; 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Add two position objects. 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project inline const position 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project operator- (const position& begin, const int width) 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return begin + -width; 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_percent_define_flag_if([[define_location_comparison]], [[ 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Compare two position objects. 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator== (const position& pos1, const position& pos2) 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (pos1.line == pos2.line 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang && pos1.column == pos2.column 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang && (pos1.filename == pos2.filename 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang || (pos1.filename && pos2.filename 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang && *pos1.filename == *pos2.filename))); 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Compare two position objects. 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator!= (const position& pos1, const position& pos2) 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return !(pos1 == pos2); 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])[ 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /** \brief Intercept output stream redirection. 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** \param ostr the destination output stream 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** \param pos a reference to the position to redirect 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project */ 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang template <typename YYChar> 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline std::basic_ostream<YYChar>& 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator<< (std::basic_ostream<YYChar>& ostr, const position& pos) 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (pos.filename) 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ostr << *pos.filename << ':'; 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ostr << pos.line << '.' << pos.column; 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_namespace_close[ 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_cpp_guard_close([b4_dir_prefix[]position.hh]) 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wangb4_output_end() 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wangb4_output_begin([b4_dir_prefix[]location.hh]) 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectb4_copyright([Locations for Bison parsers in C++], 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang [2002-2007, 2009-2012])[ 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/** 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang ** \file ]b4_dir_prefix[location.hh 15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang ** Define the ]b4_namespace_ref[::location class. 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project */ 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[ 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "position.hh" 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_namespace_open[ 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Abstract a location. 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project class location 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project public: 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project]m4_ifdef([b4_location_constructors], [ 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Construct a location from \a b to \a e. 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang location (const position& b, const position& e) 17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang : begin (b) 17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang , end (e) 17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Construct a 0-width location in \a p. 18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang explicit location (const position& p = position ()) 18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang : begin (p) 18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang , end (p) 18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Construct a 0-width location in \a f, \a l, \a c. 18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang explicit location (]b4_percent_define_get([[filename_type]])[* f, 18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int l = ]b4_location_initial_line[u, 19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int c = ]b4_location_initial_column[u) 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang : begin (f, l, c) 19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang , end (f, l, c) 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project])[ 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Initialization. 19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULL, 19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int l = ]b4_location_initial_line[u, 20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int c = ]b4_location_initial_column[u) 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang begin.initialize (f, l, c); 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project end = begin; 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /** \name Line and Column related manipulators 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** \{ */ 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project public: 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Reset initial location to final location. 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang void step () 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project begin = end; 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Extend the current location to the COUNT next columns. 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang void columns (unsigned int count = 1) 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project end += count; 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Extend the current location to the COUNT next lines. 22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang void lines (unsigned int count = 1) 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project end.lines (count); 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /** \} */ 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project public: 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Beginning of the located region. 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project position begin; 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// End of the located region. 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project position end; 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project }; 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Join two location objects to create a location. 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project inline const location operator+ (const location& begin, const location& end) 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project location res = begin; 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project res.end = end.end; 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return res; 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Add two location objects. 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project inline const location operator+ (const location& begin, unsigned int width) 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project location res = begin; 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project res.columns (width); 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return res; 250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /// Add and assign a location. 253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project inline location& operator+= (location& res, unsigned int width) 254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project res.columns (width); 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return res; 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_percent_define_flag_if([[define_location_comparison]], [[ 25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Compare two location objects. 26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool 26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator== (const location& loc1, const location& loc2) 26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang return loc1.begin == loc2.begin && loc1.end == loc2.end; 26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Compare two location objects. 26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool 26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator!= (const location& loc1, const location& loc2) 26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang return !(loc1 == loc2); 27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang]])[ 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /** \brief Intercept output stream redirection. 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** \param ostr the destination output stream 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** \param loc a reference to the location to redirect 276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ** Avoid duplicate information. 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project */ 27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang template <typename YYChar> 28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline std::basic_ostream<YYChar>& 28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator<< (std::basic_ostream<YYChar>& ostr, const location& loc) 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project position last = loc.end - 1; 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ostr << loc.begin; 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (last.filename 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project && (!loc.begin.filename 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project || *loc.begin.filename != *last.filename)) 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ostr << '-' << last; 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (loc.begin.line != last.line) 290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ostr << '-' << last.line << '.' << last.column; 291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (loc.begin.column != last.column) 292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ostr << '-' << last.column; 293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ostr; 294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_namespace_close[ 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_cpp_guard_close([b4_dir_prefix[]location.hh]) 29905436638acc7c010349a69c3395f1a57c642dc62Ying Wangb4_output_end() 300