public void MakeBitfield(CodeClass codeClass, BfsBitfield dataField)
{
codeClass.ClassType = CodeClass.ClassTypeEnum.Struct;
//Adds the implicit 'value' variable for storing the read primitive type.
codeClass.CodeFields.Add(CSHelper.TypeMap(dataField.PrimitiveType).ToLower() + " value;");
string objectType = dataField.Name;
string varName = dataField.Name.ToLower();
StringBuilder b = new StringBuilder("bool ");
for ( int i = 0; i< dataField.BitFieldFields.Count; i++)
{
if (i != 0)
b.Append(", ");
BfsBitfieldField field = dataField.BitFieldFields[i];
if (field.Name == null)
b.Append("bit" + field.BitNumber);
else
b.Append(field.Name);
}
b.Append(";");
codeClass.CodeFields.Add(b.ToString());
CodeMethod codeMethod = new CodeMethod(objectType + " Read(BfsBinaryReader file)");
codeClass.CodeMethods.Add(codeMethod);
codeMethod.CodeLines.Add(objectType + " " + varName + " = new " + objectType + "();");
codeMethod.CodeLines.Add(varName + ".value = file.Read" + dataField.PrimitiveType.PrimitiveType.ToString() + "();");
foreach( BfsBitfieldField field in dataField.BitFieldFields )
{
int size = Environments.GetSizeOfPrimitiveType(dataField.PrimitiveType);
string mask = MakeMask(field.BitNumber, size);
string bitName = ((field.Name != null) ? field.Name : ("bit" + field.BitNumber));
if (field.Actions.Count > 0)
{
IfBlock block = new IfBlock("(" + varName + ".value & " + mask + ") == 1");
block.CodeLines.Add(varName + "." + bitName + " = true;");
MakeActionList(dataField, block.CodeLines, field.Actions);
codeMethod.AddSplitLines(block.ToString());
}
else
codeMethod.CodeLines.Add(varName + "." + bitName + " = " + "(" + varName + ".value & " + mask + ") == 1;");
}
codeMethod.CodeLines.Add("return " + varName + ";");
}