diff --git a/src/tools/amduat_pel_cli.c b/src/tools/amduat_pel_cli.c index 9832536..b0e0129 100644 --- a/src/tools/amduat_pel_cli.c +++ b/src/tools/amduat_pel_cli.c @@ -83,6 +83,7 @@ static void amduat_pel_cli_print_usage(FILE *stream) { "\n" "exec:\n" " amduat-pel exec --program PATH|-\n" + " [--program-format raw|artifact]\n" " [--input PATH ...] [--input-format raw|artifact]\n" " [--output-dir DIR] [--output-format raw|artifact]\n" " [--result-out PATH|-] [--format text|json]\n" @@ -657,6 +658,8 @@ static int amduat_pel_cli_cmd_exec(int argc, const char **input_paths = NULL; size_t input_paths_len = 0; amduat_asl_io_format_t input_format = AMDUAT_ASL_IO_RAW; + amduat_asl_io_format_t program_format = AMDUAT_ASL_IO_RAW; + bool program_format_set = false; amduat_asl_io_format_t output_format = AMDUAT_ASL_IO_RAW; amduat_format_output_t format; const char *output_dir = "."; @@ -709,6 +712,16 @@ static int amduat_pel_cli_cmd_exec(int argc, fprintf(stderr, "error: invalid input-format\n"); return AMDUAT_PEL_CLI_EXIT_USAGE; } + } else if (strcmp(argv[i], "--program-format") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "error: --program-format requires a value\n"); + return AMDUAT_PEL_CLI_EXIT_USAGE; + } + if (!amduat_asl_io_format_parse(argv[++i], &program_format)) { + fprintf(stderr, "error: invalid program-format\n"); + return AMDUAT_PEL_CLI_EXIT_USAGE; + } + program_format_set = true; } else if (strcmp(argv[i], "--output-dir") == 0) { if (i + 1 >= argc) { fprintf(stderr, "error: --output-dir requires a path\n"); @@ -756,6 +769,10 @@ static int amduat_pel_cli_cmd_exec(int argc, return AMDUAT_PEL_CLI_EXIT_USAGE; } + if (!program_format_set && input_format == AMDUAT_ASL_IO_ARTIFACT) { + program_format = AMDUAT_ASL_IO_ARTIFACT; + } + if (!amduat_pel_cli_read_path_once(program_path, &stdin_used, &program_bytes, @@ -808,19 +825,36 @@ static int amduat_pel_cli_cmd_exec(int argc, } } - if (!amduat_pel_exec_program_artifact( - amduat_artifact(amduat_octets(program_bytes, program_len)), - inputs, - input_paths_len, - NULL, - &outputs, - &outputs_len, - &result)) { - fprintf(stderr, "error: exec failed\n"); - free(program_bytes); - program_bytes = NULL; - exit_code = AMDUAT_PEL_CLI_EXIT_STORE; - goto exec_cleanup; + { + amduat_artifact_t program_artifact; + memset(&program_artifact, 0, sizeof(program_artifact)); + if (!amduat_asl_artifact_from_bytes(amduat_octets(program_bytes, + program_len), + program_format, + false, + amduat_type_tag(0), + &program_artifact)) { + fprintf(stderr, "error: invalid program artifact\n"); + free(program_bytes); + program_bytes = NULL; + exit_code = AMDUAT_PEL_CLI_EXIT_CODEC; + goto exec_cleanup; + } + if (!amduat_pel_exec_program_artifact(program_artifact, + inputs, + input_paths_len, + NULL, + &outputs, + &outputs_len, + &result)) { + amduat_asl_artifact_free(&program_artifact); + fprintf(stderr, "error: exec failed\n"); + free(program_bytes); + program_bytes = NULL; + exit_code = AMDUAT_PEL_CLI_EXIT_STORE; + goto exec_cleanup; + } + amduat_asl_artifact_free(&program_artifact); } free(program_bytes); program_bytes = NULL;