escape_char_parser_tests.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*=============================================================================
  2. Copyright (c) 2001-2003 Daniel Nuffer
  3. Copyright (c) 2001-2003 Hartmut Kaiser
  4. http://spirit.sourceforge.net/
  5. Use, modification and distribution is subject to the Boost Software
  6. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7. http://www.boost.org/LICENSE_1_0.txt)
  8. =============================================================================*/
  9. #include <boost/spirit/include/classic_core.hpp>
  10. #include <boost/spirit/include/classic_assign_actor.hpp>
  11. #include <boost/spirit/include/classic_escape_char.hpp>
  12. #include <iostream>
  13. #include <boost/core/ignore_unused.hpp>
  14. #include <boost/detail/lightweight_test.hpp>
  15. #include <cstdio> // for sprintf
  16. #if !defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF)
  17. # include <cwchar> // for swprintf
  18. #endif
  19. ///////////////////////////////////////////////////////////////////////////////
  20. using namespace std;
  21. using namespace BOOST_SPIRIT_CLASSIC_NS;
  22. ///////////////////////////////////////////////////////////////////////////////
  23. int
  24. main()
  25. {
  26. char c;
  27. // testing good C escapes
  28. BOOST_TEST(parse("a", c_escape_ch_p[assign_a(c)]).full);
  29. BOOST_TEST(c == 'a');
  30. BOOST_TEST(parse("\\b", c_escape_ch_p[assign_a(c)]).full);
  31. BOOST_TEST(c == '\b');
  32. BOOST_TEST(parse("\\t", c_escape_ch_p[assign_a(c)]).full);
  33. BOOST_TEST(c == '\t');
  34. BOOST_TEST(parse("\\n", c_escape_ch_p[assign_a(c)]).full);
  35. BOOST_TEST(c == '\n');
  36. BOOST_TEST(parse("\\f", c_escape_ch_p[assign_a(c)]).full);
  37. BOOST_TEST(c == '\f');
  38. BOOST_TEST(parse("\\r", c_escape_ch_p[assign_a(c)]).full);
  39. BOOST_TEST(c == '\r');
  40. BOOST_TEST(parse("\\\"", c_escape_ch_p[assign_a(c)]).full);
  41. BOOST_TEST(c == '\"');
  42. BOOST_TEST(parse("\\'", c_escape_ch_p[assign_a(c)]).full);
  43. BOOST_TEST(c == '\'');
  44. BOOST_TEST(parse("\\\\", c_escape_ch_p[assign_a(c)]).full);
  45. BOOST_TEST(c == '\\');
  46. BOOST_TEST(parse("\\120", c_escape_ch_p[assign_a(c)]).full);
  47. BOOST_TEST(c == '\120');
  48. BOOST_TEST(parse("\\x2e", c_escape_ch_p[assign_a(c)]).full);
  49. BOOST_TEST(c == '\x2e');
  50. // test bad C escapes
  51. BOOST_TEST(!parse("\\z", c_escape_ch_p[assign_a(c)]).hit);
  52. // testing good lex escapes
  53. BOOST_TEST(parse("a", lex_escape_ch_p[assign_a(c)]).full);
  54. BOOST_TEST(c == 'a');
  55. BOOST_TEST(parse("\\b", lex_escape_ch_p[assign_a(c)]).full);
  56. BOOST_TEST(c == '\b');
  57. BOOST_TEST(parse("\\t", lex_escape_ch_p[assign_a(c)]).full);
  58. BOOST_TEST(c == '\t');
  59. BOOST_TEST(parse("\\n", lex_escape_ch_p[assign_a(c)]).full);
  60. BOOST_TEST(c == '\n');
  61. BOOST_TEST(parse("\\f", lex_escape_ch_p[assign_a(c)]).full);
  62. BOOST_TEST(c == '\f');
  63. BOOST_TEST(parse("\\r", lex_escape_ch_p[assign_a(c)]).full);
  64. BOOST_TEST(c == '\r');
  65. BOOST_TEST(parse("\\\"", lex_escape_ch_p[assign_a(c)]).full);
  66. BOOST_TEST(c == '\"');
  67. BOOST_TEST(parse("\\'", lex_escape_ch_p[assign_a(c)]).full);
  68. BOOST_TEST(c == '\'');
  69. BOOST_TEST(parse("\\\\", lex_escape_ch_p[assign_a(c)]).full);
  70. BOOST_TEST(c == '\\');
  71. BOOST_TEST(parse("\\120", lex_escape_ch_p[assign_a(c)]).full);
  72. BOOST_TEST(c == '\120');
  73. BOOST_TEST(parse("\\x2e", lex_escape_ch_p[assign_a(c)]).full);
  74. BOOST_TEST(c == '\x2e');
  75. BOOST_TEST(parse("\\z", lex_escape_ch_p[assign_a(c)]).full);
  76. BOOST_TEST(c == 'z');
  77. BOOST_TEST(parse("\\a", lex_escape_ch_p[assign_a(c)]).full);
  78. BOOST_TEST(c == 'a');
  79. // test bad lex escapes
  80. BOOST_TEST(!parse("\\xz", lex_escape_ch_p[assign_a(c)]).hit);
  81. // test out of range octal escape
  82. BOOST_TEST(!parse("\\777", lex_escape_ch_p[assign_a(c)]).hit);
  83. #if CHAR_MAX == 127
  84. BOOST_TEST(!parse("\\200", lex_escape_ch_p[assign_a(c)]).hit);
  85. BOOST_TEST(parse("\\177", lex_escape_ch_p[assign_a(c)]).full);
  86. BOOST_TEST(c == '\177');
  87. #elif CHAR_MAX == 255
  88. BOOST_TEST(!parse("\\400", lex_escape_ch_p[assign_a(c)]).hit);
  89. BOOST_TEST(parse("\\377", lex_escape_ch_p[assign_a(c)]).full);
  90. BOOST_TEST(c == '\377');
  91. #endif
  92. // test out of range hex escape
  93. BOOST_TEST(!parse("\\xFFF", lex_escape_ch_p[assign_a(c)]).hit);
  94. #if CHAR_MAX == 127
  95. BOOST_TEST(!parse("\\X80", lex_escape_ch_p[assign_a(c)]).hit);
  96. BOOST_TEST(parse("\\X7F", lex_escape_ch_p[assign_a(c)]).full);
  97. BOOST_TEST(c == '\x7f');
  98. #elif CHAR_MAX == 255
  99. BOOST_TEST(!parse("\\X100", lex_escape_ch_p[assign_a(c)]).hit);
  100. BOOST_TEST(parse("\\XFf", lex_escape_ch_p[assign_a(c)]).full);
  101. BOOST_TEST(c == '\xff');
  102. #endif
  103. #ifndef BOOST_NO_CWCHAR
  104. // test wide chars
  105. typedef escape_char_parser<lex_escapes, wchar_t> wlep_t;
  106. wlep_t wlep = wlep_t();
  107. typedef escape_char_parser<c_escapes, wchar_t> wcep_t;
  108. wcep_t wcep = wcep_t();
  109. //wchar_t const* wstr = L"a\\b\\t\\n\\f\\r\\\"\\'\\\\\\120\\x2e";
  110. //wchar_t const* wend(wstr + wcslen(wstr));
  111. wchar_t wc;
  112. BOOST_TEST(parse(L"a", wcep[assign_a(wc)]).hit);
  113. BOOST_TEST(wc == L'a');
  114. BOOST_TEST(parse(L"\\b", wcep[assign_a(wc)]).full);
  115. BOOST_TEST(wc == L'\b');
  116. BOOST_TEST(parse(L"\\t", wcep[assign_a(wc)]).full);
  117. BOOST_TEST(wc == L'\t');
  118. BOOST_TEST(parse(L"\\n", wcep[assign_a(wc)]).full);
  119. BOOST_TEST(wc == L'\n');
  120. BOOST_TEST(parse(L"\\f", wcep[assign_a(wc)]).full);
  121. BOOST_TEST(wc == L'\f');
  122. BOOST_TEST(parse(L"\\r", wcep[assign_a(wc)]).full);
  123. BOOST_TEST(wc == L'\r');
  124. BOOST_TEST(parse(L"\\\"", wcep[assign_a(wc)]).full);
  125. BOOST_TEST(wc == L'\"');
  126. BOOST_TEST(parse(L"\\'", wcep[assign_a(wc)]).full);
  127. BOOST_TEST(wc == L'\'');
  128. BOOST_TEST(parse(L"\\\\", wcep[assign_a(wc)]).full);
  129. BOOST_TEST(wc == L'\\');
  130. BOOST_TEST(parse(L"\\120", wcep[assign_a(wc)]).full);
  131. BOOST_TEST(wc == L'\120');
  132. BOOST_TEST(parse(L"\\x2e", wcep[assign_a(wc)]).full);
  133. BOOST_TEST(wc == L'\x2e');
  134. // test bad wc escapes
  135. BOOST_TEST(!parse(L"\\z", wcep[assign_a(wc)]).hit);
  136. #if !defined(BOOST_NO_SWPRINTF)
  137. // test out of range octal escape
  138. size_t const octmax_size = 16;
  139. wchar_t octmax[octmax_size];
  140. swprintf(octmax, octmax_size,
  141. L"\\%lo", (unsigned long)(std::numeric_limits<wchar_t>::max)());
  142. BOOST_TEST(parse(octmax, wlep[assign_a(wc)]).full);
  143. //BOOST_TEST(lex_escape_ch_p[assign_a(wc)].parse(str, end));
  144. BOOST_TEST(wc == (std::numeric_limits<wchar_t>::max)());
  145. swprintf(octmax, octmax_size,
  146. L"\\%lo", (unsigned long)(std::numeric_limits<wchar_t>::max)() + 1);
  147. BOOST_TEST(!parse(octmax, wlep[assign_a(wc)]).hit);
  148. // test out of range hex escape
  149. size_t const hexmax_size = 16;
  150. wchar_t hexmax[hexmax_size];
  151. swprintf(hexmax, hexmax_size,
  152. L"\\x%lx", (unsigned long)(std::numeric_limits<wchar_t>::max)());
  153. BOOST_TEST(parse(hexmax, wlep[assign_a(wc)]).full);
  154. BOOST_TEST(wc == (std::numeric_limits<wchar_t>::max)());
  155. swprintf(hexmax, hexmax_size,
  156. L"\\x%lx", (unsigned long)(std::numeric_limits<wchar_t>::max)() + 1);
  157. BOOST_TEST(!parse(hexmax, wlep[assign_a(wc)]).hit);
  158. #else
  159. boost::ignore_unused(wlep);
  160. #endif // !defined(BOOST_NO_SWPRINTF)
  161. #endif
  162. return boost::report_errors();
  163. }