From 9fb5cb254197c599a0923de49cbb96fbd53868d6 Mon Sep 17 00:00:00 2001 From: Thomas Geiger Date: Thu, 13 Sep 2018 16:55:02 +0200 Subject: [PATCH 1/4] Optional output rom feature. Useful for automization and testing. --- src/asar/interface-cli.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/asar/interface-cli.cpp b/src/asar/interface-cli.cpp index 992b571d..4062b123 100644 --- a/src/asar/interface-cli.cpp +++ b/src/asar/interface-cli.cpp @@ -128,7 +128,7 @@ int main(int argc, char * argv[]) } //if (dot) *dot='.'; libcon_init(argc, argv, - "[options] asm_file [rom_file]\n\n" + "[options] asm_file [input_rom_file] [optional_output_rom_file]\n\n" "Supported options:\n\n" " --version \n" " Display version information.\n\n" @@ -220,6 +220,12 @@ int main(int argc, char * argv[]) postprocess_param = cmdlparam_addincludepath; postprocess_arg = ((const char*)par) + strlen("-I"); } + else if (checkstartmatch(par, "-o")) + { + puts("TESTING\n"); +// postprocess_param = cmdlparam_addincludepath; +// postprocess_arg = ((const char*)par) + strlen("-I"); + } else if (checkstartmatch(par, "-D")) { postprocess_param = cmdlparam_adddefine; @@ -328,10 +334,32 @@ int main(int argc, char * argv[]) printed_version = true; } string asmname=libcon_require_filename("Enter patch name:"); - string romname=libcon_optional_filename("Enter ROM name:", nullptr); - //char * outname=libcon_optional_filename("Enter output ROM name:", nullptr); + string romname=libcon_optional_filename("Enter input ROM name:", nullptr); + string outname=libcon_optional_filename("Enter optional output ROM name:", nullptr); libcon_end(); if (!strchr(asmname, '.') && !file_exists(asmname)) asmname+=".asm"; + + // Optional copy and work on outname instead of romname. This can be useful for auto build processes of final ROMs based on others + if(outname) { // Outname was set, so we create a copy of the file + if (!file_exists(romname)) + { + asar_throw_error(pass, error_type_fatal, error_id_create_rom_failed); + } + + char buf[BUFSIZ]; + size_t size; + FILE* source = fopen(romname, "rb"); + FILE* dest = fopen(outname, "wb"); + + while ((size = fread(buf, 1, BUFSIZ, source))) { + fwrite(buf, 1, size, dest); + } + fclose(source); + fclose(dest); + + romname = outname; + } + if (!romname) { string romnametmp = get_base_name(asmname); @@ -360,6 +388,7 @@ int main(int argc, char * argv[]) pause(err); return 1; } + //check if the ROM title and checksum looks sane if (romlen>=32768 && !ignoretitleerrors) { From 6f301370db65a38dc5163c05936abbf152051c21 Mon Sep 17 00:00:00 2001 From: Thomas Geiger Date: Thu, 13 Sep 2018 17:02:37 +0200 Subject: [PATCH 2/4] Add check for unopenable destination --- src/asar/interface-cli.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/asar/interface-cli.cpp b/src/asar/interface-cli.cpp index 4062b123..464bccd6 100644 --- a/src/asar/interface-cli.cpp +++ b/src/asar/interface-cli.cpp @@ -351,6 +351,11 @@ int main(int argc, char * argv[]) FILE* source = fopen(romname, "rb"); FILE* dest = fopen(outname, "wb"); + if(!dest) + { + asar_throw_error(pass, error_type_fatal, error_id_create_rom_failed); + } + while ((size = fread(buf, 1, BUFSIZ, source))) { fwrite(buf, 1, size, dest); } From 8e1259ac904bc0bb517a2794d6206f939db0e5cd Mon Sep 17 00:00:00 2001 From: Thomas Geiger Date: Thu, 13 Sep 2018 17:05:49 +0200 Subject: [PATCH 3/4] Add error message --- src/asar/errors.cpp | 2 ++ src/asar/errors.h | 2 ++ src/asar/interface-cli.cpp | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/asar/errors.cpp b/src/asar/errors.cpp index 7329d8c0..da466ac9 100644 --- a/src/asar/errors.cpp +++ b/src/asar/errors.cpp @@ -234,6 +234,8 @@ static asar_error_mapping asar_errors[] = { error_id_pullwarnings_without_pushwarnings, "warnings pull without matching warnings push." }, { error_id_failed_to_open_file_access_denied, "Failed to open file '%s'. Access denied." }, + + { error_id_outputfile_cannot_open, "Failed to open output destination for writing." }, }; // RPG Hacker: Sanity check. This makes sure that the element count of asar_warnings diff --git a/src/asar/errors.h b/src/asar/errors.h index e17ad119..c479ce43 100644 --- a/src/asar/errors.h +++ b/src/asar/errors.h @@ -211,6 +211,8 @@ enum asar_error_id : int error_id_failed_to_open_file_access_denied, + error_id_outputfile_cannot_open, + error_id_end, error_id_count = error_id_end - error_id_start - 1, }; diff --git a/src/asar/interface-cli.cpp b/src/asar/interface-cli.cpp index 464bccd6..fb7c0a4b 100644 --- a/src/asar/interface-cli.cpp +++ b/src/asar/interface-cli.cpp @@ -353,7 +353,7 @@ int main(int argc, char * argv[]) if(!dest) { - asar_throw_error(pass, error_type_fatal, error_id_create_rom_failed); + asar_throw_error(pass, error_type_fatal, error_id_outputfile_cannot_open); } while ((size = fread(buf, 1, BUFSIZ, source))) { From 1c880b45af9724365964ea7df7723f01995d3403 Mon Sep 17 00:00:00 2001 From: Thomas Geiger Date: Thu, 13 Sep 2018 17:07:09 +0200 Subject: [PATCH 4/4] Remove unused code from different strategy --- src/asar/interface-cli.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/asar/interface-cli.cpp b/src/asar/interface-cli.cpp index fb7c0a4b..92895080 100644 --- a/src/asar/interface-cli.cpp +++ b/src/asar/interface-cli.cpp @@ -220,12 +220,6 @@ int main(int argc, char * argv[]) postprocess_param = cmdlparam_addincludepath; postprocess_arg = ((const char*)par) + strlen("-I"); } - else if (checkstartmatch(par, "-o")) - { - puts("TESTING\n"); -// postprocess_param = cmdlparam_addincludepath; -// postprocess_arg = ((const char*)par) + strlen("-I"); - } else if (checkstartmatch(par, "-D")) { postprocess_param = cmdlparam_adddefine;