parent
15612c2bcc
commit
d0463ddb5e
|
@ -71,6 +71,8 @@ target_sources(vbam-fex
|
||||||
fex/LZ_Reader.h
|
fex/LZ_Reader.h
|
||||||
fex/Rar_Extractor.cpp
|
fex/Rar_Extractor.cpp
|
||||||
fex/Rar_Extractor.h
|
fex/Rar_Extractor.h
|
||||||
|
fex/Tar_Extractor.cpp
|
||||||
|
fex/Tar_Extractor.h
|
||||||
fex/Zip7_Extractor.cpp
|
fex/Zip7_Extractor.cpp
|
||||||
fex/Zip7_Extractor.h
|
fex/Zip7_Extractor.h
|
||||||
fex/Zip_Extractor.cpp
|
fex/Zip_Extractor.cpp
|
||||||
|
|
|
@ -213,7 +213,7 @@ struct fex_type_t_ {
|
||||||
blargg_err_t (*init)(); // Called by fex_init(). Can be NULL.
|
blargg_err_t (*init)(); // Called by fex_init(). Can be NULL.
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const fex_type_t_ fex_7z_type[1], fex_gz_type[1], fex_bz2_type[1], fex_xz_type[1], fex_lz_type[1], fex_rar_type[1], fex_zip_type[1],
|
extern const fex_type_t_ fex_7z_type[1], fex_gz_type[1], fex_bz2_type[1], fex_xz_type[1], fex_lz_type[1], fex_tar_type[1], fex_rar_type[1], fex_zip_type[1],
|
||||||
fex_bin_type[1];
|
fex_bin_type[1];
|
||||||
|
|
||||||
inline blargg_err_t File_Extractor::open_v()
|
inline blargg_err_t File_Extractor::open_v()
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
// File_Extractor 1.0.0. http://www.slack.net/~ant/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#include "Tar_Extractor.h"
|
||||||
|
|
||||||
|
/* Copyright (C) 2025 Andy Vandijck. This module is free software; you
|
||||||
|
can redistribute it and/or modify it under the terms of the GNU Lesser
|
||||||
|
General Public License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version. This
|
||||||
|
module is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||||
|
details. You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this module; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||||
|
|
||||||
|
#include "blargg_source.h"
|
||||||
|
|
||||||
|
// TODO: could close file once data has been read into memory
|
||||||
|
|
||||||
|
static blargg_err_t init_tar_file()
|
||||||
|
{
|
||||||
|
get_crc_table(); // initialize zlib's CRC-32 tables
|
||||||
|
return blargg_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static File_Extractor* new_tar()
|
||||||
|
{
|
||||||
|
return BLARGG_NEW Tar_Extractor;
|
||||||
|
}
|
||||||
|
|
||||||
|
fex_type_t_ const fex_tar_type [1] = {{
|
||||||
|
".tar",
|
||||||
|
&new_tar,
|
||||||
|
"tar file",
|
||||||
|
&init_tar_file
|
||||||
|
}};
|
||||||
|
|
||||||
|
Tar_Extractor::Tar_Extractor() :
|
||||||
|
File_Extractor( fex_tar_type )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
Tar_Extractor::~Tar_Extractor()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
blargg_err_t Tar_Extractor::open_path_v()
|
||||||
|
{
|
||||||
|
RETURN_ERR( open_arc_file(true) );
|
||||||
|
RETURN_ERR( arc().seek( 0 ) );
|
||||||
|
return open_v();
|
||||||
|
}
|
||||||
|
|
||||||
|
blargg_err_t Tar_Extractor::stat_v()
|
||||||
|
{
|
||||||
|
set_info( arc().remain(), 0, 0 );
|
||||||
|
return blargg_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
blargg_err_t Tar_Extractor::open_v()
|
||||||
|
{
|
||||||
|
arc().read(&header, BLOCKSIZE);
|
||||||
|
set_name( header.name );
|
||||||
|
sscanf(header.size, "%o", &tarsize);
|
||||||
|
return blargg_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tar_Extractor::close_v()
|
||||||
|
{
|
||||||
|
name.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
blargg_err_t Tar_Extractor::next_v()
|
||||||
|
{
|
||||||
|
arc().read(&header, BLOCKSIZE);
|
||||||
|
set_name( header.name );
|
||||||
|
sscanf(header.size, "%o", &tarsize);
|
||||||
|
return blargg_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
blargg_err_t Tar_Extractor::rewind_v()
|
||||||
|
{
|
||||||
|
arc().seek(0);
|
||||||
|
return blargg_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
blargg_err_t Tar_Extractor::extract_v( void* p, int n )
|
||||||
|
{
|
||||||
|
return arc().read( p, n );
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
// Presents a gzipped file as an "archive" of just that file.
|
||||||
|
// Also handles non-gzipped files.
|
||||||
|
|
||||||
|
// File_Extractor 1.0.0
|
||||||
|
#ifndef TAR_EXTRACTOR_H
|
||||||
|
#define TAR_EXTRACTOR_H
|
||||||
|
|
||||||
|
#include "File_Extractor.h"
|
||||||
|
|
||||||
|
typedef struct posix_header
|
||||||
|
{ /* byte offset */
|
||||||
|
char name[100]; /* 0 */
|
||||||
|
char mode[8]; /* 100 */
|
||||||
|
char uid[8]; /* 108 */
|
||||||
|
char gid[8]; /* 116 */
|
||||||
|
char size[12]; /* 124 */
|
||||||
|
char mtime[12]; /* 136 */
|
||||||
|
char chksum[8]; /* 148 */
|
||||||
|
char typeflag; /* 156 */
|
||||||
|
char linkname[100]; /* 157 */
|
||||||
|
char magic[6]; /* 257 */
|
||||||
|
char version[2]; /* 263 */
|
||||||
|
char uname[32]; /* 265 */
|
||||||
|
char gname[32]; /* 297 */
|
||||||
|
char devmajor[8]; /* 329 */
|
||||||
|
char devminor[8]; /* 337 */
|
||||||
|
char prefix[155]; /* 345 */
|
||||||
|
char padding[12]; /* 500 */
|
||||||
|
/* 512 */
|
||||||
|
} posix_header;
|
||||||
|
|
||||||
|
#define BLOCKSIZE 512
|
||||||
|
|
||||||
|
#define TMAGIC "ustar" /* ustar and a null */
|
||||||
|
#define TMAGLEN 6
|
||||||
|
#define TVERSION "00" /* 00 and no null */
|
||||||
|
#define TVERSLEN 2
|
||||||
|
|
||||||
|
/* Values used in typeflag field. */
|
||||||
|
#define REGTYPE '0' /* regular file */
|
||||||
|
#define AREGTYPE '\0' /* regular file */
|
||||||
|
#define LNKTYPE '1' /* link */
|
||||||
|
#define SYMTYPE '2' /* reserved */
|
||||||
|
#define CHRTYPE '3' /* character special */
|
||||||
|
#define BLKTYPE '4' /* block special */
|
||||||
|
#define DIRTYPE '5' /* directory */
|
||||||
|
#define FIFOTYPE '6' /* FIFO special */
|
||||||
|
#define CONTTYPE '7' /* reserved */
|
||||||
|
|
||||||
|
class Tar_Extractor : public File_Extractor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Tar_Extractor();
|
||||||
|
virtual ~Tar_Extractor();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual blargg_err_t open_path_v();
|
||||||
|
virtual blargg_err_t open_v();
|
||||||
|
virtual void close_v();
|
||||||
|
|
||||||
|
virtual blargg_err_t next_v();
|
||||||
|
virtual blargg_err_t rewind_v();
|
||||||
|
|
||||||
|
virtual blargg_err_t stat_v();
|
||||||
|
virtual blargg_err_t extract_v(void *, int);
|
||||||
|
|
||||||
|
private:
|
||||||
|
File_Reader *gr;
|
||||||
|
posix_header header;
|
||||||
|
unsigned int tarsize;
|
||||||
|
blargg_vector<char> name;
|
||||||
|
|
||||||
|
void set_info_();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -33,7 +33,7 @@
|
||||||
#define FEX_TYPE_LZMA
|
#define FEX_TYPE_LZMA
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FEX_TYPE_LIST fex_7z_type, fex_gz_type, fex_zip_type, fex_rar_type, FEX_TYPE_BZ2 FEX_TYPE_LZMA
|
#define FEX_TYPE_LIST fex_7z_type, fex_gz_type, fex_zip_type, fex_tar_type, fex_rar_type, FEX_TYPE_BZ2 FEX_TYPE_LZMA
|
||||||
|
|
||||||
// Use standard config.h if present
|
// Use standard config.h if present
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
|
|
|
@ -33,6 +33,7 @@ BLARGG_EXPORT const fex_type_t* fex_type_list( void )
|
||||||
// Modify blargg_config.h to change type list, NOT this file
|
// Modify blargg_config.h to change type list, NOT this file
|
||||||
fex_7z_type,
|
fex_7z_type,
|
||||||
fex_gz_type,
|
fex_gz_type,
|
||||||
|
fex_tar_type,
|
||||||
#if FEX_ENABLE_LZMA
|
#if FEX_ENABLE_LZMA
|
||||||
fex_xz_type,
|
fex_xz_type,
|
||||||
fex_lz_type,
|
fex_lz_type,
|
||||||
|
@ -148,6 +149,7 @@ static int is_archive_extension( const char str [] )
|
||||||
".rar",
|
".rar",
|
||||||
".sit",
|
".sit",
|
||||||
".sitx",
|
".sitx",
|
||||||
|
".tar",
|
||||||
".tgz",
|
".tgz",
|
||||||
".tlz",
|
".tlz",
|
||||||
".z",
|
".z",
|
||||||
|
|
|
@ -145,7 +145,7 @@ EVT_HANDLER(wxID_OPEN, "Open ROM...")
|
||||||
"*.dmg.bz2;*.gb.bz2;*.gbc.bz2;*.cgb.bz2;*.sgb.bz2;"
|
"*.dmg.bz2;*.gb.bz2;*.gbc.bz2;*.cgb.bz2;*.sgb.bz2;"
|
||||||
"*.dmg.gz;*.gb.gz;*.gbc.gz;*.cgb.gz;*.sgb.gz;"
|
"*.dmg.gz;*.gb.gz;*.gbc.gz;*.cgb.gz;*.sgb.gz;"
|
||||||
"*.dmg.z;*.gb.z;*.gbc.z;*.cgb.z;*.sgb.z;"
|
"*.dmg.z;*.gb.z;*.gbc.z;*.cgb.z;*.sgb.z;"
|
||||||
"*.zip;*.7z;*.rar|");
|
"*.tar;*.zip;*.7z;*.rar|");
|
||||||
pats.append(wxALL_FILES);
|
pats.append(wxALL_FILES);
|
||||||
|
|
||||||
wxFileDialog dlg(this, _("Open ROM file"), gba_rom_dir, "",
|
wxFileDialog dlg(this, _("Open ROM file"), gba_rom_dir, "",
|
||||||
|
@ -179,7 +179,7 @@ EVT_HANDLER(OpenGB, "Open GB...")
|
||||||
"*.dmg.bz2;*.gb.bz2;*.gbc.bz2;*.cgb.bz2;*.sgb.bz2;"
|
"*.dmg.bz2;*.gb.bz2;*.gbc.bz2;*.cgb.bz2;*.sgb.bz2;"
|
||||||
"*.dmg.gz;*.gb.gz;*.gbc.gz;*.cgb.gz;*.sgb.gz;"
|
"*.dmg.gz;*.gb.gz;*.gbc.gz;*.cgb.gz;*.sgb.gz;"
|
||||||
"*.dmg.z;*.gb.z;*.gbc.z;*.cgb.z;*.sgb.z;"
|
"*.dmg.z;*.gb.z;*.gbc.z;*.cgb.z;*.sgb.z;"
|
||||||
"*.zip;*.7z;*.rar|");
|
"*.tar;*.zip;*.7z;*.rar|");
|
||||||
pats.append(wxALL_FILES);
|
pats.append(wxALL_FILES);
|
||||||
wxFileDialog dlg(this, _("Open GB ROM file"), gb_rom_dir, "",
|
wxFileDialog dlg(this, _("Open GB ROM file"), gb_rom_dir, "",
|
||||||
pats,
|
pats,
|
||||||
|
@ -211,7 +211,7 @@ EVT_HANDLER(OpenGBC, "Open GBC...")
|
||||||
"*.dmg.bz2;*.gb.bz2;*.gbc.bz2;*.cgb.bz2;*.sgb.bz2;"
|
"*.dmg.bz2;*.gb.bz2;*.gbc.bz2;*.cgb.bz2;*.sgb.bz2;"
|
||||||
"*.dmg.gz;*.gb.gz;*.gbc.gz;*.cgb.gz;*.sgb.gz;"
|
"*.dmg.gz;*.gb.gz;*.gbc.gz;*.cgb.gz;*.sgb.gz;"
|
||||||
"*.dmg.z;*.gb.z;*.gbc.z;*.cgb.z;*.sgb.z;"
|
"*.dmg.z;*.gb.z;*.gbc.z;*.cgb.z;*.sgb.z;"
|
||||||
"*.zip;*.7z;*.rar|");
|
"*.tar;*.zip;*.7z;*.rar|");
|
||||||
pats.append(wxALL_FILES);
|
pats.append(wxALL_FILES);
|
||||||
wxFileDialog dlg(this, _("Open GBC ROM file"), gbc_rom_dir, "",
|
wxFileDialog dlg(this, _("Open GBC ROM file"), gbc_rom_dir, "",
|
||||||
pats,
|
pats,
|
||||||
|
|
Loading…
Reference in New Issue