tables.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. *
  3. * Copyright (c) 2004
  4. * John Maddock
  5. *
  6. * Use, modification and distribution are subject to the
  7. * Boost Software License, Version 1.0. (See accompanying file
  8. * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. *
  10. */
  11. /*
  12. * LOCATION: see http://www.boost.org for most recent version.
  13. * FILE tables.cpp
  14. * VERSION see <boost/version.hpp>
  15. * DESCRIPTION: Generates code snippets programatically, for cut-and
  16. * paste into regex source.
  17. */
  18. #include <boost/config.hpp>
  19. #include <map>
  20. #include <vector>
  21. #include <string>
  22. #include <iostream>
  23. #include <algorithm>
  24. #include <cctype>
  25. std::string g_char_type;
  26. std::string g_data_type;
  27. std::map<std::string, std::string> g_table;
  28. std::map<std::string, std::pair<std::string, std::string> > g_help_table;
  29. void add(std::string key, std::string data)
  30. {
  31. g_table[key] = data;
  32. if(key.size() <= 2)
  33. g_help_table[data].first = key;
  34. else
  35. g_help_table[data].second = key;
  36. std::string::size_type i = 0;
  37. while(i < key.size())
  38. {
  39. if(std::isspace(key[i]) || (key[i] == '-') || (key[i] == '_'))
  40. key.erase(i, 1);
  41. else
  42. {
  43. key[i] = std::tolower(key[i]);
  44. ++i;
  45. }
  46. }
  47. }
  48. #define ADD(x, y) add(BOOST_STRINGIZE(x), BOOST_STRINGIZE(y))
  49. void generate_code()
  50. {
  51. std::map<std::string, std::string>::const_iterator i, j;
  52. // begin with the character tables:
  53. std::cout << "static const " << g_char_type << " prop_name_table[] = {\n";
  54. for(i = g_table.begin(), j = g_table.end(); i != j; ++i)
  55. {
  56. std::cout << " /* " << i->first << " */ ";
  57. for(std::string::size_type n = 0; n < i->first.size(); ++n)
  58. {
  59. std::cout.put('\'');
  60. std::cout.put((i->first)[n]);
  61. std::cout.put('\'');
  62. std::cout.put(',');
  63. std::cout.put(' ');
  64. }
  65. std::cout << std::endl;;
  66. }
  67. std::cout << "};\n\n";
  68. // now the iterator table:
  69. std::cout << "static const BOOST_REGEX_DETAIL_NS::character_pointer_range<" << g_char_type << "> range_data[] = {\n";
  70. std::size_t index = 0;
  71. for(i = g_table.begin(), j = g_table.end(); i != j; ++i)
  72. {
  73. std::cout << " { prop_name_table+" << index << ", prop_name_table+";
  74. index += i->first.size();
  75. std::cout << index << ", }, // " << i->first << std::endl;
  76. }
  77. std::cout << "};\n\n";
  78. // now the value table:
  79. std::cout << "static const " << g_data_type << " icu_class_map[] = {\n";
  80. for(i = g_table.begin(), j = g_table.end(); i != j; ++i)
  81. {
  82. std::cout << " " << i->second << ", // " << i->first << std::endl;
  83. }
  84. std::cout << "};\n\n" << std::flush;
  85. g_table.clear();
  86. }
  87. void generate_html()
  88. {
  89. // start by producing a sorted list:
  90. std::vector<std::pair<std::string, std::string> > v;
  91. std::map<std::string, std::pair<std::string, std::string> >::const_iterator i, j;
  92. i = g_help_table.begin();
  93. j = g_help_table.end();
  94. while(i != j)
  95. {
  96. v.push_back(i->second);
  97. ++i;
  98. }
  99. std::sort(v.begin(), v.end());
  100. std::vector<std::pair<std::string, std::string> >::const_iterator h, k;
  101. h = v.begin();
  102. k = v.end();
  103. std::cout << "<table width=\"100%\"><tr><td><b>Short Name</b></td><td><b>Long Name</b></td></tr>\n";
  104. while(h != k)
  105. {
  106. std::cout << "<tr><td>" << (h->first.size() ? h->first : std::string(" ")) << "</td><td>" << h->second << "</td></tr>\n";
  107. ++h;
  108. }
  109. std::cout << "</table>\n\n";
  110. }
  111. int main()
  112. {
  113. g_char_type = "::UChar32";
  114. g_data_type = "icu_regex_traits::char_class_type";
  115. ADD(L*, U_GC_L_MASK);
  116. ADD(Letter, U_GC_L_MASK);
  117. ADD(Lu, U_GC_LU_MASK);
  118. ADD(Ll, U_GC_LL_MASK);
  119. ADD(Lt, U_GC_LT_MASK);
  120. ADD(Lm, U_GC_LM_MASK);
  121. ADD(Lo, U_GC_LO_MASK);
  122. ADD(Uppercase Letter, U_GC_LU_MASK);
  123. ADD(Lowercase Letter, U_GC_LL_MASK);
  124. ADD(Titlecase Letter, U_GC_LT_MASK);
  125. ADD(Modifier Letter, U_GC_LM_MASK);
  126. ADD(Other Letter, U_GC_LO_MASK);
  127. ADD(M*, U_GC_M_MASK);
  128. ADD(Mn, U_GC_MN_MASK);
  129. ADD(Mc, U_GC_MC_MASK);
  130. ADD(Me, U_GC_ME_MASK);
  131. ADD(Mark, U_GC_M_MASK);
  132. ADD(Non-Spacing Mark, U_GC_MN_MASK);
  133. ADD(Spacing Combining Mark, U_GC_MC_MASK);
  134. ADD(Enclosing Mark, U_GC_ME_MASK);
  135. ADD(N*, U_GC_N_MASK);
  136. ADD(Nd, U_GC_ND_MASK);
  137. ADD(Nl, U_GC_NL_MASK);
  138. ADD(No, U_GC_NO_MASK);
  139. ADD(Number, U_GC_N_MASK);
  140. ADD(Decimal Digit Number, U_GC_ND_MASK);
  141. ADD(Letter Number, U_GC_NL_MASK);
  142. ADD(Other Number, U_GC_NO_MASK);
  143. ADD(S*, U_GC_S_MASK);
  144. ADD(Sm, U_GC_SM_MASK);
  145. ADD(Sc, U_GC_SC_MASK);
  146. ADD(Sk, U_GC_SK_MASK);
  147. ADD(So, U_GC_SO_MASK);
  148. ADD(Symbol, U_GC_S_MASK);
  149. ADD(Math Symbol, U_GC_SM_MASK);
  150. ADD(Currency Symbol, U_GC_SC_MASK);
  151. ADD(Modifier Symbol, U_GC_SK_MASK);
  152. ADD(Other Symbol, U_GC_SO_MASK);
  153. ADD(P*, U_GC_P_MASK);
  154. ADD(Pc, U_GC_PC_MASK);
  155. ADD(Pd, U_GC_PD_MASK);
  156. ADD(Ps, U_GC_PS_MASK);
  157. ADD(Pe, U_GC_PE_MASK);
  158. ADD(Pi, U_GC_PI_MASK);
  159. ADD(Pf, U_GC_PF_MASK);
  160. ADD(Po, U_GC_PO_MASK);
  161. ADD(Punctuation, U_GC_P_MASK);
  162. ADD(Connector Punctuation, U_GC_PC_MASK);
  163. ADD(Dash Punctuation, U_GC_PD_MASK);
  164. ADD(Open Punctuation, U_GC_PS_MASK);
  165. ADD(Close Punctuation, U_GC_PE_MASK);
  166. ADD(Initial Punctuation, U_GC_PI_MASK);
  167. ADD(Final Punctuation, U_GC_PF_MASK);
  168. ADD(Other Punctuation, U_GC_PO_MASK);
  169. ADD(Z*, U_GC_Z_MASK);
  170. ADD(Zs, U_GC_ZS_MASK);
  171. ADD(Zl, U_GC_ZL_MASK);
  172. ADD(Zp, U_GC_ZP_MASK);
  173. ADD(Separator, U_GC_Z_MASK);
  174. ADD(Space Separator, U_GC_ZS_MASK);
  175. ADD(Line Separator, U_GC_ZL_MASK);
  176. ADD(Paragraph Separator, U_GC_ZP_MASK);
  177. ADD(C*, U_GC_C_MASK);
  178. ADD(Cc, U_GC_CC_MASK);
  179. ADD(Cf, U_GC_CF_MASK);
  180. ADD(Cs, U_GC_CS_MASK);
  181. ADD(Co, U_GC_CO_MASK);
  182. ADD(Cn, U_GC_CN_MASK);
  183. ADD(Other, U_GC_C_MASK);
  184. ADD(Control, U_GC_CC_MASK);
  185. ADD(Format, U_GC_CF_MASK);
  186. ADD(Surrogate, U_GC_CS_MASK);
  187. ADD(Private Use, U_GC_CO_MASK);
  188. ADD(Not Assigned, U_GC_CN_MASK);
  189. ADD(Any, icu_regex_traits::mask_any);
  190. ADD(Assigned, (0x3FFFFFFFu) & ~(U_GC_CN_MASK));
  191. ADD(ASCII, icu_regex_traits::mask_ascii);
  192. ADD(Titlecase, U_GC_LT_MASK);
  193. generate_code();
  194. generate_html();
  195. return 0;
  196. }