| 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) |
| 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; |
| } |