/// <summary> /// 清空 /// </summary> public void Clear() { KeyValuePairs.Clear(); ValueKeyPairs.Clear(); }
/// <summary> /// Parses connection string /// </summary> /// <param name="connString">Semicolon delimented KeyValue pair(e.g. KeyName1=value1;KeyName2=value2;KeyName3=value3)</param> public void Parse(string connString) { string parseRegEx = @"(?<KeyName>[^=]+)=(?<KeyValue>.+)"; if (_parseErrorSb != null) { _parseErrorSb.Clear(); } if (string.IsNullOrEmpty(connString)) { ParseErrors = "Empty connection string"; } else { string[] pairs = connString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (pairs == null) { ParseErrors = string.Format("'{0}' unable to parse string", connString); } //TODO: Shall we clear keyValue dictionary? //What if parsed gets called on the same instance multiple times //the connectionString is either malformed/invalid //For now clearing keyValue dictionary, we assume the caller wants to parse new connection string //and wants to discard old values (even if they are valid) KeyValuePairs.Clear(clearValuesOnly: true); foreach (string pair in pairs) { Match m = Regex.Match(pair, parseRegEx); if (m.Groups.Count > 2) { string keyName = m.Groups["KeyName"].Value; string newValue = m.Groups["KeyValue"].Value; if (KeyValuePairs.ContainsKey(keyName)) { string existingValue = KeyValuePairs[keyName]; // Replace if the existing value do not match. // We allow existing key values to be overwritten (this is especially true for endpoints) if (!existingValue.Equals(newValue, StringComparison.OrdinalIgnoreCase)) { KeyValuePairs[keyName] = newValue; } } else { KeyValuePairs[keyName] = newValue; } } else { ParseErrors = string.Format("Incorrect '{0}' keyValue pair format", pair); } } //Adjust key-value pairs and normalize values across multiple keys //We need to do this here because Connection string can be parsed multiple time within same instance NormalizeKeyValuePairs(); } }
public void Reload(IFileStore store) { m_kvp.Clear(); Load(store); }
private void Load(IFileStore store) { using (var stream = store.OpenFile(m_path)) { var reader = new StreamReader(stream, Encoding.UTF8); string line; string type = null; var options = new KeyValuePairs(); while ((line = reader.ReadLine()) != null) { // Parse each line string[] parts = line.Split(' '); if (parts.Length < 1) { continue; } // Extract type and options type = parts[0]; options.Clear(); for (int i = 1; i < parts.Length; ++i) { string part = parts[i]; int equalsIndex = part.IndexOf('='); if (equalsIndex >= 0) { string key = part.Substring(0, equalsIndex); string value = part.Substring(equalsIndex + 1); int intValue; if (value.StartsWith("\"")) { if (value.EndsWith("\"") && value.Length >= 2) { value = value.Substring(1, value.Length - 2); } else { value = value.Substring(1) + " "; i++; while (!parts[i].EndsWith("\"")) { value += parts[i] + " "; i++; } value += parts[i].Substring(0, parts[i].Length - 1); } options.Set(key, value); } else if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out intValue)) { options.Set(key, intValue); } } } // Interpret switch (type) { case "common": { m_lineHeight = options.GetInteger("lineHeight"); m_base = options.GetInteger("base"); m_scaleW = options.GetInteger("scaleW"); m_scaleH = options.GetInteger("scaleH"); m_pages = new Page[options.GetInteger("pages")]; break; } case "page": { int id = options.GetInteger("id"); if (id >= PageCount) { Array.Resize(ref m_pages, id + 1); } m_pages[id] = new Page(); m_pages[id].Path = AssetPath.Combine(AssetPath.GetDirectoryName(m_path), options.GetString("file")); break; } case "chars": { m_chars = new Dictionary <int, Char>(options.GetInteger("count")); break; } case "char": { var id = options.GetInteger("id"); m_chars[id] = new Char(); m_chars[id].X = options.GetInteger("x"); m_chars[id].Y = options.GetInteger("y"); m_chars[id].Width = options.GetInteger("width"); m_chars[id].Height = options.GetInteger("height"); m_chars[id].XOffset = options.GetInteger("xoffset"); m_chars[id].YOffset = options.GetInteger("yoffset"); m_chars[id].XAdvance = options.GetInteger("xadvance"); m_chars[id].Page = options.GetInteger("page"); if (m_chars[id].Page < 0 || m_chars[id].Page >= PageCount) { m_chars[id].Page = 0; //throw new IOException( "Page count out of range" ); } break; } case "kernings": { m_kernings = new Dictionary <KerningPair, Kerning>(options.GetInteger("count")); break; } case "kerning": { var first = options.GetInteger("first"); var second = options.GetInteger("second"); var pair = new KerningPair(first, second); m_kernings[pair] = new Kerning(); m_kernings[pair].Amount = options.GetInteger("amount"); break; } } } } }