c++: support wide strings for file names

Reported by Mark Boyall.
http://lists.gnu.org/archive/html/help-bison/2011-08/msg00002.html

* data/location.cc (operator<<): Be templated on the type of
output stream.
* tests/headers.at (Several parsers): Adjust.
This commit is contained in:
Akim Demaille
2012-12-05 11:21:21 +01:00
parent 7bada5355e
commit 7ae57e2a35
3 changed files with 14 additions and 8 deletions

1
THANKS
View File

@@ -68,6 +68,7 @@ Lie Yan lie.yan@kaust.edu.sa
Magnus Fromreide magfr@lysator.liu.se Magnus Fromreide magfr@lysator.liu.se
Marc Autret autret_m@epita.fr Marc Autret autret_m@epita.fr
Marc Mendiola mmendiol@usc.edu Marc Mendiola mmendiol@usc.edu
Mark Boyall wolfeinstein@gmail.com
Martin Jacobs martin.jacobs@arcor.de Martin Jacobs martin.jacobs@arcor.de
Martin Mokrejs mmokrejs@natur.cuni.cz Martin Mokrejs mmokrejs@natur.cuni.cz
Martin Nylin martin.nylin@linuxmail.org Martin Nylin martin.nylin@linuxmail.org

View File

@@ -136,8 +136,9 @@ b4_copyright([Positions for Bison parsers in C++],
** \param ostr the destination output stream ** \param ostr the destination output stream
** \param pos a reference to the position to redirect ** \param pos a reference to the position to redirect
*/ */
inline std::ostream& template <typename YYChar>
operator<< (std::ostream& ostr, const position& pos) inline std::basic_ostream<YYChar>&
operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
{ {
if (pos.filename) if (pos.filename)
ostr << *pos.filename << ':'; ostr << *pos.filename << ':';
@@ -275,7 +276,9 @@ b4_copyright([Locations for Bison parsers in C++],
** **
** Avoid duplicate information. ** Avoid duplicate information.
*/ */
inline std::ostream& operator<< (std::ostream& ostr, const location& loc) template <typename YYChar>
inline std::basic_ostream<YYChar>&
operator<< (std::basic_ostream<YYChar>& ostr, const location& loc)
{ {
position last = loc.end - 1; position last = loc.end - 1;
ostr << loc.begin; ostr << loc.begin;

View File

@@ -229,14 +229,16 @@ AT_TEST([x8], [%define api.pure %define api.push-pull both])
# C++ output relies on namespaces and still uses yy a lot. # C++ output relies on namespaces and still uses yy a lot.
# #
# Check there is no 'YY' left. # Check there is no 'YY' left.
# Ignore comments, YYPARSE_PARAM (obsolete), YYPUSH_MORE(_DEFINED)? # Ignore comments, YYChar (template parameter), YYPARSE_PARAM
# (constant definition), YY_\w+_INCLUDED (header guards). # (obsolete), YYPUSH_MORE(_DEFINED)? (constant definition),
# YY_\w+_INCLUDED (header guards).
# #
# YYDEBUG (not renamed) can be read, but not changed. # YYDEBUG (not renamed) can be read, but not changed.
AT_CHECK([[$PERL -n -0777 -e ' AT_CHECK([[$PERL -n -0777 -e '
s{/\*.*?\*/}{}gs; s{/\*.*?\*/}{}gs;
s{//.*}{}g; s{//.*}{}g;
s{\b(YYPARSE_PARAM s{\b(YYChar
|YYPARSE_PARAM
|YYPUSH_MORE(_DEFINED)? |YYPUSH_MORE(_DEFINED)?
|YY_\w+_INCLUDED |YY_\w+_INCLUDED
|YY_NULL |YY_NULL
@@ -244,13 +246,13 @@ AT_CHECK([[$PERL -n -0777 -e '
)\b}{}gx; )\b}{}gx;
while (/^(.*YY.*)$/gm) while (/^(.*YY.*)$/gm)
{ {
print "$ARGV: $1\n"; print "$ARGV: invalid exported YY: $1\n";
} }
if ($ARGV =~ /\.h$/) if ($ARGV =~ /\.h$/)
{ {
while (/^(.*yy.*)$/gm) while (/^(.*yy.*)$/gm)
{ {
print "$ARGV: $1\n"; print "$ARGV: invalid exported yy: $1\n";
} }
} }
' -- *.hh *.h]]) ' -- *.hh *.h]])