List <Entry> ReadAriIndex(ArcView file, string ari_name) { long arc_offset = 4; using (var ari = VFS.OpenView(ari_name)) { long index_offset = 0; while (index_offset + 4 < ari.MaxOffset) { int name_len = ari.View.ReadInt32(index_offset); var name = ReadName(ari, index_offset + 4, name_len); if (null == name) { return(null); } var entry = new AriEntry { Name = name }; index_offset += name_len + 4; entry.Mode = ari.View.ReadUInt16(index_offset); entry.Size = ari.View.ReadUInt32(index_offset + 2); entry.UnpackedSize = 0; SetType(entry); index_offset += 6; arc_offset += name_len + 10; if (1 == entry.Mode) { entry.IsPacked = true; arc_offset += 4; } entry.Offset = arc_offset; if (!entry.CheckPlacement(file.MaxOffset)) { return(null); } arc_offset += entry.Size; m_dir.Add(entry); } } return(m_dir); }
List <Entry> BuildIndex(ArcView file) { long arc_offset = 4; while (arc_offset + 4 < file.MaxOffset) { int name_len = file.View.ReadInt32(arc_offset); var name = ReadName(file, arc_offset + 4, name_len); if (null == name) { return(null); } var entry = new AriEntry { Name = name }; arc_offset += name_len + 4; entry.Mode = file.View.ReadUInt16(arc_offset); entry.Size = file.View.ReadUInt32(arc_offset + 2); SetType(entry); arc_offset += 6; if (1 == entry.Mode) { entry.IsPacked = true; entry.UnpackedSize = file.View.ReadUInt32(arc_offset); arc_offset += 4; } entry.Offset = arc_offset; if (!entry.CheckPlacement(file.MaxOffset)) { return(null); } arc_offset += entry.Size; m_dir.Add(entry); } return(m_dir); }