/* * Read the PACK directory into memory. The optional offset to the * start of the PACK file is given in "offset". The number of files in * the directory is returned in *dirsize_r. */ PACKDirPtr ReadPACKDirectory(FILE *packfile, UInt32 offset, UInt16 *dirsize_r) { PACKDirPtr dir; UInt32 pos, size; UInt16 max, i; *dirsize_r = 0; if (packfile == NULL) return NULL; if ((fseek(packfile, offset, SEEK_SET) < 0) || (ReadMagic(packfile) != FTYPE_PACK) || (ReadInt32(packfile, &pos) == FALSE) || (ReadInt32(packfile, &size) == FALSE) || (size == 0L) || (size / sizeof(struct PACKDirectory) > 65535L) || (fseek(packfile, offset + pos, SEEK_SET) < 0)) return NULL; dir = (PACKDirPtr)__qmalloc(size); max = (UInt16)(size / sizeof(struct PACKDirectory)); for (i = 0; i < max; i++) { if (ReadBytes(packfile, &dir[i], sizeof(struct PACKDirectory)) == FALSE) { free(dir); return NULL; } ConvertFilePath(dir[i].name); dir[i].offset = SwapInt32(dir[i].offset); dir[i].size = SwapInt32(dir[i].size); } *dirsize_r = max; return dir; }
FILE *OpenFileReadMagic(const char *filename, int *ftype_r) { FILE *f; *ftype_r = FTYPE_ERROR; if ((f = fopen(filename, "rb")) == NULL) return NULL; *ftype_r = ReadMagic(f); if (*ftype_r == FTYPE_ERROR) { fclose(f); return NULL; } return f; }
LzopStreamReader::LzopStreamReader(const void* base, size_t length) { header_t header; // LZOP header information if(!base) throw Exception(E_POINTER); if(length == 0) throw Exception(E_INVALIDARG); intptr_t baseptr = intptr_t(base); // Verify the magic number and read the LZOP header information baseptr = ReadMagic(baseptr, &length); baseptr = ReadHeader(baseptr, &length, &header); // Initialize the decompression block member variables m_block = m_blockcurrent = NULL; m_blocklen = 0; m_blockremain = 0; // Initialize the LZO input stream member variables m_lzopos = baseptr; m_lzoremain = length; m_lzoflags = header.flags; }