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" "\n"
"exec:\n" "exec:\n"
" amduat-pel exec --program PATH|-\n" " amduat-pel exec --program PATH|-\n"
" [--program-format raw|artifact]\n"
" [--input PATH ...] [--input-format raw|artifact]\n" " [--input PATH ...] [--input-format raw|artifact]\n"
" [--output-dir DIR] [--output-format raw|artifact]\n" " [--output-dir DIR] [--output-format raw|artifact]\n"
" [--result-out PATH|-] [--format text|json]\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; const char **input_paths = NULL;
size_t input_paths_len = 0; size_t input_paths_len = 0;
amduat_asl_io_format_t input_format = AMDUAT_ASL_IO_RAW; 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_asl_io_format_t output_format = AMDUAT_ASL_IO_RAW;
amduat_format_output_t format; amduat_format_output_t format;
const char *output_dir = "."; const char *output_dir = ".";
@ -709,6 +712,16 @@ static int amduat_pel_cli_cmd_exec(int argc,
fprintf(stderr, "error: invalid input-format\n"); fprintf(stderr, "error: invalid input-format\n");
return AMDUAT_PEL_CLI_EXIT_USAGE; 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) { } else if (strcmp(argv[i], "--output-dir") == 0) {
if (i + 1 >= argc) { if (i + 1 >= argc) {
fprintf(stderr, "error: --output-dir requires a path\n"); 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; 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, if (!amduat_pel_cli_read_path_once(program_path,
&stdin_used, &stdin_used,
&program_bytes, &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)), amduat_artifact_t program_artifact;
inputs, memset(&program_artifact, 0, sizeof(program_artifact));
input_paths_len, if (!amduat_asl_artifact_from_bytes(amduat_octets(program_bytes,
NULL, program_len),
&outputs, program_format,
&outputs_len, false,
&result)) { amduat_type_tag(0),
fprintf(stderr, "error: exec failed\n"); &program_artifact)) {
free(program_bytes); fprintf(stderr, "error: invalid program artifact\n");
program_bytes = NULL; free(program_bytes);
exit_code = AMDUAT_PEL_CLI_EXIT_STORE; program_bytes = NULL;
goto exec_cleanup; 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); free(program_bytes);
program_bytes = NULL; program_bytes = NULL;