#pragma warning restore CSE0003 public static FunctionLocalsInfo[] GetFunctionLocals(GMFileContent content, SectionRefDefs *section) { uint extraOffset = section->Entries.NameOffset * (uint)sizeof(RefDefEntry); IntPtr extraStart = (IntPtr)((byte *)§ion->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); }
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)); }
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; })); }
// 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; })); }
// 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 *)§ion->Entries + elemOff * sizeof(uint); i < amount; rde += rdeSize, i++) { r[i] = iter((IntPtr)rde); } return(r); }