Support program artifacts in exec

This commit is contained in:
Carl Niklas Rydberg 2025-12-22 07:34:49 +01:00
parent 5438b93efd
commit 4583b1cfd3

View file

@ -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,20 +825,37 @@ static int amduat_pel_cli_cmd_exec(int argc,
}
}
if (!amduat_pel_exec_program_artifact(
amduat_artifact(amduat_octets(program_bytes, program_len)),
{
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;