static bool FindUMXNameTableEntryImpl(TFile &file, const UMXFileHeader &fileHeader, const char *name) { if(!name) { return false; } std::size_t name_len = std::strlen(name); if(name_len == 0) { return false; } bool result = false; const FileReader::off_t oldpos = file.GetPosition(); if(file.Seek(fileHeader.nameOffset)) { for(uint32 i = 0; i < fileHeader.nameCount && file.CanRead(4); i++) { if(fileHeader.packageVersion >= 64) { int32 length = ReadUMXIndexImpl(file); if(length <= 0) { continue; } } bool match = true; std::size_t pos = 0; char c = 0; while((c = file.ReadUint8()) != 0) { c = mpt::ToLowerCaseAscii(c); if(pos < name_len) { match = match && (c == name[pos]); } pos++; } if(pos != name_len) { match = false; } if(match) { result = true; } file.Skip(4); // Object flags } } file.Seek(oldpos); return result; }
__int64 CDVDInputStreamStack::Seek(__int64 offset, int whence) { __int64 pos, len; if (whence == SEEK_SET) pos = offset; else if(whence == SEEK_CUR) pos = offset + m_pos; else if(whence == SEEK_END) pos = offset + m_length; else return -1; len = 0; for(TSegVec::iterator it = m_files.begin(); it != m_files.end(); it++) { if(len + it->length > pos) { TFile file = it->file; __int64 file_pos = pos - len; if(file->GetPosition() != file_pos) { if(file->Seek(file_pos, SEEK_SET) < 0) return false; } m_file = file; m_pos = pos; m_eof = false; return pos; } len += it->length; } return -1; }