/// <summary> /// Create a new Format object from a string /// </summary> /// <param name="format">The format string</param> internal Format(string format) { FormatString = format; ElementsArray currentLevel = Root; Stack <ElementsArray> levels = new Stack <ElementsArray>(); // Inflate the format for (int i = 0; i < format.Length; i++) { switch (format[i]) { case '(': // New level of parentheses ElementsArray newLevel = new ElementsArray(); currentLevel.Elements.Add(newLevel); levels.Push(currentLevel); currentLevel = newLevel; break; case ')': if (currentLevel == Root) { // Unbalanced parentheses throw new ArgumentException("Invalid format string: " + format); } currentLevel = levels.Count == 0 ? Root : levels.Pop(); break; case 'u': currentLevel.Elements.Add(new LeafElement(Element.Type.UINT)); break; case 'i': currentLevel.Elements.Add(new LeafElement(Element.Type.INT)); break; case 'f': currentLevel.Elements.Add(new LeafElement(Element.Type.FLOAT)); break; case 't': currentLevel.Elements.Add(new LeafElement(Element.Type.TOKEN)); break; case 's': currentLevel.Elements.Add(new LeafElement(Element.Type.STRING)); break; default: // Invalid character throw new ArgumentException("Invalid format string: " + format); } } // Check if the format has balanced parentheses if (currentLevel != Root) { throw new ArgumentException("Invalid format string: " + format); } }
/// <summary> /// Create a new Format object from a string /// </summary> /// <param name="format">The format string</param> internal Format(string format) { FormatString = format; ElementsArray currentLevel = Root; Stack<ElementsArray> levels = new Stack<ElementsArray>(); // Inflate the format for (int i = 0; i < format.Length; i++) { switch (format[i]) { case '(': // New level of parentheses ElementsArray newLevel = new ElementsArray(); currentLevel.Elements.Add(newLevel); levels.Push(currentLevel); currentLevel = newLevel; break; case ')': if (currentLevel == Root) // Unbalanced parentheses throw new ArgumentException("Invalid format string: " + format); currentLevel = levels.Count == 0 ? Root : levels.Pop(); break; case 'u': currentLevel.Elements.Add(new LeafElement(Element.Type.UINT)); break; case 'i': currentLevel.Elements.Add(new LeafElement(Element.Type.INT)); break; case 'f': currentLevel.Elements.Add(new LeafElement(Element.Type.FLOAT)); break; case 't': currentLevel.Elements.Add(new LeafElement(Element.Type.TOKEN)); break; case 's': currentLevel.Elements.Add(new LeafElement(Element.Type.STRING)); break; default: // Invalid character throw new ArgumentException("Invalid format string: "+format); } } // Check if the format has balanced parentheses if (currentLevel != Root) throw new ArgumentException("Invalid format string: " + format); }