123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*=============================================================================
- Boost.Wave: A Standard compliant C++ preprocessor library
- Grammar for universal character validation (see C++ standard: Annex E)
- http://www.boost.org/
- Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost
- Software License, Version 1.0. (See accompanying file
- LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- =============================================================================*/
- #if !defined(BOOST_CONVERT_TRIGRAPHS_HK050403_INCLUDED)
- #define BOOST_CONVERT_TRIGRAPHS_HK050403_INCLUDED
- #include <boost/wave/wave_config.hpp>
- #include <boost/wave/cpplexer/cpplexer_exceptions.hpp>
- // this must occur after all of the includes and before any code appears
- #ifdef BOOST_HAS_ABI_HEADERS
- #include BOOST_ABI_PREFIX
- #endif
- ///////////////////////////////////////////////////////////////////////////////
- namespace boost {
- namespace wave {
- namespace cpplexer {
- namespace impl {
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Test, whether the given string represents a valid trigraph sequence
- //
- ///////////////////////////////////////////////////////////////////////////////
- template <typename StringT>
- inline bool
- is_trigraph(StringT const& trigraph)
- {
- if (trigraph.size() < 3 || '?' != trigraph[0] || '?' != trigraph[1])
- return false;
- switch (trigraph[2]) {
- case '\'': case '=': case '/': case '(':
- case ')': case '<': case '>': case '!':
- case '-':
- break;
- default:
- return false;
- }
- return true;
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // convert_trigraph
- //
- // The function convert_trigraph() converts a single trigraph character
- // sequence into the corresponding character.
- //
- // If the given character sequence doesn't form a valid trigraph sequence
- // no conversion is performed.
- //
- ///////////////////////////////////////////////////////////////////////////////
- template <typename StringT>
- inline StringT
- convert_trigraph(StringT const &trigraph)
- {
- StringT result (trigraph);
- if (is_trigraph(trigraph)) {
- switch (trigraph[2]) {
- case '\'': result = "^"; break;
- case '=': result = "#"; break;
- case '/': result = "\\"; break;
- case '(': result = "["; break;
- case ')': result = "]"; break;
- case '<': result = "{"; break;
- case '>': result = "}"; break;
- case '!': result = "|"; break;
- case '-': result = "~"; break;
- }
- }
- return result;
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // convert_trigraphs
- //
- // The function convert_trigraph() converts all trigraphs in the given
- // string into the corresponding characters.
- //
- // If one of the given character sequences doesn't form a valid trigraph
- // sequence no conversion is performed.
- //
- ///////////////////////////////////////////////////////////////////////////////
- template <typename StringT>
- inline StringT
- convert_trigraphs(StringT const &value)
- {
- StringT result;
- typename StringT::size_type pos = 0;
- typename StringT::size_type pos1 = value.find_first_of ("?", 0);
- if (StringT::npos != pos1) {
- do {
- result += value.substr(pos, pos1-pos);
- StringT trigraph (value.substr(pos1));
- if (is_trigraph(trigraph)) {
- result += convert_trigraph(trigraph);
- pos1 = value.find_first_of ("?", pos = pos1+3);
- }
- else {
- result += value[pos1];
- pos1 = value.find_first_of ("?", pos = pos1+1);
- }
- } while (StringT::npos != pos1);
- result += value.substr(pos);
- }
- else {
- result = value;
- }
- return result;
- }
- ///////////////////////////////////////////////////////////////////////////////
- } // namespace impl
- } // namespace cpplexer
- } // namespace wave
- } // namespace boost
- // the suffix header occurs after all of the code
- #ifdef BOOST_HAS_ABI_HEADERS
- #include BOOST_ABI_SUFFIX
- #endif
- #endif // !defined(BOOST_CONVERT_TRIGRAPHS_HK050403_INCLUDED)
|