예제 #1
0
파일: th105.cpp 프로젝트: click3/touhouSE
bool Th105DataArchiveExtractor::read_file(FileData &data, const FileInfo &info, FILE *fp) {
	if(fp == NULL) {
		return false;
	}
	fseek(fp, 0, SEEK_END);
	const unsigned int file_size = ftell(fp);
	if(info.filename[0] == '\0' || strnlen(info.filename, sizeof(info.filename)) >= sizeof(info.filename) || info.addr + info.comp_size > file_size){
		return false;
	}

	data.set_path(info.filename);
	data.data = std::vector<unsigned char>(info.size);
	if(info.comp_size == 0) {
		return true;
	}

	fseek(fp, info.addr, SEEK_SET);
	unsigned char *p = &data.data.front();
	if(fread(p, 1, info.comp_size, fp) != info.comp_size){
		return false;
	}
	return true;
}