GPAK  1.0.0
A general-purpose archive library

◆ gpak_fopen()

GPAK_API gpak_file_t* gpak_fopen ( gpak_t _pak,
const char *  _path 
)
Brief Description:\n Opens a file in a G-PAK archive.

This function opens a file with the specified _path in the G-PAK archive.

Parameters
_pakA pointer to the gpak_t.
_pathA string containing the path of the file to open.
Returns
A pointer to the opened gpak_file_t or NULL if an error occurred.

Definition at line 389 of file gpak.c.

390 {
391  filesystem_tree_file_t* _file_info = filesystem_tree_find_file(_pak->root_, _path);
392  if (!_file_info)
393  {
394  _gpak_make_error(_pak, GPAK_ERROR_FILE_NOT_FOUND);
395  return NULL;
396  }
397 
398  _pak->current_file_ = filesystem_tree_file_path(_pak->root_, _file_info);
399 
400  uint32_t uncompressed_size = _file_info->entry_.uncompressed_size_;
401  uint32_t compressed_size = _file_info->entry_.compressed_size_;
402 
403  gpak_file_t* mfile = (gpak_file_t*)malloc(sizeof(gpak_file_t));
404  mfile->data_ = (char*)malloc(uncompressed_size + 1);
405  mfile->data_[uncompressed_size] = '\0';
406 
407  mfile->stream_ = fmemopen(mfile->data_, uncompressed_size, "wb+");
408 
409  // Setting position to file start
410  fseek(_pak->stream_, _file_info->entry_.offset_, SEEK_SET);
411 
413  mfile->crc32_ = _gpak_decompressor_inflate(_pak, _pak->stream_, mfile->stream_, compressed_size);
415  mfile->crc32_ = _gpak_decompressor_zstd(_pak, _pak->stream_, mfile->stream_, compressed_size);
416  else
417  mfile->crc32_ = _gpak_decompressor_none(_pak, _pak->stream_, mfile->stream_, compressed_size);
418 
419  fseek(mfile->stream_, 0, SEEK_SET);
420 
421  // Check crc32
422  if (mfile->crc32_ != _file_info->entry_.crc32_)
423  {
424  _gpak_make_error(_pak, GPAK_ERROR_FILE_CRC_NOT_MATCH);
425  free(_pak->current_file_);
426  gpak_fclose(mfile);
427  return NULL;
428  }
429 
430  free(_pak->current_file_);
431 
432  return mfile;
433 }
GPAK_API char * filesystem_tree_file_path(filesystem_tree_node_t *_node, filesystem_tree_file_t *_file)
GPAK_API filesystem_tree_file_t * filesystem_tree_find_file(filesystem_tree_node_t *_root, const char *_path)
GPAK_API void gpak_fclose(gpak_file_t *_file)
Definition: gpak.c:470
GPAK_API uint32_t _gpak_decompressor_none(gpak_t *_pak, FILE *_infile, FILE *_outfile, size_t _read_size)
GPAK_API uint32_t _gpak_decompressor_inflate(gpak_t *_pak, FILE *_infile, FILE *_outfile, size_t _read_size)
GPAK_API uint32_t _gpak_decompressor_zstd(gpak_t *_pak, FILE *_infile, FILE *_outfile, size_t _read_size)
@ GPAK_HEADER_COMPRESSION_ZST
Definition: gpak_data.h:36
@ GPAK_HEADER_COMPRESSION_DEFLATE
Definition: gpak_data.h:35
@ GPAK_ERROR_FILE_NOT_FOUND
Definition: gpak_data.h:163
@ GPAK_ERROR_FILE_CRC_NOT_MATCH
Definition: gpak_data.h:185
pak_entry_t entry_
Definition: gpak_data.h:306
uint32_t crc32_
Definition: gpak_data.h:137
uint32_t uncompressed_size_
Definition: gpak_data.h:135
uint32_t compressed_size_
Definition: gpak_data.h:134
size_t offset_
Definition: gpak_data.h:136
uint32_t crc32_
Definition: gpak_data.h:286
FILE * stream_
Definition: gpak_data.h:285
char * data_
Definition: gpak_data.h:284
gpak_header_compression_algorithm_t compression_
Definition: gpak_data.h:113
char * current_file_
Definition: gpak_data.h:263
struct filesystem_tree_node * root_
Definition: gpak_data.h:260
FILE * stream_
Definition: gpak_data.h:259
pak_header_t header_
Definition: gpak_data.h:258

References _gpak_decompressor_inflate(), _gpak_decompressor_none(), _gpak_decompressor_zstd(), gpak_entry_header::compressed_size_, gpak_header::compression_, gpak_entry_header::crc32_, gpak_file::crc32_, gpak::current_file_, gpak_file::data_, filesystem_tree_file::entry_, filesystem_tree_file_path(), filesystem_tree_find_file(), GPAK_ERROR_FILE_CRC_NOT_MATCH, GPAK_ERROR_FILE_NOT_FOUND, gpak_fclose(), GPAK_HEADER_COMPRESSION_DEFLATE, GPAK_HEADER_COMPRESSION_ZST, gpak::header_, gpak_entry_header::offset_, gpak::root_, gpak::stream_, gpak_file::stream_, and gpak_entry_header::uncompressed_size_.