コード例 #1
0
            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);
            }
コード例 #2
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;
            }
コード例 #3
0
            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);
                }
            }
コード例 #4
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());
            }
コード例 #5
0
            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);
            }
コード例 #6
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);
        }
コード例 #7
0
            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);
            }
コード例 #8
0
            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);
            }
コード例 #9
0
            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
            }
コード例 #10
0
            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
            }
コード例 #11
0
            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
            }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
            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);
            }