private CaseFoldingEntry[] GetCaseFolding() { List <CaseFoldingEntry> list = new List <CaseFoldingEntry>(); List <string> segs = new List <string>(); List <int> codeList = new List <int>(); using (LineReader reader = OpenLineReader("CaseFolding.txt")) { foreach (var count in reader.GetLines(segs, 3)) { var entry = new CaseFoldingEntry(); if (!TryParseHex(segs[0], out entry.Code)) { continue; } var status = segs[1].Trim(); if (status.Length != 1) { continue; } switch (status[0]) { case 'C': entry.Status = CaseFoldingStatus.Common; break; case 'F': entry.Status = CaseFoldingStatus.Full; break; case 'S': entry.Status = CaseFoldingStatus.Simple; break; case 'T': entry.Status = CaseFoldingStatus.Special; break; default: continue; } if (TryParseHex(codeList, segs[2], out entry.Mapping)) { list.Add(entry); } } } list.Sort(); return(list.ToArray()); }
public int GetFoldingCharacter(int codeValue) { int idx = CaseFoldings.BinaryFind(codeValue); idx = CaseFoldings.GetRange(codeValue, out int stop); if (idx >= 0) { for (int i = idx; i <= stop; i++) { ref CaseFoldingEntry ptr = ref _caseFoldings[i]; if (ptr.Mapping.Count == 1 && ptr.Status == CaseFoldingStatus.Common || ptr.Status == CaseFoldingStatus.Simple) { return(ptr.Mapping.First); } } }