public string GenerateCode(BinaryFileSchema schema)
{
StringBuilder b = new StringBuilder();
List<CodeClass> codeClasses = new List<CodeClass>();
FormatName = schema.FormatBlock.Name;
b.AppendLine("using System;");
b.AppendLine("using System.Collections.Generic;");
b.AppendLine("using System.IO;");
b.AppendLine("using System.Text;");
b.AppendLine("namespace " + schema.FormatBlock.Name);
b.AppendLine("{");
CodeClass mainClass = new CodeClass(schema.FormatBlock.Name + "Parser");
codeClasses.Add(mainClass);
rootParser = mainClass;
CodeMethod mainMethod = new CodeMethod("void Main(string[] args)");
mainMethod.CodeLines.Add("try{");
mainMethod.CodeLines.Add("\t" + schema.FormatBlock.Name + " ps = " + schema.FormatBlock.Name + "Parser.ReadFile(args[0]);");
mainMethod.CodeLines.Add("\tConsole.WriteLine(ps.ToString());");
mainMethod.CodeLines.Add("}");
mainMethod.CodeLines.Add("catch(Exception e){");
mainMethod.CodeLines.Add("\tConsole.WriteLine(e.Message);");
mainMethod.CodeLines.Add("\tConsole.WriteLine(e.StackTrace);");
mainMethod.CodeLines.Add("}");
mainClass.CodeMethods.Add(mainMethod);
CodeMethod readFile = new CodeMethod( schema.FormatBlock.Name + " ReadFile(string filename)");
mainClass.CodeMethods.Add(readFile);
readFile.CodeLines.Add("FileStream fstream = new FileStream(filename, FileMode.Open);");
readFile.CodeLines.Add("BinaryReader reader = new BinaryReader(fstream);");
string endianness = ((schema.ByteOrder.ByteOrder == BfsByteOrderEnum.BigEndian) ? BfsByteOrderEnum.BigEndian : BfsByteOrderEnum.LittleEndian).ToString();
readFile.CodeLines.Add("BfsBinaryReader bfsReader = new BfsBinaryReader(reader, BfsBinaryReader.Endianness." + endianness + ");");
readFile.CodeLines.Add("return " + schema.FormatBlock.Name + ".Read(bfsReader);");
foreach (IBfsDataBlock dataBlock in schema.DatablockList)
{
CodeClass newClass = MakeClass(dataBlock);
if(newClass != null)
codeClasses.Add(newClass);
}
//Output the classes
foreach (CodeClass cc in codeClasses)
b.Append(cc.ToString());
b.AppendLine("}");
return b.ToString();
}