Promote ASL IO helpers
This commit is contained in:
parent
f48b73b75f
commit
edc81beb9b
|
|
@ -61,6 +61,7 @@ set(AMDUAT_UTIL_SRCS
|
||||||
|
|
||||||
set(AMDUAT_ASL_SRCS
|
set(AMDUAT_ASL_SRCS
|
||||||
src/kernel/asl/core.c
|
src/kernel/asl/core.c
|
||||||
|
src/near_core/asl/io.c
|
||||||
src/near_core/asl/parse.c
|
src/near_core/asl/parse.c
|
||||||
src/near_core/asl/store.c
|
src/near_core/asl/store.c
|
||||||
src/near_core/asl/ref_text.c
|
src/near_core/asl/ref_text.c
|
||||||
|
|
|
||||||
26
include/amduat/asl/io.h
Normal file
26
include/amduat/asl/io.h
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef AMDUAT_ASL_IO_H
|
||||||
|
#define AMDUAT_ASL_IO_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Caller owns any heap allocations returned in out_bytes. */
|
||||||
|
bool amduat_asl_read_stream(FILE *stream, uint8_t **out_bytes, size_t *out_len);
|
||||||
|
bool amduat_asl_read_path(const char *path, uint8_t **out_bytes, size_t *out_len);
|
||||||
|
|
||||||
|
bool amduat_asl_write_stream(FILE *stream, const uint8_t *bytes, size_t len);
|
||||||
|
bool amduat_asl_write_path(const char *path, const uint8_t *bytes, size_t len);
|
||||||
|
|
||||||
|
bool amduat_asl_write_text_line(const char *path, const char *text);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* AMDUAT_ASL_IO_H */
|
||||||
149
src/near_core/asl/io.c
Normal file
149
src/near_core/asl/io.c
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
#include "amduat/asl/io.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
enum { AMDUAT_ASL_IO_BUF_CHUNK = 4096 };
|
||||||
|
|
||||||
|
bool amduat_asl_read_stream(FILE *stream, uint8_t **out_bytes, size_t *out_len) {
|
||||||
|
uint8_t *buffer;
|
||||||
|
size_t cap;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (out_bytes == NULL || out_len == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*out_bytes = NULL;
|
||||||
|
*out_len = 0;
|
||||||
|
|
||||||
|
buffer = NULL;
|
||||||
|
cap = 0;
|
||||||
|
len = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (len == cap) {
|
||||||
|
size_t new_cap = cap == 0 ? AMDUAT_ASL_IO_BUF_CHUNK : cap * 2u;
|
||||||
|
uint8_t *next;
|
||||||
|
if (new_cap < cap) {
|
||||||
|
free(buffer);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
next = (uint8_t *)realloc(buffer, new_cap);
|
||||||
|
if (next == NULL) {
|
||||||
|
free(buffer);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
buffer = next;
|
||||||
|
cap = new_cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t nread = fread(buffer + len, 1u, cap - len, stream);
|
||||||
|
len += nread;
|
||||||
|
if (nread == 0u) {
|
||||||
|
if (ferror(stream)) {
|
||||||
|
free(buffer);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len == 0u) {
|
||||||
|
free(buffer);
|
||||||
|
buffer = NULL;
|
||||||
|
}
|
||||||
|
*out_bytes = buffer;
|
||||||
|
*out_len = len;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_read_path(const char *path,
|
||||||
|
uint8_t **out_bytes,
|
||||||
|
size_t *out_len) {
|
||||||
|
FILE *stream;
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
if (path == NULL || out_bytes == NULL || out_len == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(path, "-") == 0) {
|
||||||
|
return amduat_asl_read_stream(stdin, out_bytes, out_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = fopen(path, "rb");
|
||||||
|
if (stream == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ok = amduat_asl_read_stream(stream, out_bytes, out_len);
|
||||||
|
if (fclose(stream) != 0) {
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_write_stream(FILE *stream, const uint8_t *bytes, size_t len) {
|
||||||
|
size_t offset;
|
||||||
|
|
||||||
|
if (len != 0u && bytes == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = 0u;
|
||||||
|
while (offset < len) {
|
||||||
|
size_t written = fwrite(bytes + offset, 1u, len - offset, stream);
|
||||||
|
if (written == 0u) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
offset += written;
|
||||||
|
}
|
||||||
|
return fflush(stream) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_write_path(const char *path,
|
||||||
|
const uint8_t *bytes,
|
||||||
|
size_t len) {
|
||||||
|
FILE *stream;
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
if (path == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (strcmp(path, "-") == 0) {
|
||||||
|
return amduat_asl_write_stream(stdout, bytes, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = fopen(path, "wb");
|
||||||
|
if (stream == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ok = amduat_asl_write_stream(stream, bytes, len);
|
||||||
|
if (fclose(stream) != 0) {
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_write_text_line(const char *path, const char *text) {
|
||||||
|
FILE *stream;
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
if (path == NULL || text == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (strcmp(path, "-") == 0) {
|
||||||
|
stream = stdout;
|
||||||
|
} else {
|
||||||
|
stream = fopen(path, "wb");
|
||||||
|
if (stream == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ok = fputs(text, stream) >= 0 && fputc('\n', stream) != EOF &&
|
||||||
|
fflush(stream) == 0;
|
||||||
|
if (stream != stdout && fclose(stream) != 0) {
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include "amduat/asl/asl_store_fs.h"
|
#include "amduat/asl/asl_store_fs.h"
|
||||||
#include "amduat/asl/asl_store_fs_meta.h"
|
#include "amduat/asl/asl_store_fs_meta.h"
|
||||||
|
#include "amduat/asl/io.h"
|
||||||
#include "amduat/asl/parse.h"
|
#include "amduat/asl/parse.h"
|
||||||
#include "amduat/asl/ref_text.h"
|
#include "amduat/asl/ref_text.h"
|
||||||
#include "amduat/asl/store.h"
|
#include "amduat/asl/store.h"
|
||||||
|
|
@ -21,10 +22,7 @@ enum {
|
||||||
AMDUAT_ASL_CLI_EXIT_CONFIG = 8
|
AMDUAT_ASL_CLI_EXIT_CONFIG = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum { AMDUAT_ASL_CLI_STORE_ID_MAX = AMDUAT_ASL_STORE_FS_STORE_ID_MAX };
|
||||||
AMDUAT_ASL_CLI_STORE_ID_MAX = AMDUAT_ASL_STORE_FS_STORE_ID_MAX,
|
|
||||||
AMDUAT_ASL_CLI_BUF_CHUNK = 4096
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *const AMDUAT_ASL_CLI_DEFAULT_ROOT = ".amduat-asl";
|
static const char *const AMDUAT_ASL_CLI_DEFAULT_ROOT = ".amduat-asl";
|
||||||
|
|
||||||
|
|
@ -183,154 +181,6 @@ static bool amduat_asl_cli_parse_io_format(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool amduat_asl_cli_read_stream(FILE *stream,
|
|
||||||
uint8_t **out,
|
|
||||||
size_t *out_len) {
|
|
||||||
uint8_t *buffer;
|
|
||||||
size_t cap;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
if (out == NULL || out_len == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*out = NULL;
|
|
||||||
*out_len = 0;
|
|
||||||
|
|
||||||
buffer = NULL;
|
|
||||||
cap = 0;
|
|
||||||
len = 0;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (len == cap) {
|
|
||||||
size_t new_cap = cap == 0 ? AMDUAT_ASL_CLI_BUF_CHUNK : cap * 2u;
|
|
||||||
uint8_t *next;
|
|
||||||
if (new_cap < cap) {
|
|
||||||
free(buffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
next = (uint8_t *)realloc(buffer, new_cap);
|
|
||||||
if (next == NULL) {
|
|
||||||
free(buffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
buffer = next;
|
|
||||||
cap = new_cap;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t nread = fread(buffer + len, 1u, cap - len, stream);
|
|
||||||
len += nread;
|
|
||||||
if (nread == 0u) {
|
|
||||||
if (ferror(stream)) {
|
|
||||||
free(buffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len == 0u) {
|
|
||||||
free(buffer);
|
|
||||||
buffer = NULL;
|
|
||||||
}
|
|
||||||
*out = buffer;
|
|
||||||
*out_len = len;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_read_path(const char *path,
|
|
||||||
uint8_t **out,
|
|
||||||
size_t *out_len) {
|
|
||||||
FILE *stream;
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
if (path == NULL || out == NULL || out_len == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(path, "-") == 0) {
|
|
||||||
return amduat_asl_cli_read_stream(stdin, out, out_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream = fopen(path, "rb");
|
|
||||||
if (stream == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ok = amduat_asl_cli_read_stream(stream, out, out_len);
|
|
||||||
if (fclose(stream) != 0) {
|
|
||||||
ok = false;
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_write_stream(FILE *stream,
|
|
||||||
const uint8_t *bytes,
|
|
||||||
size_t len) {
|
|
||||||
size_t offset;
|
|
||||||
|
|
||||||
if (len != 0u && bytes == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
offset = 0u;
|
|
||||||
while (offset < len) {
|
|
||||||
size_t written = fwrite(bytes + offset, 1u, len - offset, stream);
|
|
||||||
if (written == 0u) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
offset += written;
|
|
||||||
}
|
|
||||||
return fflush(stream) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_write_path(const char *path,
|
|
||||||
const uint8_t *bytes,
|
|
||||||
size_t len) {
|
|
||||||
FILE *stream;
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
if (path == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (strcmp(path, "-") == 0) {
|
|
||||||
return amduat_asl_cli_write_stream(stdout, bytes, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream = fopen(path, "wb");
|
|
||||||
if (stream == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ok = amduat_asl_cli_write_stream(stream, bytes, len);
|
|
||||||
if (fclose(stream) != 0) {
|
|
||||||
ok = false;
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_write_text_line(const char *path,
|
|
||||||
const char *text) {
|
|
||||||
FILE *stream;
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
if (path == NULL || text == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (strcmp(path, "-") == 0) {
|
|
||||||
stream = stdout;
|
|
||||||
} else {
|
|
||||||
stream = fopen(path, "wb");
|
|
||||||
if (stream == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = fputs(text, stream) >= 0 && fputc('\n', stream) != EOF &&
|
|
||||||
fflush(stream) == 0;
|
|
||||||
if (stream != stdout && fclose(stream) != 0) {
|
|
||||||
ok = false;
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void amduat_asl_cli_free_reference(amduat_reference_t *ref) {
|
static void amduat_asl_cli_free_reference(amduat_reference_t *ref) {
|
||||||
if (ref == NULL) {
|
if (ref == NULL) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -578,7 +428,7 @@ static int amduat_asl_cli_cmd_put(int argc, char **argv) {
|
||||||
|
|
||||||
input_bytes = NULL;
|
input_bytes = NULL;
|
||||||
input_len = 0u;
|
input_len = 0u;
|
||||||
if (!amduat_asl_cli_read_path(opts.input_path, &input_bytes, &input_len)) {
|
if (!amduat_asl_read_path(opts.input_path, &input_bytes, &input_len)) {
|
||||||
fprintf(stderr, "error: failed to read input: %s\n", opts.input_path);
|
fprintf(stderr, "error: failed to read input: %s\n", opts.input_path);
|
||||||
return AMDUAT_ASL_CLI_EXIT_IO;
|
return AMDUAT_ASL_CLI_EXIT_IO;
|
||||||
}
|
}
|
||||||
|
|
@ -616,7 +466,7 @@ static int amduat_asl_cli_cmd_put(int argc, char **argv) {
|
||||||
fprintf(stderr, "error: failed to encode reference\n");
|
fprintf(stderr, "error: failed to encode reference\n");
|
||||||
exit_code = AMDUAT_ASL_CLI_EXIT_CODEC;
|
exit_code = AMDUAT_ASL_CLI_EXIT_CODEC;
|
||||||
} else {
|
} else {
|
||||||
if (!amduat_asl_cli_write_text_line(opts.output_path, hex_ref)) {
|
if (!amduat_asl_write_text_line(opts.output_path, hex_ref)) {
|
||||||
fprintf(stderr, "error: failed to write output: %s\n",
|
fprintf(stderr, "error: failed to write output: %s\n",
|
||||||
opts.output_path);
|
opts.output_path);
|
||||||
exit_code = AMDUAT_ASL_CLI_EXIT_IO;
|
exit_code = AMDUAT_ASL_CLI_EXIT_IO;
|
||||||
|
|
@ -628,7 +478,7 @@ static int amduat_asl_cli_cmd_put(int argc, char **argv) {
|
||||||
fprintf(stderr, "error: failed to encode reference\n");
|
fprintf(stderr, "error: failed to encode reference\n");
|
||||||
exit_code = AMDUAT_ASL_CLI_EXIT_CODEC;
|
exit_code = AMDUAT_ASL_CLI_EXIT_CODEC;
|
||||||
} else {
|
} else {
|
||||||
if (!amduat_asl_cli_write_path(opts.output_path,
|
if (!amduat_asl_write_path(opts.output_path,
|
||||||
encoded_ref.data,
|
encoded_ref.data,
|
||||||
encoded_ref.len)) {
|
encoded_ref.len)) {
|
||||||
fprintf(stderr, "error: failed to write output: %s\n",
|
fprintf(stderr, "error: failed to write output: %s\n",
|
||||||
|
|
@ -770,7 +620,7 @@ static int amduat_asl_cli_cmd_get(int argc, char **argv) {
|
||||||
} else {
|
} else {
|
||||||
ref_bytes = NULL;
|
ref_bytes = NULL;
|
||||||
ref_len = 0u;
|
ref_len = 0u;
|
||||||
if (!amduat_asl_cli_read_path(opts.ref, &ref_bytes, &ref_len)) {
|
if (!amduat_asl_read_path(opts.ref, &ref_bytes, &ref_len)) {
|
||||||
fprintf(stderr, "error: failed to read reference: %s\n", opts.ref);
|
fprintf(stderr, "error: failed to read reference: %s\n", opts.ref);
|
||||||
return AMDUAT_ASL_CLI_EXIT_IO;
|
return AMDUAT_ASL_CLI_EXIT_IO;
|
||||||
}
|
}
|
||||||
|
|
@ -801,7 +651,7 @@ static int amduat_asl_cli_cmd_get(int argc, char **argv) {
|
||||||
|
|
||||||
if (exit_code == AMDUAT_ASL_CLI_EXIT_OK) {
|
if (exit_code == AMDUAT_ASL_CLI_EXIT_OK) {
|
||||||
if (opts.output_format == AMDUAT_ASL_CLI_IO_RAW) {
|
if (opts.output_format == AMDUAT_ASL_CLI_IO_RAW) {
|
||||||
if (!amduat_asl_cli_write_path(opts.output_path,
|
if (!amduat_asl_write_path(opts.output_path,
|
||||||
artifact.bytes.data,
|
artifact.bytes.data,
|
||||||
artifact.bytes.len)) {
|
artifact.bytes.len)) {
|
||||||
fprintf(stderr, "error: failed to write output: %s\n",
|
fprintf(stderr, "error: failed to write output: %s\n",
|
||||||
|
|
@ -814,7 +664,7 @@ static int amduat_asl_cli_cmd_get(int argc, char **argv) {
|
||||||
fprintf(stderr, "error: failed to encode artifact\n");
|
fprintf(stderr, "error: failed to encode artifact\n");
|
||||||
exit_code = AMDUAT_ASL_CLI_EXIT_CODEC;
|
exit_code = AMDUAT_ASL_CLI_EXIT_CODEC;
|
||||||
} else {
|
} else {
|
||||||
if (!amduat_asl_cli_write_path(opts.output_path,
|
if (!amduat_asl_write_path(opts.output_path,
|
||||||
encoded_artifact.data,
|
encoded_artifact.data,
|
||||||
encoded_artifact.len)) {
|
encoded_artifact.len)) {
|
||||||
fprintf(stderr, "error: failed to write output: %s\n",
|
fprintf(stderr, "error: failed to write output: %s\n",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue