CaseInsensitive.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. //
  6. // Map Unicode characters to their equivalence classes induced by the modified ToUpper map.
  7. // i.e.: c1 and c2 are in the same class if ToUpper(c1) == ToUpper(c2).
  8. //
  9. // The ToUpper map takes any character to its Unicode upper case equivalent, with the modification that
  10. // a non-7-bit-ASCII character cannot be mapped to 7-bit-ASCII characters.
  11. //
  12. #include "ParserPch.h"
  13. namespace UnifiedRegex
  14. {
  15. namespace CaseInsensitive
  16. {
  17. struct Transform
  18. {
  19. // This skipCount is to help define the range. Ex, given range [0 - 20]
  20. // If skip count is 1, then all items between 0 and 20 are in the range.
  21. // If skip count is 2, then every even item is in the range, so 0, 2, 4, 6, 8, etc.
  22. byte skipCountOfRange;
  23. MappingSource source;
  24. // Range of chars this transform applies to
  25. Chars<codepoint_t>::UChar lo;
  26. Chars<codepoint_t>::UChar hi;
  27. // Offsets to add to original character to get each equivalent character
  28. int delta0;
  29. int delta1;
  30. int delta2;
  31. int delta3;
  32. template <typename Char>
  33. inline void Apply(uint c, Char outEquiv[EquivClassSize]) const
  34. {
  35. Assert(c >= lo && c <= hi);
  36. outEquiv[0] = Chars<Char>::UTC((lo + 1) % skipCountOfRange == c % skipCountOfRange ? (int)c + delta0 : c);
  37. CompileAssert(CaseInsensitive::EquivClassSize == 4);
  38. if (lo % skipCountOfRange == c % skipCountOfRange)
  39. {
  40. outEquiv[1] = Chars<Char>::ITC((int)c + delta1);
  41. outEquiv[2] = Chars<Char>::ITC((int)c + delta2);
  42. outEquiv[3] = Chars<Char>::ITC((int)c + delta3);
  43. }
  44. else
  45. {
  46. outEquiv[1] = outEquiv[2] = outEquiv[3] = Chars<Char>::UTC(c);
  47. }
  48. }
  49. };
  50. /*
  51. We first construct a total map from character codes to equivalence lists such that:
  52. - if ToUpper(c1) == ToUpper(c2) then c1 has c2 in its equivalence list
  53. - if c1 and c2 appear in the same equivalence list then c1 and c2 have equal equivalence lists
  54. We then compress the above map such that:
  55. - characters with singleton equivalence classes are elided
  56. - consecutive characters with consecutive equivalence lists are represented as a range and delta
  57. - the result is in strictly increasing range order
  58. Using gawk the above is:
  59. gawk -f equiv.gawk http://www.unicode.org/Public/UNIDATA/UnicodeData.txt | gawk -f table.gawk
  60. Where equiv.gawk is:
  61. ----------------------------------------------------------------------
  62. BEGIN {
  63. FS = ";";
  64. previncode = -1;
  65. }
  66. length($1) == 4 {
  67. incode = strtonum("0x" $1);
  68. for (i = previncode + 1; i < incode; i++)
  69. map[i] = i;
  70. if ($3 == "Ll" && $15 != "")
  71. {
  72. map[incode] = strtonum("0x" $15);
  73. # non-7-bit-ASCII cannot map to 7-bit-ASCII
  74. if (incode > 127 && map[incode] <= 127)
  75. map[incode] = incode;
  76. }
  77. else
  78. map[incode] = incode;
  79. previncode = incode;
  80. }
  81. END {
  82. for (i = previncode + 1; i <= 0xffff; i++)
  83. map[i] = i;
  84. for (i = 0x0000; i <= 0xffff; i++)
  85. ninv[i] = 0;
  86. for (i = 0x0000; i <= 0xffff; i++)
  87. {
  88. if (map[i] != i)
  89. ninv[map[i]]++;
  90. }
  91. maxninv = 0;
  92. for (i = 0x0000; i <= 0xffff; i++)
  93. {
  94. if (ninv[i] > maxninv)
  95. maxninv = ninv[i];
  96. }
  97. if (maxninv > 2)
  98. print "ERROR";
  99. for (i = 0x0000; i <= 0xffff; i++)
  100. inv[i] = "";
  101. for (i = 0x0000; i <= 0xffff; i++)
  102. {
  103. if (map[i] != i)
  104. inv[map[i]] = sprintf("%s;0x%04x", inv[map[i]], i);
  105. }
  106. for (i = 0x0000; i <= 0xffff; i++)
  107. {
  108. if (map[i] != i)
  109. {
  110. equiv[i] = sprintf("0x%04x%s", map[i], inv[map[i]]);
  111. nequiv[i] = 1 + ninv[map[i]];
  112. }
  113. else if (inv[i] != "")
  114. {
  115. equiv[i] = sprintf("0x%04x%s", i, inv[i]);
  116. nequiv[i] = 1 + ninv[i];
  117. }
  118. else
  119. {
  120. equiv[i] = sprintf("0x%04x", i);
  121. nequiv[i] = 1;
  122. }
  123. }
  124. nentries = 0
  125. for (i = 0x0000; i <= 0xffff; i++)
  126. {
  127. if (nequiv[i] > 1)
  128. {
  129. printf("0x%04x;%s\n", i, equiv[i]);
  130. nentries++;
  131. }
  132. }
  133. #printf("nentries = %d\n", nentries);
  134. }
  135. ----------------------------------------------------------------------
  136. And table.gawk is:
  137. ----------------------------------------------------------------------
  138. BEGIN {
  139. FS = ";";
  140. lastCode = -1;
  141. currStart = -1;
  142. for (i = 0; i < 3; i++)
  143. currDeltas[i] = "";
  144. }
  145. {
  146. if (NF > 4)
  147. print "ERROR"
  148. incode = strtonum($1);
  149. for (i = 0; i < NF - 1; i++)
  150. equivs[i] = strtonum($(i+2));
  151. for (i = NF - 1; i < 3; i++)
  152. equivs[i] = equivs[i - 1];
  153. #printf("0x%04x, 0x%04x, 0x%04x, 0x%04x\n", incode, equivs[0], equivs[1], equivs[2]);
  154. for (i = 0; i < 3; i++)
  155. deltas[i] = equivs[i] - incode;
  156. if (currStart < 0)
  157. {
  158. # start a new range
  159. currStart = incode;
  160. for (i = 0; i < 3; i++)
  161. currDeltas[i] = deltas[i]
  162. }
  163. else if (incode == lastCode + 1 && deltas[0] == currDeltas[0] && deltas[1] == currDeltas[1] && deltas[2] == currDeltas[2])
  164. {
  165. # keep accumulating range
  166. }
  167. else
  168. {
  169. # dump current range and start a new one
  170. printf(" 0x%04x, 0x%04x, %d, %d, %d,\n", currStart, lastCode, currDeltas[0], currDeltas[1], currDeltas[2]);
  171. currStart = incode;
  172. for (i = 0; i < 3; i++)
  173. currDeltas[i] = deltas[i]
  174. }
  175. lastCode = incode;
  176. }
  177. END {
  178. printf(" 0x%04x, 0x%04x, %d, %d, %d,\n", currStart, lastCode, currDeltas[0], currDeltas[1], currDeltas[2]);
  179. }
  180. ----------------------------------------------------------------------
  181. */
  182. // For case-folding entries, version 8.0.0 of CaseFolding.txt located at [1] was used.
  183. // [1] ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt
  184. static const Transform transforms[] =
  185. {
  186. 1, MappingSource::UnicodeData, 0x0041, 0x004a, 0, 32, 32, 32,
  187. 1, MappingSource::CaseFolding, 0x004b, 0x004b, 0, 32, 8415, 8415,
  188. 1, MappingSource::UnicodeData, 0x004b, 0x0052, 0, 32, 32, 32,
  189. 1, MappingSource::CaseFolding, 0x0053, 0x0053, 0, 32, 300, 300,
  190. 1, MappingSource::UnicodeData, 0x0053, 0x005a, 0, 32, 32, 32,
  191. 1, MappingSource::UnicodeData, 0x0061, 0x006a, -32, 0, 0, 0,
  192. 1, MappingSource::CaseFolding, 0x006b, 0x006b, -32, 0, 8383, 8383,
  193. 1, MappingSource::UnicodeData, 0x006b, 0x0072, -32, 0, 0, 0,
  194. 1, MappingSource::CaseFolding, 0x0073, 0x0073, -32, 0, 268, 268,
  195. 1, MappingSource::UnicodeData, 0x0073, 0x007a, -32, 0, 0, 0,
  196. 1, MappingSource::UnicodeData, 0x00b5, 0x00b5, 743, 0, 775, 775,
  197. 1, MappingSource::UnicodeData, 0x00c0, 0x00c4, 0, 32, 32, 32,
  198. 1, MappingSource::CaseFolding, 0x00c5, 0x00c5, 0, 32, 8294, 8294,
  199. 1, MappingSource::UnicodeData, 0x00c5, 0x00d6, 0, 32, 32, 32,
  200. 1, MappingSource::UnicodeData, 0x00d8, 0x00de, 0, 32, 32, 32,
  201. 1, MappingSource::UnicodeData, 0x00DF, 0x00DF, 0, 7615, 7615, 7615,
  202. 1, MappingSource::UnicodeData, 0x00e0, 0x00e4, -32, 0, 0, 0,
  203. 1, MappingSource::CaseFolding, 0x00e5, 0x00e5, -32, 0, 8262, 8262,
  204. 1, MappingSource::UnicodeData, 0x00e5, 0x00f6, -32, 0, 0, 0,
  205. 1, MappingSource::UnicodeData, 0x00f8, 0x00fe, -32, 0, 0, 0,
  206. 1, MappingSource::UnicodeData, 0x00ff, 0x00ff, 121, 0, 0, 0,
  207. 2, MappingSource::UnicodeData, 0x0100, 0x012f, -1, 1, 1, 1,
  208. 2, MappingSource::UnicodeData, 0x0132, 0x0137, -1, 1, 1, 1,
  209. 2, MappingSource::UnicodeData, 0x0139, 0x0148, -1, 1, 1, 1,
  210. 2, MappingSource::UnicodeData, 0x014a, 0x0177, -1, 1, 1, 1,
  211. 1, MappingSource::UnicodeData, 0x0178, 0x0178, 0, -121, -121, -121,
  212. 2, MappingSource::UnicodeData, 0x0179, 0x017e, -1, 1, 1, 1,
  213. 1, MappingSource::CaseFolding, 0x017f, 0x017f, -300, -268, 0, 0,
  214. 1, MappingSource::UnicodeData, 0x0180, 0x0180, 195, 0, 0, 0,
  215. 1, MappingSource::UnicodeData, 0x0181, 0x0181, 0, 210, 210, 210,
  216. 2, MappingSource::UnicodeData, 0x0182, 0x0185, -1, 1, 1, 1,
  217. 1, MappingSource::UnicodeData, 0x0186, 0x0186, 0, 206, 206, 206,
  218. 1, MappingSource::UnicodeData, 0x0187, 0x0187, 0, 1, 1, 1,
  219. 1, MappingSource::UnicodeData, 0x0188, 0x0188, -1, 0, 0, 0,
  220. 1, MappingSource::UnicodeData, 0x0189, 0x018a, 0, 205, 205, 205,
  221. 1, MappingSource::UnicodeData, 0x018b, 0x018b, 0, 1, 1, 1,
  222. 1, MappingSource::UnicodeData, 0x018c, 0x018c, -1, 0, 0, 0,
  223. 1, MappingSource::UnicodeData, 0x018e, 0x018e, 0, 79, 79, 79,
  224. 1, MappingSource::UnicodeData, 0x018f, 0x018f, 0, 202, 202, 202,
  225. 1, MappingSource::UnicodeData, 0x0190, 0x0190, 0, 203, 203, 203,
  226. 1, MappingSource::UnicodeData, 0x0191, 0x0191, 0, 1, 1, 1,
  227. 1, MappingSource::UnicodeData, 0x0192, 0x0192, -1, 0, 0, 0,
  228. 1, MappingSource::UnicodeData, 0x0193, 0x0193, 0, 205, 205, 205,
  229. 1, MappingSource::UnicodeData, 0x0194, 0x0194, 0, 207, 207, 207,
  230. 1, MappingSource::UnicodeData, 0x0195, 0x0195, 97, 0, 0, 0,
  231. 1, MappingSource::UnicodeData, 0x0196, 0x0196, 0, 211, 211, 211,
  232. 1, MappingSource::UnicodeData, 0x0197, 0x0197, 0, 209, 209, 209,
  233. 1, MappingSource::UnicodeData, 0x0198, 0x0198, 0, 1, 1, 1,
  234. 1, MappingSource::UnicodeData, 0x0199, 0x0199, -1, 0, 0, 0,
  235. 1, MappingSource::UnicodeData, 0x019a, 0x019a, 163, 0, 0, 0,
  236. 1, MappingSource::UnicodeData, 0x019c, 0x019c, 0, 211, 211, 211,
  237. 1, MappingSource::UnicodeData, 0x019d, 0x019d, 0, 213, 213, 213,
  238. 1, MappingSource::UnicodeData, 0x019e, 0x019e, 130, 0, 0, 0,
  239. 1, MappingSource::UnicodeData, 0x019f, 0x019f, 0, 214, 214, 214,
  240. 2, MappingSource::UnicodeData, 0x01a0, 0x01a5, -1, 1, 1, 1,
  241. 1, MappingSource::UnicodeData, 0x01a6, 0x01a6, 0, 218, 218, 218,
  242. 1, MappingSource::UnicodeData, 0x01a7, 0x01a7, 0, 1, 1, 1,
  243. 1, MappingSource::UnicodeData, 0x01a8, 0x01a8, -1, 0, 0, 0,
  244. 1, MappingSource::UnicodeData, 0x01a9, 0x01a9, 0, 218, 218, 218,
  245. 1, MappingSource::UnicodeData, 0x01ac, 0x01ac, 0, 1, 1, 1,
  246. 1, MappingSource::UnicodeData, 0x01ad, 0x01ad, -1, 0, 0, 0,
  247. 1, MappingSource::UnicodeData, 0x01ae, 0x01ae, 0, 218, 218, 218,
  248. 1, MappingSource::UnicodeData, 0x01af, 0x01af, 0, 1, 1, 1,
  249. 1, MappingSource::UnicodeData, 0x01b0, 0x01b0, -1, 0, 0, 0,
  250. 1, MappingSource::UnicodeData, 0x01b1, 0x01b2, 0, 217, 217, 217,
  251. 1, MappingSource::UnicodeData, 0x01b3, 0x01b3, 0, 1, 1, 1,
  252. 1, MappingSource::UnicodeData, 0x01b4, 0x01b4, -1, 0, 0, 0,
  253. 1, MappingSource::UnicodeData, 0x01b5, 0x01b5, 0, 1, 1, 1,
  254. 1, MappingSource::UnicodeData, 0x01b6, 0x01b6, -1, 0, 0, 0,
  255. 1, MappingSource::UnicodeData, 0x01b7, 0x01b7, 0, 219, 219, 219,
  256. 2, MappingSource::UnicodeData, 0x01b8, 0x01bd, -1, 1, 1, 1,
  257. 1, MappingSource::UnicodeData, 0x01bf, 0x01bf, 56, 0, 0, 0,
  258. 1, MappingSource::UnicodeData, 0x01c4, 0x01c4, 2, 0, 0, 0,
  259. 1, MappingSource::UnicodeData, 0x01c5, 0x01c5, 1, 0, 0, 0,
  260. 1, MappingSource::UnicodeData, 0x01c6, 0x01c6, 0, -2, -1, -1,
  261. 1, MappingSource::UnicodeData, 0x01c7, 0x01c7, 2, 0, 0, 0,
  262. 1, MappingSource::UnicodeData, 0x01c8, 0x01c8, 1, 0, 0, 0,
  263. 1, MappingSource::UnicodeData, 0x01c9, 0x01c9, 0, -2, -1, -1,
  264. 1, MappingSource::UnicodeData, 0x01CA, 0x01CA, 2, 0, 0, 0,
  265. 1, MappingSource::UnicodeData, 0x01CB, 0x01CB, 1, 0, 0, 0,
  266. 1, MappingSource::UnicodeData, 0x01CC, 0x01CC, 0, -2, -1, -1,
  267. 2, MappingSource::UnicodeData, 0x01cd, 0x01dc, -1, 1, 1, 1,
  268. 1, MappingSource::UnicodeData, 0x01dd, 0x01dd, -79, 0, 0, 0,
  269. 2, MappingSource::UnicodeData, 0x01de, 0x01f5, -1, 1, 1, 1,
  270. 1, MappingSource::UnicodeData, 0x01F1, 0x01F1, 2, 0, 0, 0,
  271. 1, MappingSource::UnicodeData, 0x01F2, 0x01F2, 1, 0, 0, 0,
  272. 1, MappingSource::UnicodeData, 0x01F3, 0x01F3, 0, -2, -1, -1,
  273. 2, MappingSource::UnicodeData, 0x01f4, 0x01f5, -1, 1, 1, 1,
  274. 1, MappingSource::UnicodeData, 0x01f6, 0x01f6, 0, -97, -97, -97,
  275. 1, MappingSource::UnicodeData, 0x01f7, 0x01f7, 0, -56, -56, -56,
  276. 2, MappingSource::UnicodeData, 0x01f8, 0x021f, -1, 1, 1, 1,
  277. 1, MappingSource::UnicodeData, 0x0220, 0x0220, 0, -130, -130, -130,
  278. 2, MappingSource::UnicodeData, 0x0222, 0x0233, -1, 1, 1, 1,
  279. 1, MappingSource::UnicodeData, 0x023a, 0x023a, 0, 10795, 10795, 10795,
  280. 1, MappingSource::UnicodeData, 0x023b, 0x023b, 0, 1, 1, 1,
  281. 1, MappingSource::UnicodeData, 0x023c, 0x023c, -1, 0, 0, 0,
  282. 1, MappingSource::UnicodeData, 0x023d, 0x023d, 0, -163, -163, -163,
  283. 1, MappingSource::UnicodeData, 0x023e, 0x023e, 0, 10792, 10792, 10792,
  284. 1, MappingSource::UnicodeData, 0x023f, 0x0240, 10815, 0, 0, 0,
  285. 1, MappingSource::UnicodeData, 0x0241, 0x0241, 0, 1, 1, 1,
  286. 1, MappingSource::UnicodeData, 0x0242, 0x0242, -1, 0, 0, 0,
  287. 1, MappingSource::UnicodeData, 0x0243, 0x0243, 0, -195, -195, -195,
  288. 1, MappingSource::UnicodeData, 0x0244, 0x0244, 0, 69, 69, 69,
  289. 1, MappingSource::UnicodeData, 0x0245, 0x0245, 0, 71, 71, 71,
  290. 2, MappingSource::UnicodeData, 0x0246, 0x024f, -1, 1, 1, 1,
  291. 1, MappingSource::UnicodeData, 0x0250, 0x0250, 10783, 0, 0, 0,
  292. 1, MappingSource::UnicodeData, 0x0251, 0x0251, 10780, 0, 0, 0,
  293. 1, MappingSource::UnicodeData, 0x0252, 0x0252, 10782, 0, 0, 0,
  294. 1, MappingSource::UnicodeData, 0x0253, 0x0253, -210, 0, 0, 0,
  295. 1, MappingSource::UnicodeData, 0x0254, 0x0254, -206, 0, 0, 0,
  296. 1, MappingSource::UnicodeData, 0x0256, 0x0257, -205, 0, 0, 0,
  297. 1, MappingSource::UnicodeData, 0x0259, 0x0259, -202, 0, 0, 0,
  298. 1, MappingSource::UnicodeData, 0x025b, 0x025b, -203, 0, 0, 0,
  299. 1, MappingSource::UnicodeData, 0x0260, 0x0260, -205, 0, 0, 0,
  300. 1, MappingSource::UnicodeData, 0x0263, 0x0263, -207, 0, 0, 0,
  301. 1, MappingSource::UnicodeData, 0x0265, 0x0265, 42280, 0, 0, 0,
  302. 1, MappingSource::UnicodeData, 0x0266, 0x0266, 42308, 0, 0, 0,
  303. 1, MappingSource::UnicodeData, 0x0268, 0x0268, -209, 0, 0, 0,
  304. 1, MappingSource::UnicodeData, 0x0269, 0x0269, -211, 0, 0, 0,
  305. 1, MappingSource::UnicodeData, 0x026b, 0x026b, 10743, 0, 0, 0,
  306. 1, MappingSource::UnicodeData, 0x026f, 0x026f, -211, 0, 0, 0,
  307. 1, MappingSource::UnicodeData, 0x0271, 0x0271, 10749, 0, 0, 0,
  308. 1, MappingSource::UnicodeData, 0x0272, 0x0272, -213, 0, 0, 0,
  309. 1, MappingSource::UnicodeData, 0x0275, 0x0275, -214, 0, 0, 0,
  310. 1, MappingSource::UnicodeData, 0x027d, 0x027d, 10727, 0, 0, 0,
  311. 1, MappingSource::UnicodeData, 0x0280, 0x0280, -218, 0, 0, 0,
  312. 1, MappingSource::UnicodeData, 0x0283, 0x0283, -218, 0, 0, 0,
  313. 1, MappingSource::UnicodeData, 0x0288, 0x0288, -218, 0, 0, 0,
  314. 1, MappingSource::UnicodeData, 0x0289, 0x0289, -69, 0, 0, 0,
  315. 1, MappingSource::UnicodeData, 0x028a, 0x028b, -217, 0, 0, 0,
  316. 1, MappingSource::UnicodeData, 0x028c, 0x028c, -71, 0, 0, 0,
  317. 1, MappingSource::UnicodeData, 0x0292, 0x0292, -219, 0, 0, 0,
  318. 1, MappingSource::CaseFolding, 0x0345, 0x0345, 0, 84, 116, 7289,
  319. 2, MappingSource::UnicodeData, 0x0370, 0x0373, -1, 1, 1, 1,
  320. 1, MappingSource::UnicodeData, 0x0376, 0x0376, 0, 1, 1, 1,
  321. 1, MappingSource::UnicodeData, 0x0377, 0x0377, -1, 0, 0, 0,
  322. 1, MappingSource::UnicodeData, 0x037b, 0x037d, 130, 0, 0, 0,
  323. 1, MappingSource::UnicodeData, 0x0386, 0x0386, 0, 38, 38, 38,
  324. 1, MappingSource::UnicodeData, 0x0388, 0x038a, 0, 37, 37, 37,
  325. 1, MappingSource::UnicodeData, 0x038c, 0x038c, 0, 64, 64, 64,
  326. 1, MappingSource::UnicodeData, 0x038e, 0x038f, 0, 63, 63, 63,
  327. 1, MappingSource::UnicodeData, 0x0391, 0x0391, 0, 32, 32, 32,
  328. 1, MappingSource::UnicodeData, 0x0392, 0x0392, 0, 32, 62, 62,
  329. 1, MappingSource::UnicodeData, 0x0393, 0x0394, 0, 32, 32, 32,
  330. 1, MappingSource::UnicodeData, 0x0395, 0x0395, 0, 32, 96, 96,
  331. 1, MappingSource::UnicodeData, 0x0396, 0x0397, 0, 32, 32, 32,
  332. 1, MappingSource::CaseFolding, 0x0398, 0x0398, 0, 32, 57, 92,
  333. 1, MappingSource::UnicodeData, 0x0398, 0x0398, 0, 32, 57, 57,
  334. 1, MappingSource::CaseFolding, 0x0399, 0x0399, -84, 0, 32, 7205,
  335. 1, MappingSource::UnicodeData, 0x0399, 0x0399, 0, 32, 7205, 7205,
  336. 1, MappingSource::UnicodeData, 0x039a, 0x039a, 0, 32, 86, 86,
  337. 1, MappingSource::UnicodeData, 0x039b, 0x039b, 0, 32, 32, 32,
  338. 1, MappingSource::UnicodeData, 0x039c, 0x039c, 0, -743, 32, 32,
  339. 1, MappingSource::UnicodeData, 0x039d, 0x039f, 0, 32, 32, 32,
  340. 1, MappingSource::UnicodeData, 0x03a0, 0x03a0, 0, 32, 54, 54,
  341. 1, MappingSource::UnicodeData, 0x03a1, 0x03a1, 0, 32, 80, 80,
  342. 1, MappingSource::UnicodeData, 0x03a3, 0x03a3, 0, 31, 32, 32,
  343. 1, MappingSource::UnicodeData, 0x03a4, 0x03a5, 0, 32, 32, 32,
  344. 1, MappingSource::UnicodeData, 0x03a6, 0x03a6, 0, 32, 47, 47,
  345. 1, MappingSource::UnicodeData, 0x03a7, 0x03a8, 0, 32, 32, 32,
  346. 1, MappingSource::CaseFolding, 0x03a9, 0x03a9, 0, 32, 7549, 7549,
  347. 1, MappingSource::UnicodeData, 0x03a9, 0x03ab, 0, 32, 32, 32,
  348. 1, MappingSource::UnicodeData, 0x03ac, 0x03ac, -38, 0, 0, 0,
  349. 1, MappingSource::UnicodeData, 0x03ad, 0x03af, -37, 0, 0, 0,
  350. 1, MappingSource::UnicodeData, 0x03b1, 0x03b1, -32, 0, 0, 0,
  351. 1, MappingSource::UnicodeData, 0x03b2, 0x03b2, -32, 0, 30, 30,
  352. 1, MappingSource::UnicodeData, 0x03b3, 0x03b4, -32, 0, 0, 0,
  353. 1, MappingSource::UnicodeData, 0x03b5, 0x03b5, -32, 0, 64, 64,
  354. 1, MappingSource::UnicodeData, 0x03b6, 0x03b7, -32, 0, 0, 0,
  355. 1, MappingSource::CaseFolding, 0x03b8, 0x03b8, -32, 0, 25, 60,
  356. 1, MappingSource::UnicodeData, 0x03b8, 0x03b8, -32, 0, 25, 25,
  357. 1, MappingSource::CaseFolding, 0x03b9, 0x03b9, -116, -32, 0, 7173,
  358. 1, MappingSource::UnicodeData, 0x03b9, 0x03b9, -32, 0, 7173, 7173,
  359. 1, MappingSource::UnicodeData, 0x03ba, 0x03ba, -32, 0, 54, 54,
  360. 1, MappingSource::UnicodeData, 0x03bb, 0x03bb, -32, 0, 0, 0,
  361. 1, MappingSource::UnicodeData, 0x03bc, 0x03bc, -32, -775, 0, 0,
  362. 1, MappingSource::UnicodeData, 0x03bd, 0x03bf, -32, 0, 0, 0,
  363. 1, MappingSource::UnicodeData, 0x03c0, 0x03c0, -32, 0, 22, 22,
  364. 1, MappingSource::UnicodeData, 0x03c1, 0x03c1, -32, 0, 48, 48,
  365. 1, MappingSource::UnicodeData, 0x03c2, 0x03c2, -31, 0, 1, 1,
  366. 1, MappingSource::UnicodeData, 0x03c3, 0x03c3, -32, -1, 0, 0,
  367. 1, MappingSource::UnicodeData, 0x03c4, 0x03c5, -32, 0, 0, 0,
  368. 1, MappingSource::UnicodeData, 0x03c6, 0x03c6, -32, 0, 15, 15,
  369. 1, MappingSource::UnicodeData, 0x03c7, 0x03c8, -32, 0, 0, 0,
  370. 1, MappingSource::CaseFolding, 0x03c9, 0x03c9, -32, 0, 7517, 7517,
  371. 1, MappingSource::UnicodeData, 0x03c9, 0x03cb, -32, 0, 0, 0,
  372. 1, MappingSource::UnicodeData, 0x03cc, 0x03cc, -64, 0, 0, 0,
  373. 1, MappingSource::UnicodeData, 0x03cd, 0x03ce, -63, 0, 0, 0,
  374. 1, MappingSource::UnicodeData, 0x03cf, 0x03cf, 0, 8, 8, 8,
  375. 1, MappingSource::UnicodeData, 0x03d0, 0x03d0, -62, -30, 0, 0,
  376. 1, MappingSource::CaseFolding, 0x03d1, 0x03d1, -57, -25, 0, 35,
  377. 1, MappingSource::UnicodeData, 0x03d1, 0x03d1, -57, -25, 0, 0,
  378. 1, MappingSource::UnicodeData, 0x03d5, 0x03d5, -47, -15, 0, 0,
  379. 1, MappingSource::UnicodeData, 0x03d6, 0x03d6, -54, -22, 0, 0,
  380. 1, MappingSource::UnicodeData, 0x03d7, 0x03d7, -8, 0, 0, 0,
  381. 2, MappingSource::UnicodeData, 0x03d8, 0x03ef, -1, 1, 1, 1,
  382. 1, MappingSource::UnicodeData, 0x03f0, 0x03f0, -86, -54, 0, 0,
  383. 1, MappingSource::UnicodeData, 0x03f1, 0x03f1, -80, -48, 0, 0,
  384. 1, MappingSource::UnicodeData, 0x03f2, 0x03f2, 7, 0, 0, 0,
  385. 1, MappingSource::CaseFolding, 0x03f4, 0x03f4, -92, -60, -35, 0,
  386. 1, MappingSource::UnicodeData, 0x03f5, 0x03f5, -96, -64, 0, 0,
  387. 1, MappingSource::UnicodeData, 0x03f7, 0x03f7, 0, 1, 1, 1,
  388. 1, MappingSource::UnicodeData, 0x03f8, 0x03f8, -1, 0, 0, 0,
  389. 1, MappingSource::UnicodeData, 0x03f9, 0x03f9, 0, -7, -7, -7,
  390. 1, MappingSource::UnicodeData, 0x03fa, 0x03fa, 0, 1, 1, 1,
  391. 1, MappingSource::UnicodeData, 0x03fb, 0x03fb, -1, 0, 0, 0,
  392. 1, MappingSource::UnicodeData, 0x03fd, 0x03ff, 0, -130, -130, -130,
  393. 1, MappingSource::UnicodeData, 0x0400, 0x040f, 0, 80, 80, 80,
  394. 1, MappingSource::UnicodeData, 0x0410, 0x042f, 0, 32, 32, 32,
  395. 1, MappingSource::UnicodeData, 0x0430, 0x044f, -32, 0, 0, 0,
  396. 1, MappingSource::UnicodeData, 0x0450, 0x045f, -80, 0, 0, 0,
  397. 2, MappingSource::UnicodeData, 0x0460, 0x0481, -1, 1, 1, 1,
  398. 2, MappingSource::UnicodeData, 0x048a, 0x04bf, -1, 1, 1, 1,
  399. 1, MappingSource::UnicodeData, 0x04c0, 0x04c0, 0, 15, 15, 15,
  400. 2, MappingSource::UnicodeData, 0x04c1, 0x04ce, -1, 1, 1, 1,
  401. 1, MappingSource::UnicodeData, 0x04cf, 0x04cf, -15, 0, 0, 0,
  402. 2, MappingSource::UnicodeData, 0x04d0, 0x0527, -1, 1, 1, 1,
  403. 1, MappingSource::UnicodeData, 0x0531, 0x0556, 0, 48, 48, 48,
  404. 1, MappingSource::UnicodeData, 0x0561, 0x0586, -48, 0, 0, 0,
  405. 1, MappingSource::UnicodeData, 0x10a0, 0x10c5, 0, 7264, 7264, 7264,
  406. 1, MappingSource::UnicodeData, 0x10C7, 0x10C7, 0, 7264, 7264, 7264,
  407. 1, MappingSource::UnicodeData, 0x10CD, 0x10CD, 0, 7264, 7264, 7264,
  408. 1, MappingSource::UnicodeData, 0x1d79, 0x1d79, 35332, 0, 0, 0,
  409. 1, MappingSource::UnicodeData, 0x1d7d, 0x1d7d, 3814, 0, 0, 0,
  410. 2, MappingSource::UnicodeData, 0x1e00, 0x1e5f, -1, 1, 1, 1,
  411. 1, MappingSource::UnicodeData, 0x1e60, 0x1e60, 0, 1, 59, 59,
  412. 1, MappingSource::UnicodeData, 0x1e61, 0x1e61, -1, 0, 58, 58,
  413. 2, MappingSource::UnicodeData, 0x1e62, 0x1e95, -1, 1, 1, 1,
  414. 1, MappingSource::UnicodeData, 0x1e9b, 0x1e9b, -59, -58, 0, 0,
  415. 1, MappingSource::UnicodeData, 0x1E9E, 0x1E9E, -7615, 0, 0, 0,
  416. 2, MappingSource::UnicodeData, 0x1ea0, 0x1eff, -1, 1, 1, 1,
  417. 1, MappingSource::UnicodeData, 0x1f00, 0x1f07, 8, 0, 0, 0,
  418. 1, MappingSource::UnicodeData, 0x1f08, 0x1f0f, 0, -8, -8, -8,
  419. 1, MappingSource::UnicodeData, 0x1f10, 0x1f15, 8, 0, 0, 0,
  420. 1, MappingSource::UnicodeData, 0x1f18, 0x1f1d, 0, -8, -8, -8,
  421. 1, MappingSource::UnicodeData, 0x1f20, 0x1f27, 8, 0, 0, 0,
  422. 1, MappingSource::UnicodeData, 0x1f28, 0x1f2f, 0, -8, -8, -8,
  423. 1, MappingSource::UnicodeData, 0x1f30, 0x1f37, 8, 0, 0, 0,
  424. 1, MappingSource::UnicodeData, 0x1f38, 0x1f3f, 0, -8, -8, -8,
  425. 1, MappingSource::UnicodeData, 0x1f40, 0x1f45, 8, 0, 0, 0,
  426. 1, MappingSource::UnicodeData, 0x1f48, 0x1f4d, 0, -8, -8, -8,
  427. 1, MappingSource::UnicodeData, 0x1f51, 0x1f51, 8, 0, 0, 0,
  428. 1, MappingSource::UnicodeData, 0x1f53, 0x1f53, 8, 0, 0, 0,
  429. 1, MappingSource::UnicodeData, 0x1f55, 0x1f55, 8, 0, 0, 0,
  430. 1, MappingSource::UnicodeData, 0x1f57, 0x1f57, 8, 0, 0, 0,
  431. 1, MappingSource::UnicodeData, 0x1f59, 0x1f59, 0, -8, -8, -8,
  432. 1, MappingSource::UnicodeData, 0x1f5b, 0x1f5b, 0, -8, -8, -8,
  433. 1, MappingSource::UnicodeData, 0x1f5d, 0x1f5d, 0, -8, -8, -8,
  434. 1, MappingSource::UnicodeData, 0x1f5f, 0x1f5f, 0, -8, -8, -8,
  435. 1, MappingSource::UnicodeData, 0x1f60, 0x1f67, 8, 0, 0, 0,
  436. 1, MappingSource::UnicodeData, 0x1f68, 0x1f6f, 0, -8, -8, -8,
  437. 1, MappingSource::UnicodeData, 0x1f70, 0x1f71, 74, 0, 0, 0,
  438. 1, MappingSource::UnicodeData, 0x1f72, 0x1f75, 86, 0, 0, 0,
  439. 1, MappingSource::UnicodeData, 0x1f76, 0x1f77, 100, 0, 0, 0,
  440. 1, MappingSource::UnicodeData, 0x1f78, 0x1f79, 128, 0, 0, 0,
  441. 1, MappingSource::UnicodeData, 0x1f7a, 0x1f7b, 112, 0, 0, 0,
  442. 1, MappingSource::UnicodeData, 0x1f7c, 0x1f7d, 126, 0, 0, 0,
  443. 1, MappingSource::UnicodeData, 0x1f80, 0x1f87, 8, 0, 0, 0,
  444. 1, MappingSource::UnicodeData, 0x1f88, 0x1f8f, 0, -8, -8, -8,
  445. 1, MappingSource::UnicodeData, 0x1f90, 0x1f97, 8, 0, 0, 0,
  446. 1, MappingSource::UnicodeData, 0x1f98, 0x1f9f, 0, -8, -8, -8,
  447. 1, MappingSource::UnicodeData, 0x1fa0, 0x1fa7, 8, 0, 0, 0,
  448. 1, MappingSource::UnicodeData, 0x1fa8, 0x1faf, 0, -8, -8, -8,
  449. 1, MappingSource::UnicodeData, 0x1fb0, 0x1fb1, 8, 0, 0, 0,
  450. 1, MappingSource::UnicodeData, 0x1fb3, 0x1fb3, 9, 0, 0, 0,
  451. 1, MappingSource::UnicodeData, 0x1fb8, 0x1fb9, 0, -8, -8, -8,
  452. 1, MappingSource::UnicodeData, 0x1fba, 0x1fbb, 0, -74, -74, -74,
  453. 1, MappingSource::UnicodeData, 0x1fbc, 0x1fbc, 0, -9, -9, -9,
  454. 1, MappingSource::CaseFolding, 0x1fbe, 0x1fbe, -7289, -7205, -7173, 0,
  455. 1, MappingSource::UnicodeData, 0x1fbe, 0x1fbe, -7205, -7173, 0, 0,
  456. 1, MappingSource::UnicodeData, 0x1fc3, 0x1fc3, 9, 0, 0, 0,
  457. 1, MappingSource::UnicodeData, 0x1fc8, 0x1fcb, 0, -86, -86, -86,
  458. 1, MappingSource::UnicodeData, 0x1fcc, 0x1fcc, 0, -9, -9, -9,
  459. 1, MappingSource::UnicodeData, 0x1fd0, 0x1fd1, 8, 0, 0, 0,
  460. 1, MappingSource::UnicodeData, 0x1fd8, 0x1fd9, 0, -8, -8, -8,
  461. 1, MappingSource::UnicodeData, 0x1fda, 0x1fdb, 0, -100, -100, -100,
  462. 1, MappingSource::UnicodeData, 0x1fe0, 0x1fe1, 8, 0, 0, 0,
  463. 1, MappingSource::UnicodeData, 0x1fe5, 0x1fe5, 7, 0, 0, 0,
  464. 1, MappingSource::UnicodeData, 0x1fe8, 0x1fe9, 0, -8, -8, -8,
  465. 1, MappingSource::UnicodeData, 0x1fea, 0x1feb, 0, -112, -112, -112,
  466. 1, MappingSource::UnicodeData, 0x1fec, 0x1fec, 0, -7, -7, -7,
  467. 1, MappingSource::UnicodeData, 0x1ff3, 0x1ff3, 9, 0, 0, 0,
  468. 1, MappingSource::UnicodeData, 0x1ff8, 0x1ff9, 0, -128, -128, -128,
  469. 1, MappingSource::UnicodeData, 0x1ffa, 0x1ffb, 0, -126, -126, -126,
  470. 1, MappingSource::UnicodeData, 0x1ffc, 0x1ffc, 0, -9, -9, -9,
  471. 1, MappingSource::CaseFolding, 0x2126, 0x2126, -7549, -7517, 0, 0,
  472. 1, MappingSource::CaseFolding, 0x212a, 0x212a, -8415, -8383, 0, 0,
  473. 1, MappingSource::CaseFolding, 0x212b, 0x212b, -8294, -8262, 0, 0,
  474. 1, MappingSource::UnicodeData, 0x2132, 0x2132, 0, 28, 28, 28,
  475. 1, MappingSource::UnicodeData, 0x214e, 0x214e, -28, 0, 0, 0,
  476. 1, MappingSource::UnicodeData, 0x2160, 0x216F, 0, 16, 16, 16,
  477. 1, MappingSource::UnicodeData, 0x2170, 0x217F, -16, 0, 0, 0,
  478. 1, MappingSource::UnicodeData, 0x2183, 0x2183, 0, 1, 1, 1,
  479. 1, MappingSource::UnicodeData, 0x2184, 0x2184, -1, 0, 0, 0,
  480. 1, MappingSource::UnicodeData, 0x24B6, 0x24CF, 0, 26, 26, 26,
  481. 1, MappingSource::UnicodeData, 0x24D0, 0x24E9, -26, 0, 0, 0,
  482. 1, MappingSource::UnicodeData, 0x2c00, 0x2c2e, 0, 48, 48, 48,
  483. 1, MappingSource::UnicodeData, 0x2c30, 0x2c5e, -48, 0, 0, 0,
  484. 1, MappingSource::UnicodeData, 0x2c60, 0x2c60, 0, 1, 1, 1,
  485. 1, MappingSource::UnicodeData, 0x2c61, 0x2c61, -1, 0, 0, 0,
  486. 1, MappingSource::UnicodeData, 0x2c62, 0x2c62, 0, -10743, -10743, -10743,
  487. 1, MappingSource::UnicodeData, 0x2c63, 0x2c63, 0, -3814, -3814, -3814,
  488. 1, MappingSource::UnicodeData, 0x2c64, 0x2c64, 0, -10727, -10727, -10727,
  489. 1, MappingSource::UnicodeData, 0x2c65, 0x2c65, -10795, 0, 0, 0,
  490. 1, MappingSource::UnicodeData, 0x2c66, 0x2c66, -10792, 0, 0, 0,
  491. 2, MappingSource::UnicodeData, 0x2c67, 0x2c6c, -1, 1, 1, 1,
  492. 1, MappingSource::UnicodeData, 0x2c6d, 0x2c6d, 0, -10780, -10780, -10780,
  493. 1, MappingSource::UnicodeData, 0x2c6e, 0x2c6e, 0, -10749, -10749, -10749,
  494. 1, MappingSource::UnicodeData, 0x2c6f, 0x2c6f, 0, -10783, -10783, -10783,
  495. 1, MappingSource::UnicodeData, 0x2c70, 0x2c70, 0, -10782, -10782, -10782,
  496. 1, MappingSource::UnicodeData, 0x2c72, 0x2c72, 0, 1, 1, 1,
  497. 1, MappingSource::UnicodeData, 0x2c73, 0x2c73, -1, 0, 0, 0,
  498. 1, MappingSource::UnicodeData, 0x2c75, 0x2c75, 0, 1, 1, 1,
  499. 1, MappingSource::UnicodeData, 0x2c76, 0x2c76, -1, 0, 0, 0,
  500. 1, MappingSource::UnicodeData, 0x2c7e, 0x2c7f, 0, -10815, -10815, -10815,
  501. 2, MappingSource::UnicodeData, 0x2c80, 0x2ce3, -1, 1, 1, 1,
  502. 2, MappingSource::UnicodeData, 0x2ceb, 0x2cee, -1, 1, 1, 1,
  503. 2, MappingSource::UnicodeData, 0x2CF2, 0x2CF3, -1, 1, 1, 1,
  504. 1, MappingSource::UnicodeData, 0x2d00, 0x2d25, -7264, 0, 0, 0,
  505. 1, MappingSource::UnicodeData, 0x2D27, 0x2D27, -7264, 0, 0, 0,
  506. 1, MappingSource::UnicodeData, 0x2D2D, 0x2D2D, -7264, 0, 0, 0,
  507. 2, MappingSource::UnicodeData, 0xa640, 0xa66d, -1, 1, 1, 1,
  508. 2, MappingSource::UnicodeData, 0xa680, 0xa697, -1, 1, 1, 1,
  509. 2, MappingSource::UnicodeData, 0xa722, 0xa72f, -1, 1, 1, 1,
  510. 2, MappingSource::UnicodeData, 0xa732, 0xa76f, -1, 1, 1, 1,
  511. 2, MappingSource::UnicodeData, 0xa779, 0xa77c, -1, 1, 1, 1,
  512. 1, MappingSource::UnicodeData, 0xa77d, 0xa77d, 0, -35332, -35332, -35332,
  513. 2, MappingSource::UnicodeData, 0xa77e, 0xa787, -1, 1, 1, 1,
  514. 1, MappingSource::UnicodeData, 0xa78b, 0xa78b, 0, 1, 1, 1,
  515. 1, MappingSource::UnicodeData, 0xa78c, 0xa78c, -1, 0, 0, 0,
  516. 1, MappingSource::UnicodeData, 0xa78d, 0xa78d, 0, -42280, -42280, -42280,
  517. 1, MappingSource::UnicodeData, 0xa790, 0xa790, 0, 1, 1, 1,
  518. 1, MappingSource::UnicodeData, 0xa791, 0xa791, -1, 0, 0, 0,
  519. 2, MappingSource::UnicodeData, 0xa792, 0xa793, -1, 1, 1, 1,
  520. 2, MappingSource::UnicodeData, 0xa7a0, 0xa7a9, -1, 1, 1, 1,
  521. 1, MappingSource::UnicodeData, 0xA7AA, 0XA7AA, 0, -42308, -42308, -42308,
  522. 1, MappingSource::UnicodeData, 0xff21, 0xff3a, 0, 32, 32, 32,
  523. 1, MappingSource::UnicodeData, 0xff41, 0xff5a, -32, 0, 0, 0,
  524. 1, MappingSource::CaseFolding, 0x10400, 0x10427, 0, 40, 40, 40,
  525. 1, MappingSource::CaseFolding, 0x10428, 0x1044f, -40, 0, 0, 0,
  526. 1, MappingSource::CaseFolding, 0x10c80, 0x10cb2, 0, 64, 64, 64,
  527. 1, MappingSource::CaseFolding, 0x10cc0, 0x10cf2, -64, 0, 0, 0,
  528. 1, MappingSource::CaseFolding, 0x118a0, 0x118bf, 0, 32, 32, 32,
  529. 1, MappingSource::CaseFolding, 0x118c0, 0x118df, -32, 0, 0, 0,
  530. };
  531. static const int numTransforms = sizeof(transforms) / sizeof(Transform);
  532. static const Transform lastTransform = transforms[numTransforms - 1];
  533. template <typename Char, typename Fn>
  534. bool RangeToEquivClass(uint& tblidx, uint l, uint h, uint& acth, Char equivl[EquivClassSize], Fn acceptSource)
  535. {
  536. Assert(l <= h);
  537. if (lastTransform.hi >= l)
  538. {
  539. // Skip transforms which come completely before l
  540. while (tblidx < numTransforms && (transforms[tblidx].hi < l || !acceptSource(transforms[tblidx].source)))
  541. {
  542. tblidx++;
  543. }
  544. if (tblidx < numTransforms)
  545. {
  546. // Does current transform intersect the desired range?
  547. uint interl = max(l, static_cast<uint>(transforms[tblidx].lo));
  548. uint interh = min(h, static_cast<uint>(transforms[tblidx].skipCountOfRange == 1 ? transforms[tblidx].hi : interl));
  549. if (interl <= interh)
  550. {
  551. if (l < interl)
  552. {
  553. // Part of input range comes before next table range, so that sub-range has trivial equivalence class
  554. acth = interl - 1;
  555. for (int i = 0; i < EquivClassSize; i++)
  556. equivl[i] = Chars<Char>::UTC(l);
  557. return false; // trivial
  558. }
  559. else
  560. {
  561. // Input range begins at a table range, so map the character range
  562. acth = interh;
  563. transforms[tblidx].Apply(interl, equivl);
  564. return true; // non-trivial
  565. }
  566. }
  567. // else fall-through: No intersection, so nothing in this range has non-trivial equivalence class
  568. }
  569. }
  570. // else fall-through: No more transforms, so nothing in this range has a non-trivial equivalence class
  571. acth = h;
  572. for (int i = 0; i < EquivClassSize; i++)
  573. {
  574. equivl[i] = Chars<Char>::UTC(l);
  575. }
  576. return false; // trivial
  577. }
  578. bool RangeToEquivClass(uint & tblidx, uint l, uint h, uint & acth, __out_ecount(EquivClassSize) wchar_t equivl[EquivClassSize])
  579. {
  580. return RangeToEquivClass(tblidx, l, h, acth, equivl, [](MappingSource source) {
  581. return source == MappingSource::UnicodeData;
  582. });
  583. }
  584. bool RangeToEquivClass(uint & tblidx, uint l, uint h, uint & acth, __out_ecount(EquivClassSize) codepoint_t equivl[EquivClassSize])
  585. {
  586. return RangeToEquivClass(tblidx, l, h, acth, equivl, [](MappingSource source) {
  587. return source == MappingSource::CaseFolding || source == MappingSource::UnicodeData;
  588. });
  589. }
  590. bool RangeToEquivClassOnlyInSource(MappingSource mappingSource, uint& tblidx, uint l, uint h, uint& acth, __out_ecount(EquivClassSize) wchar_t equivl[EquivClassSize])
  591. {
  592. return RangeToEquivClass(tblidx, l, h, acth, equivl, [&](MappingSource actualSource) {
  593. return mappingSource == actualSource;
  594. });
  595. }
  596. }
  597. }