public QueuedType(string name, ParseSchema.Table table, QueuedType parent) { if (string.IsNullOrEmpty(name) == true) { throw new ArgumentException(); } this.Name = name; this.Table = table; this.Parent = parent; }
public static void DeserializeTable(ParseSchema.Table table, Stream input, XmlWriter output) { //output.Flush(); var dataSize = input.ReadValueU32(); using (var data = input.ReadToMemoryStream((int)dataSize)) { /* * Counter++; * using (var temp = File.Create(string.Format("{0}.struct", Counter))) * { * temp.WriteFromStream(data, data.Length); * data.Position = 0; * } */ output.WriteStartElement("table"); foreach (var column in table.Columns) { if (column.Flags.HasAny( Parse.ColumnFlags.REDUNDANTNAME | Parse.ColumnFlags.UNOWNED | Parse.ColumnFlags.NO_WRITE) == true) { continue; } //output.WriteComment(string.Format(" offset = {0} ", data.Position)); output.WriteStartElement("column"); output.WriteAttributeString("name", column.Name); DeserializeColumn(column, data, output); output.WriteEndElement(); //output.Flush(); } output.WriteEndElement(); if (data.Position != data.Length) { throw new InvalidOperationException(); } } //output.Flush(); }
private void ResolveParse(ParseSchema.Table table) { foreach (var column in table .Columns .Where(c => c.Subtable != null)) { ResolveParse(column.Subtable); } foreach (var column in table .Columns .Where(c => string.IsNullOrEmpty(c.SubtableExternalName) == false)) { var external = this.LoadParse(column.SubtableExternalName); column.Subtable = external.Table ?? throw new InvalidOperationException(); } }
public static string GetColumnName( ParseSchema.Table table, ParseSchema.Column column) { if (string.IsNullOrEmpty(column.Name) == true) { if (table.Columns.Count(c => string.IsNullOrEmpty(c.Name)) > 1) { return("__unnamed_" + column.Offset.ToString("X")); } return("_"); } if (table.Columns.Count(c => c != column && c.Name.ToLowerInvariant() == column.Name.ToLowerInvariant()) > 1) { throw new InvalidOperationException(); } return(column.Name); }
public QueuedType(string name, ParseSchema.Table table) : this(name, table, null) { }
private static ParseSchema.Table LoadTable(XPathNavigator nav, string path) { var table = new ParseSchema.Table(); var columnIterator = nav.Select("column"); while (columnIterator.MoveNext() == true) { var columnNode = columnIterator.Current; if (columnNode == null) { throw new InvalidOperationException(); } // ReSharper disable UseObjectOrCollectionInitializer var column = new ParseSchema.Column(); // ReSharper restore UseObjectOrCollectionInitializer column.Name = columnNode.GetAttribute("name", ""); var type = columnNode.GetAttribute("type", ""); var token = Parse.GlobalTokens.MatchToken(type, out column.Token, out column.Flags); var flagIterator = columnNode.Select("flags/flag"); while (flagIterator.MoveNext() == true) { if (flagIterator.Current == null) { throw new InvalidOperationException(); } var flag = flagIterator.Current.Value; if (Enum.IsDefined(typeof(Parse.ColumnFlags), flag) == false) { throw new FormatException("invalid parse flag"); } column.Flags |= (Parse.ColumnFlags)Enum.Parse(typeof(Parse.ColumnFlags), flag); } column.Offset = (uint)GetIntElement(columnNode, "offset", 0); column.RedundantName = GetStringElement(columnNode, "redundant_name", null); column.MinBits = (byte)GetIntElement(columnNode, "min_bits", 0); column.FloatRounding = GetStringElement(columnNode, "float_rounding", null); column.NumberOfElements = GetIntElement(columnNode, "num_elements", 0); column.Default = GetIntElement(columnNode, "default", 0); column.StringLength = GetIntElement(columnNode, "string_length", 0); column.DefaultString = GetStringElement(columnNode, "default_string", null); column.CommandString = GetStringElement(columnNode, "command_string", null); column.Size = GetIntElement(columnNode, "size", 0); column.BitOffset = GetIntElement(columnNode, "bit_offset", 0); var subtable = columnNode.SelectSingleNode("subtable"); if (subtable != null) { var subtableExternalName = subtable.GetAttribute("external", ""); if (string.IsNullOrEmpty(subtableExternalName) == false) { column.SubtableExternalName = subtableExternalName; column.SubtableIsExternal = true; } else { var subtableTable = subtable.SelectSingleNode("table"); if (subtableTable != null) { column.SubtableIsExternal = false; column.Subtable = LoadTable(subtableTable, path); } else { var lineInfo = (IXmlLineInfo)subtable; Console.WriteLine("empty subtable in {0} @ {1}/{2}", path, lineInfo.LineNumber, lineInfo.LinePosition); continue; } } } var staticDefineList = columnNode.SelectSingleNode("static_define_list"); if (staticDefineList != null) { column.StaticDefineListExternalName = staticDefineList.GetAttribute("external", ""); column.StaticDefineListIsExternal = true; var staticDefineListElements = staticDefineList.SelectSingleNode("elements"); if (staticDefineListElements != null) { column.StaticDefineListIsExternal = false; column.StaticDefineList = ParseEnumFile.LoadEnumeration(staticDefineListElements); } } var formatName = GetStringElement(columnNode, "format", null); if (string.IsNullOrEmpty(formatName) == false) { ParseSchema.ColumnFormat format; if (Enum.TryParse(formatName, true, out format) == false) { throw new FormatException("invalid column format"); } column.Format = format; } var formatStringIterator = columnNode.Select("format_strings/format_string"); column.FormatStrings.Clear(); while (formatStringIterator.MoveNext() == true) { var formatStringNode = formatStringIterator.Current; if (formatStringNode == null) { throw new InvalidOperationException(); } var formatStringKey = formatStringNode.GetAttribute("name", ""); if (string.IsNullOrEmpty(formatStringKey) == true) { throw new FormatException("invalid schema format string key"); } /*Console.WriteLine("Adding {0}={1} to {2}", * formatStringKey, formatStringNode.Value, column.Name);*/ column.FormatStrings.Add(formatStringKey, formatStringNode.Value); } table.Columns.Add(column); } return(table); }