public static byte[][] ListToByteArrays(GMFileContent content, SectionCountOffsets *list, long elemLen = 0) { var ret = new byte[list->Count][]; for (uint i = 0; i < list->Count; i++) { var curOff = (&list->Offsets)[i]; var nextOff = i == list->Count - 1L ? list->Header.Size - 4L : (&list->Offsets)[i + 1]; var curPtr = (byte *)GMFile.PtrFromOffset(content, curOff); var len = elemLen <= 0L ? ((byte *)GMFile.PtrFromOffset(content, nextOff) - curPtr) : elemLen; if (len < 0L && elemLen < 0L) { len = -elemLen; } var data = new byte[len]; Marshal.Copy((IntPtr)curPtr, data, 0, (int)len); ret[i] = data; } return(ret); }
internal static LazyArray <T> MkLazyArr <T>(SectionCountOffsets *hdr, Func <uint, T> readOne) { if (hdr == null) { return(new LazyArray <T>(null, 0)); } bool skip = false; return(new LazyArray <T>(ind => { var fail = new KeyValuePair <bool, T>(false, default(T)); try { if (skip) { return fail; } return new KeyValuePair <bool, T>(true, readOne(ind)); } catch (Exception e) { Console.Error.WriteLine("Error reading " + hdr->Header.MagicString() + " #" + ind + " - skipping others."); Console.Error.WriteLine(e); skip = true; return fail; } }, hdr->Count)); }