示例#1
0
#pragma warning restore CSE0003

        public static FunctionLocalsInfo[] GetFunctionLocals(GMFileContent content, SectionRefDefs *section)
        {
            uint   extraOffset = section->Entries.NameOffset * (uint)sizeof(RefDefEntry);
            IntPtr extraStart  = (IntPtr)((byte *)&section->Entries.Occurrences + extraOffset);

            uint count = *(uint *)extraStart;
            var  r     = new FunctionLocalsInfo[count];

            uint i = 0;

            for (var entryPtr = (byte *)extraStart + 4; i < count; i++)
            {
                var extraEntry = (FunctionLocalsEntry *)entryPtr;
                var info       = new FunctionLocalsInfo();

                info.FunctionName = StringFromOffset(content, extraEntry->FunctionName);
                info.LocalNames   = new string[extraEntry->LocalsCount];

                entryPtr += 8;

                for (uint j = 0; j < extraEntry->LocalsCount; j++)
                {
                    var local = (FunctionLocalEntry *)entryPtr;
                    info.LocalNames[local->Index] = StringFromOffset(content, local->Name);
                    entryPtr += sizeof(FunctionLocalEntry);
                }

                r[i] = info;
            }

            return(r);
        }
示例#2
0
        public static ReferenceDef[] GetRefDefsWithLength(GMFileContent content, SectionRefDefs *section)
        {
            return(GetRefDefsInternal(content, section, 1, section->Entries.NameOffset /* actually length, because reasons */, 12, p =>
            {
                var rde = (RefDefEntry *)p;
                var ret = new ReferenceDef();

                ret.Name = StringFromOffset(content, rde->NameOffset);
                ret.Occurrences = rde->Occurrences;
                ret.FirstOffset = rde->FirstAddress;

                return ret;
            }, false));
        }
示例#3
0
        public static ReferenceDef[] GetRefDefsWithOthers(GMFileContent content, SectionRefDefs *section)
        {
            return(GetRefDefsInternal(content, section, 3, 0, 20 /* sizeof RefDefEntryWithOthers */, p =>
            {
                var rde = (RefDefEntryWithOthers *)p; // they really are doing a Redigit here (well, this AND the DwordBools (instead of 1-byte bools or bit flags))
                var ret = new ReferenceDef();

                ret.Name = StringFromOffset(content, rde->NameOffset);
                ret.Occurrences = rde->Occurrences;
                ret.FirstOffset = rde->FirstAddress;

                return ret;
            }));
        }
示例#4
0
        // FFS YoYo Games, WHY?
#pragma warning disable CSE0003 // "Use expression-bodied members": too ugly with those lambdas
        public static ReferenceDef[] GetRefDefs(GMFileContent content, SectionRefDefs *section)
        {
            return(GetRefDefsInternal(content, section, 0, 0, 12 /* sizeof RefDefEntry */, p =>
            {
                var rde = (RefDefEntry *)p;
                var ret = new ReferenceDef();

                ret.Name = StringFromOffset(content, rde->NameOffset);
                ret.Occurrences = rde->Occurrences;
                ret.FirstOffset = rde->FirstAddress;

                return ret;
            }));
        }
示例#5
0
        // C# doesn't like pointers of generic types...
        static ReferenceDef[] GetRefDefsInternal(GMFileContent content, SectionRefDefs *section, long elemOff, uint amount, uint rdeSize, Func <IntPtr, ReferenceDef> iter)
        {
            amount = amount == 0 ? section->Header.Size / rdeSize : amount;
            var r = new ReferenceDef[amount];

            uint i = 0;

            for (var rde = (byte *)&section->Entries + elemOff * sizeof(uint); i < amount; rde += rdeSize, i++)
            {
                r[i] = iter((IntPtr)rde);
            }

            return(r);
        }