public UnicodeEntry[] GetEntries() { var allEntries = new UnicodeEntry[_totalEntries]; for (int i = 0; i < _segList.Count; i++) { Array.Copy(_segList[i], 0, allEntries, i * WorkSegment, WorkSegment); } Array.Copy(_workEntries, 0, allEntries, _segList.Count * WorkSegment, _workIndex); return(allEntries); }
public bool TryGetEntry(int code, out UnicodeEntry entry) { int idx = IndexOf(code); if (idx >= 0) { entry = _entries[idx]; return(true); } entry = default(UnicodeEntry); return(false); }
protected void Add(UnicodeEntry entry) { if (_workIndex == WorkSegment) { _segList.Add(_workEntries); _workEntries = new UnicodeEntry[WorkSegment]; _workIndex = 0; } _workEntries[_workIndex] = entry; _workIndex++; _totalEntries++; }
public void Load(LineReader reader) { Dictionary <int, string> alternativeNames = _owner.AlternativeNames; List <string> segs = new List <string>(); int firstRange = 0; int lastRange = 0; const string FirstRange = ", First>"; const string LastRange = ", Last>"; foreach (var count in reader.GetLines(segs, 15)) { if (count != 15) { continue; } _entry = new UnicodeEntry(); if (!TryParseHex(segs[0], out _entry.CodeValue)) { continue; } if (_entry.CodeValue > _owner._maxCodePoint) { break; } string name = segs[1]; string dscr; if ((Options & LoadOptions.AlternativeNames) != 0 && alternativeNames.TryGetValue(_entry.CodeValue, out dscr)) { name = dscr; } else { dscr = name; if (name.HasValue()) { if (name[0] == '<') { if (name.SameName("<control>")) { dscr = segs[10]; } else if (name.EndsWith(FirstRange, StringComparison.OrdinalIgnoreCase)) { firstRange = _entry.CodeValue; name = name.Substring(1, name.Length - 1 - FirstRange.Length); dscr = null; } else if (name.EndsWith(LastRange, StringComparison.OrdinalIgnoreCase)) { name = name.Substring(1, name.Length - 1 - LastRange.Length); dscr = null; lastRange = _entry.CodeValue; } else { Debug.WriteLine("Asd:" + name); } } } } if (dscr.HasValue()) { if ((Options & LoadOptions.EnumNames) != 0) { _entry.EnumName = Util.GenEnumName(dscr); } } else if (!alternativeNames.TryGetValue(_entry.CodeValue, out dscr)) { //Debug.WriteLine( "NO NAME " + _entry.CodeValue.ToString( "X4" ) + " " + segs[ 11 ] ); } _entry.Name = name; if (!_charTypes.TryGetValue(segs[2], out _entry.Category)) { Error("Unknown category '{0}'", segs[2]); } byte comb; if (!byte.TryParse(segs[3], NumberStyles.Integer, CultureInfo.InvariantCulture, out comb)) { Error("Unknown combing class '{0}'", segs[3]); } _entry.Combing = (CombingClass)comb; if (!_bidiMap.TryGetValue(segs[4], out _entry.Bidirectional)) { Error("Unknown bidi category '{0}'", segs[4]); } if (_decomposeMap != null && !string.IsNullOrEmpty(segs[5])) { ParseDecombosing(segs[5]); } //_entry._numericType = NumericEntryType.None; byte dec; if (segs[6].Length > 0) { if (!byte.TryParse(segs[6], NumberStyles.Integer, CultureInfo.InvariantCulture, out dec) || dec > 9) { Error("Invalid Decimal digit value '{0}'", segs[6]); } _entry._numericType = NumericEntryType.Decimal; _entry._value.Value = dec; //_Decimals.Increment( _entry.DecimalValue ); } if (segs[7].Length > 0) { if (!byte.TryParse(segs[7], NumberStyles.Integer, CultureInfo.InvariantCulture, out dec) || dec > 9) { Error("Invalid Digit value '{0}'", segs[7]); } if (!_entry.IsDecimalDigit) { _entry._numericType = NumericEntryType.Digit; _entry._value.Value = dec; } else if (_entry._value.Value != dec) { Error("Invalid Digit value '{0}'", segs[7]); } } else if (_entry._numericType != NumericEntryType.None) { Error("Invalid Digit value '{0}'", segs[7]); } if (segs[8].Length > 0) { ParseNumeric(segs[8]); } switch (segs[9]) { case "": case "N": break; case "Y": _entry.Mirrored = true; break; default: Error("Invalid Mirrored value '{0}'", segs[9]); break; } if ((Options & LoadOptions.OldNames) != 0 && segs[10].Length > 0) { _entry.OldName = segs[10]; } if ((Options & LoadOptions.Comments) != 0 && segs[11].Length > 0) { _entry.Comment = segs[11]; } if (segs[12].Length > 0) { if (!TryParseHex(segs[12], out _entry.Uppercase)) { Error("Invlaid code point '{0}'", segs[12]); } } if (segs[13].Length > 0) { if (!TryParseHex(segs[13], out _entry.LowerCase)) { Error("Invlaid code point '{0}'", segs[13]); } } if (segs[14].Length > 0) { if (!TryParseHex(segs[14], out _entry.TitleCase)) { Error("Invlaid code point '{0}'", segs[14]); } } if (lastRange > 0) { _entry.CodeValue = firstRange + 1; while (_entry.CodeValue < lastRange) { Add(_entry); _entry.CodeValue++; } lastRange = 0; firstRange = 0; } Add(_entry); } //ShowCounts(); }