Turn core_file into a proper class that gets cleaned up safely using unique_ptr

Subverted somewhat by chd_file class
This commit is contained in:
Vas Crabb 2016-03-06 18:02:37 +11:00
parent 00941faaab
commit 73b44c9429
68 changed files with 1751 additions and 1590 deletions

View File

@ -537,7 +537,7 @@ std::string a78_cart_slot_device::get_default_card_software()
int type = A78_TYPE0, mapper; int type = A78_TYPE0, mapper;
// Load and check the header // Load and check the header
core_fread(m_file, &head[0], 128); m_file->read(&head[0], 128);
// let's try to auto-fix some common errors in the header // let's try to auto-fix some common errors in the header
mapper = validate_header((head[53] << 8) | head[54], FALSE); mapper = validate_header((head[53] << 8) | head[54], FALSE);
@ -558,7 +558,7 @@ std::string a78_cart_slot_device::get_default_card_software()
break; break;
case 0x0022: case 0x0022:
case 0x0026: case 0x0026:
if (core_fsize(m_file) > 0x40000) if (m_file->size() > 0x40000)
type = A78_MEGACART; type = A78_MEGACART;
else else
type = A78_VERSABOARD; type = A78_VERSABOARD;

View File

@ -412,13 +412,13 @@ std::string a800_cart_slot_device::get_default_card_software()
{ {
const char *slot_string; const char *slot_string;
dynamic_buffer head(0x10); dynamic_buffer head(0x10);
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
int type = A800_8K; int type = A800_8K;
// check whether there is an header, to identify the cart type // check whether there is an header, to identify the cart type
if ((len % 0x1000) == 0x10) if ((len % 0x1000) == 0x10)
{ {
core_fread(m_file, &head[0], 0x10); m_file->read(&head[0], 0x10);
type = identify_cart_type(&head[0]); type = identify_cart_type(&head[0]);
} }
else // otherwise try to guess based on size else // otherwise try to guess based on size
@ -449,13 +449,13 @@ std::string a5200_cart_slot_device::get_default_card_software()
{ {
const char *slot_string; const char *slot_string;
dynamic_buffer head(0x10); dynamic_buffer head(0x10);
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
int type = A5200_8K; int type = A5200_8K;
// check whether there is an header, to identify the cart type // check whether there is an header, to identify the cart type
if ((len % 0x1000) == 0x10) if ((len % 0x1000) == 0x10)
{ {
core_fread(m_file, &head[0], 0x10); m_file->read(&head[0], 0x10);
type = identify_cart_type(&head[0]); type = identify_cart_type(&head[0]);
std::string info; std::string info;
@ -482,13 +482,13 @@ std::string xegs_cart_slot_device::get_default_card_software()
{ {
const char *slot_string; const char *slot_string;
dynamic_buffer head(0x10); dynamic_buffer head(0x10);
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
int type = A800_8K; int type = A800_8K;
// check whether there is an header, to identify the cart type // check whether there is an header, to identify the cart type
if ((len % 0x1000) == 0x10) if ((len % 0x1000) == 0x10)
{ {
core_fread(m_file, &head[0], 0x10); m_file->read(&head[0], 0x10);
type = identify_cart_type(&head[0]); type = identify_cart_type(&head[0]);
} }
if (type != A800_XEGS) if (type != A800_XEGS)

View File

@ -226,7 +226,7 @@ std::string apf_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 size = core_fsize(m_file); UINT32 size = m_file->size();
int type = APF_STD; int type = APF_STD;
// attempt to identify Space Destroyer, which needs 1K of additional RAM // attempt to identify Space Destroyer, which needs 1K of additional RAM

View File

@ -203,7 +203,7 @@ std::string astrocade_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 size = core_fsize(m_file); UINT32 size = m_file->size();
int type = ASTROCADE_STD; int type = ASTROCADE_STD;
if (size == 0x40000) if (size == 0x40000)

View File

@ -153,7 +153,7 @@ bool c64_expansion_slot_device::call_load()
int exrom = 1; int exrom = 1;
int game = 1; int game = 1;
if (cbm_crt_read_header(m_file, &roml_size, &romh_size, &exrom, &game)) if (cbm_crt_read_header(*m_file, &roml_size, &romh_size, &exrom, &game))
{ {
UINT8 *roml = nullptr; UINT8 *roml = nullptr;
UINT8 *romh = nullptr; UINT8 *romh = nullptr;
@ -164,7 +164,7 @@ bool c64_expansion_slot_device::call_load()
if (roml_size) roml = m_card->m_roml; if (roml_size) roml = m_card->m_roml;
if (romh_size) romh = m_card->m_roml; if (romh_size) romh = m_card->m_roml;
cbm_crt_read_data(m_file, roml, romh); cbm_crt_read_data(*m_file, roml, romh);
} }
m_card->m_exrom = exrom; m_card->m_exrom = exrom;
@ -222,7 +222,7 @@ std::string c64_expansion_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
if (!core_stricmp(filetype(), "crt")) if (!core_stricmp(filetype(), "crt"))
return cbm_crt_get_card(m_file); return cbm_crt_get_card(*m_file);
clear(); clear();
} }

View File

@ -222,7 +222,7 @@ std::string channelf_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
int type; int type;
if (len == 0x40000) if (len == 0x40000)

View File

@ -116,7 +116,7 @@ std::string colecovision_cartridge_slot_device::get_default_card_software()
{ {
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
UINT32 length = core_fsize(m_file); UINT32 length = m_file->size();
if (length == 0x100000 || length == 0x200000) if (length == 0x100000 || length == 0x200000)
return software_get_default_slot("xin1"); return software_get_default_slot("xin1");
} }

View File

@ -234,7 +234,7 @@ std::string crvision_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 size = core_fsize(m_file); UINT32 size = m_file->size();
int type = CRV_4K; int type = CRV_4K;
switch (size) switch (size)

View File

@ -605,11 +605,11 @@ std::string base_gb_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file), offset = 0; UINT32 len = m_file->size(), offset = 0;
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type; int type;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
if ((len % 0x4000) == 512) if ((len % 0x4000) == 512)
offset = 512; offset = 512;

View File

@ -405,11 +405,11 @@ std::string gba_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type; int type;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
type = get_cart_type(&rom[0], len); type = get_cart_type(&rom[0], len);
slot_string = gba_get_slot(type); slot_string = gba_get_slot(type);

View File

@ -464,11 +464,11 @@ std::string intv_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type = INTV_STD; int type = INTV_STD;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
if (rom[0] == 0xa8 && (rom[1] == (rom[2] ^ 0xff))) if (rom[0] == 0xa8 && (rom[1] == (rom[2] ^ 0xff)))
{ {

View File

@ -1370,7 +1370,7 @@ void omti_disk_image_device::device_start()
{ {
m_image = this; m_image = this;
if (m_image->image_core_file() == nullptr) if (!m_image->is_open())
{ {
LOG1(("device_start_omti_disk: no disk")); LOG1(("device_start_omti_disk: no disk"));
} }

View File

@ -344,7 +344,7 @@ void sc499_device::device_start()
m_installed = false; m_installed = false;
if (m_image->image_core_file() == nullptr) if (!m_image->is_open())
{ {
LOG2(("start sc499: no cartridge tape")); LOG2(("start sc499: no cartridge tape"));
} }

View File

@ -905,11 +905,11 @@ std::string base_md_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file), offset = 0; UINT32 len = m_file->size(), offset = 0;
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type; int type;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
if (genesis_is_SMD(&rom[0x200], len - 0x200)) if (genesis_is_SMD(&rom[0x200], len - 0x200))
offset = 0x200; offset = 0x200;

View File

@ -283,7 +283,7 @@ std::string msx_slot_cartridge_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string = "nomapper"; const char *slot_string = "nomapper";
UINT32 length = core_fsize(m_file); UINT32 length = m_file->size();
dynamic_buffer rom(length); dynamic_buffer rom(length);
int type = NOMAPPER; int type = NOMAPPER;
@ -328,7 +328,7 @@ std::string msx_slot_cartridge_device::get_default_card_software()
if (type == NOMAPPER) if (type == NOMAPPER)
{ {
// Not identified through hashfile, try automatic detection // Not identified through hashfile, try automatic detection
core_fread(m_file, &rom[0], length); m_file->read(&rom[0], length);
type = get_cart_type(&rom[0], length); type = get_cart_type(&rom[0], length);
} }

View File

@ -147,11 +147,11 @@ std::string nes_aladdin_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string = "algn"; const char *slot_string = "algn";
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
UINT8 mapper; UINT8 mapper;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
mapper = (rom[6] & 0xf0) >> 4; mapper = (rom[6] & 0xf0) >> 4;
mapper |= rom[7] & 0xf0; mapper |= rom[7] & 0xf0;

View File

@ -917,10 +917,10 @@ std::string nes_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string = "nrom"; const char *slot_string = "nrom";
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
if ((rom[0] == 'N') && (rom[1] == 'E') && (rom[2] == 'S')) if ((rom[0] == 'N') && (rom[1] == 'E') && (rom[2] == 'S'))
slot_string = get_default_card_ines(&rom[0], len); slot_string = get_default_card_ines(&rom[0], len);

View File

@ -214,7 +214,7 @@ std::string o2_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 size = core_fsize(m_file); UINT32 size = m_file->size();
int type = O2_STD; int type = O2_STD;
if (size == 12288) if (size == 12288)

View File

@ -344,11 +344,11 @@ std::string pce_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type; int type;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
type = get_cart_type(&rom[0], len); type = get_cart_type(&rom[0], len);
slot_string = pce_get_slot(type); slot_string = pce_get_slot(type);

View File

@ -264,11 +264,11 @@ std::string scv_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type; int type;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
type = get_cart_type(&rom[0], len); type = get_cart_type(&rom[0], len);
slot_string = scv_get_slot(type); slot_string = scv_get_slot(type);

View File

@ -608,11 +608,11 @@ std::string sega8_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file), offset = 0; UINT32 len = m_file->size(), offset = 0;
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type; int type;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
if ((len % 0x4000) == 512) if ((len % 0x4000) == 512)
offset = 512; offset = 512;

View File

@ -1007,11 +1007,11 @@ std::string base_sns_cart_slot_device::get_default_card_software()
{ {
const char *slot_string; const char *slot_string;
UINT32 offset; UINT32 offset;
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type = 0, addon = 0; int type = 0, addon = 0;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
offset = snes_skip_header(&rom[0], len); offset = snes_skip_header(&rom[0], len);

View File

@ -240,7 +240,7 @@ std::string vc4000_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 size = core_fsize(m_file); UINT32 size = m_file->size();
int type = VC4000_STD; int type = VC4000_STD;
// attempt to identify the non-standard types // attempt to identify the non-standard types

4
src/devices/bus/vcs/vcs_slot.cpp Executable file → Normal file
View File

@ -786,11 +786,11 @@ std::string vcs_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 len = core_fsize(m_file); UINT32 len = m_file->size();
dynamic_buffer rom(len); dynamic_buffer rom(len);
int type; int type;
core_fread(m_file, &rom[0], len); m_file->read(&rom[0], len);
type = identify_cart_type(&rom[0], len); type = identify_cart_type(&rom[0], len);
slot_string = vcs_get_slot(type); slot_string = vcs_get_slot(type);

View File

@ -222,11 +222,11 @@ std::string vectrex_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 size = core_fsize(m_file); UINT32 size = m_file->size();
dynamic_buffer rom(size); dynamic_buffer rom(size);
int type = VECTREX_STD; int type = VECTREX_STD;
core_fread(m_file, &rom[0], size); m_file->read(&rom[0], size);
if (!memcmp(&rom[0x06], "SRAM", 4)) if (!memcmp(&rom[0x06], "SRAM", 4))
type = VECTREX_SRAM; type = VECTREX_SRAM;

View File

@ -139,7 +139,7 @@ bool vic10_expansion_slot_device::call_load()
int exrom = 1; int exrom = 1;
int game = 1; int game = 1;
if (cbm_crt_read_header(m_file, &roml_size, &romh_size, &exrom, &game)) if (cbm_crt_read_header(*m_file, &roml_size, &romh_size, &exrom, &game))
{ {
UINT8 *roml = nullptr; UINT8 *roml = nullptr;
UINT8 *romh = nullptr; UINT8 *romh = nullptr;
@ -150,7 +150,7 @@ bool vic10_expansion_slot_device::call_load()
if (roml_size) roml = m_card->m_lorom; if (roml_size) roml = m_card->m_lorom;
if (romh_size) romh = m_card->m_lorom; if (romh_size) romh = m_card->m_lorom;
cbm_crt_read_data(m_file, roml, romh); cbm_crt_read_data(*m_file, roml, romh);
} }
} }
} }
@ -187,7 +187,7 @@ std::string vic10_expansion_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
if (!core_stricmp(filetype(), "crt")) if (!core_stricmp(filetype(), "crt"))
return cbm_crt_get_card(m_file); return cbm_crt_get_card(*m_file);
clear(); clear();
} }

View File

@ -311,12 +311,12 @@ std::string ws_cart_slot_device::get_default_card_software()
if (open_image_file(mconfig().options())) if (open_image_file(mconfig().options()))
{ {
const char *slot_string; const char *slot_string;
UINT32 size = core_fsize(m_file); UINT32 size = m_file->size();
dynamic_buffer rom(size); dynamic_buffer rom(size);
int type; int type;
UINT32 nvram; UINT32 nvram;
core_fread(m_file, &rom[0], size); m_file->read(&rom[0], size);
// nvram size is not really used here, but we set it up nevertheless // nvram size is not really used here, but we set it up nevertheless
type = get_cart_type(&rom[0], size, nvram); type = get_cart_type(&rom[0], size, nvram);

View File

@ -109,7 +109,7 @@ bool cdrom_image_device::call_load()
if (software_entry() == nullptr) if (software_entry() == nullptr)
{ {
if (strstr(m_image_name.c_str(), ".chd") && is_loaded()) { if (strstr(m_image_name.c_str(), ".chd") && is_loaded()) {
err = m_self_chd.open( *image_core_file() ); /* CDs are never writeable */ err = m_self_chd.open( image_core_file() ); /* CDs are never writeable */
if ( err ) if ( err )
goto error; goto error;
chd = &m_self_chd; chd = &m_self_chd;

View File

@ -124,7 +124,7 @@ bool diablo_image_device::call_create(int create_format, option_resolution *crea
/* create the CHD file */ /* create the CHD file */
chd_codec_type compression[4] = { CHD_CODEC_NONE }; chd_codec_type compression[4] = { CHD_CODEC_NONE };
err = m_origchd.create(*image_core_file(), (UINT64)totalsectors * (UINT64)sectorsize, hunksize, sectorsize, compression); err = m_origchd.create(image_core_file(), (UINT64)totalsectors * (UINT64)sectorsize, hunksize, sectorsize, compression);
if (err != CHDERR_NONE) if (err != CHDERR_NONE)
goto error; goto error;
@ -219,14 +219,14 @@ int diablo_image_device::internal_load_dsk()
} }
else else
{ {
err = m_origchd.open(*image_core_file(), true); err = m_origchd.open(image_core_file(), true);
if (err == CHDERR_NONE) if (err == CHDERR_NONE)
{ {
m_chd = &m_origchd; m_chd = &m_origchd;
} }
else if (err == CHDERR_FILE_NOT_WRITEABLE) else if (err == CHDERR_FILE_NOT_WRITEABLE)
{ {
err = m_origchd.open(*image_core_file(), false); err = m_origchd.open(image_core_file(), false);
if (err == CHDERR_NONE) if (err == CHDERR_NONE)
{ {
err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd); err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd);

View File

@ -295,7 +295,7 @@ void floppy_image_device::commit_image()
io.procs = &image_ioprocs; io.procs = &image_ioprocs;
io.filler = 0xff; io.filler = 0xff;
file_error err = core_truncate(image_core_file(), 0); file_error err = image_core_file().truncate(0);
if (err != 0) if (err != 0)
popmessage("Error, unable to truncate image: %d", err); popmessage("Error, unable to truncate image: %d", err);
@ -362,7 +362,7 @@ void floppy_image_device::device_timer(emu_timer &timer, device_timer_id id, int
floppy_image_format_t *floppy_image_device::identify(std::string filename) floppy_image_format_t *floppy_image_device::identify(std::string filename)
{ {
core_file *fd; util::core_file::ptr fd;
std::string revised_path; std::string revised_path;
file_error err = zippath_fopen(filename.c_str(), OPEN_FLAG_READ, fd, revised_path); file_error err = zippath_fopen(filename.c_str(), OPEN_FLAG_READ, fd, revised_path);
@ -372,19 +372,20 @@ floppy_image_format_t *floppy_image_device::identify(std::string filename)
} }
io_generic io; io_generic io;
io.file = fd; io.file = fd.get();
io.procs = &corefile_ioprocs_noclose; io.procs = &corefile_ioprocs_noclose;
io.filler = 0xff; io.filler = 0xff;
int best = 0; int best = 0;
floppy_image_format_t *best_format = nullptr; floppy_image_format_t *best_format = nullptr;
for(floppy_image_format_t *format = fif_list; format; format = format->next) { for (floppy_image_format_t *format = fif_list; format; format = format->next)
{
int score = format->identify(&io, form_factor); int score = format->identify(&io, form_factor);
if(score > best) { if(score > best) {
best = score; best = score;
best_format = format; best_format = format;
} }
} }
core_fclose(fd); fd.reset();
return best_format; return best_format;
} }
@ -1001,11 +1002,11 @@ void ui_menu_control_floppy_image::hook_load(std::string filename, bool softlist
if(can_in_place) { if(can_in_place) {
file_error filerr; file_error filerr;
std::string tmp_path; std::string tmp_path;
core_file *tmp_file; util::core_file::ptr tmp_file;
/* attempt to open the file for writing but *without* create */ /* attempt to open the file for writing but *without* create */
filerr = zippath_fopen(filename.c_str(), OPEN_FLAG_READ | OPEN_FLAG_WRITE, tmp_file, tmp_path); filerr = zippath_fopen(filename.c_str(), OPEN_FLAG_READ | OPEN_FLAG_WRITE, tmp_file, tmp_path);
if(!filerr) if(!filerr)
core_fclose(tmp_file); tmp_file.reset();
else else
can_in_place = false; can_in_place = false;
} }

View File

@ -148,7 +148,7 @@ bool harddisk_image_device::call_create(int create_format, option_resolution *cr
/* create the CHD file */ /* create the CHD file */
chd_codec_type compression[4] = { CHD_CODEC_NONE }; chd_codec_type compression[4] = { CHD_CODEC_NONE };
err = m_origchd.create(*image_core_file(), (UINT64)totalsectors * (UINT64)sectorsize, hunksize, sectorsize, compression); err = m_origchd.create(image_core_file(), (UINT64)totalsectors * (UINT64)sectorsize, hunksize, sectorsize, compression);
if (err != CHDERR_NONE) if (err != CHDERR_NONE)
goto error; goto error;
@ -243,14 +243,14 @@ int harddisk_image_device::internal_load_hd()
} }
else else
{ {
err = m_origchd.open(*image_core_file(), true); err = m_origchd.open(image_core_file(), true);
if (err == CHDERR_NONE) if (err == CHDERR_NONE)
{ {
m_chd = &m_origchd; m_chd = &m_origchd;
} }
else if (err == CHDERR_FILE_NOT_WRITEABLE) else if (err == CHDERR_FILE_NOT_WRITEABLE)
{ {
err = m_origchd.open(*image_core_file(), false); err = m_origchd.open(image_core_file(), false);
if (err == CHDERR_NONE) if (err == CHDERR_NONE)
{ {
err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd); err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd);

View File

@ -77,7 +77,7 @@ void serflash_device::nvram_read(emu_file &file)
int size = m_length / FLASH_PAGE_SIZE; int size = m_length / FLASH_PAGE_SIZE;
if (file) if (file.is_open())
{ {
UINT32 page; UINT32 page;
file.read(&page, 4); file.read(&page, 4);

View File

@ -571,7 +571,7 @@ bool samples_device::read_flac_sample(emu_file &file, sample_t &sample)
file.seek(0, SEEK_SET); file.seek(0, SEEK_SET);
// create the FLAC decoder and fill in the sample data // create the FLAC decoder and fill in the sample data
flac_decoder decoder((core_file&) file); flac_decoder decoder((util::core_file &)file);
sample.frequency = decoder.sample_rate(); sample.frequency = decoder.sample_rate();
// error if more than 1 channel or not 16bpp // error if more than 1 channel or not 16bpp

View File

@ -1880,7 +1880,7 @@ void media_identifier::identify_file(const char *name)
// load the file and process if it opens and has a valid length // load the file and process if it opens and has a valid length
UINT32 length; UINT32 length;
void *data; void *data;
file_error filerr = core_fload(name, &data, &length); const file_error filerr = util::core_file::load(name, &data, length);
if (filerr == FILERR_NONE && length > 0) if (filerr == FILERR_NONE && length > 0)
{ {
identify_data(name, reinterpret_cast<UINT8 *>(data), length); identify_data(name, reinterpret_cast<UINT8 *>(data), length);

View File

@ -57,8 +57,8 @@ const image_device_type_info device_image_interface::m_device_info_array[] =
device_image_interface::device_image_interface(const machine_config &mconfig, device_t &device) device_image_interface::device_image_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "image"), : device_interface(device, "image"),
m_err(), m_err(),
m_file(nullptr), m_file(),
m_mame_file(nullptr), m_mame_file(),
m_software_info_ptr(nullptr), m_software_info_ptr(nullptr),
m_software_part_ptr(nullptr), m_software_part_ptr(nullptr),
m_supported(0), m_supported(0),
@ -611,12 +611,11 @@ bool device_image_interface::is_loaded()
image_error_t device_image_interface::load_image_by_path(UINT32 open_flags, const char *path) image_error_t device_image_interface::load_image_by_path(UINT32 open_flags, const char *path)
{ {
file_error filerr;
image_error_t err; image_error_t err;
std::string revised_path; std::string revised_path;
/* attempt to read the file */ /* attempt to read the file */
filerr = zippath_fopen(path, open_flags, m_file, revised_path); auto const filerr = zippath_fopen(path, open_flags, m_file, revised_path);
/* did the open succeed? */ /* did the open succeed? */
switch(filerr) switch(filerr)
@ -662,15 +661,13 @@ image_error_t device_image_interface::load_image_by_path(UINT32 open_flags, cons
int device_image_interface::reopen_for_write(const char *path) int device_image_interface::reopen_for_write(const char *path)
{ {
if(m_file) m_file.reset();
core_fclose(m_file);
file_error filerr;
image_error_t err; image_error_t err;
std::string revised_path; std::string revised_path;
/* attempt to open the file for writing*/ /* attempt to open the file for writing*/
filerr = zippath_fopen(path, OPEN_FLAG_READ|OPEN_FLAG_WRITE|OPEN_FLAG_CREATE, m_file, revised_path); auto const filerr = zippath_fopen(path, OPEN_FLAG_READ|OPEN_FLAG_WRITE|OPEN_FLAG_CREATE, m_file, revised_path);
/* did the open succeed? */ /* did the open succeed? */
switch(filerr) switch(filerr)
@ -876,10 +873,9 @@ bool device_image_interface::load_software(software_list_device &swlist, const c
warningcount += verify_length_and_hash(m_mame_file.get(),ROM_GETNAME(romp),ROM_GETLENGTH(romp),hash_collection(ROM_GETHASHDATA(romp))); warningcount += verify_length_and_hash(m_mame_file.get(),ROM_GETNAME(romp),ROM_GETLENGTH(romp),hash_collection(ROM_GETHASHDATA(romp)));
if (filerr == FILERR_NONE) if (filerr == FILERR_NONE)
{ filerr = util::core_file::open_proxy(*m_mame_file, m_file);
m_file = *m_mame_file; if (filerr == FILERR_NONE)
retVal = TRUE; retVal = TRUE;
}
break; // load first item for start break; // load first item for start
} }
@ -1118,17 +1114,8 @@ bool device_image_interface::create(const char *path, const image_device_format
void device_image_interface::clear() void device_image_interface::clear()
{ {
if (m_mame_file) m_mame_file.reset();
{ m_file.reset();
m_mame_file = nullptr;
m_file = nullptr;
} else {
if (m_file)
{
core_fclose(m_file);
m_file = nullptr;
}
}
m_image_name.clear(); m_image_name.clear();
m_readonly = false; m_readonly = false;

View File

@ -178,21 +178,22 @@ public:
const char *basename() { if (m_basename.empty()) return nullptr; else return m_basename.c_str(); } const char *basename() { if (m_basename.empty()) return nullptr; else return m_basename.c_str(); }
const char *basename_noext() { if (m_basename_noext.empty()) return nullptr; else return m_basename_noext.c_str(); } const char *basename_noext() { if (m_basename_noext.empty()) return nullptr; else return m_basename_noext.c_str(); }
const char *filetype() { if (m_filetype.empty()) return nullptr; else return m_filetype.c_str(); } const char *filetype() { if (m_filetype.empty()) return nullptr; else return m_filetype.c_str(); }
core_file *image_core_file() { return m_file; } bool is_open() const { return bool(m_file); }
UINT64 length() { check_for_file(); return core_fsize(m_file); } util::core_file &image_core_file() { return *m_file; }
UINT64 length() { check_for_file(); return m_file->size(); }
bool is_readonly() { return m_readonly; } bool is_readonly() { return m_readonly; }
bool has_been_created() { return m_created; } bool has_been_created() { return m_created; }
void make_readonly() { m_readonly = true; } void make_readonly() { m_readonly = true; }
UINT32 fread(void *buffer, UINT32 length) { check_for_file(); return core_fread(m_file, buffer, length); } UINT32 fread(void *buffer, UINT32 length) { check_for_file(); return m_file->read(buffer, length); }
UINT32 fread(optional_shared_ptr<UINT8> &ptr, UINT32 length) { ptr.allocate(length); return fread(ptr.target(), length); } UINT32 fread(optional_shared_ptr<UINT8> &ptr, UINT32 length) { ptr.allocate(length); return fread(ptr.target(), length); }
UINT32 fread(optional_shared_ptr<UINT8> &ptr, UINT32 length, offs_t offset) { ptr.allocate(length); return fread(ptr + offset, length - offset); } UINT32 fread(optional_shared_ptr<UINT8> &ptr, UINT32 length, offs_t offset) { ptr.allocate(length); return fread(ptr + offset, length - offset); }
UINT32 fwrite(const void *buffer, UINT32 length) { check_for_file(); return core_fwrite(m_file, buffer, length); } UINT32 fwrite(const void *buffer, UINT32 length) { check_for_file(); return m_file->write(buffer, length); }
int fseek(INT64 offset, int whence) { check_for_file(); return core_fseek(m_file, offset, whence); } int fseek(INT64 offset, int whence) { check_for_file(); return m_file->seek(offset, whence); }
UINT64 ftell() { check_for_file(); return core_ftell(m_file); } UINT64 ftell() { check_for_file(); return m_file->tell(); }
int fgetc() { char ch; if (fread(&ch, 1) != 1) ch = '\0'; return ch; } int fgetc() { char ch; if (fread(&ch, 1) != 1) ch = '\0'; return ch; }
char *fgets(char *buffer, UINT32 length) { check_for_file(); return core_fgets(buffer, length, m_file); } char *fgets(char *buffer, UINT32 length) { check_for_file(); return m_file->gets(buffer, length); }
int image_feof() { check_for_file(); return core_feof(m_file); } int image_feof() { check_for_file(); return m_file->eof(); }
void *ptr() {check_for_file(); return (void *) core_fbuffer(m_file); } void *ptr() {check_for_file(); return const_cast<void *>(m_file->buffer()); }
// configuration access // configuration access
void set_init_phase() { m_init_phase = TRUE; } void set_init_phase() { m_init_phase = TRUE; }
@ -250,7 +251,7 @@ protected:
void clear_error(); void clear_error();
void check_for_file() { assert_always(m_file != nullptr, "Illegal operation on unmounted image"); } void check_for_file() { assert_always(m_file, "Illegal operation on unmounted image"); }
void setup_working_directory(); void setup_working_directory();
bool try_change_working_directory(const char *subdir); bool try_change_working_directory(const char *subdir);
@ -274,7 +275,7 @@ protected:
std::string m_err_message; std::string m_err_message;
/* variables that are only non-zero when an image is mounted */ /* variables that are only non-zero when an image is mounted */
core_file *m_file; util::core_file::ptr m_file;
std::unique_ptr<emu_file> m_mame_file; std::unique_ptr<emu_file> m_mame_file;
std::string m_image_name; std::string m_image_name;
std::string m_basename; std::string m_basename;

View File

@ -571,7 +571,7 @@ bool emu_options::parse_one_ini(const char *basename, int priority, std::string
// parse the file // parse the file
osd_printf_verbose("Parsing %s.ini\n", basename); osd_printf_verbose("Parsing %s.ini\n", basename);
std::string error; std::string error;
bool result = parse_ini_file((core_file&)file, priority, OPTION_PRIORITY_DRIVER_INI, error); bool result = parse_ini_file((util::core_file&)file, priority, OPTION_PRIORITY_DRIVER_INI, error);
// append errors if requested // append errors if requested
if (!error.empty() && error_string) if (!error.empty() && error_string)

View File

@ -187,21 +187,11 @@ emu_file::~emu_file()
//------------------------------------------------- //-------------------------------------------------
// operator core_file - automatically convert // operator util::core_file - automatically
// ourselves to a core_file pointer // convert ourselves to a core_file reference
//------------------------------------------------- //-------------------------------------------------
emu_file::operator core_file *() emu_file::operator util::core_file &()
{
// load the ZIP file now if we haven't yet
if (compressed_file_ready())
return nullptr;
// return the core file
return m_file;
}
emu_file::operator core_file &()
{ {
// load the ZIP file now if we haven't yet // load the ZIP file now if we haven't yet
if (compressed_file_ready()) if (compressed_file_ready())
@ -251,12 +241,12 @@ hash_collection &emu_file::hashes(const char *types)
} }
// read the data if we can // read the data if we can
const UINT8 *filedata = (const UINT8 *)core_fbuffer(m_file); const UINT8 *filedata = (const UINT8 *)m_file->buffer();
if (filedata == nullptr) if (filedata == nullptr)
return m_hashes; return m_hashes;
// compute the hash // compute the hash
m_hashes.compute(filedata, core_fsize(m_file), needed.c_str()); m_hashes.compute(filedata, m_file->size(), needed.c_str());
return m_hashes; return m_hashes;
} }
@ -348,7 +338,7 @@ file_error emu_file::open_next()
while (m_iterator.next(m_fullpath, m_filename.c_str())) while (m_iterator.next(m_fullpath, m_filename.c_str()))
{ {
// attempt to open the file directly // attempt to open the file directly
filerr = core_fopen(m_fullpath.c_str(), m_openflags, &m_file); filerr = util::core_file::open(m_fullpath.c_str(), m_openflags, m_file);
if (filerr == FILERR_NONE) if (filerr == FILERR_NONE)
break; break;
@ -384,7 +374,7 @@ file_error emu_file::open_ram(const void *data, UINT32 length)
m_crc = 0; m_crc = 0;
// use the core_file's built-in RAM support // use the core_file's built-in RAM support
return core_fopen_ram(data, length, m_openflags, &m_file); return util::core_file::open_ram(data, length, m_openflags, m_file);
} }
@ -404,9 +394,7 @@ void emu_file::close()
zip_file_close(m_zipfile); zip_file_close(m_zipfile);
m_zipfile = nullptr; m_zipfile = nullptr;
if (m_file != nullptr) m_file.reset();
core_fclose(m_file);
m_file = nullptr;
m__7zdata.clear(); m__7zdata.clear();
m_zipdata.clear(); m_zipdata.clear();
@ -429,7 +417,7 @@ void emu_file::close()
file_error emu_file::compress(int level) file_error emu_file::compress(int level)
{ {
return core_fcompress(m_file, level); return m_file->compress(level);
} }
@ -461,8 +449,8 @@ int emu_file::seek(INT64 offset, int whence)
return 1; return 1;
// seek if we can // seek if we can
if (m_file != nullptr) if (m_file)
return core_fseek(m_file, offset, whence); return m_file->seek(offset, whence);
return 1; return 1;
} }
@ -479,8 +467,8 @@ UINT64 emu_file::tell()
return 0; return 0;
// tell if we can // tell if we can
if (m_file != nullptr) if (m_file)
return core_ftell(m_file); return m_file->tell();
return 0; return 0;
} }
@ -497,8 +485,8 @@ bool emu_file::eof()
return 0; return 0;
// return EOF if we can // return EOF if we can
if (m_file != nullptr) if (m_file)
return core_feof(m_file); return m_file->eof();
return 0; return 0;
} }
@ -518,8 +506,8 @@ UINT64 emu_file::size()
return m_ziplength; return m_ziplength;
// return length if we can // return length if we can
if (m_file != nullptr) if (m_file)
return core_fsize(m_file); return m_file->size();
return 0; return 0;
} }
@ -536,8 +524,8 @@ UINT32 emu_file::read(void *buffer, UINT32 length)
return 0; return 0;
// read the data if we can // read the data if we can
if (m_file != nullptr) if (m_file)
return core_fread(m_file, buffer, length); return m_file->read(buffer, length);
return 0; return 0;
} }
@ -554,8 +542,8 @@ int emu_file::getc()
return EOF; return EOF;
// read the data if we can // read the data if we can
if (m_file != nullptr) if (m_file)
return core_fgetc(m_file); return m_file->getc();
return EOF; return EOF;
} }
@ -572,8 +560,8 @@ int emu_file::ungetc(int c)
return 1; return 1;
// read the data if we can // read the data if we can
if (m_file != nullptr) if (m_file)
return core_ungetc(c, m_file); return m_file->ungetc(c);
return 1; return 1;
} }
@ -590,8 +578,8 @@ char *emu_file::gets(char *s, int n)
return nullptr; return nullptr;
// read the data if we can // read the data if we can
if (m_file != nullptr) if (m_file)
return core_fgets(s, n, m_file); return m_file->gets(s, n);
return nullptr; return nullptr;
} }
@ -604,8 +592,8 @@ char *emu_file::gets(char *s, int n)
UINT32 emu_file::write(const void *buffer, UINT32 length) UINT32 emu_file::write(const void *buffer, UINT32 length)
{ {
// write the data if we can // write the data if we can
if (m_file != nullptr) if (m_file)
return core_fwrite(m_file, buffer, length); return m_file->write(buffer, length);
return 0; return 0;
} }
@ -618,8 +606,8 @@ UINT32 emu_file::write(const void *buffer, UINT32 length)
int emu_file::puts(const char *s) int emu_file::puts(const char *s)
{ {
// write the data if we can // write the data if we can
if (m_file != nullptr) if (m_file)
return core_fputs(m_file, s); return m_file->puts(s);
return 0; return 0;
} }
@ -632,7 +620,7 @@ int emu_file::puts(const char *s)
int emu_file::vprintf(const char *fmt, va_list va) int emu_file::vprintf(const char *fmt, va_list va)
{ {
// write the data if we can // write the data if we can
return (m_file != nullptr) ? core_vfprintf(m_file, fmt, va) : 0; return (m_file) ? m_file->vprintf(fmt, va) : 0;
} }
@ -658,8 +646,8 @@ int CLIB_DECL emu_file::printf(const char *fmt, ...)
void emu_file::flush() void emu_file::flush()
{ {
// flush the buffers if we can // flush the buffers if we can
if (m_file != nullptr) if (m_file)
core_fflush(m_file); m_file->flush();
} }
@ -778,7 +766,7 @@ file_error emu_file::load_zipped_file()
} }
// convert to RAM file // convert to RAM file
file_error filerr = core_fopen_ram(&m_zipdata[0], m_zipdata.size(), m_openflags, &m_file); file_error filerr = util::core_file::open_ram(&m_zipdata[0], m_zipdata.size(), m_openflags, m_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
m_zipdata.clear(); m_zipdata.clear();
@ -907,7 +895,7 @@ file_error emu_file::load__7zped_file()
} }
// convert to RAM file // convert to RAM file
file_error filerr = core_fopen_ram(&m__7zdata[0], m__7zdata.size(), m_openflags, &m_file); file_error filerr = util::core_file::open_ram(&m__7zdata[0], m__7zdata.size(), m_openflags, m_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
m__7zdata.clear(); m__7zdata.clear();

View File

@ -90,9 +90,8 @@ public:
virtual ~emu_file(); virtual ~emu_file();
// getters // getters
operator core_file *(); operator util::core_file &();
operator core_file &(); bool is_open() const { return bool(m_file); }
bool is_open() const { return (m_file != nullptr); }
const char *filename() const { return m_filename.c_str(); } const char *filename() const { return m_filename.c_str(); }
const char *fullpath() const { return m_fullpath.c_str(); } const char *fullpath() const { return m_fullpath.c_str(); }
UINT32 openflags() const { return m_openflags; } UINT32 openflags() const { return m_openflags; }
@ -102,7 +101,7 @@ public:
// setters // setters
void remove_on_close() { m_remove_on_close = true; } void remove_on_close() { m_remove_on_close = true; }
void set_openflags(UINT32 openflags) { assert(m_file == nullptr); m_openflags = openflags; } void set_openflags(UINT32 openflags) { assert(!m_file); m_openflags = openflags; }
void set_restrict_to_mediapath(bool rtmp = true) { m_restrict_to_mediapath = rtmp; } void set_restrict_to_mediapath(bool rtmp = true) { m_restrict_to_mediapath = rtmp; }
// open/close // open/close
@ -157,9 +156,9 @@ private:
// internal state // internal state
std::string m_filename; // original filename provided std::string m_filename; // original filename provided
std::string m_fullpath; // full filename std::string m_fullpath; // full filename
core_file * m_file; // core file pointer util::core_file::ptr m_file; // core file pointer
path_iterator m_iterator; // iterator for paths path_iterator m_iterator; // iterator for paths
path_iterator m_mediapaths; // media-path iterator path_iterator m_mediapaths; // media-path iterator
UINT32 m_crc; // file's CRC UINT32 m_crc; // file's CRC
UINT32 m_openflags; // flags we used for the open UINT32 m_openflags; // flags we used for the open
hash_collection m_hashes; // collection of hashes hash_collection m_hashes; // collection of hashes

View File

@ -341,7 +341,7 @@ void save_main_option(running_machine &machine)
emu_file file(machine.options().ini_path(), OPEN_FLAG_READ); emu_file file(machine.options().ini_path(), OPEN_FLAG_READ);
if (file.open(emulator_info::get_configname(), ".ini") == FILERR_NONE) if (file.open(emulator_info::get_configname(), ".ini") == FILERR_NONE)
{ {
bool result = options.parse_ini_file((core_file&)file, OPTION_PRIORITY_MAME_INI, OPTION_PRIORITY_DRIVER_INI, error); bool result = options.parse_ini_file((util::core_file&)file, OPTION_PRIORITY_MAME_INI, OPTION_PRIORITY_DRIVER_INI, error);
if (!result) if (!result)
{ {
osd_printf_error(_("**Error loading %s.ini**"), emulator_info::get_configname()); osd_printf_error(_("**Error loading %s.ini**"), emulator_info::get_configname());

View File

@ -171,7 +171,7 @@ static void load_ui_options(running_machine &machine)
emu_file file(machine.options().ini_path(), OPEN_FLAG_READ); emu_file file(machine.options().ini_path(), OPEN_FLAG_READ);
if (file.open("ui.ini") == FILERR_NONE) if (file.open("ui.ini") == FILERR_NONE)
{ {
bool result = machine.ui().options().parse_ini_file((core_file&)file, OPTION_PRIORITY_MAME_INI, OPTION_PRIORITY_DRIVER_INI, error); bool result = machine.ui().options().parse_ini_file((util::core_file&)file, OPTION_PRIORITY_MAME_INI, OPTION_PRIORITY_DRIVER_INI, error);
if (!result) if (!result)
osd_printf_error("**Error loading ui.ini**"); osd_printf_error("**Error loading ui.ini**");
} }

View File

@ -122,11 +122,11 @@ static const char * CRT_C64_SLOT_NAMES[_CRT_C64_COUNT] =
// cbm_crt_get_card - get slot interface card // cbm_crt_get_card - get slot interface card
//------------------------------------------------- //-------------------------------------------------
std::string cbm_crt_get_card(core_file *file) std::string cbm_crt_get_card(util::core_file &file)
{ {
// read the header // read the header
cbm_crt_header header; cbm_crt_header header;
core_fread(file, &header, CRT_HEADER_LENGTH); file.read(&header, CRT_HEADER_LENGTH);
if (memcmp(header.signature, CRT_SIGNATURE, 16) == 0) if (memcmp(header.signature, CRT_SIGNATURE, 16) == 0)
{ {
@ -143,11 +143,11 @@ std::string cbm_crt_get_card(core_file *file)
// cbm_crt_read_header - read cartridge header // cbm_crt_read_header - read cartridge header
//------------------------------------------------- //-------------------------------------------------
bool cbm_crt_read_header(core_file* file, size_t *roml_size, size_t *romh_size, int *exrom, int *game) bool cbm_crt_read_header(util::core_file &file, size_t *roml_size, size_t *romh_size, int *exrom, int *game)
{ {
// read the header // read the header
cbm_crt_header header; cbm_crt_header header;
core_fread(file, &header, CRT_HEADER_LENGTH); file.read(&header, CRT_HEADER_LENGTH);
if (memcmp(header.signature, CRT_SIGNATURE, 16) != 0) if (memcmp(header.signature, CRT_SIGNATURE, 16) != 0)
return false; return false;
@ -166,10 +166,10 @@ bool cbm_crt_read_header(core_file* file, size_t *roml_size, size_t *romh_size,
} }
// determine ROM region lengths // determine ROM region lengths
while (!core_feof(file)) while (!file.eof())
{ {
cbm_crt_chip chip; cbm_crt_chip chip;
core_fread(file, &chip, CRT_CHIP_LENGTH); file.read(&chip, CRT_CHIP_LENGTH);
UINT16 address = pick_integer_be(chip.start_address, 0, 2); UINT16 address = pick_integer_be(chip.start_address, 0, 2);
UINT16 size = pick_integer_be(chip.image_size, 0, 2); UINT16 size = pick_integer_be(chip.image_size, 0, 2);
@ -190,7 +190,7 @@ bool cbm_crt_read_header(core_file* file, size_t *roml_size, size_t *romh_size,
default: osd_printf_verbose("Invalid CHIP loading address!\n"); break; default: osd_printf_verbose("Invalid CHIP loading address!\n"); break;
} }
core_fseek(file, size, SEEK_CUR); file.seek(size, SEEK_CUR);
} }
return true; return true;
@ -201,26 +201,26 @@ bool cbm_crt_read_header(core_file* file, size_t *roml_size, size_t *romh_size,
// cbm_crt_read_data - read cartridge data // cbm_crt_read_data - read cartridge data
//------------------------------------------------- //-------------------------------------------------
bool cbm_crt_read_data(core_file* file, UINT8 *roml, UINT8 *romh) bool cbm_crt_read_data(util::core_file &file, UINT8 *roml, UINT8 *romh)
{ {
UINT32 roml_offset = 0; UINT32 roml_offset = 0;
UINT32 romh_offset = 0; UINT32 romh_offset = 0;
core_fseek(file, CRT_HEADER_LENGTH, SEEK_SET); file.seek(CRT_HEADER_LENGTH, SEEK_SET);
while (!core_feof(file)) while (!file.eof())
{ {
cbm_crt_chip chip; cbm_crt_chip chip;
core_fread(file, &chip, CRT_CHIP_LENGTH); file.read(&chip, CRT_CHIP_LENGTH);
UINT16 address = pick_integer_be(chip.start_address, 0, 2); UINT16 address = pick_integer_be(chip.start_address, 0, 2);
UINT16 size = pick_integer_be(chip.image_size, 0, 2); UINT16 size = pick_integer_be(chip.image_size, 0, 2);
switch (address) switch (address)
{ {
case 0x8000: core_fread(file, roml + roml_offset, size); roml_offset += size; break; case 0x8000: file.read(roml + roml_offset, size); roml_offset += size; break;
case 0xa000: core_fread(file, romh + romh_offset, size); romh_offset += size; break; case 0xa000: file.read(romh + romh_offset, size); romh_offset += size; break;
case 0xe000: core_fread(file, romh + romh_offset, size); romh_offset += size; break; case 0xe000: file.read(romh + romh_offset, size); romh_offset += size; break;
} }
} }

View File

@ -135,9 +135,9 @@ struct cbm_crt_chip
// FUNCTION PROTOTYPES // FUNCTION PROTOTYPES
//************************************************************************** //**************************************************************************
std::string cbm_crt_get_card(core_file *file); std::string cbm_crt_get_card(util::core_file &file);
bool cbm_crt_read_header(core_file* file, size_t *roml_size, size_t *romh_size, int *exrom, int *game); bool cbm_crt_read_header(util::core_file &file, size_t *roml_size, size_t *romh_size, int *exrom, int *game);
bool cbm_crt_read_data(core_file* file, UINT8 *roml, UINT8 *romh); bool cbm_crt_read_data(util::core_file &file, UINT8 *roml, UINT8 *romh);
#endif #endif

View File

@ -68,34 +68,33 @@ const struct io_procs stdio_ioprocs_noclose =
static void corefile_closeproc(void *file) static void corefile_closeproc(void *file)
{ {
core_fclose((core_file*)file); delete (util::core_file*)file;
} }
static int corefile_seekproc(void *file, INT64 offset, int whence) static int corefile_seekproc(void *file, INT64 offset, int whence)
{ {
return core_fseek((core_file*)file, (long) offset, whence); return ((util::core_file*)file)->seek(offset, whence);
} }
static size_t corefile_readproc(void *file, void *buffer, size_t length) static size_t corefile_readproc(void *file, void *buffer, size_t length)
{ {
return core_fread((core_file*)file, buffer, length); return ((util::core_file*)file)->read(buffer, length);
} }
static size_t corefile_writeproc(void *file, const void *buffer, size_t length) static size_t corefile_writeproc(void *file, const void *buffer, size_t length)
{ {
return core_fwrite((core_file*)file, buffer, length); return ((util::core_file*)file)->write(buffer, length);
} }
static UINT64 corefile_filesizeproc(void *file) static UINT64 corefile_filesizeproc(void *file)
{ {
long l, sz; const auto l = ((util::core_file*)file)->tell();
l = core_ftell((core_file*)file); if (((util::core_file*)file)->seek(0, SEEK_END))
if (core_fseek((core_file*)file, 0, SEEK_END))
return (size_t) -1; return (size_t) -1;
sz = core_ftell((core_file*)file); const auto sz = ((util::core_file*)file)->tell();
if (core_fseek((core_file*)file, l, SEEK_SET)) if (((util::core_file*)file)->seek(l, SEEK_SET))
return (size_t) -1; return UINT64(-1);
return (size_t) sz; return UINT64(sz);
} }
const struct io_procs corefile_ioprocs = const struct io_procs corefile_ioprocs =

View File

@ -115,7 +115,7 @@ struct cdrom_file
/** @brief Information describing the track. */ /** @brief Information describing the track. */
chdcd_track_input_info track_info; /* track info */ chdcd_track_input_info track_info; /* track info */
/** @brief The fhandle[ CD maximum tracks]. */ /** @brief The fhandle[ CD maximum tracks]. */
core_file * fhandle[CD_MAX_TRACKS];/* file handle */ util::core_file::ptr fhandle[CD_MAX_TRACKS];/* file handle */
}; };
@ -244,7 +244,7 @@ cdrom_file *cdrom_open(const char *inputfile)
for (i = 0; i < file->cdtoc.numtrks; i++) for (i = 0; i < file->cdtoc.numtrks; i++)
{ {
file_error filerr = core_fopen(file->track_info.track[i].fname.c_str(), OPEN_FLAG_READ, &file->fhandle[i]); file_error filerr = util::core_file::open(file->track_info.track[i].fname.c_str(), OPEN_FLAG_READ, file->fhandle[i]);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
fprintf(stderr, "Unable to open file: %s\n", file->track_info.track[i].fname.c_str()); fprintf(stderr, "Unable to open file: %s\n", file->track_info.track[i].fname.c_str());
@ -418,7 +418,7 @@ void cdrom_close(cdrom_file *file)
{ {
for (int i = 0; i < file->cdtoc.numtrks; i++) for (int i = 0; i < file->cdtoc.numtrks; i++)
{ {
core_fclose(file->fhandle[i]); file->fhandle[i].reset();
} }
} }
@ -474,7 +474,7 @@ chd_error read_partial_sector(cdrom_file *file, void *dest, UINT32 lbasector, UI
else else
{ {
// else read from the appropriate file // else read from the appropriate file
core_file *srcfile = file->fhandle[tracknum]; util::core_file &srcfile = *file->fhandle[tracknum];
UINT64 sourcefileoffset = file->track_info.track[tracknum].offset; UINT64 sourcefileoffset = file->track_info.track[tracknum].offset;
int bytespersector = file->cdtoc.tracks[tracknum].datasize + file->cdtoc.tracks[tracknum].subsize; int bytespersector = file->cdtoc.tracks[tracknum].datasize + file->cdtoc.tracks[tracknum].subsize;
@ -483,8 +483,8 @@ chd_error read_partial_sector(cdrom_file *file, void *dest, UINT32 lbasector, UI
// printf("Reading sector %d from track %d at offset %lld\n", chdsector, tracknum, sourcefileoffset); // printf("Reading sector %d from track %d at offset %lld\n", chdsector, tracknum, sourcefileoffset);
core_fseek(srcfile, sourcefileoffset, SEEK_SET); srcfile.seek(sourcefileoffset, SEEK_SET);
core_fread(srcfile, dest, length); srcfile.read(dest, length);
needswap = file->track_info.track[tracknum].swap; needswap = file->track_info.track[tracknum].swap;
} }

View File

@ -190,8 +190,8 @@ inline void chd_file::file_read(UINT64 offset, void *dest, UINT32 length)
throw CHDERR_NOT_OPEN; throw CHDERR_NOT_OPEN;
// seek and read // seek and read
core_fseek(m_file, offset, SEEK_SET); m_file->seek(offset, SEEK_SET);
UINT32 count = core_fread(m_file, dest, length); UINT32 count = m_file->read(dest, length);
if (count != length) if (count != length)
throw CHDERR_READ_ERROR; throw CHDERR_READ_ERROR;
} }
@ -209,8 +209,8 @@ inline void chd_file::file_write(UINT64 offset, const void *source, UINT32 lengt
throw CHDERR_NOT_OPEN; throw CHDERR_NOT_OPEN;
// seek and write // seek and write
core_fseek(m_file, offset, SEEK_SET); m_file->seek(offset, SEEK_SET);
UINT32 count = core_fwrite(m_file, source, length); UINT32 count = m_file->write(source, length);
if (count != length) if (count != length)
throw CHDERR_WRITE_ERROR; throw CHDERR_WRITE_ERROR;
} }
@ -229,10 +229,10 @@ inline UINT64 chd_file::file_append(const void *source, UINT32 length, UINT32 al
throw CHDERR_NOT_OPEN; throw CHDERR_NOT_OPEN;
// seek to the end and align if necessary // seek to the end and align if necessary
core_fseek(m_file, 0, SEEK_END); m_file->seek(0, SEEK_END);
if (alignment != 0) if (alignment != 0)
{ {
UINT64 offset = core_ftell(m_file); UINT64 offset = m_file->tell();
UINT32 delta = offset % alignment; UINT32 delta = offset % alignment;
if (delta != 0) if (delta != 0)
{ {
@ -243,7 +243,7 @@ inline UINT64 chd_file::file_append(const void *source, UINT32 length, UINT32 al
while (delta != 0) while (delta != 0)
{ {
UINT32 bytes_to_write = MIN(sizeof(buffer), delta); UINT32 bytes_to_write = MIN(sizeof(buffer), delta);
UINT32 count = core_fwrite(m_file, buffer, bytes_to_write); UINT32 count = m_file->write(buffer, bytes_to_write);
if (count != bytes_to_write) if (count != bytes_to_write)
throw CHDERR_WRITE_ERROR; throw CHDERR_WRITE_ERROR;
delta -= bytes_to_write; delta -= bytes_to_write;
@ -252,8 +252,8 @@ inline UINT64 chd_file::file_append(const void *source, UINT32 length, UINT32 al
} }
// write the real data // write the real data
UINT64 offset = core_ftell(m_file); UINT64 offset = m_file->tell();
UINT32 count = core_fwrite(m_file, source, length); UINT32 count = m_file->write(source, length);
if (count != length) if (count != length)
throw CHDERR_READ_ERROR; throw CHDERR_READ_ERROR;
return offset; return offset;
@ -567,7 +567,7 @@ void chd_file::set_parent_sha1(sha1_t parent)
} }
/** /**
* @fn chd_error chd_file::create(core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4]) * @fn chd_error chd_file::create(util::core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4])
* *
* @brief ------------------------------------------------- * @brief -------------------------------------------------
* create - create a new file with no parent using an existing opened file handle * create - create a new file with no parent using an existing opened file handle
@ -582,7 +582,7 @@ void chd_file::set_parent_sha1(sha1_t parent)
* @return A chd_error. * @return A chd_error.
*/ */
chd_error chd_file::create(core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4]) chd_error chd_file::create(util::core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4])
{ {
// make sure we don't already have a file open // make sure we don't already have a file open
if (m_file != nullptr) if (m_file != nullptr)
@ -602,7 +602,7 @@ chd_error chd_file::create(core_file &file, UINT64 logicalbytes, UINT32 hunkbyte
} }
/** /**
* @fn chd_error chd_file::create(core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent) * @fn chd_error chd_file::create(util::core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent)
* *
* @brief ------------------------------------------------- * @brief -------------------------------------------------
* create - create a new file with a parent using an existing opened file handle * create - create a new file with a parent using an existing opened file handle
@ -617,7 +617,7 @@ chd_error chd_file::create(core_file &file, UINT64 logicalbytes, UINT32 hunkbyte
* @return A chd_error. * @return A chd_error.
*/ */
chd_error chd_file::create(core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent) chd_error chd_file::create(util::core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent)
{ {
// make sure we don't already have a file open // make sure we don't already have a file open
if (m_file != nullptr) if (m_file != nullptr)
@ -659,21 +659,25 @@ chd_error chd_file::create(const char *filename, UINT64 logicalbytes, UINT32 hun
return CHDERR_ALREADY_OPEN; return CHDERR_ALREADY_OPEN;
// create the new file // create the new file
core_file *file = nullptr; util::core_file::ptr file;
file_error filerr = core_fopen(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &file); const file_error filerr = util::core_file::open(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
return CHDERR_FILE_NOT_FOUND; return CHDERR_FILE_NOT_FOUND;
// create the file normally, then claim the file // create the file normally, then claim the file
chd_error chderr = create(*file, logicalbytes, hunkbytes, unitbytes, compression); const chd_error chderr = create(*file, logicalbytes, hunkbytes, unitbytes, compression);
m_owns_file = true; m_owns_file = true;
// if an error happened, close and delete the file // if an error happened, close and delete the file
if (chderr != CHDERR_NONE) if (chderr != CHDERR_NONE)
{ {
core_fclose(file); file.reset();
osd_rmfile(filename); osd_rmfile(filename);
} }
else
{
file.release();
}
return chderr; return chderr;
} }
@ -700,21 +704,25 @@ chd_error chd_file::create(const char *filename, UINT64 logicalbytes, UINT32 hun
return CHDERR_ALREADY_OPEN; return CHDERR_ALREADY_OPEN;
// create the new file // create the new file
core_file *file = nullptr; util::core_file::ptr file;
file_error filerr = core_fopen(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &file); const file_error filerr = util::core_file::open(filename, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
return CHDERR_FILE_NOT_FOUND; return CHDERR_FILE_NOT_FOUND;
// create the file normally, then claim the file // create the file normally, then claim the file
chd_error chderr = create(*file, logicalbytes, hunkbytes, compression, parent); const chd_error chderr = create(*file, logicalbytes, hunkbytes, compression, parent);
m_owns_file = true; m_owns_file = true;
// if an error happened, close and delete the file // if an error happened, close and delete the file
if (chderr != CHDERR_NONE) if (chderr != CHDERR_NONE)
{ {
core_fclose(file); file.reset();
osd_rmfile(filename); osd_rmfile(filename);
} }
else
{
file.release();
}
return chderr; return chderr;
} }
@ -739,27 +747,25 @@ chd_error chd_file::open(const char *filename, bool writeable, chd_file *parent)
return CHDERR_ALREADY_OPEN; return CHDERR_ALREADY_OPEN;
// open the file // open the file
UINT32 openflags = writeable ? (OPEN_FLAG_READ | OPEN_FLAG_WRITE) : OPEN_FLAG_READ; const UINT32 openflags = writeable ? (OPEN_FLAG_READ | OPEN_FLAG_WRITE) : OPEN_FLAG_READ;
core_file *file = nullptr; util::core_file::ptr file;
file_error filerr = core_fopen(filename, openflags, &file); const file_error filerr = util::core_file::open(filename, openflags, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
return CHDERR_FILE_NOT_FOUND; return CHDERR_FILE_NOT_FOUND;
// now open the CHD // now open the CHD
chd_error err = open(*file, writeable, parent); chd_error err = open(*file, writeable, parent);
if (err != CHDERR_NONE) if (err != CHDERR_NONE)
{
core_fclose(file);
return err; return err;
}
// we now own this file // we now own this file
file.release();
m_owns_file = true; m_owns_file = true;
return err; return err;
} }
/** /**
* @fn chd_error chd_file::open(core_file &file, bool writeable, chd_file *parent) * @fn chd_error chd_file::open(util::core_file &file, bool writeable, chd_file *parent)
* *
* @brief ------------------------------------------------- * @brief -------------------------------------------------
* open - open an existing file for read or read/write * open - open an existing file for read or read/write
@ -772,7 +778,7 @@ chd_error chd_file::open(const char *filename, bool writeable, chd_file *parent)
* @return A chd_error. * @return A chd_error.
*/ */
chd_error chd_file::open(core_file &file, bool writeable, chd_file *parent) chd_error chd_file::open(util::core_file &file, bool writeable, chd_file *parent)
{ {
// make sure we don't already have a file open // make sure we don't already have a file open
if (m_file != nullptr) if (m_file != nullptr)
@ -796,8 +802,8 @@ chd_error chd_file::open(core_file &file, bool writeable, chd_file *parent)
void chd_file::close() void chd_file::close()
{ {
// reset file characteristics // reset file characteristics
if (m_owns_file && m_file != nullptr) if (m_owns_file && m_file)
core_fclose(m_file); delete m_file;
m_file = nullptr; m_file = nullptr;
m_owns_file = false; m_owns_file = false;
m_allow_reads = false; m_allow_reads = false;

View File

@ -304,7 +304,7 @@ public:
virtual ~chd_file(); virtual ~chd_file();
// operators // operators
operator core_file *() { return m_file; } operator util::core_file &() { return *m_file; }
// getters // getters
bool opened() const { return (m_file != nullptr); } bool opened() const { return (m_file != nullptr); }
@ -328,13 +328,13 @@ public:
// file create // file create
chd_error create(const char *filename, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4]); chd_error create(const char *filename, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4]);
chd_error create(core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4]); chd_error create(util::core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 unitbytes, chd_codec_type compression[4]);
chd_error create(const char *filename, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent); chd_error create(const char *filename, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent);
chd_error create(core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent); chd_error create(util::core_file &file, UINT64 logicalbytes, UINT32 hunkbytes, chd_codec_type compression[4], chd_file &parent);
// file open // file open
chd_error open(const char *filename, bool writeable = false, chd_file *parent = nullptr); chd_error open(const char *filename, bool writeable = false, chd_file *parent = nullptr);
chd_error open(core_file &file, bool writeable = false, chd_file *parent = nullptr); chd_error open(util::core_file &file, bool writeable = false, chd_file *parent = nullptr);
// file close // file close
void close(); void close();
@ -401,7 +401,7 @@ private:
static int CLIB_DECL metadata_hash_compare(const void *elem1, const void *elem2); static int CLIB_DECL metadata_hash_compare(const void *elem1, const void *elem2);
// file characteristics // file characteristics
core_file * m_file; // handle to the open core file util::core_file * m_file; // handle to the open core file
bool m_owns_file; // flag indicating if this file should be closed on chd_close() bool m_owns_file; // flag indicating if this file should be closed on chd_close()
bool m_allow_reads; // permit reads from this CHD? bool m_allow_reads; // permit reads from this CHD?
bool m_allow_writes; // permit writes to this CHD? bool m_allow_writes; // permit writes to this CHD?

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders:Aaron Giles // copyright-holders:Aaron Giles, Vas Crabb
/*************************************************************************** /***************************************************************************
corefile.h corefile.h
@ -15,11 +15,15 @@
#include <stdarg.h> #include <stdarg.h>
#include "corestr.h" #include "corestr.h"
#include <string>
#include "coretmpl.h" #include "coretmpl.h"
#include <cstdint>
#include <memory>
#include <string>
namespace util {
/*************************************************************************** /***************************************************************************
ADDITIONAL OPEN FLAGS ADDITIONAL OPEN FLAGS
***************************************************************************/ ***************************************************************************/
@ -32,99 +36,105 @@
#define FCOMPRESS_MAX 9 /* maximum compression */ #define FCOMPRESS_MAX 9 /* maximum compression */
/*************************************************************************** /***************************************************************************
TYPE DEFINITIONS TYPE DEFINITIONS
***************************************************************************/ ***************************************************************************/
struct core_file; class core_file
{
public:
typedef std::unique_ptr<core_file> ptr;
// ----- file open/close -----
// open a file with the specified filename
static file_error open(const char *filename, std::uint32_t openflags, ptr &file);
// open a RAM-based "file" using the given data and length (read-only)
static file_error open_ram(const void *data, std::size_t length, std::uint32_t openflags, ptr &file);
// open a RAM-based "file" using the given data and length (read-only), copying the data
static file_error open_ram_copy(const void *data, std::size_t length, std::uint32_t openflags, ptr &file);
// open a proxy "file" that forwards requests to another file object
static file_error open_proxy(core_file &file, ptr &proxy);
// close an open file
virtual ~core_file();
// enable/disable streaming file compression via zlib; level is 0 to disable compression, or up to 9 for max compression
virtual file_error compress(int level) = 0;
// ----- file positioning -----
// adjust the file pointer within the file
virtual int seek(std::int64_t offset, int whence) = 0;
// return the current file pointer
virtual std::uint64_t tell() const = 0;
// return true if we are at the EOF
virtual bool eof() const = 0;
// return the total size of the file
virtual std::uint64_t size() const = 0;
// ----- file read -----
// standard binary read from a file
virtual std::uint32_t read(void *buffer, std::uint32_t length) = 0;
// read one character from the file
virtual int getc() = 0;
// put back one character from the file
virtual int ungetc(int c) = 0;
// read a full line of text from the file
virtual char *gets(char *s, int n) = 0;
// get a pointer to a buffer that holds the full file data in RAM
// this function may cause the full file data to be read
virtual const void *buffer() = 0;
// open a file with the specified filename, read it into memory, and return a pointer
static file_error load(const char *filename, void **data, std::uint32_t &length);
static file_error load(const char *filename, dynamic_buffer &data);
// ----- file write -----
// standard binary write to a file
virtual std::uint32_t write(const void *buffer, std::uint32_t length) = 0;
// write a line of text to the file
virtual int puts(const char *s) = 0;
// printf-style text write to a file
virtual int vprintf(const char *fmt, va_list va) = 0;
int CLIB_DECL printf(const char *fmt, ...) ATTR_PRINTF(2,3);
// file truncation
virtual file_error truncate(std::uint64_t offset) = 0;
// flush file buffers
virtual file_error flush() = 0;
protected:
core_file();
};
} // namespace util
/*************************************************************************** /***************************************************************************
FUNCTION PROTOTYPES FUNCTION PROTOTYPES
***************************************************************************/ ***************************************************************************/
/* ----- file open/close ----- */
/* open a file with the specified filename */
file_error core_fopen(const char *filename, UINT32 openflags, core_file **file);
/* open a RAM-based "file" using the given data and length (read-only) */
file_error core_fopen_ram(const void *data, size_t length, UINT32 openflags, core_file **file);
/* open a RAM-based "file" using the given data and length (read-only), copying the data */
file_error core_fopen_ram_copy(const void *data, size_t length, UINT32 openflags, core_file **file);
/* close an open file */
void core_fclose(core_file *file);
/* enable/disable streaming file compression via zlib; level is 0 to disable compression, or up to 9 for max compression */
file_error core_fcompress(core_file *file, int level);
/* ----- file positioning ----- */
/* adjust the file pointer within the file */
int core_fseek(core_file *file, INT64 offset, int whence);
/* return the current file pointer */
UINT64 core_ftell(core_file *file);
/* return true if we are at the EOF */
int core_feof(core_file *file);
/* return the total size of the file */
UINT64 core_fsize(core_file *file);
/* ----- file read ----- */
/* standard binary read from a file */
UINT32 core_fread(core_file *file, void *buffer, UINT32 length);
/* read one character from the file */
int core_fgetc(core_file *file);
/* put back one character from the file */
int core_ungetc(int c, core_file *file);
/* read a full line of text from the file */
char *core_fgets(char *s, int n, core_file *file);
/* get a pointer to a buffer that holds the full file data in RAM */
/* this function may cause the full file data to be read */
const void *core_fbuffer(core_file *file);
/* open a file with the specified filename, read it into memory, and return a pointer */
file_error core_fload(const char *filename, void **data, UINT32 *length);
file_error core_fload(const char *filename, dynamic_buffer &data);
/* ----- file write ----- */
/* standard binary write to a file */
UINT32 core_fwrite(core_file *file, const void *buffer, UINT32 length);
/* write a line of text to the file */
int core_fputs(core_file *f, const char *s);
/* printf-style text write to a file */
int core_vfprintf(core_file *f, const char *fmt, va_list va);
int CLIB_DECL core_fprintf(core_file *f, const char *fmt, ...) ATTR_PRINTF(2,3);
/* file truncation */
file_error core_truncate(core_file *f, UINT64 offset);
/* flush file buffers */
file_error core_fflush(core_file *f);
/* ----- filename utilities ----- */ /* ----- filename utilities ----- */
/* extract the base part of a filename (remove extensions and paths) */ /* extract the base part of a filename (remove extensions and paths) */

View File

@ -35,7 +35,7 @@ flac_encoder::flac_encoder(void *buffer, UINT32 buflength)
} }
flac_encoder::flac_encoder(core_file &file) flac_encoder::flac_encoder(util::core_file &file)
{ {
init_common(); init_common();
reset(file); reset(file);
@ -100,7 +100,7 @@ bool flac_encoder::reset(void *buffer, UINT32 buflength)
// reset - reset state with new file parameters // reset - reset state with new file parameters
//------------------------------------------------- //-------------------------------------------------
bool flac_encoder::reset(core_file &file) bool flac_encoder::reset(util::core_file &file)
{ {
// configure the output // configure the output
m_compressed_start = nullptr; m_compressed_start = nullptr;
@ -185,7 +185,7 @@ UINT32 flac_encoder::finish()
{ {
// process the data and return the amount written // process the data and return the amount written
FLAC__stream_encoder_finish(m_encoder); FLAC__stream_encoder_finish(m_encoder);
return (m_file != nullptr) ? core_ftell(m_file) : m_compressed_offset; return (m_file != nullptr) ? m_file->tell() : m_compressed_offset;
} }
@ -252,7 +252,7 @@ FLAC__StreamEncoderWriteStatus flac_encoder::write_callback(const FLAC__byte buf
{ {
int count = bytes - offset; int count = bytes - offset;
if (m_file != nullptr) if (m_file != nullptr)
core_fwrite(m_file, buffer, count); m_file->write(buffer, count);
else else
{ {
if (m_compressed_offset + count <= m_compressed_length) if (m_compressed_offset + count <= m_compressed_length)
@ -308,7 +308,7 @@ flac_decoder::flac_decoder(const void *buffer, UINT32 length, const void *buffer
// flac_decoder - constructor // flac_decoder - constructor
//------------------------------------------------- //-------------------------------------------------
flac_decoder::flac_decoder(core_file &file) flac_decoder::flac_decoder(util::core_file &file)
: m_decoder(FLAC__stream_decoder_new()), : m_decoder(FLAC__stream_decoder_new()),
m_file(&file), m_file(&file),
m_compressed_offset(0), m_compressed_offset(0),
@ -414,7 +414,7 @@ bool flac_decoder::reset(UINT32 sample_rate, UINT8 num_channels, UINT32 block_si
// reset - reset state with new file parameter // reset - reset state with new file parameter
//------------------------------------------------- //-------------------------------------------------
bool flac_decoder::reset(core_file &file) bool flac_decoder::reset(util::core_file &file)
{ {
m_file = &file; m_file = &file;
m_compressed_start = nullptr; m_compressed_start = nullptr;
@ -511,7 +511,7 @@ FLAC__StreamDecoderReadStatus flac_decoder::read_callback(FLAC__byte buffer[], s
// if a file, just read // if a file, just read
if (m_file != nullptr) if (m_file != nullptr)
*bytes = core_fread(m_file, buffer, expected); *bytes = m_file->read(buffer, expected);
// otherwise, copy from memory // otherwise, copy from memory
else else

View File

@ -35,7 +35,7 @@ public:
// construction/destruction // construction/destruction
flac_encoder(); flac_encoder();
flac_encoder(void *buffer, UINT32 buflength); flac_encoder(void *buffer, UINT32 buflength);
flac_encoder(core_file &file); flac_encoder(util::core_file &file);
~flac_encoder(); ~flac_encoder();
// configuration // configuration
@ -51,7 +51,7 @@ public:
// reset // reset
bool reset(); bool reset();
bool reset(void *buffer, UINT32 buflength); bool reset(void *buffer, UINT32 buflength);
bool reset(core_file &file); bool reset(util::core_file &file);
// encode a buffer // encode a buffer
bool encode_interleaved(const INT16 *samples, UINT32 samples_per_channel, bool swap_endian = false); bool encode_interleaved(const INT16 *samples, UINT32 samples_per_channel, bool swap_endian = false);
@ -68,7 +68,7 @@ private:
// internal state // internal state
FLAC__StreamEncoder * m_encoder; // actual encoder FLAC__StreamEncoder * m_encoder; // actual encoder
core_file * m_file; // output file util::core_file * m_file; // output file
UINT32 m_compressed_offset; // current offset with the compressed stream UINT32 m_compressed_offset; // current offset with the compressed stream
FLAC__byte * m_compressed_start; // start of compressed data FLAC__byte * m_compressed_start; // start of compressed data
UINT32 m_compressed_length; // length of the compressed stream UINT32 m_compressed_length; // length of the compressed stream
@ -93,7 +93,7 @@ public:
// construction/destruction // construction/destruction
flac_decoder(); flac_decoder();
flac_decoder(const void *buffer, UINT32 length, const void *buffer2 = nullptr, UINT32 length2 = 0); flac_decoder(const void *buffer, UINT32 length, const void *buffer2 = nullptr, UINT32 length2 = 0);
flac_decoder(core_file &file); flac_decoder(util::core_file &file);
~flac_decoder(); ~flac_decoder();
// getters (valid after reset) // getters (valid after reset)
@ -108,7 +108,7 @@ public:
bool reset(); bool reset();
bool reset(const void *buffer, UINT32 length, const void *buffer2 = nullptr, UINT32 length2 = 0); bool reset(const void *buffer, UINT32 length, const void *buffer2 = nullptr, UINT32 length2 = 0);
bool reset(UINT32 sample_rate, UINT8 num_channels, UINT32 block_size, const void *buffer, UINT32 length); bool reset(UINT32 sample_rate, UINT8 num_channels, UINT32 block_size, const void *buffer, UINT32 length);
bool reset(core_file &file); bool reset(util::core_file &file);
// decode to a buffer; num_samples must be a multiple of the block size // decode to a buffer; num_samples must be a multiple of the block size
bool decode_interleaved(INT16 *samples, UINT32 num_samples, bool swap_endian = false); bool decode_interleaved(INT16 *samples, UINT32 num_samples, bool swap_endian = false);
@ -129,7 +129,7 @@ private:
// output state // output state
FLAC__StreamDecoder * m_decoder; // actual encoder FLAC__StreamDecoder * m_decoder; // actual encoder
core_file * m_file; // output file util::core_file * m_file; // output file
UINT32 m_sample_rate; // decoded sample rate UINT32 m_sample_rate; // decoded sample rate
UINT8 m_channels; // decoded number of channels UINT8 m_channels; // decoded number of channels
UINT8 m_bits_per_sample; // decoded bits per sample UINT8 m_bits_per_sample; // decoded bits per sample

View File

@ -400,11 +400,11 @@ bool core_options::parse_command_line(int argc, char **argv, int priority, std::
// an INI file // an INI file
//------------------------------------------------- //-------------------------------------------------
bool core_options::parse_ini_file(core_file &inifile, int priority, int ignore_priority, std::string &error_string) bool core_options::parse_ini_file(util::core_file &inifile, int priority, int ignore_priority, std::string &error_string)
{ {
// loop over lines in the file // loop over lines in the file
char buffer[4096]; char buffer[4096];
while (core_fgets(buffer, ARRAY_LENGTH(buffer), &inifile) != nullptr) while (inifile.gets(buffer, ARRAY_LENGTH(buffer)) != nullptr)
{ {
// find the extent of the name // find the extent of the name
char *optionname; char *optionname;

View File

@ -142,7 +142,7 @@ public:
// parsing/input // parsing/input
bool parse_command_line(int argc, char **argv, int priority, std::string &error_string); bool parse_command_line(int argc, char **argv, int priority, std::string &error_string);
bool parse_ini_file(core_file &inifile, int priority, int ignore_priority, std::string &error_string); bool parse_ini_file(util::core_file &inifile, int priority, int ignore_priority, std::string &error_string);
// reverting // reverting
void revert(int priority = OPTION_PRIORITY_MAXIMUM); void revert(int priority = OPTION_PRIORITY_MAXIMUM);

View File

@ -148,12 +148,12 @@ void png_free(png_info *pnginfo)
header at the current file location header at the current file location
-------------------------------------------------*/ -------------------------------------------------*/
static png_error verify_header(core_file *fp) static png_error verify_header(util::core_file &fp)
{ {
UINT8 signature[8]; UINT8 signature[8];
/* read 8 bytes */ /* read 8 bytes */
if (core_fread(fp, signature, 8) != 8) if (fp.read(signature, 8) != 8)
return PNGERR_FILE_TRUNCATED; return PNGERR_FILE_TRUNCATED;
/* return an error if we don't match */ /* return an error if we don't match */
@ -168,18 +168,18 @@ static png_error verify_header(core_file *fp)
read_chunk - read the next PNG chunk read_chunk - read the next PNG chunk
-------------------------------------------------*/ -------------------------------------------------*/
static png_error read_chunk(core_file *fp, UINT8 **data, UINT32 *type, UINT32 *length) static png_error read_chunk(util::core_file &fp, UINT8 **data, UINT32 *type, UINT32 *length)
{ {
UINT32 crc, chunk_crc; UINT32 crc, chunk_crc;
UINT8 tempbuff[4]; UINT8 tempbuff[4];
/* fetch the length of this chunk */ /* fetch the length of this chunk */
if (core_fread(fp, tempbuff, 4) != 4) if (fp.read(tempbuff, 4) != 4)
return PNGERR_FILE_TRUNCATED; return PNGERR_FILE_TRUNCATED;
*length = fetch_32bit(tempbuff); *length = fetch_32bit(tempbuff);
/* fetch the type of this chunk */ /* fetch the type of this chunk */
if (core_fread(fp, tempbuff, 4) != 4) if (fp.read(tempbuff, 4) != 4)
return PNGERR_FILE_TRUNCATED; return PNGERR_FILE_TRUNCATED;
*type = fetch_32bit(tempbuff); *type = fetch_32bit(tempbuff);
@ -200,7 +200,7 @@ static png_error read_chunk(core_file *fp, UINT8 **data, UINT32 *type, UINT32 *l
return PNGERR_OUT_OF_MEMORY; return PNGERR_OUT_OF_MEMORY;
/* read the data from the file */ /* read the data from the file */
if (core_fread(fp, *data, *length) != *length) if (fp.read(*data, *length) != *length)
{ {
free(*data); free(*data);
*data = nullptr; *data = nullptr;
@ -212,7 +212,7 @@ static png_error read_chunk(core_file *fp, UINT8 **data, UINT32 *type, UINT32 *l
} }
/* read the CRC */ /* read the CRC */
if (core_fread(fp, tempbuff, 4) != 4) if (fp.read(tempbuff, 4) != 4)
{ {
free(*data); free(*data);
*data = nullptr; *data = nullptr;
@ -502,7 +502,7 @@ handle_error:
png_read_file - read a PNG from a core stream png_read_file - read a PNG from a core stream
-------------------------------------------------*/ -------------------------------------------------*/
png_error png_read_file(core_file *fp, png_info *pnginfo) png_error png_read_file(util::core_file &fp, png_info *pnginfo)
{ {
UINT8 *chunk_data = nullptr; UINT8 *chunk_data = nullptr;
png_private png; png_private png;
@ -579,7 +579,7 @@ handle_error:
bitmap bitmap
-------------------------------------------------*/ -------------------------------------------------*/
png_error png_read_bitmap(core_file *fp, bitmap_argb32 &bitmap) png_error png_read_bitmap(util::core_file &fp, bitmap_argb32 &bitmap)
{ {
png_error result; png_error result;
png_info png; png_info png;
@ -747,7 +747,7 @@ png_error png_add_text(png_info *pnginfo, const char *keyword, const char *text)
the given file the given file
-------------------------------------------------*/ -------------------------------------------------*/
static png_error write_chunk(core_file *fp, const UINT8 *data, UINT32 type, UINT32 length) static png_error write_chunk(util::core_file &fp, const UINT8 *data, UINT32 type, UINT32 length)
{ {
UINT8 tempbuff[8]; UINT8 tempbuff[8];
UINT32 crc; UINT32 crc;
@ -758,20 +758,20 @@ static png_error write_chunk(core_file *fp, const UINT8 *data, UINT32 type, UINT
crc = crc32(0, tempbuff + 4, 4); crc = crc32(0, tempbuff + 4, 4);
/* write that data */ /* write that data */
if (core_fwrite(fp, tempbuff, 8) != 8) if (fp.write(tempbuff, 8) != 8)
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
/* append the actual data */ /* append the actual data */
if (length > 0) if (length > 0)
{ {
if (core_fwrite(fp, data, length) != length) if (fp.write(data, length) != length)
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
crc = crc32(crc, data, length); crc = crc32(crc, data, length);
} }
/* write the CRC */ /* write the CRC */
put_32bit(tempbuff, crc); put_32bit(tempbuff, crc);
if (core_fwrite(fp, tempbuff, 4) != 4) if (fp.write(tempbuff, 4) != 4)
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
return PNGERR_NONE; return PNGERR_NONE;
@ -783,9 +783,9 @@ static png_error write_chunk(core_file *fp, const UINT8 *data, UINT32 type, UINT
chunk to the given file by deflating it chunk to the given file by deflating it
-------------------------------------------------*/ -------------------------------------------------*/
static png_error write_deflated_chunk(core_file *fp, UINT8 *data, UINT32 type, UINT32 length) static png_error write_deflated_chunk(util::core_file &fp, UINT8 *data, UINT32 type, UINT32 length)
{ {
UINT64 lengthpos = core_ftell(fp); UINT64 lengthpos = fp.tell();
UINT8 tempbuff[8192]; UINT8 tempbuff[8192];
UINT32 zlength = 0; UINT32 zlength = 0;
z_stream stream; z_stream stream;
@ -798,7 +798,7 @@ static png_error write_deflated_chunk(core_file *fp, UINT8 *data, UINT32 type, U
crc = crc32(0, tempbuff + 4, 4); crc = crc32(0, tempbuff + 4, 4);
/* write that data */ /* write that data */
if (core_fwrite(fp, tempbuff, 8) != 8) if (fp.write(tempbuff, 8) != 8)
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
/* initialize the stream */ /* initialize the stream */
@ -821,7 +821,7 @@ static png_error write_deflated_chunk(core_file *fp, UINT8 *data, UINT32 type, U
if (stream.avail_out < sizeof(tempbuff)) if (stream.avail_out < sizeof(tempbuff))
{ {
int bytes = sizeof(tempbuff) - stream.avail_out; int bytes = sizeof(tempbuff) - stream.avail_out;
if (core_fwrite(fp, tempbuff, bytes) != bytes) if (fp.write(tempbuff, bytes) != bytes)
{ {
deflateEnd(&stream); deflateEnd(&stream);
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
@ -849,17 +849,17 @@ static png_error write_deflated_chunk(core_file *fp, UINT8 *data, UINT32 type, U
/* write the CRC */ /* write the CRC */
put_32bit(tempbuff, crc); put_32bit(tempbuff, crc);
if (core_fwrite(fp, tempbuff, 4) != 4) if (fp.write(tempbuff, 4) != 4)
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
/* seek back and update the length */ /* seek back and update the length */
core_fseek(fp, lengthpos, SEEK_SET); fp.seek(lengthpos, SEEK_SET);
put_32bit(tempbuff + 0, zlength); put_32bit(tempbuff + 0, zlength);
if (core_fwrite(fp, tempbuff, 4) != 4) if (fp.write(tempbuff, 4) != 4)
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
/* return to the end */ /* return to the end */
core_fseek(fp, lengthpos + 8 + zlength + 4, SEEK_SET); fp.seek(lengthpos + 8 + zlength + 4, SEEK_SET);
return PNGERR_NONE; return PNGERR_NONE;
} }
@ -1006,7 +1006,7 @@ static png_error convert_bitmap_to_image_rgb(png_info *pnginfo, const bitmap_t &
chunks to the given file chunks to the given file
-------------------------------------------------*/ -------------------------------------------------*/
static png_error write_png_stream(core_file *fp, png_info *pnginfo, const bitmap_t &bitmap, int palette_length, const rgb_t *palette) static png_error write_png_stream(util::core_file &fp, png_info *pnginfo, const bitmap_t &bitmap, int palette_length, const rgb_t *palette)
{ {
UINT8 tempbuff[16]; UINT8 tempbuff[16];
png_text *text; png_text *text;
@ -1061,7 +1061,7 @@ handle_error:
} }
png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette) png_error png_write_bitmap(util::core_file &fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette)
{ {
png_info pnginfo; png_info pnginfo;
png_error error; png_error error;
@ -1074,7 +1074,7 @@ png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t &bitmap, int
} }
/* write the PNG signature */ /* write the PNG signature */
if (core_fwrite(fp, PNG_Signature, 8) != 8) if (fp.write(PNG_Signature, 8) != 8)
{ {
if (info == &pnginfo) if (info == &pnginfo)
png_free(&pnginfo); png_free(&pnginfo);
@ -1097,7 +1097,7 @@ png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t &bitmap, int
********************************************************************************/ ********************************************************************************/
/** /**
* @fn png_error mng_capture_start(core_file *fp, bitmap_t &bitmap, double rate) * @fn png_error mng_capture_start(util::core_file &fp, bitmap_t &bitmap, double rate)
* *
* @brief Mng capture start. * @brief Mng capture start.
* *
@ -1108,12 +1108,12 @@ png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t &bitmap, int
* @return A png_error. * @return A png_error.
*/ */
png_error mng_capture_start(core_file *fp, bitmap_t &bitmap, double rate) png_error mng_capture_start(util::core_file &fp, bitmap_t &bitmap, double rate)
{ {
UINT8 mhdr[28]; UINT8 mhdr[28];
png_error error; png_error error;
if (core_fwrite(fp, MNG_Signature, 8) != 8) if (fp.write(MNG_Signature, 8) != 8)
return PNGERR_FILE_ERROR; return PNGERR_FILE_ERROR;
memset(mhdr, 0, 28); memset(mhdr, 0, 28);
@ -1131,7 +1131,7 @@ png_error mng_capture_start(core_file *fp, bitmap_t &bitmap, double rate)
} }
/** /**
* @fn png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette) * @fn png_error mng_capture_frame(util::core_file &fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette)
* *
* @brief Mng capture frame. * @brief Mng capture frame.
* *
@ -1144,13 +1144,13 @@ png_error mng_capture_start(core_file *fp, bitmap_t &bitmap, double rate)
* @return A png_error. * @return A png_error.
*/ */
png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette) png_error mng_capture_frame(util::core_file &fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette)
{ {
return write_png_stream(fp, info, bitmap, palette_length, palette); return write_png_stream(fp, info, bitmap, palette_length, palette);
} }
/** /**
* @fn png_error mng_capture_stop(core_file *fp) * @fn png_error mng_capture_stop(util::core_file &fp)
* *
* @brief Mng capture stop. * @brief Mng capture stop.
* *
@ -1159,7 +1159,7 @@ png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t &bitmap, int
* @return A png_error. * @return A png_error.
*/ */
png_error mng_capture_stop(core_file *fp) png_error mng_capture_stop(util::core_file &fp)
{ {
return write_chunk(fp, nullptr, MNG_CN_MEND, 0); return write_chunk(fp, nullptr, MNG_CN_MEND, 0);
} }

View File

@ -119,15 +119,15 @@ struct png_info
void png_free(png_info *pnginfo); void png_free(png_info *pnginfo);
png_error png_read_file(core_file *fp, png_info *pnginfo); png_error png_read_file(util::core_file &fp, png_info *pnginfo);
png_error png_read_bitmap(core_file *fp, bitmap_argb32 &bitmap); png_error png_read_bitmap(util::core_file &fp, bitmap_argb32 &bitmap);
png_error png_expand_buffer_8bit(png_info *p); png_error png_expand_buffer_8bit(png_info *p);
png_error png_add_text(png_info *pnginfo, const char *keyword, const char *text); png_error png_add_text(png_info *pnginfo, const char *keyword, const char *text);
png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette); png_error png_write_bitmap(util::core_file &fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette);
png_error mng_capture_start(core_file *fp, bitmap_t &bitmap, double rate); png_error mng_capture_start(util::core_file &fp, bitmap_t &bitmap, double rate);
png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette); png_error mng_capture_frame(util::core_file &fp, png_info *info, bitmap_t &bitmap, int palette_length, const rgb_t *palette);
png_error mng_capture_stop(core_file *fp); png_error mng_capture_stop(util::core_file &fp);
#endif /* __PNG_H__ */ #endif /* __PNG_H__ */

View File

@ -52,7 +52,7 @@ static xml_data_node *add_child(xml_data_node *parent, const char *name, const c
static xml_attribute_node *add_attribute(xml_data_node *node, const char *name, const char *value); static xml_attribute_node *add_attribute(xml_data_node *node, const char *name, const char *value);
/* recursive tree operations */ /* recursive tree operations */
static void write_node_recursive(xml_data_node *node, int indent, core_file *file); static void write_node_recursive(xml_data_node *node, int indent, util::core_file &file);
static void free_node_recursive(xml_data_node *node); static void free_node_recursive(xml_data_node *node);
@ -139,7 +139,7 @@ xml_data_node *xml_file_create(void)
nodes nodes
-------------------------------------------------*/ -------------------------------------------------*/
xml_data_node *xml_file_read(core_file *file, xml_parse_options *opts) xml_data_node *xml_file_read(util::core_file &file, xml_parse_options *opts)
{ {
xml_parse_info parse_info; xml_parse_info parse_info;
int done; int done;
@ -154,8 +154,8 @@ xml_data_node *xml_file_read(core_file *file, xml_parse_options *opts)
char tempbuf[TEMP_BUFFER_SIZE]; char tempbuf[TEMP_BUFFER_SIZE];
/* read as much as we can */ /* read as much as we can */
int bytes = core_fread(file, tempbuf, sizeof(tempbuf)); int bytes = file.read(tempbuf, sizeof(tempbuf));
done = core_feof(file); done = file.eof();
/* parse the data */ /* parse the data */
if (XML_Parse(parse_info.parser, tempbuf, bytes, done) == XML_STATUS_ERROR) if (XML_Parse(parse_info.parser, tempbuf, bytes, done) == XML_STATUS_ERROR)
@ -223,15 +223,15 @@ xml_data_node *xml_string_read(const char *string, xml_parse_options *opts)
xml_file_write - write an XML tree to a file xml_file_write - write an XML tree to a file
-------------------------------------------------*/ -------------------------------------------------*/
void xml_file_write(xml_data_node *node, core_file *file) void xml_file_write(xml_data_node *node, util::core_file &file)
{ {
/* ensure this is a root node */ /* ensure this is a root node */
if (node->name != nullptr) if (node->name != nullptr)
return; return;
/* output a simple header */ /* output a simple header */
core_fprintf(file, "<?xml version=\"1.0\"?>\n"); file.printf("<?xml version=\"1.0\"?>\n");
core_fprintf(file, "<!-- This file is autogenerated; comments and unknown tags will be stripped -->\n"); file.printf("<!-- This file is autogenerated; comments and unknown tags will be stripped -->\n");
/* loop over children of the root and output */ /* loop over children of the root and output */
for (node = node->child; node; node = node->next) for (node = node->child; node; node = node->next)
@ -1002,7 +1002,7 @@ static xml_attribute_node *add_attribute(xml_data_node *node, const char *name,
-------------------------------------------------*/ -------------------------------------------------*/
/** /**
* @fn static void write_node_recursive(xml_data_node *node, int indent, core_file *file) * @fn static void write_node_recursive(xml_data_node *node, int indent, util::core_file &file)
* *
* @brief Writes a node recursive. * @brief Writes a node recursive.
* *
@ -1011,30 +1011,30 @@ static xml_attribute_node *add_attribute(xml_data_node *node, const char *name,
* @param [in,out] file If non-null, the file. * @param [in,out] file If non-null, the file.
*/ */
static void write_node_recursive(xml_data_node *node, int indent, core_file *file) static void write_node_recursive(xml_data_node *node, int indent, util::core_file &file)
{ {
xml_attribute_node *anode; xml_attribute_node *anode;
xml_data_node *child; xml_data_node *child;
/* output this tag */ /* output this tag */
core_fprintf(file, "%*s<%s", indent, "", node->name); file.printf("%*s<%s", indent, "", node->name);
/* output any attributes */ /* output any attributes */
for (anode = node->attribute; anode; anode = anode->next) for (anode = node->attribute; anode; anode = anode->next)
core_fprintf(file, " %s=\"%s\"", anode->name, anode->value); file.printf(" %s=\"%s\"", anode->name, anode->value);
/* if there are no children and no value, end the tag here */ /* if there are no children and no value, end the tag here */
if (node->child == nullptr && node->value == nullptr) if (node->child == nullptr && node->value == nullptr)
core_fprintf(file, " />\n"); file.printf(" />\n");
/* otherwise, close this tag and output more stuff */ /* otherwise, close this tag and output more stuff */
else else
{ {
core_fprintf(file, ">\n"); file.printf(">\n");
/* if there is a value, output that here */ /* if there is a value, output that here */
if (node->value != nullptr) if (node->value != nullptr)
core_fprintf(file, "%*s%s\n", indent + 4, "", node->value); file.printf("%*s%s\n", indent + 4, "", node->value);
/* loop over children and output them as well */ /* loop over children and output them as well */
if (node->child != nullptr) if (node->child != nullptr)
@ -1044,7 +1044,7 @@ static void write_node_recursive(xml_data_node *node, int indent, core_file *fil
} }
/* write a closing tag */ /* write a closing tag */
core_fprintf(file, "%*s</%s>\n", indent, "", node->name); file.printf("%*s</%s>\n", indent, "", node->name);
} }
} }

View File

@ -97,13 +97,13 @@ struct xml_parse_options
xml_data_node *xml_file_create(void); xml_data_node *xml_file_create(void);
/* parse an XML file into its nodes */ /* parse an XML file into its nodes */
xml_data_node *xml_file_read(core_file *file, xml_parse_options *opts); xml_data_node *xml_file_read(util::core_file &file, xml_parse_options *opts);
/* parse an XML string into its nodes */ /* parse an XML string into its nodes */
xml_data_node *xml_string_read(const char *string, xml_parse_options *opts); xml_data_node *xml_string_read(const char *string, xml_parse_options *opts);
/* write an XML tree to a file */ /* write an XML tree to a file */
void xml_file_write(xml_data_node *node, core_file *file); void xml_file_write(xml_data_node *node, util::core_file &file);
/* free an XML file object */ /* free an XML file object */
void xml_file_free(xml_data_node *node); void xml_file_free(xml_data_node *node);

View File

@ -298,7 +298,7 @@ static file_error file_error_from_zip_error(zip_error ziperr)
-------------------------------------------------*/ -------------------------------------------------*/
/** /**
* @fn static file_error create_core_file_from_zip(zip_file *zip, const zip_file_header *header, core_file *&file) * @fn static file_error create_core_file_from_zip(zip_file *zip, const zip_file_header *header, util::core_file::ptr &file)
* *
* @brief Creates core file from zip. * @brief Creates core file from zip.
* *
@ -309,7 +309,7 @@ static file_error file_error_from_zip_error(zip_error ziperr)
* @return The new core file from zip. * @return The new core file from zip.
*/ */
static file_error create_core_file_from_zip(zip_file *zip, const zip_file_header *header, core_file *&file) static file_error create_core_file_from_zip(zip_file *zip, const zip_file_header *header, util::core_file::ptr &file)
{ {
file_error filerr; file_error filerr;
zip_error ziperr; zip_error ziperr;
@ -329,7 +329,7 @@ static file_error create_core_file_from_zip(zip_file *zip, const zip_file_header
goto done; goto done;
} }
filerr = core_fopen_ram_copy(ptr, header->uncompressed_length, OPEN_FLAG_READ, &file); filerr = util::core_file::open_ram_copy(ptr, header->uncompressed_length, OPEN_FLAG_READ, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
goto done; goto done;
@ -345,7 +345,7 @@ done:
-------------------------------------------------*/ -------------------------------------------------*/
/** /**
* @fn file_error zippath_fopen(const char *filename, UINT32 openflags, core_file *&file, std::string &revised_path) * @fn file_error zippath_fopen(const char *filename, UINT32 openflags, util::core_file::ptr &file, std::string &revised_path)
* *
* @brief Zippath fopen. * @brief Zippath fopen.
* *
@ -357,7 +357,7 @@ done:
* @return A file_error. * @return A file_error.
*/ */
file_error zippath_fopen(const char *filename, UINT32 openflags, core_file *&file, std::string &revised_path) file_error zippath_fopen(const char *filename, UINT32 openflags, util::core_file::ptr &file, std::string &revised_path)
{ {
file_error filerr = FILERR_NOT_FOUND; file_error filerr = FILERR_NOT_FOUND;
zip_error ziperr; zip_error ziperr;
@ -421,7 +421,7 @@ file_error zippath_fopen(const char *filename, UINT32 openflags, core_file *&fil
} }
if (subpath.length() == 0) if (subpath.length() == 0)
filerr = core_fopen(filename, openflags, &file); filerr = util::core_file::open(filename, openflags, file);
else else
filerr = FILERR_NOT_FOUND; filerr = FILERR_NOT_FOUND;

View File

@ -45,7 +45,7 @@ std::string &zippath_combine(std::string &dst, const char *path1, const char *pa
/* ----- file operations ----- */ /* ----- file operations ----- */
/* opens a zip path file */ /* opens a zip path file */
file_error zippath_fopen(const char *filename, UINT32 openflags, core_file *&file, std::string &revised_path); file_error zippath_fopen(const char *filename, UINT32 openflags, util::core_file::ptr &file, std::string &revised_path);
/* ----- directory operations ----- */ /* ----- directory operations ----- */

View File

@ -187,10 +187,10 @@ class chd_rawfile_compressor : public chd_file_compressor
{ {
public: public:
// construction/destruction // construction/destruction
chd_rawfile_compressor(core_file *file, UINT64 offset = 0, UINT64 maxoffset = ~0) chd_rawfile_compressor(util::core_file &file, UINT64 offset = 0, UINT64 maxoffset = ~0)
: m_file(file), : m_file(file),
m_offset(offset), m_offset(offset),
m_maxoffset(MIN(maxoffset, (file != nullptr) ? core_fsize(file) : 0)) { } m_maxoffset((std::min)(maxoffset, file.size())) { }
// read interface // read interface
virtual UINT32 read_data(void *dest, UINT64 offset, UINT32 length) virtual UINT32 read_data(void *dest, UINT64 offset, UINT32 length)
@ -200,15 +200,15 @@ public:
return 0; return 0;
if (offset + length > m_maxoffset) if (offset + length > m_maxoffset)
length = m_maxoffset - offset; length = m_maxoffset - offset;
core_fseek(m_file, offset, SEEK_SET); m_file.seek(offset, SEEK_SET);
return core_fread(m_file, dest, length); return m_file.read(dest, length);
} }
private: private:
// internal state // internal state
core_file * m_file; util::core_file & m_file;
UINT64 m_offset; UINT64 m_offset;
UINT64 m_maxoffset; UINT64 m_maxoffset;
}; };
@ -290,14 +290,12 @@ class chd_cd_compressor : public chd_file_compressor
public: public:
// construction/destruction // construction/destruction
chd_cd_compressor(cdrom_toc &toc, chdcd_track_input_info &info) chd_cd_compressor(cdrom_toc &toc, chdcd_track_input_info &info)
: m_file(nullptr), : m_file(),
m_toc(toc), m_toc(toc),
m_info(info) { } m_info(info) { }
~chd_cd_compressor() ~chd_cd_compressor()
{ {
if (m_file != nullptr)
core_fclose(m_file);
} }
// read interface // read interface
@ -321,12 +319,11 @@ public:
if (offset >= startoffs && offset < endoffs) if (offset >= startoffs && offset < endoffs)
{ {
// if we don't already have this file open, open it now // if we don't already have this file open, open it now
if (m_file == nullptr || m_lastfile.compare(m_info.track[tracknum].fname)!=0) if (!m_file || m_lastfile.compare(m_info.track[tracknum].fname)!=0)
{ {
if (m_file != nullptr) m_file.reset();
core_fclose(m_file);
m_lastfile = m_info.track[tracknum].fname; m_lastfile = m_info.track[tracknum].fname;
file_error filerr = core_fopen(m_lastfile.c_str(), OPEN_FLAG_READ, &m_file); file_error filerr = util::core_file::open(m_lastfile.c_str(), OPEN_FLAG_READ, m_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Error opening input file (%s)'", m_lastfile.c_str()); report_error(1, "Error opening input file (%s)'", m_lastfile.c_str());
} }
@ -349,8 +346,8 @@ public:
} }
else else
{ {
core_fseek(m_file, src_frame_start, SEEK_SET); m_file->seek(src_frame_start, SEEK_SET);
UINT32 count = core_fread(m_file, dest, bytesperframe); UINT32 count = m_file->read(dest, bytesperframe);
if (count != bytesperframe) if (count != bytesperframe)
report_error(1, "Error reading input file (%s)'", m_lastfile.c_str()); report_error(1, "Error reading input file (%s)'", m_lastfile.c_str());
} }
@ -383,7 +380,7 @@ public:
private: private:
// internal state // internal state
std::string m_lastfile; std::string m_lastfile;
core_file * m_file; util::core_file::ptr m_file;
cdrom_toc & m_toc; cdrom_toc & m_toc;
chdcd_track_input_info & m_info; chdcd_track_input_info & m_info;
}; };
@ -1008,11 +1005,11 @@ static void check_existing_output_file(const parameters_t &params, const char *f
{ {
if (params.find(OPTION_OUTPUT_FORCE) == params.end()) if (params.find(OPTION_OUTPUT_FORCE) == params.end())
{ {
core_file *file; util::core_file::ptr file;
file_error filerr = core_fopen(filename, OPEN_FLAG_READ, &file); file_error filerr = util::core_file::open(filename, OPEN_FLAG_READ, file);
if (filerr == FILERR_NONE) if (filerr == FILERR_NONE)
{ {
core_fclose(file); file.reset();
report_error(1, "Error: file already exists (%s)\nUse --force (or -f) to force overwriting", filename); report_error(1, "Error: file already exists (%s)\nUse --force (or -f) to force overwriting", filename);
} }
} }
@ -1185,7 +1182,7 @@ static void compress_common(chd_file_compressor &chd)
// to a CUE file // to a CUE file
//------------------------------------------------- //-------------------------------------------------
void output_track_metadata(int mode, core_file *file, int tracknum, const cdrom_track_info &info, const char *filename, UINT32 frameoffs, UINT64 discoffs) void output_track_metadata(int mode, util::core_file &file, int tracknum, const cdrom_track_info &info, const char *filename, UINT32 frameoffs, UINT64 discoffs)
{ {
if (mode == MODE_GDI) if (mode == MODE_GDI)
{ {
@ -1234,13 +1231,13 @@ void output_track_metadata(int mode, core_file *file, int tracknum, const cdrom_
break; break;
} }
bool needquote = strchr(filename, ' ') != nullptr; bool needquote = strchr(filename, ' ') != nullptr;
core_fprintf(file, "%d %d %d %d %s%s%s %" I64FMT "d\n", tracknum+1, frameoffs, mode, size, needquote?"\"":"", filename, needquote?"\"":"", discoffs); file.printf("%d %d %d %d %s%s%s %" I64FMT "d\n", tracknum+1, frameoffs, mode, size, needquote?"\"":"", filename, needquote?"\"":"", discoffs);
} }
else if (mode == MODE_CUEBIN) else if (mode == MODE_CUEBIN)
{ {
// first track specifies the file // first track specifies the file
if (tracknum == 0) if (tracknum == 0)
core_fprintf(file, "FILE \"%s\" BINARY\n", filename); file.printf("FILE \"%s\" BINARY\n", filename);
// determine submode // determine submode
std::string tempstr; std::string tempstr;
@ -1265,37 +1262,37 @@ void output_track_metadata(int mode, core_file *file, int tracknum, const cdrom_
} }
// output TRACK entry // output TRACK entry
core_fprintf(file, " TRACK %02d %s\n", tracknum + 1, tempstr.c_str()); file.printf(" TRACK %02d %s\n", tracknum + 1, tempstr.c_str());
// output PREGAP tag if pregap sectors are not in the file // output PREGAP tag if pregap sectors are not in the file
if ((info.pregap > 0) && (info.pgdatasize == 0)) if ((info.pregap > 0) && (info.pgdatasize == 0))
{ {
core_fprintf(file, " PREGAP %s\n", msf_string_from_frames(tempstr, info.pregap)); file.printf(" PREGAP %s\n", msf_string_from_frames(tempstr, info.pregap));
core_fprintf(file, " INDEX 01 %s\n", msf_string_from_frames(tempstr, frameoffs)); file.printf(" INDEX 01 %s\n", msf_string_from_frames(tempstr, frameoffs));
} }
else if ((info.pregap > 0) && (info.pgdatasize > 0)) else if ((info.pregap > 0) && (info.pgdatasize > 0))
{ {
core_fprintf(file, " INDEX 00 %s\n", msf_string_from_frames(tempstr, frameoffs)); file.printf(" INDEX 00 %s\n", msf_string_from_frames(tempstr, frameoffs));
core_fprintf(file, " INDEX 01 %s\n", msf_string_from_frames(tempstr, frameoffs+info.pregap)); file.printf(" INDEX 01 %s\n", msf_string_from_frames(tempstr, frameoffs+info.pregap));
} }
// if no pregap at all, output index 01 only // if no pregap at all, output index 01 only
if (info.pregap == 0) if (info.pregap == 0)
{ {
core_fprintf(file, " INDEX 01 %s\n", msf_string_from_frames(tempstr, frameoffs)); file.printf(" INDEX 01 %s\n", msf_string_from_frames(tempstr, frameoffs));
} }
// output POSTGAP // output POSTGAP
if (info.postgap > 0) if (info.postgap > 0)
core_fprintf(file, " POSTGAP %s\n", msf_string_from_frames(tempstr, info.postgap)); file.printf(" POSTGAP %s\n", msf_string_from_frames(tempstr, info.postgap));
} }
// non-CUE mode // non-CUE mode
else if (mode == MODE_NORMAL) else if (mode == MODE_NORMAL)
{ {
// header on the first track // header on the first track
if (tracknum == 0) if (tracknum == 0)
core_fprintf(file, "CD_ROM\n\n\n"); file.printf("CD_ROM\n\n\n");
core_fprintf(file, "// Track %d\n", tracknum + 1); file.printf("// Track %d\n", tracknum + 1);
// write out the track type // write out the track type
std::string modesubmode; std::string modesubmode;
@ -1303,32 +1300,32 @@ void output_track_metadata(int mode, core_file *file, int tracknum, const cdrom_
modesubmode = string_format("%s %s", cdrom_get_type_string(info.trktype), cdrom_get_subtype_string(info.subtype)); modesubmode = string_format("%s %s", cdrom_get_type_string(info.trktype), cdrom_get_subtype_string(info.subtype));
else else
modesubmode = string_format("%s", cdrom_get_type_string(info.trktype)); modesubmode = string_format("%s", cdrom_get_type_string(info.trktype));
core_fprintf(file, "TRACK %s\n", modesubmode.c_str()); file.printf("TRACK %s\n", modesubmode.c_str());
// write out the attributes // write out the attributes
core_fprintf(file, "NO COPY\n"); file.printf("NO COPY\n");
if (info.trktype == CD_TRACK_AUDIO) if (info.trktype == CD_TRACK_AUDIO)
{ {
core_fprintf(file, "NO PRE_EMPHASIS\n"); file.printf("NO PRE_EMPHASIS\n");
core_fprintf(file, "TWO_CHANNEL_AUDIO\n"); file.printf("TWO_CHANNEL_AUDIO\n");
} }
// output pregap // output pregap
std::string tempstr; std::string tempstr;
if (info.pregap > 0) if (info.pregap > 0)
core_fprintf(file, "ZERO %s %s\n", modesubmode.c_str(), msf_string_from_frames(tempstr, info.pregap)); file.printf("ZERO %s %s\n", modesubmode.c_str(), msf_string_from_frames(tempstr, info.pregap));
// all tracks but the first one have a file offset // all tracks but the first one have a file offset
if (tracknum > 0) if (tracknum > 0)
core_fprintf(file, "DATAFILE \"%s\" #%d %s // length in bytes: %d\n", filename, UINT32(discoffs), msf_string_from_frames(tempstr, info.frames), info.frames * (info.datasize + info.subsize)); file.printf("DATAFILE \"%s\" #%d %s // length in bytes: %d\n", filename, UINT32(discoffs), msf_string_from_frames(tempstr, info.frames), info.frames * (info.datasize + info.subsize));
else else
core_fprintf(file, "DATAFILE \"%s\" %s // length in bytes: %d\n", filename, msf_string_from_frames(tempstr, info.frames), info.frames * (info.datasize + info.subsize)); file.printf("DATAFILE \"%s\" %s // length in bytes: %d\n", filename, msf_string_from_frames(tempstr, info.frames), info.frames * (info.datasize + info.subsize));
// tracks with pregaps get a START marker too // tracks with pregaps get a START marker too
if (info.pregap > 0) if (info.pregap > 0)
core_fprintf(file, "START %s\n", msf_string_from_frames(tempstr, info.pregap)); file.printf("START %s\n", msf_string_from_frames(tempstr, info.pregap));
core_fprintf(file, "\n\n"); file.printf("\n\n");
} }
} }
@ -1361,9 +1358,9 @@ static void do_info(parameters_t &params)
printf("Unit Size: %s bytes\n", big_int_string(tempstr, input_chd.unit_bytes())); printf("Unit Size: %s bytes\n", big_int_string(tempstr, input_chd.unit_bytes()));
printf("Total Units: %s\n", big_int_string(tempstr, input_chd.unit_count())); printf("Total Units: %s\n", big_int_string(tempstr, input_chd.unit_count()));
printf("Compression: %s\n", compression_string(tempstr, compression)); printf("Compression: %s\n", compression_string(tempstr, compression));
printf("CHD size: %s bytes\n", big_int_string(tempstr, core_fsize(input_chd))); printf("CHD size: %s bytes\n", big_int_string(tempstr, static_cast<util::core_file &>(input_chd).size()));
if (compression[0] != CHD_CODEC_NONE) if (compression[0] != CHD_CODEC_NONE)
printf("Ratio: %.1f%%\n", 100.0 * double(core_fsize(input_chd)) / double(input_chd.logical_bytes())); printf("Ratio: %.1f%%\n", 100.0 * double(static_cast<util::core_file &>(input_chd).size()) / double(input_chd.logical_bytes()));
// add SHA1 output // add SHA1 output
sha1_t overall = input_chd.sha1(); sha1_t overall = input_chd.sha1();
@ -1570,11 +1567,11 @@ static void do_verify(parameters_t &params)
static void do_create_raw(parameters_t &params) static void do_create_raw(parameters_t &params)
{ {
// process input file // process input file
core_file *input_file = nullptr; util::core_file::ptr input_file;
auto input_file_str = params.find(OPTION_INPUT); auto input_file_str = params.find(OPTION_INPUT);
if (input_file_str != params.end()) if (input_file_str != params.end())
{ {
file_error filerr = core_fopen(input_file_str->second->c_str(), OPEN_FLAG_READ, &input_file); file_error filerr = util::core_file::open(input_file_str->second->c_str(), OPEN_FLAG_READ, input_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Unable to open file (%s)", input_file_str->second->c_str()); report_error(1, "Unable to open file (%s)", input_file_str->second->c_str());
} }
@ -1600,7 +1597,7 @@ static void do_create_raw(parameters_t &params)
// process input start/end (needs to know hunk_size) // process input start/end (needs to know hunk_size)
UINT64 input_start; UINT64 input_start;
UINT64 input_end; UINT64 input_end;
parse_input_start_end(params, core_fsize(input_file), hunk_size, hunk_size, input_start, input_end); parse_input_start_end(params, input_file->size(), hunk_size, hunk_size, input_start, input_end);
// process compression // process compression
chd_codec_type compression[4]; chd_codec_type compression[4];
@ -1616,7 +1613,7 @@ static void do_create_raw(parameters_t &params)
if (output_parent.opened()) if (output_parent.opened())
printf("Parent CHD: %s\n", params.find(OPTION_OUTPUT_PARENT)->second->c_str()); printf("Parent CHD: %s\n", params.find(OPTION_OUTPUT_PARENT)->second->c_str());
printf("Input file: %s\n", input_file_str->second->c_str()); printf("Input file: %s\n", input_file_str->second->c_str());
if (input_start != 0 || input_end != core_fsize(input_file)) if (input_start != 0 || input_end != input_file->size())
{ {
printf("Input start: %s\n", big_int_string(tempstr, input_start)); printf("Input start: %s\n", big_int_string(tempstr, input_start));
printf("Input length: %s\n", big_int_string(tempstr, input_end - input_start)); printf("Input length: %s\n", big_int_string(tempstr, input_end - input_start));
@ -1630,7 +1627,7 @@ static void do_create_raw(parameters_t &params)
try try
{ {
// create the new CHD // create the new CHD
chd = new chd_rawfile_compressor(input_file, input_start, input_end); chd = new chd_rawfile_compressor(*input_file, input_start, input_end);
chd_error err; chd_error err;
if (output_parent.opened()) if (output_parent.opened())
err = chd->create(output_chd_str->c_str(), input_end - input_start, hunk_size, compression, output_parent); err = chd->create(output_chd_str->c_str(), input_end - input_start, hunk_size, compression, output_parent);
@ -1667,11 +1664,11 @@ static void do_create_raw(parameters_t &params)
static void do_create_hd(parameters_t &params) static void do_create_hd(parameters_t &params)
{ {
// process input file // process input file
core_file *input_file = nullptr; util::core_file::ptr input_file;
auto input_file_str = params.find(OPTION_INPUT); auto input_file_str = params.find(OPTION_INPUT);
if (input_file_str != params.end()) if (input_file_str != params.end())
{ {
file_error filerr = core_fopen(input_file_str->second->c_str(), OPEN_FLAG_READ, &input_file); file_error filerr = util::core_file::open(input_file_str->second->c_str(), OPEN_FLAG_READ, input_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Unable to open file (%s)", input_file_str->second->c_str()); report_error(1, "Unable to open file (%s)", input_file_str->second->c_str());
} }
@ -1698,9 +1695,9 @@ static void do_create_hd(parameters_t &params)
UINT64 filesize = 0; UINT64 filesize = 0;
UINT64 input_start = 0; UINT64 input_start = 0;
UINT64 input_end = 0; UINT64 input_end = 0;
if (input_file != nullptr) if (input_file)
{ {
parse_input_start_end(params, core_fsize(input_file), hunk_size, hunk_size, input_start, input_end); parse_input_start_end(params, input_file->size(), hunk_size, hunk_size, input_start, input_end);
filesize = input_end - input_start; filesize = input_end - input_start;
} }
else else
@ -1716,10 +1713,10 @@ static void do_create_hd(parameters_t &params)
// process compression // process compression
chd_codec_type compression[4]; chd_codec_type compression[4];
memcpy(compression, s_default_hd_compression, sizeof(compression)); memcpy(compression, s_default_hd_compression, sizeof(compression));
if (input_file == nullptr) if (!input_file)
compression[0] = compression[1] = compression[2] = compression[3] = CHD_CODEC_NONE; compression[0] = compression[1] = compression[2] = compression[3] = CHD_CODEC_NONE;
parse_compression(params, compression); parse_compression(params, compression);
if (input_file == nullptr && compression[0] != CHD_CODEC_NONE) if (!input_file && compression[0] != CHD_CODEC_NONE)
report_error(1, "Blank hard disks must be uncompressed"); report_error(1, "Blank hard disks must be uncompressed");
// process numprocessors // process numprocessors
@ -1746,7 +1743,7 @@ static void do_create_hd(parameters_t &params)
if (ident_str != params.end()) if (ident_str != params.end())
{ {
// load the file // load the file
file_error filerr = core_fload(ident_str->second->c_str(), identdata); file_error filerr = util::core_file::load(ident_str->second->c_str(), identdata);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Error reading ident file (%s)", ident_str->second->c_str()); report_error(1, "Error reading ident file (%s)", ident_str->second->c_str());
@ -1775,7 +1772,7 @@ static void do_create_hd(parameters_t &params)
// if no CHS values, try to guess them // if no CHS values, try to guess them
if (cylinders == 0) if (cylinders == 0)
{ {
if (input_file == nullptr && filesize == 0) if (!input_file && filesize == 0)
report_error(1, "Blank hard drives must specify either a length or a set of CHS values"); report_error(1, "Blank hard drives must specify either a length or a set of CHS values");
guess_chs((input_file_str != params.end()) ? input_file_str->second : nullptr, filesize, sector_size, cylinders, heads, sectors, sector_size); guess_chs((input_file_str != params.end()) ? input_file_str->second : nullptr, filesize, sector_size, cylinders, heads, sectors, sector_size);
} }
@ -1786,10 +1783,10 @@ static void do_create_hd(parameters_t &params)
printf("Output CHD: %s\n", output_chd_str->c_str()); printf("Output CHD: %s\n", output_chd_str->c_str());
if (output_parent.opened()) if (output_parent.opened())
printf("Parent CHD: %s\n", params.find(OPTION_OUTPUT_PARENT)->second->c_str()); printf("Parent CHD: %s\n", params.find(OPTION_OUTPUT_PARENT)->second->c_str());
if (input_file != nullptr) if (input_file)
{ {
printf("Input file: %s\n", input_file_str->second->c_str()); printf("Input file: %s\n", input_file_str->second->c_str());
if (input_start != 0 || input_end != core_fsize(input_file)) if (input_start != 0 || input_end != input_file->size())
{ {
printf("Input start: %s\n", big_int_string(tempstr, input_start)); printf("Input start: %s\n", big_int_string(tempstr, input_start));
printf("Input length: %s\n", big_int_string(tempstr, filesize)); printf("Input length: %s\n", big_int_string(tempstr, filesize));
@ -1808,7 +1805,7 @@ static void do_create_hd(parameters_t &params)
try try
{ {
// create the new hard drive // create the new hard drive
chd = new chd_rawfile_compressor(input_file, input_start, input_end); chd = new chd_rawfile_compressor(*input_file, input_start, input_end);
chd_error err; chd_error err;
if (output_parent.opened()) if (output_parent.opened())
err = chd->create(output_chd_str->c_str(), UINT64(totalsectors) * UINT64(sector_size), hunk_size, compression, output_parent); err = chd->create(output_chd_str->c_str(), UINT64(totalsectors) * UINT64(sector_size), hunk_size, compression, output_parent);
@ -1832,7 +1829,7 @@ static void do_create_hd(parameters_t &params)
} }
// compress it generically // compress it generically
if (input_file != nullptr) if (input_file)
compress_common(*chd); compress_common(*chd);
delete chd; delete chd;
} }
@ -2236,11 +2233,11 @@ static void do_extract_raw(parameters_t &params)
} }
// catch errors so we can close & delete the output file // catch errors so we can close & delete the output file
core_file *output_file = nullptr; util::core_file::ptr output_file;
try try
{ {
// process output file // process output file
file_error filerr = core_fopen(output_file_str->second->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &output_file); file_error filerr = util::core_file::open(output_file_str->second->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Unable to open file (%s)", output_file_str->second->c_str()); report_error(1, "Unable to open file (%s)", output_file_str->second->c_str());
@ -2257,7 +2254,7 @@ static void do_extract_raw(parameters_t &params)
report_error(1, "Error reading CHD file (%s): %s", params.find(OPTION_INPUT)->second->c_str(), chd_file::error_string(err)); report_error(1, "Error reading CHD file (%s): %s", params.find(OPTION_INPUT)->second->c_str(), chd_file::error_string(err));
// write to the output // write to the output
UINT32 count = core_fwrite(output_file, &buffer[0], bytes_to_read); UINT32 count = output_file->write(&buffer[0], bytes_to_read);
if (count != bytes_to_read) if (count != bytes_to_read)
report_error(1, "Error writing to file; check disk space (%s)", output_file_str->second->c_str()); report_error(1, "Error writing to file; check disk space (%s)", output_file_str->second->c_str());
@ -2266,7 +2263,7 @@ static void do_extract_raw(parameters_t &params)
} }
// finish up // finish up
core_fclose(output_file); output_file.reset();
printf("Extraction complete \n"); printf("Extraction complete \n");
} }
catch (...) catch (...)
@ -2274,7 +2271,7 @@ static void do_extract_raw(parameters_t &params)
// delete the output file // delete the output file
if (output_file != nullptr) if (output_file != nullptr)
{ {
core_fclose(output_file); output_file.reset();
osd_rmfile(output_file_str->second->c_str()); osd_rmfile(output_file_str->second->c_str());
} }
throw; throw;
@ -2329,8 +2326,8 @@ static void do_extract_cd(parameters_t &params)
printf("Input CHD: %s\n", params.find(OPTION_INPUT)->second->c_str()); printf("Input CHD: %s\n", params.find(OPTION_INPUT)->second->c_str());
// catch errors so we can close & delete the output file // catch errors so we can close & delete the output file
core_file *output_bin_file = nullptr; util::core_file::ptr output_bin_file;
core_file *output_toc_file = nullptr; util::core_file::ptr output_toc_file;
try try
{ {
int mode = MODE_NORMAL; int mode = MODE_NORMAL;
@ -2345,14 +2342,14 @@ static void do_extract_cd(parameters_t &params)
} }
// process output file // process output file
file_error filerr = core_fopen(output_file_str->second->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, &output_toc_file); file_error filerr = util::core_file::open(output_file_str->second->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, output_toc_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Unable to open file (%s)", output_file_str->second->c_str()); report_error(1, "Unable to open file (%s)", output_file_str->second->c_str());
// process output BIN file // process output BIN file
if (mode != MODE_GDI) if (mode != MODE_GDI)
{ {
filerr = core_fopen(output_bin_file_str->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &output_bin_file); filerr = util::core_file::open(output_bin_file_str->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_bin_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Unable to open file (%s)", output_bin_file_str->c_str()); report_error(1, "Unable to open file (%s)", output_bin_file_str->c_str());
} }
@ -2365,7 +2362,7 @@ static void do_extract_cd(parameters_t &params)
// GDI must start with the # of tracks // GDI must start with the # of tracks
if (mode == MODE_GDI) if (mode == MODE_GDI)
{ {
core_fprintf(output_toc_file, "%d\n", toc->numtrks); output_toc_file->printf("%d\n", toc->numtrks);
} }
// iterate over tracks and copy all data // iterate over tracks and copy all data
@ -2386,13 +2383,9 @@ static void do_extract_cd(parameters_t &params)
else else
trackbin_name.append(".bin"); trackbin_name.append(".bin");
if (output_bin_file) output_bin_file.reset();
{
core_fclose(output_bin_file);
output_bin_file = nullptr;
}
filerr = core_fopen(trackbin_name.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &output_bin_file); filerr = util::core_file::open(trackbin_name.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_bin_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Unable to open file (%s)", trackbin_name.c_str()); report_error(1, "Unable to open file (%s)", trackbin_name.c_str());
@ -2403,11 +2396,11 @@ static void do_extract_cd(parameters_t &params)
const cdrom_track_info &trackinfo = toc->tracks[tracknum]; const cdrom_track_info &trackinfo = toc->tracks[tracknum];
if (mode == MODE_GDI) if (mode == MODE_GDI)
{ {
output_track_metadata(mode, output_toc_file, tracknum, trackinfo, core_filename_extract_base(trackbin_name.c_str()).c_str(), discoffs, outputoffs); output_track_metadata(mode, *output_toc_file, tracknum, trackinfo, core_filename_extract_base(trackbin_name.c_str()).c_str(), discoffs, outputoffs);
} }
else else
{ {
output_track_metadata(mode, output_toc_file, tracknum, trackinfo, core_filename_extract_base(output_bin_file_str->c_str()).c_str(), discoffs, outputoffs); output_track_metadata(mode, *output_toc_file, tracknum, trackinfo, core_filename_extract_base(output_bin_file_str->c_str()).c_str(), discoffs, outputoffs);
} }
// If this is bin/cue output and the CHD contains subdata, warn the user and don't include // If this is bin/cue output and the CHD contains subdata, warn the user and don't include
@ -2455,8 +2448,8 @@ static void do_extract_cd(parameters_t &params)
// write it out if we need to // write it out if we need to
if (bufferoffs == buffer.size() || frame == actualframes - 1) if (bufferoffs == buffer.size() || frame == actualframes - 1)
{ {
core_fseek(output_bin_file, outputoffs, SEEK_SET); output_bin_file->seek(outputoffs, SEEK_SET);
UINT32 byteswritten = core_fwrite(output_bin_file, &buffer[0], bufferoffs); UINT32 byteswritten = output_bin_file->write(&buffer[0], bufferoffs);
if (byteswritten != bufferoffs) if (byteswritten != bufferoffs)
report_error(1, "Error writing frame %d to file (%s): %s\n", frame, output_file_str->second->c_str(), chd_file::error_string(CHDERR_WRITE_ERROR)); report_error(1, "Error writing frame %d to file (%s): %s\n", frame, output_file_str->second->c_str(), chd_file::error_string(CHDERR_WRITE_ERROR));
outputoffs += bufferoffs; outputoffs += bufferoffs;
@ -2468,17 +2461,15 @@ static void do_extract_cd(parameters_t &params)
} }
// finish up // finish up
core_fclose(output_bin_file); output_bin_file.reset();
core_fclose(output_toc_file); output_toc_file.reset();
printf("Extraction complete \n"); printf("Extraction complete \n");
} }
catch (...) catch (...)
{ {
// delete the output files // delete the output files
if (output_bin_file != nullptr) output_bin_file.reset();
core_fclose(output_bin_file); output_toc_file.reset();
if (output_toc_file != nullptr)
core_fclose(output_toc_file);
osd_rmfile(output_bin_file_str->c_str()); osd_rmfile(output_bin_file_str->c_str());
osd_rmfile(output_file_str->second->c_str()); osd_rmfile(output_file_str->second->c_str());
throw; throw;
@ -2600,7 +2591,7 @@ static void do_extract_ld(parameters_t &params)
chd_error err = input_chd.read_hunk(framenum, nullptr); chd_error err = input_chd.read_hunk(framenum, nullptr);
if (err != CHDERR_NONE) if (err != CHDERR_NONE)
{ {
UINT64 filepos = core_ftell(input_chd); UINT64 filepos = static_cast<util::core_file &>(input_chd).tell();
report_error(1, "Error reading hunk %" I64FMT "d at offset %" I64FMT "d from CHD file (%s): %s\n", framenum, filepos, params.find(OPTION_INPUT)->second->c_str(), chd_file::error_string(err)); report_error(1, "Error reading hunk %" I64FMT "d at offset %" I64FMT "d from CHD file (%s): %s\n", framenum, filepos, params.find(OPTION_INPUT)->second->c_str(), chd_file::error_string(err));
} }
@ -2678,7 +2669,7 @@ static void do_add_metadata(parameters_t &params)
dynamic_buffer file; dynamic_buffer file;
if (file_str != params.end()) if (file_str != params.end())
{ {
file_error filerr = core_fload(file_str->second->c_str(), file); file_error filerr = util::core_file::load(file_str->second->c_str(), file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Error reading metadata file (%s)", file_str->second->c_str()); report_error(1, "Error reading metadata file (%s)", file_str->second->c_str());
} }
@ -2796,21 +2787,21 @@ static void do_dump_metadata(parameters_t &params)
report_error(1, "Error reading metadata: %s", chd_file::error_string(err)); report_error(1, "Error reading metadata: %s", chd_file::error_string(err));
// catch errors so we can close & delete the output file // catch errors so we can close & delete the output file
core_file *output_file = nullptr; util::core_file::ptr output_file;
try try
{ {
// create the file // create the file
if (output_file_str != params.end()) if (output_file_str != params.end())
{ {
file_error filerr = core_fopen(output_file_str->second->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &output_file); file_error filerr = util::core_file::open(output_file_str->second->c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, output_file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
report_error(1, "Unable to open file (%s)", output_file_str->second->c_str()); report_error(1, "Unable to open file (%s)", output_file_str->second->c_str());
// output the metadata // output the metadata
UINT32 count = core_fwrite(output_file, &buffer[0], buffer.size()); UINT32 count = output_file->write(&buffer[0], buffer.size());
if (count != buffer.size()) if (count != buffer.size())
report_error(1, "Error writing file (%s)", output_file_str->second->c_str()); report_error(1, "Error writing file (%s)", output_file_str->second->c_str());
core_fclose(output_file); output_file.reset();
// provide some feedback // provide some feedback
std::string tempstr; std::string tempstr;
@ -2827,8 +2818,7 @@ static void do_dump_metadata(parameters_t &params)
catch (...) catch (...)
{ {
// delete the output file // delete the output file
if (output_file != nullptr) output_file.reset();
core_fclose(output_file);
osd_rmfile(output_file_str->second->c_str()); osd_rmfile(output_file_str->second->c_str());
throw; throw;
} }

View File

@ -24,78 +24,112 @@ enum imgtype_t
struct imgtool_stream struct imgtool_stream
{ {
imgtype_t imgtype; typedef std::unique_ptr<imgtool_stream> ptr;
int write_protect;
const char *name; // needed for clear
UINT64 position;
UINT64 filesize;
union imgtool_stream(bool wp)
: imgtype(IMG_FILE)
, write_protect(wp)
, name(nullptr)
, position(0)
, filesize(0)
, file()
, buffer(nullptr)
{ {
core_file *file; }
UINT8 *buffer;
} u; imgtool_stream(
bool wp,
util::core_file::ptr &&f)
: imgtype(IMG_FILE)
, write_protect(wp)
, name(nullptr)
, position(0)
, filesize(f->size())
, file(std::move(f))
, buffer(nullptr)
{
}
imgtool_stream(bool wp, std::size_t size)
: imgtype(IMG_MEM)
, write_protect(wp)
, name(nullptr)
, position(0)
, filesize(size)
, file()
, buffer(reinterpret_cast<std::uint8_t *>(malloc(size)))
{
}
imgtool_stream(bool wp, std::size_t size, void *buf)
: imgtype(IMG_MEM)
, write_protect(wp)
, name(nullptr)
, position(0)
, filesize(size)
, file()
, buffer(reinterpret_cast<std::uint8_t *>(buf))
{
}
~imgtool_stream()
{
free(buffer);
}
imgtype_t imgtype;
bool write_protect;
const char *name; // needed for clear
std::uint64_t position;
std::uint64_t filesize;
util::core_file::ptr file;
std::uint8_t *buffer;
}; };
static imgtool_stream *stream_open_zip(const char *zipname, const char *subname, int read_or_write) static imgtool_stream *stream_open_zip(const char *zipname, const char *subname, int read_or_write)
{ {
imgtool_stream *imgfile = nullptr;
// zip_error ziperr;
zip_file *z = nullptr;
const zip_file_header *zipent;
FILE *f;
if (read_or_write) if (read_or_write)
goto error; return nullptr;
/* check to see if the file exists */ /* check to see if the file exists */
f = fopen(zipname, "r"); FILE *f = fopen(zipname, "r");
if (!f) if (!f)
goto error; return nullptr;
fclose(f); fclose(f);
imgfile = (imgtool_stream *)malloc(sizeof(imgtool_stream)); imgtool_stream::ptr imgfile(new imgtool_stream(true));
if (!imgfile)
goto error;
memset(imgfile, 0, sizeof(*imgfile));
imgfile->imgtype = IMG_MEM; imgfile->imgtype = IMG_MEM;
imgfile->write_protect = 1;
imgfile->position = 0;
// ziperr = zip_file *z = nullptr;
const zip_file_header *zipent = nullptr;
zip_file_open(zipname, &z); zip_file_open(zipname, &z);
if (!z) if (!z)
goto error; goto error;
zipent = zip_file_first_file(z); zipent = zip_file_first_file(z);
while(zipent && subname && strcmp(subname, zipent->filename)) while (zipent && subname && strcmp(subname, zipent->filename))
zipent = zip_file_next_file(z); zipent = zip_file_next_file(z);
if (!zipent) if (!zipent)
goto error; goto error;
imgfile->filesize = zipent->uncompressed_length; imgfile->filesize = zipent->uncompressed_length;
imgfile->u.buffer = (UINT8*)malloc(zipent->uncompressed_length); imgfile->buffer = reinterpret_cast<std::uint8_t *>(malloc(zipent->uncompressed_length));
if (!imgfile->u.buffer) if (!imgfile->buffer)
goto error; goto error;
if (zip_file_decompress(z, imgfile->u.buffer, zipent->uncompressed_length)) if (zip_file_decompress(z, imgfile->buffer, zipent->uncompressed_length))
goto error; goto error;
zip_file_close(z); zip_file_close(z);
return imgfile; return imgfile.release();
error: error:
if (z) if (z)
zip_file_close(z); zip_file_close(z);
if (imgfile)
{
if (imgfile->u.buffer)
free(imgfile->u.buffer);
free(imgfile);
}
return nullptr; return nullptr;
} }
@ -103,9 +137,6 @@ error:
imgtool_stream *stream_open(const char *fname, int read_or_write) imgtool_stream *stream_open(const char *fname, int read_or_write)
{ {
file_error filerr;
const char *ext;
imgtool_stream *imgfile = nullptr;
static const UINT32 write_modes[] = static const UINT32 write_modes[] =
{ {
OPEN_FLAG_READ, OPEN_FLAG_READ,
@ -113,118 +144,70 @@ imgtool_stream *stream_open(const char *fname, int read_or_write)
OPEN_FLAG_READ | OPEN_FLAG_WRITE, OPEN_FLAG_READ | OPEN_FLAG_WRITE,
OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE
}; };
core_file *f = nullptr;
char *buf = nullptr;
int len, i;
imgtool_stream *s = nullptr; imgtool_stream *s = nullptr;
char c; char c;
/* maybe we are just a ZIP? */ /* maybe we are just a ZIP? */
ext = strrchr(fname, '.'); const char *ext = strrchr(fname, '.');
if (ext && !core_stricmp(ext, ".zip")) if (ext && !core_stricmp(ext, ".zip"))
return stream_open_zip(fname, nullptr, read_or_write); return stream_open_zip(fname, nullptr, read_or_write);
filerr = core_fopen(fname, write_modes[read_or_write], &f); util::core_file::ptr f = nullptr;
auto const filerr = util::core_file::open(fname, write_modes[read_or_write], f);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
if (!read_or_write) if (!read_or_write)
{ {
len = strlen(fname); int const len = strlen(fname);
/* can't open the file; try opening ZIP files with other names */ /* can't open the file; try opening ZIP files with other names */
buf = (char*)malloc(len + 1); std::vector<char> buf(len + 1);
if (!buf) strcpy(&buf[0], fname);
goto error;
strcpy(buf, fname);
for(i = len-1; !s && (i >= 0); i--) for (int i = len-1; !s && (i >= 0); i--)
{ {
if ((buf[i] == '\\') || (buf[i] == '/')) if ((buf[i] == '\\') || (buf[i] == '/'))
{ {
c = buf[i]; c = buf[i];
buf[i] = '\0'; buf[i] = '\0';
s = stream_open_zip(buf, buf + i + 1, read_or_write); s = stream_open_zip(&buf[0], &buf[i + 1], read_or_write);
buf[i] = c; buf[i] = c;
} }
} }
free(buf);
buf = nullptr;
if (s) if (s)
return s; return s;
} }
/* ah well, it was worth a shot */ /* ah well, it was worth a shot */
goto error; return nullptr;
} }
imgfile = (imgtool_stream *)malloc(sizeof(imgtool_stream)); imgtool_stream::ptr imgfile(new imgtool_stream(read_or_write ? false : true, std::move(f)));
if (!imgfile)
goto error;
/* Normal file */ /* Normal file */
memset(imgfile, 0, sizeof(*imgfile));
imgfile->imgtype = IMG_FILE;
imgfile->position = 0;
imgfile->filesize = core_fsize(f);
imgfile->write_protect = read_or_write ? 0 : 1;
imgfile->u.file = f;
imgfile->name = fname; imgfile->name = fname;
return imgfile; return imgfile.release();
error:
if (imgfile != nullptr)
free((void *) imgfile);
if (f != nullptr)
core_fclose(f);
if (buf)
free(buf);
return (imgtool_stream *) nullptr;
} }
imgtool_stream *stream_open_write_stream(int size) imgtool_stream *stream_open_write_stream(int size)
{ {
imgtool_stream *imgfile; imgtool_stream::ptr imgfile(new imgtool_stream(false, size));
if (!imgfile->buffer)
imgfile = (imgtool_stream *)malloc(sizeof(imgtool_stream));
if (!imgfile)
return nullptr; return nullptr;
imgfile->imgtype = IMG_MEM; return imgfile.release();
imgfile->write_protect = 0;
imgfile->position = 0;
imgfile->filesize = size;
imgfile->u.buffer = (UINT8*)malloc(size);
if (!imgfile->u.buffer)
{
free(imgfile);
return nullptr;
}
return imgfile;
} }
imgtool_stream *stream_open_mem(void *buf, size_t sz) imgtool_stream *stream_open_mem(void *buf, size_t sz)
{ {
imgtool_stream *imgfile; imgtool_stream::ptr imgfile(new imgtool_stream(false, sz, buf));
imgfile = (imgtool_stream *)malloc(sizeof(imgtool_stream)); return imgfile.release();
if (!imgfile)
return nullptr;
memset(imgfile, 0, sizeof(*imgfile));
imgfile->imgtype = IMG_MEM;
imgfile->position = 0;
imgfile->write_protect = 0;
imgfile->filesize = sz;
imgfile->u.buffer = (UINT8*)buf;
return imgfile;
} }
@ -233,36 +216,14 @@ void stream_close(imgtool_stream *s)
{ {
assert(s != nullptr); assert(s != nullptr);
switch(s->imgtype) delete s;
{
case IMG_FILE:
if (s->u.file != nullptr)
{
core_fclose(s->u.file);
s->u.file = nullptr;
}
break;
case IMG_MEM:
if (s->u.buffer != nullptr)
{
free(s->u.buffer);
s->u.buffer = nullptr;
}
break;
default:
assert(0);
break;
}
free((void *) s);
} }
core_file *stream_core_file(imgtool_stream *stream) util::core_file *stream_core_file(imgtool_stream *stream)
{ {
return (stream->imgtype == IMG_FILE) ? stream->u.file : nullptr; return (stream->imgtype == IMG_FILE) ? stream->file.get() : nullptr;
} }
@ -275,8 +236,8 @@ UINT32 stream_read(imgtool_stream *stream, void *buf, UINT32 sz)
{ {
case IMG_FILE: case IMG_FILE:
assert(sz == (UINT32) sz); assert(sz == (UINT32) sz);
core_fseek(stream->u.file, stream->position, SEEK_SET); stream->file->seek(stream->position, SEEK_SET);
result = core_fread(stream->u.file, buf, (UINT32) sz); result = stream->file->read(buf, (UINT32) sz);
break; break;
case IMG_MEM: case IMG_MEM:
@ -284,7 +245,7 @@ UINT32 stream_read(imgtool_stream *stream, void *buf, UINT32 sz)
if (sz > (stream->filesize - stream->position)) if (sz > (stream->filesize - stream->position))
sz = (UINT32) (stream->filesize - stream->position); sz = (UINT32) (stream->filesize - stream->position);
memcpy(buf, stream->u.buffer + stream->position, sz); memcpy(buf, stream->buffer + stream->position, sz);
result = sz; result = sz;
break; break;
@ -312,11 +273,11 @@ UINT32 stream_write(imgtool_stream *s, const void *buf, UINT32 sz)
if (s->filesize < s->position + sz) if (s->filesize < s->position + sz)
{ {
/* try to expand the buffer */ /* try to expand the buffer */
if (s->u.buffer) free(s->u.buffer); if (s->buffer) free(s->buffer);
new_buffer = malloc(s->position + sz); new_buffer = malloc(s->position + sz);
if (new_buffer) if (new_buffer)
{ {
s->u.buffer = (UINT8*)new_buffer; s->buffer = (UINT8*)new_buffer;
s->filesize = s->position + sz; s->filesize = s->position + sz;
} }
} }
@ -325,14 +286,14 @@ UINT32 stream_write(imgtool_stream *s, const void *buf, UINT32 sz)
if (sz > (s->filesize - s->position)) if (sz > (s->filesize - s->position))
sz = (UINT32) (s->filesize - s->position); sz = (UINT32) (s->filesize - s->position);
memcpy(s->u.buffer + s->position, buf, sz); memcpy(s->buffer + s->position, buf, sz);
result = sz; result = sz;
} }
break; break;
case IMG_FILE: case IMG_FILE:
core_fseek(s->u.file, s->position, SEEK_SET); s->file->seek(s->position, SEEK_SET);
result = core_fwrite(s->u.file, buf, sz); result = s->file->write(buf, sz);
break; break;
default: default:
@ -365,7 +326,7 @@ void *stream_getptr(imgtool_stream *f)
switch(f->imgtype) switch(f->imgtype)
{ {
case IMG_MEM: case IMG_MEM:
ptr = f->u.buffer; ptr = f->buffer;
break; break;
default: default:
@ -445,7 +406,7 @@ int stream_crc(imgtool_stream *s, unsigned long *result)
switch(s->imgtype) switch(s->imgtype)
{ {
case IMG_MEM: case IMG_MEM:
*result = crc32(0, (unsigned char *) s->u.buffer, (size_t) s->filesize); *result = crc32(0, (unsigned char *) s->buffer, (size_t) s->filesize);
break; break;
default: default:

View File

@ -20,7 +20,7 @@ imgtool_stream *stream_open(const char *fname, int read_or_write); /* similar p
imgtool_stream *stream_open_write_stream(int filesize); imgtool_stream *stream_open_write_stream(int filesize);
imgtool_stream *stream_open_mem(void *buf, size_t sz); imgtool_stream *stream_open_mem(void *buf, size_t sz);
void stream_close(imgtool_stream *stream); void stream_close(imgtool_stream *stream);
core_file *stream_core_file(imgtool_stream *stream); util::core_file *stream_core_file(imgtool_stream *stream);
UINT32 stream_read(imgtool_stream *stream, void *buf, UINT32 sz); UINT32 stream_read(imgtool_stream *stream, void *buf, UINT32 sz);
UINT32 stream_write(imgtool_stream *stream, const void *buf, UINT32 sz); UINT32 stream_write(imgtool_stream *stream, const void *buf, UINT32 sz);
UINT64 stream_size(imgtool_stream *stream); UINT64 stream_size(imgtool_stream *stream);

View File

@ -554,7 +554,7 @@ int main(int argc, char *argv[])
// open the destination file // open the destination file
chd_resample_compressor dstfile(srcfile, info, INT64(offset * 65536.0 * 256.0), INT64(slope * 65536.0 * 256.0)); chd_resample_compressor dstfile(srcfile, info, INT64(offset * 65536.0 * 256.0), INT64(slope * 65536.0 * 256.0));
err = create_chd(dstfile, dstfilename, srcfile, info); err = create_chd(dstfile, dstfilename, srcfile, info);
if (dstfile == nullptr) if (!dstfile.opened())
{ {
fprintf(stderr, "Unable to create file '%s'\n", dstfilename); fprintf(stderr, "Unable to create file '%s'\n", dstfilename);
return 1; return 1;

View File

@ -72,7 +72,7 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
bitmap_argb32 bitmap2; bitmap_argb32 bitmap2;
bitmap_argb32 finalbitmap; bitmap_argb32 finalbitmap;
int width, height, maxwidth; int width, height, maxwidth;
core_file *file = nullptr; util::core_file::ptr file;
file_error filerr; file_error filerr;
png_error pngerr; png_error pngerr;
int error = 100; int error = 100;
@ -80,7 +80,7 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
int x, y; int x, y;
/* open the source image */ /* open the source image */
filerr = core_fopen(imgfile1.c_str(), OPEN_FLAG_READ, &file); filerr = util::core_file::open(imgfile1.c_str(), OPEN_FLAG_READ, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
printf("Could not open %s (%d)\n", imgfile1.c_str(), filerr); printf("Could not open %s (%d)\n", imgfile1.c_str(), filerr);
@ -88,8 +88,8 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
} }
/* load the source image */ /* load the source image */
pngerr = png_read_bitmap(file, bitmap1); pngerr = png_read_bitmap(*file, bitmap1);
core_fclose(file); file.reset();
if (pngerr != PNGERR_NONE) if (pngerr != PNGERR_NONE)
{ {
printf("Could not read %s (%d)\n", imgfile1.c_str(), pngerr); printf("Could not read %s (%d)\n", imgfile1.c_str(), pngerr);
@ -97,7 +97,7 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
} }
/* open the source image */ /* open the source image */
filerr = core_fopen(imgfile2.c_str(), OPEN_FLAG_READ, &file); filerr = util::core_file::open(imgfile2.c_str(), OPEN_FLAG_READ, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
printf("Could not open %s (%d)\n", imgfile2.c_str(), filerr); printf("Could not open %s (%d)\n", imgfile2.c_str(), filerr);
@ -105,8 +105,8 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
} }
/* load the source image */ /* load the source image */
pngerr = png_read_bitmap(file, bitmap2); pngerr = png_read_bitmap(*file, bitmap2);
core_fclose(file); file.reset();
if (pngerr != PNGERR_NONE) if (pngerr != PNGERR_NONE)
{ {
printf("Could not read %s (%d)\n", imgfile2.c_str(), pngerr); printf("Could not read %s (%d)\n", imgfile2.c_str(), pngerr);
@ -170,14 +170,14 @@ static int generate_png_diff(const std::string& imgfile1, const std::string& img
} }
/* write the final PNG */ /* write the final PNG */
filerr = core_fopen(outfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &file); filerr = util::core_file::open(outfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
printf("Could not open %s (%d)\n", outfilename.c_str(), filerr); printf("Could not open %s (%d)\n", outfilename.c_str(), filerr);
goto error; goto error;
} }
pngerr = png_write_bitmap(file, nullptr, finalbitmap, 0, nullptr); pngerr = png_write_bitmap(*file, nullptr, finalbitmap, 0, nullptr);
core_fclose(file); file.reset();
if (pngerr != PNGERR_NONE) if (pngerr != PNGERR_NONE)
{ {
printf("Could not write %s (%d)\n", outfilename.c_str(), pngerr); printf("Could not write %s (%d)\n", outfilename.c_str(), pngerr);

View File

@ -148,15 +148,15 @@ static int CLIB_DECL compare_file(const void *file0ptr, const void *file1ptr);
static summary_file *sort_file_list(void); static summary_file *sort_file_list(void);
/* HTML helpers */ /* HTML helpers */
static core_file *create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &title); static util::core_file::ptr create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &title);
static void output_footer_and_close_file(core_file *file, std::string &templatefile, std::string &title); static void output_footer_and_close_file(util::core_file::ptr &&file, std::string &templatefile, std::string &title);
/* report generators */ /* report generators */
static void output_report(std::string &dirname, std::string &tempheader, std::string &tempfooter, summary_file *filelist); static void output_report(std::string &dirname, std::string &tempheader, std::string &tempfooter, summary_file *filelist);
static int compare_screenshots(summary_file *curfile); static int compare_screenshots(summary_file *curfile);
static int generate_png_diff(const summary_file *curfile, std::string &destdir, const char *destname); static int generate_png_diff(const summary_file *curfile, std::string &destdir, const char *destname);
static void create_linked_file(std::string &dirname, const summary_file *curfile, const summary_file *prevfile, const summary_file *nextfile, const char *pngfile, std::string &tempheader, std::string &tempfooter); static void create_linked_file(std::string &dirname, const summary_file *curfile, const summary_file *prevfile, const summary_file *nextfile, const char *pngfile, std::string &tempheader, std::string &tempfooter);
static void append_driver_list_table(const char *header, std::string &dirname, core_file *indexfile, const summary_file *listhead, std::string &tempheader, std::string &tempfooter); static void append_driver_list_table(const char *header, std::string &dirname, util::core_file &indexfile, const summary_file *listhead, std::string &tempheader, std::string &tempfooter);
@ -235,7 +235,7 @@ int main(int argc, char *argv[])
/* read the template file into an astring */ /* read the template file into an astring */
std::string tempheader; std::string tempheader;
if (core_fload(tempfilename.c_str(), &buffer, &bufsize) == FILERR_NONE) if (util::core_file::load(tempfilename.c_str(), &buffer, bufsize) == FILERR_NONE)
{ {
tempheader.assign((const char *)buffer, bufsize); tempheader.assign((const char *)buffer, bufsize);
osd_free(buffer); osd_free(buffer);
@ -560,18 +560,18 @@ static summary_file *sort_file_list(void)
HTML file with a standard header HTML file with a standard header
-------------------------------------------------*/ -------------------------------------------------*/
static core_file *create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &title) static util::core_file::ptr create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &title)
{ {
core_file *file; util::core_file::ptr file;
/* create the indexfile */ /* create the indexfile */
if (core_fopen(filename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS | OPEN_FLAG_NO_BOM, &file) != FILERR_NONE) if (util::core_file::open(filename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS | OPEN_FLAG_NO_BOM, file) != FILERR_NONE)
return nullptr; return util::core_file::ptr();
/* print a header */ /* print a header */
std::string modified(templatefile); std::string modified(templatefile);
strreplace(modified, "<!--TITLE-->", title.c_str()); strreplace(modified, "<!--TITLE-->", title.c_str());
core_fwrite(file, modified.c_str(), modified.length()); file->write(modified.c_str(), modified.length());
/* return the file */ /* return the file */
return file; return file;
@ -583,12 +583,12 @@ static core_file *create_file_and_output_header(std::string &filename, std::stri
standard footer to an HTML file and close it standard footer to an HTML file and close it
-------------------------------------------------*/ -------------------------------------------------*/
static void output_footer_and_close_file(core_file *file, std::string &templatefile, std::string &title) static void output_footer_and_close_file(util::core_file::ptr &&file, std::string &templatefile, std::string &title)
{ {
std::string modified(templatefile); std::string modified(templatefile);
strreplace(modified, "<!--TITLE-->", title.c_str()); strreplace(modified, "<!--TITLE-->", title.c_str());
core_fwrite(file, modified.c_str(), modified.length()); file->write(modified.c_str(), modified.length());
core_fclose(file); file.reset();
} }
@ -609,7 +609,7 @@ static void output_report(std::string &dirname, std::string &tempheader, std::st
std::string title("MAME Regressions"); std::string title("MAME Regressions");
std::string tempname; std::string tempname;
int listnum, bucknum; int listnum, bucknum;
core_file *indexfile; util::core_file::ptr indexfile;
int count = 0, total; int count = 0, total;
/* initialize the lists */ /* initialize the lists */
@ -688,7 +688,7 @@ static void output_report(std::string &dirname, std::string &tempheader, std::st
/* output header */ /* output header */
tempname = string_format("%s" PATH_SEPARATOR "%s", dirname.c_str(), "index.html"); tempname = string_format("%s" PATH_SEPARATOR "%s", dirname.c_str(), "index.html");
indexfile = create_file_and_output_header(tempname, tempheader, title); indexfile = create_file_and_output_header(tempname, tempheader, title);
if (indexfile == nullptr) if (!indexfile)
{ {
fprintf(stderr, "Error creating file '%s'\n", tempname.c_str()); fprintf(stderr, "Error creating file '%s'\n", tempname.c_str());
return; return;
@ -702,12 +702,12 @@ static void output_report(std::string &dirname, std::string &tempheader, std::st
if (buckethead[curbucket] != nullptr) if (buckethead[curbucket] != nullptr)
{ {
fprintf(stderr, "Outputting bucket: %s\n", bucket_name[curbucket]); fprintf(stderr, "Outputting bucket: %s\n", bucket_name[curbucket]);
append_driver_list_table(bucket_name[curbucket], dirname, indexfile, buckethead[curbucket], tempheader, tempfooter); append_driver_list_table(bucket_name[curbucket], dirname, *indexfile, buckethead[curbucket], tempheader, tempfooter);
} }
} }
/* output footer */ /* output footer */
output_footer_and_close_file(indexfile, tempfooter, title); output_footer_and_close_file(std::move(indexfile), tempfooter, title);
} }
@ -729,13 +729,13 @@ static int compare_screenshots(summary_file *curfile)
{ {
std::string fullname; std::string fullname;
file_error filerr; file_error filerr;
core_file *file; util::core_file::ptr file;
/* get the filename for the image */ /* get the filename for the image */
fullname = string_format("%s" PATH_SEPARATOR "snap" PATH_SEPARATOR "%s" PATH_SEPARATOR "final.png", lists[listnum].dir, curfile->name); fullname = string_format("%s" PATH_SEPARATOR "snap" PATH_SEPARATOR "%s" PATH_SEPARATOR "final.png", lists[listnum].dir, curfile->name);
/* open the file */ /* open the file */
filerr = core_fopen(fullname.c_str(), OPEN_FLAG_READ, &file); filerr = util::core_file::open(fullname.c_str(), OPEN_FLAG_READ, file);
/* if that failed, look in the old location */ /* if that failed, look in the old location */
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
@ -744,14 +744,14 @@ static int compare_screenshots(summary_file *curfile)
fullname = string_format("%s" PATH_SEPARATOR "snap" PATH_SEPARATOR "_%s.png", lists[listnum].dir, curfile->name); fullname = string_format("%s" PATH_SEPARATOR "snap" PATH_SEPARATOR "_%s.png", lists[listnum].dir, curfile->name);
/* open the file */ /* open the file */
filerr = core_fopen(fullname.c_str(), OPEN_FLAG_READ, &file); filerr = util::core_file::open(fullname.c_str(), OPEN_FLAG_READ, file);
} }
/* if that worked, load the file */ /* if that worked, load the file */
if (filerr == FILERR_NONE) if (filerr == FILERR_NONE)
{ {
png_read_bitmap(file, bitmaps[listnum]); png_read_bitmap(*file, bitmaps[listnum]);
core_fclose(file); file.reset();
} }
} }
@ -836,7 +836,7 @@ static int generate_png_diff(const summary_file *curfile, std::string &destdir,
int width, height, maxwidth; int width, height, maxwidth;
int bitmapcount = 0; int bitmapcount = 0;
int listnum, bmnum; int listnum, bmnum;
core_file *file = nullptr; util::core_file::ptr file;
file_error filerr; file_error filerr;
png_error pngerr; png_error pngerr;
int error = -1; int error = -1;
@ -853,13 +853,13 @@ static int generate_png_diff(const summary_file *curfile, std::string &destdir,
tempname = string_format("%s" PATH_SEPARATOR "%s", lists[listnum].dir, srcimgname.c_str()); tempname = string_format("%s" PATH_SEPARATOR "%s", lists[listnum].dir, srcimgname.c_str());
/* open the source image */ /* open the source image */
filerr = core_fopen(tempname.c_str(), OPEN_FLAG_READ, &file); filerr = util::core_file::open(tempname.c_str(), OPEN_FLAG_READ, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
goto error; goto error;
/* load the source image */ /* load the source image */
pngerr = png_read_bitmap(file, bitmaps[bitmapcount++]); pngerr = png_read_bitmap(*file, bitmaps[bitmapcount++]);
core_fclose(file); file.reset();
if (pngerr != PNGERR_NONE) if (pngerr != PNGERR_NONE)
goto error; goto error;
} }
@ -925,11 +925,11 @@ static int generate_png_diff(const summary_file *curfile, std::string &destdir,
} }
/* write the final PNG */ /* write the final PNG */
filerr = core_fopen(dstfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &file); filerr = util::core_file::open(dstfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, file);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
goto error; goto error;
pngerr = png_write_bitmap(file, nullptr, finalbitmap, 0, nullptr); pngerr = png_write_bitmap(*file, nullptr, finalbitmap, 0, nullptr);
core_fclose(file); file.reset();
if (pngerr != PNGERR_NONE) if (pngerr != PNGERR_NONE)
goto error; goto error;
@ -953,7 +953,7 @@ static void create_linked_file(std::string &dirname, const summary_file *curfile
std::string linkname; std::string linkname;
std::string filename; std::string filename;
std::string title; std::string title;
core_file *linkfile; util::core_file::ptr linkfile;
int listnum; int listnum;
/* create the filename */ /* create the filename */
@ -970,19 +970,19 @@ static void create_linked_file(std::string &dirname, const summary_file *curfile
} }
/* link to the previous/next entries */ /* link to the previous/next entries */
core_fprintf(linkfile, "\t<p>\n"); linkfile->printf("\t<p>\n");
core_fprintf(linkfile, "\t<table width=\"100%%\">\n"); linkfile->printf("\t<table width=\"100%%\">\n");
core_fprintf(linkfile, "\t\t<td align=\"left\" width=\"40%%\" style=\"border:none\">"); linkfile->printf("\t\t<td align=\"left\" width=\"40%%\" style=\"border:none\">");
if (prevfile != nullptr) if (prevfile != nullptr)
core_fprintf(linkfile, "<a href=\"%s.html\"><< %s (%s)</a>", prevfile->name, prevfile->name, prevfile->source); linkfile->printf("<a href=\"%s.html\"><< %s (%s)</a>", prevfile->name, prevfile->name, prevfile->source);
core_fprintf(linkfile, "</td>\n"); linkfile->printf("</td>\n");
core_fprintf(linkfile, "\t\t<td align=\"center\" width=\"20%%\" style=\"border:none\"><a href=\"index.html\">Home</a></td>\n"); linkfile->printf("\t\t<td align=\"center\" width=\"20%%\" style=\"border:none\"><a href=\"index.html\">Home</a></td>\n");
core_fprintf(linkfile, "\t\t<td align=\"right\" width=\"40%%\" style=\"border:none\">"); linkfile->printf("\t\t<td align=\"right\" width=\"40%%\" style=\"border:none\">");
if (nextfile != nullptr) if (nextfile != nullptr)
core_fprintf(linkfile, "<a href=\"%s.html\">%s (%s) >></a>", nextfile->name, nextfile->name, nextfile->source); linkfile->printf("<a href=\"%s.html\">%s (%s) >></a>", nextfile->name, nextfile->name, nextfile->source);
core_fprintf(linkfile, "</td>\n"); linkfile->printf("</td>\n");
core_fprintf(linkfile, "\t</table>\n"); linkfile->printf("\t</table>\n");
core_fprintf(linkfile, "\t</p>\n"); linkfile->printf("\t</p>\n");
/* output data for each one */ /* output data for each one */
for (listnum = 0; listnum < list_count; listnum++) for (listnum = 0; listnum < list_count; listnum++)
@ -990,34 +990,34 @@ static void create_linked_file(std::string &dirname, const summary_file *curfile
int imageindex = -1; int imageindex = -1;
/* generate the HTML */ /* generate the HTML */
core_fprintf(linkfile, "\n\t<h2>%s</h2>\n", lists[listnum].version); linkfile->printf("\n\t<h2>%s</h2>\n", lists[listnum].version);
core_fprintf(linkfile, "\t<p>\n"); linkfile->printf("\t<p>\n");
core_fprintf(linkfile, "\t<b>Status:</b> %s\n", status_text[curfile->status[listnum]]); linkfile->printf("\t<b>Status:</b> %s\n", status_text[curfile->status[listnum]]);
if (pngfile != nullptr) if (pngfile != nullptr)
imageindex = get_unique_index(curfile, listnum); imageindex = get_unique_index(curfile, listnum);
if (imageindex != -1) if (imageindex != -1)
core_fprintf(linkfile, " [%d]", imageindex); linkfile->printf(" [%d]", imageindex);
core_fprintf(linkfile, "\t</p>\n"); linkfile->printf("\t</p>\n");
if (curfile->text[listnum].length() != 0) if (curfile->text[listnum].length() != 0)
{ {
core_fprintf(linkfile, "\t<p>\n"); linkfile->printf("\t<p>\n");
core_fprintf(linkfile, "\t<b>Errors:</b>\n"); linkfile->printf("\t<b>Errors:</b>\n");
core_fprintf(linkfile, "\t<pre>%s</pre>\n", curfile->text[listnum].c_str()); linkfile->printf("\t<pre>%s</pre>\n", curfile->text[listnum].c_str());
core_fprintf(linkfile, "\t</p>\n"); linkfile->printf("\t</p>\n");
} }
} }
/* output link to the image */ /* output link to the image */
if (pngfile != nullptr) if (pngfile != nullptr)
{ {
core_fprintf(linkfile, "\n\t<h2>Screenshot Comparisons</h2>\n"); linkfile->printf("\n\t<h2>Screenshot Comparisons</h2>\n");
core_fprintf(linkfile, "\t<p>\n"); linkfile->printf("\t<p>\n");
core_fprintf(linkfile, "\t<img src=\"%s\" />\n", pngfile); linkfile->printf("\t<img src=\"%s\" />\n", pngfile);
core_fprintf(linkfile, "\t</p>\n"); linkfile->printf("\t</p>\n");
} }
/* output footer */ /* output footer */
output_footer_and_close_file(linkfile, tempfooter, title); output_footer_and_close_file(std::move(linkfile), tempfooter, title);
} }
@ -1026,28 +1026,28 @@ static void create_linked_file(std::string &dirname, const summary_file *curfile
of drivers from a list to an HTML file of drivers from a list to an HTML file
-------------------------------------------------*/ -------------------------------------------------*/
static void append_driver_list_table(const char *header, std::string &dirname, core_file *indexfile, const summary_file *listhead, std::string &tempheader, std::string &tempfooter) static void append_driver_list_table(const char *header, std::string &dirname, util::core_file &indexfile, const summary_file *listhead, std::string &tempheader, std::string &tempfooter)
{ {
const summary_file *curfile, *prevfile; const summary_file *curfile, *prevfile;
int width = 100 / (2 + list_count); int width = 100 / (2 + list_count);
int listnum; int listnum;
/* output a header */ /* output a header */
core_fprintf(indexfile, "\t<h2>%s</h2>\n", header); indexfile.printf("\t<h2>%s</h2>\n", header);
/* start the table */ /* start the table */
core_fprintf(indexfile, "\t<p><table width=\"90%%\">\n"); indexfile.printf("\t<p><table width=\"90%%\">\n");
core_fprintf(indexfile, "\t\t<tr>\n\t\t\t<th width=\"%d%%\">Source</th><th width=\"%d%%\">Driver</th>", width, width); indexfile.printf("\t\t<tr>\n\t\t\t<th width=\"%d%%\">Source</th><th width=\"%d%%\">Driver</th>", width, width);
for (listnum = 0; listnum < list_count; listnum++) for (listnum = 0; listnum < list_count; listnum++)
core_fprintf(indexfile, "<th width=\"%d%%\">%s</th>", width, lists[listnum].version); indexfile.printf("<th width=\"%d%%\">%s</th>", width, lists[listnum].version);
core_fprintf(indexfile, "\n\t\t</tr>\n"); indexfile.printf("\n\t\t</tr>\n");
/* if nothing, print a default message */ /* if nothing, print a default message */
if (listhead == nullptr) if (listhead == nullptr)
{ {
core_fprintf(indexfile, "\t\t<tr>\n\t\t\t"); indexfile.printf("\t\t<tr>\n\t\t\t");
core_fprintf(indexfile, "<td colspan=\"%d\" align=\"center\">(No regressions detected)</td>", list_count + 2); indexfile.printf("<td colspan=\"%d\" align=\"center\">(No regressions detected)</td>", list_count + 2);
core_fprintf(indexfile, "\n\t\t</tr>\n"); indexfile.printf("\n\t\t</tr>\n");
} }
/* iterate over files */ /* iterate over files */
@ -1083,10 +1083,10 @@ static void append_driver_list_table(const char *header, std::string &dirname, c
create_linked_file(dirname, curfile, prevfile, curfile->next, (pngdiffname[0] == 0) ? nullptr : pngdiffname, tempheader, tempfooter); create_linked_file(dirname, curfile, prevfile, curfile->next, (pngdiffname[0] == 0) ? nullptr : pngdiffname, tempheader, tempfooter);
/* create a row */ /* create a row */
core_fprintf(indexfile, "\t\t<tr>\n\t\t\t"); indexfile.printf("\t\t<tr>\n\t\t\t");
if (rowspan > 0) if (rowspan > 0)
core_fprintf(indexfile, "<td rowspan=\"%d\">%s</td>", rowspan, curfile->source); indexfile.printf("<td rowspan=\"%d\">%s</td>", rowspan, curfile->source);
core_fprintf(indexfile, "<td><a href=\"%s.html\">%s</a></td>", curfile->name, curfile->name); indexfile.printf("<td><a href=\"%s.html\">%s</a></td>", curfile->name, curfile->name);
for (listnum = 0; listnum < list_count; listnum++) for (listnum = 0; listnum < list_count; listnum++)
{ {
int unique_index = -1; int unique_index = -1;
@ -1094,16 +1094,16 @@ static void append_driver_list_table(const char *header, std::string &dirname, c
if (pngdiffname[0] != 0) if (pngdiffname[0] != 0)
unique_index = get_unique_index(curfile, listnum); unique_index = get_unique_index(curfile, listnum);
if (unique_index != -1) if (unique_index != -1)
core_fprintf(indexfile, "<td><span style=\"%s\">&nbsp;&nbsp;&nbsp;</span> %s [<a href=\"%s\" target=\"blank\">%d</a>]</td>", status_color[curfile->status[listnum]], status_text[curfile->status[listnum]], pngdiffname, unique_index); indexfile.printf("<td><span style=\"%s\">&nbsp;&nbsp;&nbsp;</span> %s [<a href=\"%s\" target=\"blank\">%d</a>]</td>", status_color[curfile->status[listnum]], status_text[curfile->status[listnum]], pngdiffname, unique_index);
else else
core_fprintf(indexfile, "<td><span style=\"%s\">&nbsp;&nbsp;&nbsp;</span> %s</td>", status_color[curfile->status[listnum]], status_text[curfile->status[listnum]]); indexfile.printf("<td><span style=\"%s\">&nbsp;&nbsp;&nbsp;</span> %s</td>", status_color[curfile->status[listnum]], status_text[curfile->status[listnum]]);
} }
core_fprintf(indexfile, "\n\t\t</tr>\n"); indexfile.printf("\n\t\t</tr>\n");
/* also print the name and source file */ /* also print the name and source file */
printf("%s %s\n", curfile->name, curfile->source); printf("%s %s\n", curfile->name, curfile->source);
} }
/* end of table */ /* end of table */
core_fprintf(indexfile, "</table></p>\n"); indexfile.printf("</table></p>\n");
} }

View File

@ -64,7 +64,7 @@ static void compute_hash_as_string(std::string &buffer, void *data, UINT32 lengt
static int split_file(const char *filename, const char *basename, UINT32 splitsize) static int split_file(const char *filename, const char *basename, UINT32 splitsize)
{ {
std::string outfilename, basefilename, splitfilename; std::string outfilename, basefilename, splitfilename;
core_file *outfile = nullptr, *infile = nullptr, *splitfile = nullptr; util::core_file::ptr outfile, infile, splitfile;
std::string computedhash; std::string computedhash;
void *splitbuffer = nullptr; void *splitbuffer = nullptr;
int index, partnum; int index, partnum;
@ -81,7 +81,7 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
splitsize *= 1024 * 1024; splitsize *= 1024 * 1024;
// open the file for read // open the file for read
filerr = core_fopen(filename, OPEN_FLAG_READ, &infile); filerr = util::core_file::open(filename, OPEN_FLAG_READ, infile);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
fprintf(stderr, "Fatal error: unable to open file '%s'\n", filename); fprintf(stderr, "Fatal error: unable to open file '%s'\n", filename);
@ -89,7 +89,7 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
} }
// get the total length // get the total length
totallength = core_fsize(infile); totallength = infile->size();
if (totallength < splitsize) if (totallength < splitsize)
{ {
fprintf(stderr, "Fatal error: file is smaller than the split size\n"); fprintf(stderr, "Fatal error: file is smaller than the split size\n");
@ -119,7 +119,7 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
splitfilename.assign(basename).append(".split"); splitfilename.assign(basename).append(".split");
// create the split file // create the split file
filerr = core_fopen(splitfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, &splitfile); filerr = util::core_file::open(splitfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, splitfile);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
fprintf(stderr, "Fatal error: unable to create split file '%s'\n", splitfilename.c_str()); fprintf(stderr, "Fatal error: unable to create split file '%s'\n", splitfilename.c_str());
@ -127,8 +127,8 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
} }
// write the basics out // write the basics out
core_fprintf(splitfile, "splitfile=%s\n", basefilename.c_str()); splitfile->printf("splitfile=%s\n", basefilename.c_str());
core_fprintf(splitfile, "splitsize=%d\n", splitsize); splitfile->printf("splitsize=%d\n", splitsize);
printf("Split file is '%s'\n", splitfilename.c_str()); printf("Split file is '%s'\n", splitfilename.c_str());
printf("Splitting file %s into chunks of %dMB...\n", basefilename.c_str(), splitsize / (1024 * 1024)); printf("Splitting file %s into chunks of %dMB...\n", basefilename.c_str(), splitsize / (1024 * 1024));
@ -141,7 +141,7 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
printf("Reading part %d...", partnum); printf("Reading part %d...", partnum);
// read as much as we can from the file // read as much as we can from the file
length = core_fread(infile, splitbuffer, splitsize); length = infile->read(splitbuffer, splitsize);
if (length == 0) if (length == 0)
break; break;
@ -149,13 +149,13 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
compute_hash_as_string(computedhash, splitbuffer, length); compute_hash_as_string(computedhash, splitbuffer, length);
// write that info to the split file // write that info to the split file
core_fprintf(splitfile, "hash=%s file=%s.%03d\n", computedhash.c_str(), basefilename.c_str(), partnum); splitfile->printf("hash=%s file=%s.%03d\n", computedhash.c_str(), basefilename.c_str(), partnum);
// compute the full filename for this guy // compute the full filename for this guy
outfilename = string_format("%s.%03d", basename, partnum); outfilename = string_format("%s.%03d", basename, partnum);
// create it // create it
filerr = core_fopen(outfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &outfile); filerr = util::core_file::open(outfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, outfile);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
printf("\n"); printf("\n");
@ -166,15 +166,14 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
printf(" writing %s.%03d...", basefilename.c_str(), partnum); printf(" writing %s.%03d...", basefilename.c_str(), partnum);
// write the data // write the data
actual = core_fwrite(outfile, splitbuffer, length); actual = outfile->write(splitbuffer, length);
if (actual != length) if (actual != length)
{ {
printf("\n"); printf("\n");
fprintf(stderr, "Fatal error: Error writing output file (out of space?)\n"); fprintf(stderr, "Fatal error: Error writing output file (out of space?)\n");
goto cleanup; goto cleanup;
} }
core_fclose(outfile); outfile.reset();
outfile = nullptr;
printf(" done\n"); printf(" done\n");
@ -188,17 +187,17 @@ static int split_file(const char *filename, const char *basename, UINT32 splitsi
error = 0; error = 0;
cleanup: cleanup:
if (splitfile != nullptr) if (splitfile)
{ {
core_fclose(splitfile); splitfile.reset();
if (error != 0) if (error != 0)
remove(splitfilename.c_str()); remove(splitfilename.c_str());
} }
if (infile != nullptr) if (infile)
core_fclose(infile); infile.reset();
if (outfile != nullptr) if (outfile)
{ {
core_fclose(outfile); outfile.reset();
if (error != 0) if (error != 0)
remove(outfilename.c_str()); remove(outfilename.c_str());
} }
@ -218,7 +217,7 @@ static int join_file(const char *filename, const char *outname, int write_output
std::string expectedhash, computedhash; std::string expectedhash, computedhash;
std::string outfilename, infilename; std::string outfilename, infilename;
std::string basepath; std::string basepath;
core_file *outfile = nullptr, *infile = nullptr, *splitfile = nullptr; util::core_file::ptr outfile, infile, splitfile;
void *splitbuffer = nullptr; void *splitbuffer = nullptr;
file_error filerr; file_error filerr;
UINT32 splitsize; UINT32 splitsize;
@ -227,7 +226,7 @@ static int join_file(const char *filename, const char *outname, int write_output
int index; int index;
// open the file for read // open the file for read
filerr = core_fopen(filename, OPEN_FLAG_READ, &splitfile); filerr = util::core_file::open(filename, OPEN_FLAG_READ, splitfile);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
fprintf(stderr, "Fatal error: unable to open file '%s'\n", filename); fprintf(stderr, "Fatal error: unable to open file '%s'\n", filename);
@ -235,7 +234,7 @@ static int join_file(const char *filename, const char *outname, int write_output
} }
// read the first line and verify this is a split file // read the first line and verify this is a split file
if (!core_fgets(buffer, sizeof(buffer), splitfile) || strncmp(buffer, "splitfile=", 10) != 0) if (!splitfile->gets(buffer, sizeof(buffer)) || strncmp(buffer, "splitfile=", 10) != 0)
{ {
fprintf(stderr, "Fatal error: corrupt or incomplete split file at line:\n%s\n", buffer); fprintf(stderr, "Fatal error: corrupt or incomplete split file at line:\n%s\n", buffer);
goto cleanup; goto cleanup;
@ -258,7 +257,7 @@ static int join_file(const char *filename, const char *outname, int write_output
outfilename.insert(0, basepath); outfilename.insert(0, basepath);
// read the split size // read the split size
if (!core_fgets(buffer, sizeof(buffer), splitfile) || sscanf(buffer, "splitsize=%d", &splitsize) != 1) if (!splitfile->gets(buffer, sizeof(buffer)) || sscanf(buffer, "splitsize=%d", &splitsize) != 1)
{ {
fprintf(stderr, "Fatal error: corrupt or incomplete split file at line:\n%s\n", buffer); fprintf(stderr, "Fatal error: corrupt or incomplete split file at line:\n%s\n", buffer);
goto cleanup; goto cleanup;
@ -268,17 +267,16 @@ static int join_file(const char *filename, const char *outname, int write_output
if (write_output) if (write_output)
{ {
// don't overwrite the original! // don't overwrite the original!
filerr = core_fopen(outfilename.c_str(), OPEN_FLAG_READ, &outfile); filerr = util::core_file::open(outfilename.c_str(), OPEN_FLAG_READ, outfile);
if (filerr == FILERR_NONE) if (filerr == FILERR_NONE)
{ {
core_fclose(outfile); outfile.reset();
outfile = nullptr;
fprintf(stderr, "Fatal error: output file '%s' already exists\n", outfilename.c_str()); fprintf(stderr, "Fatal error: output file '%s' already exists\n", outfilename.c_str());
goto cleanup; goto cleanup;
} }
// open the output for write // open the output for write
filerr = core_fopen(outfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &outfile); filerr = util::core_file::open(outfilename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, outfile);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
fprintf(stderr, "Fatal error: unable to create file '%s'\n", outfilename.c_str()); fprintf(stderr, "Fatal error: unable to create file '%s'\n", outfilename.c_str());
@ -289,7 +287,7 @@ static int join_file(const char *filename, const char *outname, int write_output
printf("%s file '%s'...\n", write_output ? "Joining" : "Verifying", outfilename.c_str()); printf("%s file '%s'...\n", write_output ? "Joining" : "Verifying", outfilename.c_str());
// now iterate through each file // now iterate through each file
while (core_fgets(buffer, sizeof(buffer), splitfile)) while (splitfile->gets(buffer, sizeof(buffer)))
{ {
UINT32 length, actual; UINT32 length, actual;
@ -307,7 +305,7 @@ static int join_file(const char *filename, const char *outname, int write_output
// read the file's contents // read the file's contents
infilename.insert(0, basepath); infilename.insert(0, basepath);
filerr = core_fload(infilename.c_str(), &splitbuffer, &length); filerr = util::core_file::load(infilename.c_str(), &splitbuffer, length);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
printf("\n"); printf("\n");
@ -331,7 +329,7 @@ static int join_file(const char *filename, const char *outname, int write_output
{ {
printf(" writing..."); printf(" writing...");
actual = core_fwrite(outfile, splitbuffer, length); actual = outfile->write(splitbuffer, length);
if (actual != length) if (actual != length)
{ {
printf("\n"); printf("\n");
@ -357,13 +355,13 @@ static int join_file(const char *filename, const char *outname, int write_output
error = 0; error = 0;
cleanup: cleanup:
if (splitfile != nullptr) if (splitfile)
core_fclose(splitfile); splitfile.reset();
if (infile != nullptr) if (infile)
core_fclose(infile); infile.reset();
if (outfile != nullptr) if (outfile)
{ {
core_fclose(outfile); outfile.reset();
if (error != 0) if (error != 0)
remove(outfilename.c_str()); remove(outfilename.c_str());
} }

View File

@ -206,12 +206,12 @@ static int recurse_dir(int srcrootlen, int dstrootlen, std::string &srcdir, std:
static int output_file(file_type type, int srcrootlen, int dstrootlen, std::string &srcfile, std::string &dstfile, bool link_to_file, std::string &tempheader, std::string &tempfooter); static int output_file(file_type type, int srcrootlen, int dstrootlen, std::string &srcfile, std::string &dstfile, bool link_to_file, std::string &tempheader, std::string &tempfooter);
// HTML helpers // HTML helpers
static core_file *create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &path); static util::core_file::ptr create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &path);
static void output_footer_and_close_file(core_file *file, std::string &templatefile, std::string &path); static void output_footer_and_close_file(util::core_file::ptr &&file, std::string &templatefile, std::string &path);
// path helpers // path helpers
static std::string &normalized_subpath(std::string &dest, std::string &path, int start); static std::string &normalized_subpath(std::string &dest, std::string &path, int start);
static void output_path_as_links(core_file *file, std::string &path, bool end_is_directory, bool link_to_file); static void output_path_as_links(util::core_file &file, std::string &path, bool end_is_directory, bool link_to_file);
static bool find_include_file(std::string &srcincpath, int srcrootlen, int dstrootlen, std::string &srcfile, std::string &dstfile, std::string &filename); static bool find_include_file(std::string &srcincpath, int srcrootlen, int dstrootlen, std::string &srcfile, std::string &dstfile, std::string &filename);
@ -279,7 +279,7 @@ int main(int argc, char *argv[])
// read the template file into an std::string // read the template file into an std::string
UINT32 bufsize; UINT32 bufsize;
void *buffer; void *buffer;
if (core_fload(tempfilename.c_str(), &buffer, &bufsize) == FILERR_NONE) if (util::core_file::load(tempfilename.c_str(), &buffer, bufsize) == FILERR_NONE)
{ {
tempheader.assign((const char *)buffer, bufsize); tempheader.assign((const char *)buffer, bufsize);
osd_free(buffer); osd_free(buffer);
@ -333,12 +333,12 @@ static int recurse_dir(int srcrootlen, int dstrootlen, std::string &srcdir, std:
// create an index file // create an index file
std::string indexname; std::string indexname;
indexname = string_format("%s%c%s", dstdir.c_str(), PATH_SEPARATOR[0], "index.html"); indexname = string_format("%s%c%s", dstdir.c_str(), PATH_SEPARATOR[0], "index.html");
core_file *indexfile = create_file_and_output_header(indexname, tempheader, srcdir_subpath); util::core_file::ptr indexfile = create_file_and_output_header(indexname, tempheader, srcdir_subpath);
// output the directory navigation // output the directory navigation
core_fprintf(indexfile, "<h3>Viewing Directory: "); indexfile->printf("<h3>Viewing Directory: ");
output_path_as_links(indexfile, srcdir_subpath, true, false); output_path_as_links(*indexfile, srcdir_subpath, true, false);
core_fprintf(indexfile, "</h3>"); indexfile->printf("</h3>");
// iterate first over directories, then over files // iterate first over directories, then over files
int result = 0; int result = 0;
@ -398,7 +398,7 @@ static int recurse_dir(int srcrootlen, int dstrootlen, std::string &srcdir, std:
{ {
// add a header // add a header
if (curlist == list) if (curlist == list)
core_fprintf(indexfile, "\t<h2>%s</h2>\n\t<ul>\n", (entry_type == ENTTYPE_DIR) ? "Directories" : "Files"); indexfile->printf("\t<h2>%s</h2>\n\t<ul>\n", (entry_type == ENTTYPE_DIR) ? "Directories" : "Files");
// build the source filename // build the source filename
std::string srcfile; std::string srcfile;
@ -422,7 +422,7 @@ static int recurse_dir(int srcrootlen, int dstrootlen, std::string &srcdir, std:
{ {
dstfile = string_format("%s%c%s.html", dstdir.c_str(), PATH_SEPARATOR[0], curlist->name.c_str()); dstfile = string_format("%s%c%s.html", dstdir.c_str(), PATH_SEPARATOR[0], curlist->name.c_str());
if (indexfile != nullptr) if (indexfile != nullptr)
core_fprintf(indexfile, "\t<li><a href=\"%s.html\">%s</a></li>\n", curlist->name.c_str(), curlist->name.c_str()); indexfile->printf("\t<li><a href=\"%s.html\">%s</a></li>\n", curlist->name.c_str(), curlist->name.c_str());
result = output_file(type, srcrootlen, dstrootlen, srcfile, dstfile, srcdir.compare(dstdir) == 0, tempheader, tempfooter); result = output_file(type, srcrootlen, dstrootlen, srcfile, dstfile, srcdir.compare(dstdir) == 0, tempheader, tempfooter);
} }
} }
@ -432,14 +432,14 @@ static int recurse_dir(int srcrootlen, int dstrootlen, std::string &srcdir, std:
{ {
dstfile = string_format("%s%c%s", dstdir.c_str(), PATH_SEPARATOR[0], curlist->name.c_str()); dstfile = string_format("%s%c%s", dstdir.c_str(), PATH_SEPARATOR[0], curlist->name.c_str());
if (indexfile != nullptr) if (indexfile != nullptr)
core_fprintf(indexfile, "\t<li><a href=\"%s/index.html\">%s/</a></li>\n", curlist->name.c_str(), curlist->name.c_str()); indexfile->printf("\t<li><a href=\"%s/index.html\">%s/</a></li>\n", curlist->name.c_str(), curlist->name.c_str());
result = recurse_dir(srcrootlen, dstrootlen, srcfile, dstfile, tempheader, tempfooter); result = recurse_dir(srcrootlen, dstrootlen, srcfile, dstfile, tempheader, tempfooter);
} }
} }
// close the list if we found some stuff // close the list if we found some stuff
if (list != nullptr) if (list != nullptr)
core_fprintf(indexfile, "\t</ul>\n"); indexfile->printf("\t</ul>\n");
// free all the allocated entries // free all the allocated entries
while (list != nullptr) while (list != nullptr)
@ -451,7 +451,7 @@ static int recurse_dir(int srcrootlen, int dstrootlen, std::string &srcdir, std:
} }
if (indexfile != nullptr) if (indexfile != nullptr)
output_footer_and_close_file(indexfile, tempfooter, srcdir_subpath); output_footer_and_close_file(std::move(indexfile), tempfooter, srcdir_subpath);
return result; return result;
} }
@ -516,36 +516,35 @@ static int output_file(file_type type, int srcrootlen, int dstrootlen, std::stri
is_token[(UINT8)token_chars[toknum]] = true; is_token[(UINT8)token_chars[toknum]] = true;
// open the source file // open the source file
core_file *src; util::core_file::ptr src;
if (core_fopen(srcfile.c_str(), OPEN_FLAG_READ, &src) != FILERR_NONE) if (util::core_file::open(srcfile.c_str(), OPEN_FLAG_READ, src) != FILERR_NONE)
{ {
fprintf(stderr, "Unable to read file '%s'\n", srcfile.c_str()); fprintf(stderr, "Unable to read file '%s'\n", srcfile.c_str());
return 1; return 1;
} }
// open the output file // open the output file
core_file *dst = create_file_and_output_header(dstfile, tempheader, srcfile_subpath); util::core_file::ptr dst = create_file_and_output_header(dstfile, tempheader, srcfile_subpath);
if (dst == nullptr) if (dst == nullptr)
{ {
fprintf(stderr, "Unable to write file '%s'\n", dstfile.c_str()); fprintf(stderr, "Unable to write file '%s'\n", dstfile.c_str());
core_fclose(src);
return 1; return 1;
} }
// output the directory navigation // output the directory navigation
core_fprintf(dst, "<h3>Viewing File: "); dst->printf("<h3>Viewing File: ");
output_path_as_links(dst, srcfile_subpath, false, link_to_file); output_path_as_links(*dst, srcfile_subpath, false, link_to_file);
core_fprintf(dst, "</h3>"); dst->printf("</h3>");
// start with some tags // start with some tags
core_fprintf(dst, "\t<pre class=\"source\">\n"); dst->printf("\t<pre class=\"source\">\n");
// iterate over lines in the source file // iterate over lines in the source file
int linenum = 1; int linenum = 1;
bool in_comment = false; bool in_comment = false;
char srcline[4096]; char srcline[4096];
std::ostringstream dstline; std::ostringstream dstline;
while (core_fgets(srcline, ARRAY_LENGTH(srcline), src) != nullptr) while (src->gets(srcline, ARRAY_LENGTH(srcline)) != nullptr)
{ {
// start with the line number // start with the line number
dstline.str(""); dstline.str("");
@ -707,15 +706,14 @@ static int output_file(file_type type, int srcrootlen, int dstrootlen, std::stri
// append a break and move on // append a break and move on
dstline.put('\n'); dstline.put('\n');
core_fputs(dst, dstline.str().c_str()); dst->puts(dstline.str().c_str());
} }
// close tags // close tags
core_fprintf(dst, "\t</pre>\n"); dst->printf("\t</pre>\n");
// close the file // close the file
output_footer_and_close_file(dst, tempfooter, srcfile_subpath); output_footer_and_close_file(std::move(dst), tempfooter, srcfile_subpath);
core_fclose(src);
return 0; return 0;
} }
@ -730,17 +728,17 @@ static int output_file(file_type type, int srcrootlen, int dstrootlen, std::stri
HTML file with a standard header HTML file with a standard header
-------------------------------------------------*/ -------------------------------------------------*/
static core_file *create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &path) static util::core_file::ptr create_file_and_output_header(std::string &filename, std::string &templatefile, std::string &path)
{ {
// create the indexfile // create the indexfile
core_file *file; util::core_file::ptr file;
if (core_fopen(filename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS | OPEN_FLAG_NO_BOM, &file) != FILERR_NONE) if (util::core_file::open(filename.c_str(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS | OPEN_FLAG_NO_BOM, file) != FILERR_NONE)
return nullptr; return util::core_file::ptr();
// print a header // print a header
std::string modified(templatefile); std::string modified(templatefile);
strreplace(modified, "<!--PATH-->", path.c_str()); strreplace(modified, "<!--PATH-->", path.c_str());
core_fwrite(file, modified.c_str(), modified.length()); file->write(modified.c_str(), modified.length());
// return the file // return the file
return file; return file;
@ -752,12 +750,12 @@ static core_file *create_file_and_output_header(std::string &filename, std::stri
standard footer to an HTML file and close it standard footer to an HTML file and close it
-------------------------------------------------*/ -------------------------------------------------*/
static void output_footer_and_close_file(core_file *file, std::string &templatefile, std::string &path) static void output_footer_and_close_file(util::core_file::ptr &&file, std::string &templatefile, std::string &path)
{ {
std::string modified(templatefile); std::string modified(templatefile);
strreplace(modified, "<!--PATH-->", path.c_str()); strreplace(modified, "<!--PATH-->", path.c_str());
core_fwrite(file, modified.c_str(), modified.length()); file->write(modified.c_str(), modified.length());
core_fclose(file); file.reset();
} }
@ -783,7 +781,7 @@ static std::string &normalized_subpath(std::string &dest, std::string &path, int
series of links series of links
-------------------------------------------------*/ -------------------------------------------------*/
static void output_path_as_links(core_file *file, std::string &path, bool end_is_directory, bool link_to_file) static void output_path_as_links(util::core_file &file, std::string &path, bool end_is_directory, bool link_to_file)
{ {
// first count how deep we are // first count how deep we are
int srcdepth = 0; int srcdepth = 0;
@ -793,10 +791,10 @@ static void output_path_as_links(core_file *file, std::string &path, bool end_is
srcdepth++; srcdepth++;
// output a link to the root // output a link to the root
core_fprintf(file, "<a href=\""); file.printf("<a href=\"");
for (int depth = 0; depth < srcdepth; depth++) for (int depth = 0; depth < srcdepth; depth++)
core_fprintf(file, "../"); file.printf("../");
core_fprintf(file, "index.html\">&lt;root&gt;</a>/"); file.printf("index.html\">&lt;root&gt;</a>/");
// now output links to each path up the chain // now output links to each path up the chain
int curdepth = 0; int curdepth = 0;
@ -806,10 +804,10 @@ static void output_path_as_links(core_file *file, std::string &path, bool end_is
std::string substr(path, lastslash, slashindex - lastslash); std::string substr(path, lastslash, slashindex - lastslash);
curdepth++; curdepth++;
core_fprintf(file, "<a href=\""); file.printf("<a href=\"");
for (int depth = curdepth; depth < srcdepth; depth++) for (int depth = curdepth; depth < srcdepth; depth++)
core_fprintf(file, "../"); file.printf("../");
core_fprintf(file, "index.html\">%s</a>/", substr.c_str()); file.printf("index.html\">%s</a>/", substr.c_str());
lastslash = slashindex + 1; lastslash = slashindex + 1;
} }
@ -817,11 +815,11 @@ static void output_path_as_links(core_file *file, std::string &path, bool end_is
// and a final link to the current directory // and a final link to the current directory
std::string substr(path, lastslash, -1); std::string substr(path, lastslash, -1);
if (end_is_directory) if (end_is_directory)
core_fprintf(file, "<a href=\"index.html\">%s</a>", substr.c_str()); file.printf("<a href=\"index.html\">%s</a>", substr.c_str());
else if (link_to_file) else if (link_to_file)
core_fprintf(file, "<a href=\"%s\">%s</a>", substr.c_str(), substr.c_str()); file.printf("<a href=\"%s\">%s</a>", substr.c_str(), substr.c_str());
else else
core_fprintf(file, "<a href=\"%s.html\">%s</a>", substr.c_str(), substr.c_str()); file.printf("<a href=\"%s.html\">%s</a>", substr.c_str(), substr.c_str());
} }
@ -866,11 +864,11 @@ static bool find_include_file(std::string &srcincpath, int srcrootlen, int dstro
srcincpath.append(PATH_SEPARATOR).append(filename.substr(lastsepindex, -1)); srcincpath.append(PATH_SEPARATOR).append(filename.substr(lastsepindex, -1));
// see if we can open it // see if we can open it
core_file *testfile; util::core_file::ptr testfile;
if (core_fopen(srcincpath.c_str(), OPEN_FLAG_READ, &testfile) == FILERR_NONE) if (util::core_file::open(srcincpath.c_str(), OPEN_FLAG_READ, testfile) == FILERR_NONE)
{ {
// close the file // close the file
core_fclose(testfile); testfile.reset();
// find the longest matching directory substring between the include and source file // find the longest matching directory substring between the include and source file
lastsepindex = 0; lastsepindex = 0;

View File

@ -512,7 +512,7 @@ int main(int argc, char *argv[])
return 1; return 1;
// load the file // load the file
filerr = core_fload(opts.filename, &data, &length); filerr = util::core_file::load(opts.filename, &data, length);
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
{ {
fprintf(stderr, "Error opening file '%s'\n", opts.filename); fprintf(stderr, "Error opening file '%s'\n", opts.filename);