libclamunrar/arcmem.cpp
01eebc13
 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;
 }