85 lines
1.8 KiB
C++
Executable File
85 lines
1.8 KiB
C++
Executable File
#ifdef READER_CPP
|
|
#include "gzreader.hpp"
|
|
|
|
unsigned GZReader::size() {
|
|
return filesize;
|
|
}
|
|
|
|
//This function will allocate memory even if open() fails.
|
|
//This is needed so that when SRAM files do not exist, the
|
|
//memory for the SRAM data will be allocated still.
|
|
//The memory is flushed to 0x00 when no file is opened.
|
|
uint8_t* GZReader::read(unsigned length) {
|
|
uint8_t *data = 0;
|
|
|
|
if(length == 0) {
|
|
//read the entire file into RAM
|
|
data = new(zeromemory) uint8_t[filesize];
|
|
if(gp) gzread(gp, data, filesize);
|
|
} else if(length > filesize) {
|
|
//read the entire file into RAM, pad the rest with 0x00s
|
|
data = new(zeromemory) uint8_t[length];
|
|
if(gp) gzread(gp, data, filesize);
|
|
} else { //filesize >= length
|
|
//read only what was requested
|
|
data = new(zeromemory) uint8_t[length];
|
|
if(gp) gzread(gp, data, length);
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
bool GZReader::ready() {
|
|
return (gp != 0);
|
|
}
|
|
|
|
GZReader::GZReader(const char *fn) : gp(0) {
|
|
#if !defined(_WIN32)
|
|
fp = fopen(fn, "rb");
|
|
#else
|
|
fp = _wfopen(utf16_t(fn), L"rb");
|
|
#endif
|
|
if(!fp) return;
|
|
|
|
fseek(fp, 0, SEEK_END);
|
|
filesize = ftell(fp);
|
|
|
|
if(filesize < 4) {
|
|
//too small to be a valid GZ archive
|
|
fclose(fp);
|
|
fp = 0;
|
|
return;
|
|
}
|
|
|
|
fseek(fp, -4, SEEK_END);
|
|
unsigned gzsize;
|
|
gzsize = fgetc(fp);
|
|
gzsize |= fgetc(fp) << 8;
|
|
gzsize |= fgetc(fp) << 16;
|
|
gzsize |= fgetc(fp) << 24;
|
|
fseek(fp, 0, SEEK_SET);
|
|
|
|
//zlib does not support UTF-8 filenames on Windows,
|
|
//thus _wfopen() wrapper above + fileno() wrapper here.
|
|
gp = gzdopen(fileno(fp), "rb");
|
|
if(!gp) return;
|
|
|
|
if(gzdirect(gp) == false) filesize = gzsize;
|
|
|
|
if(filesize == 0) {
|
|
//archive is empty
|
|
gzclose(gp);
|
|
gp = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
GZReader::~GZReader() {
|
|
if(gp) {
|
|
gzclose(gp);
|
|
gp = 0;
|
|
}
|
|
}
|
|
|
|
#endif //ifdef READER_CPP
|