Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }