ArcMemory::ArcMemory() { Loaded=false; SeekPos=0; } void ArcMemory::Load(const byte *Data,size_t Size) { ArcData.Alloc(Size); memcpy(&ArcData[0],Data,Size); Loaded=true; SeekPos=0; } bool ArcMemory::Unload() { if (!Loaded) return false; Loaded=false; return true; } bool ArcMemory::Read(void *Data,size_t Size,size_t &Result) { if (!Loaded) return false; Result=(size_t)Min(Size,ArcData.Size()-SeekPos); memcpy(Data,&ArcData[(size_t)SeekPos],Result); SeekPos+=Result; return true; } bool ArcMemory::Seek(int64 Offset,int Method) { if (!Loaded) return false; if (Method==SEEK_SET) { if (Offset<0) SeekPos=0; else SeekPos=Min((uint64)Offset,ArcData.Size()); } else if (Method==SEEK_CUR || Method==SEEK_END) { if (Method==SEEK_END) SeekPos=ArcData.Size(); SeekPos+=(uint64)Offset; if (SeekPos>ArcData.Size()) SeekPos=Offset<0 ? 0 : ArcData.Size(); } return true; } bool ArcMemory::Tell(int64 *Pos) { if (!Loaded) return false; *Pos=SeekPos; return true; }