public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; #region Fields #region Byte swap codes /* * uint fieldBSCodesAddress = stream.PositionUnsigned; * stream.Write(comp.OwnerState.Definition.FieldTypes[comp.TypeIndexArrayStart].ByteSwapCodes[0]); * stream.Write((int)1); // array count * foreach (Import.Field f in fieldSet.Fields) * { * if (f.TypeIndex == comp.TypeIndexUselessPad) continue; * else if (f.TypeIndex == comp.TypeIndexPad || f.TypeIndex == comp.TypeIndexSkip) * stream.Write(f.ToInt()); * else * foreach (int x in comp.OwnerState.Definition.FieldTypes[f.TypeIndex].ByteSwapCodes) * if (x != 0) * stream.Write(x); * } * stream.Write(comp.OwnerState.Definition.FieldTypes[comp.TypeIndexArrayEnd].ByteSwapCodes[0]); */ #endregion uint fieldsAddress = stream.PositionUnsigned; Field temp = new Field(); foreach (Import.Field f in fieldSet.Fields) { temp.Reset(f); temp.Write(stream); } stream.Write(comp.TypeIndexTerminator); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); #endregion int field_set_size = fieldSet.CalculateSize(comp.OwnerState); stream.WritePointer(fieldsAddress); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write(uint.MaxValue); stream.Write(field_set_size); stream.Write((int)0); stream.Write((int)0); stream.WritePointer(fieldsAddress); stream.Write(comp.Strings.GetNull()); stream.Write(comp.Strings.GetNull()); stream.Write(field_set_size); stream.Write((int)0); //stream.WritePointer(fieldBSCodesAddress); MiscGroups.bysw.Write(stream); stream.Write((int)0 /*1*/); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); }
public void Write(IO.EndianWriter stream) { int orgPos = stream.Position; if (address != 0) { if (offsets.Count == 0) { string name = (stream.Owner as Compiler).GetLocationName(this); Debug.LogFile.WriteLine("LocationWriteback: unused address! There are no references to '{0}'", name); } else { foreach (uint tempPos in offsets) { stream.PositionUnsigned = tempPos; stream.WritePointer(address); } } } else { string name = (stream.Owner as Compiler).GetLocationName(this); Debug.LogFile.WriteLine("LocationWriteback: failed to writeback! '{0}'s address was not set, {1} memory locations will be null!", name, offsets.Count.ToString()); } stream.Position = orgPos; }
public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; uint elementsAddress = 0; int flags = ( (tagRef.IsNonResolving ? 1 << 1 : 0) ); if (tagRef.Elements.Count > 1) { elementsAddress = stream.PositionUnsigned; foreach (string i in tagRef.Elements) { stream.WriteTag(i); } comp.MarkLocationFixup(tagRef.Name, stream, true); stream.Write(flags); stream.Write((int)-1); stream.WritePointer(elementsAddress); } else { comp.MarkLocationFixup(tagRef.Name, stream, true); stream.Write(flags); stream.WriteTag(tagRef.Elements[0]); stream.Write((int)0); } }
public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; TagBlock tb = new TagBlock((Import.TagBlock)tagGroup.Block); tb.Write(stream); comp.MarkLocationFixup(tagGroup.Name, stream, false); stream.Write(tagGroup.Name); stream.Write((int)0); stream.WriteTag(tagGroup.GroupTag); if (tagGroup.ParentTag != null) { stream.WriteTag(tagGroup.ParentTag); } else { stream.Write((int)-1); } stream.Write(tagGroup.Version); stream.Write((short)1); // init'd stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.WritePointer(tb.RuntimeAddress); for (int x = 0; x < 17; x++) { stream.Write((int)0); // child group tags } stream.Write((int)0); // we don't support that shit, gtfo stream.Write(comp.Strings.GetNull()); }
public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; #region FieldSets uint fieldSetsAddress = stream.PositionUnsigned; FieldSet temp = new FieldSet(); Import.FieldSet fs; int x; for (x = 0; x < tagBlock.FieldSets.Count - 1; x++) { fs = tagBlock.FieldSets[x]; temp.Reset(fs); temp.Write(stream); } uint fieldSetLatestAddress = stream.PositionUnsigned; fs = tagBlock.FieldSets[x]; temp.Reset(fs); temp.Write(stream); #endregion comp.MarkLocationFixup(tagBlock.Name, stream, false); RuntimeAddress = stream.PositionUnsigned; stream.Write(tagBlock.Name); stream.Write(tagBlock.DisplayName); stream.Write((int)0); stream.Write(tagBlock.MaxElements); stream.Write(comp.Strings.GetNull()); stream.WritePointer(fieldSetsAddress); stream.Write(tagBlock.FieldSets.Count); stream.WritePointer(fieldSetLatestAddress); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); }
/// <summary> /// Process the block data to a stream /// </summary> /// <param name="s">Stream</param> public override void Write(IO.EndianWriter s) { if (this.elements.Count == 0) { return; // don't do anything when empty } relativeOffset = s.PositionUnsigned; // store offset s.Seek(headerOffset, System.IO.SeekOrigin.Begin); // go to the reflexive header s.WritePointer(relativeOffset); // write offset s.Seek(relativeOffset, System.IO.SeekOrigin.Begin); // go back to where we were elements.Write(s); }
public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; TagBlock tb = new TagBlock((Import.TagBlock)tagStruct.Block); tb.Write(stream); comp.MarkLocationFixup(tagStruct.Name, stream, false); stream.Write(tagStruct.Name); stream.WriteTag(tagStruct.GroupTag); stream.Write(tagStruct.Block.DisplayName); stream.WritePointer(tb.RuntimeAddress); }
public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; uint elementsAddress = stream.PositionUnsigned; // write string list's element's addresses foreach (uint i in stringList.Elements) { stream.Write(i); } comp.MarkLocationFixup(stringList.Name, stream, true); stream.Write(stringList.Elements.Count); stream.WritePointer(elementsAddress); }
public void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; Import import = comp.OwnerState.Importer as Import; short real_count = (short)import.Groups.Count; var next_index = new DatumIndex((ushort)real_count, 0); // note that this default value isn't ideal stream.Write("dynamic tag groups", false); stream.Write(DataArray.MaxValue); stream.Write(Item.Size); stream.Write((byte)0); // alignment bit stream.Write(true); // is valid stream.Write((short)0); // flags MiscGroups.data.Write(stream); stream.Write(uint.MinValue); // allocator stream.Write((int)0); // bit vector next index stream.Write(Datums.Count); // bit vector length stream.Write(Datums.Count); // actual count next_index.Write(stream); // next index stream.WritePointer(stream.PositionUnsigned + 8); stream.Write((int)0); // bit vector pointer #region Write tag group datums foreach (Import.TagGroup tg in import.Groups.Values) { stream.Write((short)0); // Header stream.Write((short)0); // Flags comp.AddLocationFixup(tg.Name, stream, false); stream.Write((int)0); } #endregion #region Write null datums Item i = new Item(); int count = DataArray.MaxValue - real_count; for (int x = 0; x < count; x++) { i.Write(stream); } #endregion }
public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; uint fieldsAddress = new FieldsWriter(tagBlock.Fields).WriteFields(stream, comp); comp.MarkLocationFixup(tagBlock.Name, stream, false); int flags = 0; stream.Write(tagBlock.Name); stream.Write(flags); stream.Write(tagBlock.MaxElements); stream.Write(tagBlock.CalculateSize(comp.OwnerState)); stream.Write((int)0); stream.WritePointer(fieldsAddress); // procs stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); // byte swap codes address }
public void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; Import import = comp.OwnerState.Importer as Import; int real_count = import.Groups.Count; stream.Write("dynamic tag groups", false); stream.Write((short)DataArray.MaxValue); stream.Write((short)Item.Size); stream.Write(true); stream.Write(true); stream.Write((short)0); MiscGroups.data.Write(stream); stream.Write((short)real_count); //stream.Write((short)Datums.Count); stream.Write((short)real_count); //stream.Write((short)Datums.Count); stream.Write(real_count); stream.WritePointer(stream.PositionUnsigned + 4); #region Write tag group datums foreach (Import.TagGroup tg in import.Groups.Values) { stream.Write((short)0); // Header stream.Write((short)0); // Flags comp.AddLocationFixup(tg.Name, stream, false); stream.Write((int)0); } #endregion #region Write null datums Item i = new Item(); int count = DataArray.MaxValue - real_count; for (int x = 0; x < count; x++) { i.Write(stream); } #endregion }
/// <summary> /// Process the block data to a tag stream /// </summary> /// <param name="ts"></param> public override void Write(IO.ITagStream ts) { if (this.elements.Count == 0) { return; // don't do anything when empty } IO.EndianWriter s = ts.GetOutputStream(); if (ts.Flags.Test(IO.ITagStreamFlags.UseStreamPositions)) { relativeOffset = s.PositionUnsigned; // store offset s.Seek(headerOffset, System.IO.SeekOrigin.Begin); // go to the reflexive header s.WritePointer(relativeOffset); // write offset s.Seek(relativeOffset, System.IO.SeekOrigin.Begin); // go back to where we were } if (DefinitionState.FieldSetRequiresVersioningHeader(ts)) { kState.FieldSetWriteVersion(ts, FieldType.Block, Count); } elements.Write(ts); }
public override void Write(IO.EndianWriter stream) { Compiler comp = stream.Owner as Compiler; int flags; #region Block var tag_block = tagGroup.Block as Import.TagBlock; uint fieldsAddress = new FieldsWriter(tag_block.Fields).WriteFields(stream, comp); //comp.MarkLocationFixup(tag_block.Name, stream, false); flags = ( (tag_block.DontReadChildren ? 1 << 0 : 0) ); uint blockAddress = stream.PositionUnsigned; stream.Write(tagGroup.BlockName); stream.Write(flags); stream.Write((int)1); // max elements stream.Write(tag_block.CalculateSize(comp.OwnerState)); stream.Write((int)0); stream.WritePointer(fieldsAddress); // procs stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); stream.Write((int)0); // byte swap codes address #endregion comp.MarkLocationFixup(tagGroup.Name, stream, false); flags = ( (tagGroup.IsIncludedInTagGroupsChecksum ? 1 << 0 : 0) ); stream.Write(tagGroup.Name); stream.Write(flags); if (string.IsNullOrEmpty(tagGroup.GroupTag)) { Debug.LogFile.WriteLine("CheApe: tag_group '{0}' has a bad group-tag...check your XML?"); } stream.WriteTag(tagGroup.GroupTag); if (tagGroup.ParentTag != null) { if (string.IsNullOrEmpty(tagGroup.GroupTag)) { Debug.LogFile.WriteLine("CheApe: tag_group '{0}' has a bad parent group-tag...check your XML?"); } stream.WriteTag(tagGroup.ParentTag); } else { stream.Write((int)-1); } stream.Write(tagGroup.Version); stream.Write((short)0); stream.Write((int)0); // post process proc stream.WritePointer(blockAddress); for (int x = 0; x < 17; x++) { stream.Write((int)0); // child group tags } stream.Write((int)0); // we don't support that shit, gtfo stream.Write((int)0); }