Promote ASL ID parsing helpers
This commit is contained in:
parent
4bc40995b4
commit
f48b73b75f
|
|
@ -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/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
|
||||||
src/near_core/asl/registry.c
|
src/near_core/asl/registry.c
|
||||||
|
|
|
||||||
29
include/amduat/asl/parse.h
Normal file
29
include/amduat/asl/parse.h
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef AMDUAT_ASL_PARSE_H
|
||||||
|
#define AMDUAT_ASL_PARSE_H
|
||||||
|
|
||||||
|
#include "amduat/asl/core.h"
|
||||||
|
#include "amduat/asl/store.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool amduat_asl_parse_u16(const char *text, uint16_t *out);
|
||||||
|
bool amduat_asl_parse_u32(const char *text, uint32_t *out);
|
||||||
|
|
||||||
|
bool amduat_asl_parse_profile_id(
|
||||||
|
const char *text,
|
||||||
|
amduat_asl_encoding_profile_id_t *out_id);
|
||||||
|
|
||||||
|
bool amduat_asl_parse_hash_id(const char *text, amduat_hash_id_t *out_id);
|
||||||
|
|
||||||
|
bool amduat_asl_parse_type_tag(const char *text, amduat_type_tag_t *out_tag);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* AMDUAT_ASL_PARSE_H */
|
||||||
114
src/near_core/asl/parse.c
Normal file
114
src/near_core/asl/parse.c
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
#include "amduat/asl/parse.h"
|
||||||
|
|
||||||
|
#include "amduat/enc/asl1_core.h"
|
||||||
|
#include "amduat/hash/asl1.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
bool amduat_asl_parse_u16(const char *text, uint16_t *out) {
|
||||||
|
char *end;
|
||||||
|
unsigned long value;
|
||||||
|
|
||||||
|
if (text == NULL || text[0] == '\0' || out == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
value = strtoul(text, &end, 0);
|
||||||
|
if (errno != 0 || end == text || *end != '\0' || value > UINT16_MAX) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*out = (uint16_t)value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_parse_u32(const char *text, uint32_t *out) {
|
||||||
|
char *end;
|
||||||
|
unsigned long value;
|
||||||
|
|
||||||
|
if (text == NULL || text[0] == '\0' || out == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
value = strtoul(text, &end, 0);
|
||||||
|
if (errno != 0 || end == text || *end != '\0' || value > UINT32_MAX) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*out = (uint32_t)value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_parse_profile_id(const char *text,
|
||||||
|
amduat_asl_encoding_profile_id_t *out_id) {
|
||||||
|
uint16_t id;
|
||||||
|
size_t i;
|
||||||
|
size_t count;
|
||||||
|
const amduat_enc_asl1_core_profile_desc_t *descs;
|
||||||
|
|
||||||
|
if (text == NULL || out_id == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (amduat_asl_parse_u16(text, &id)) {
|
||||||
|
if (amduat_enc_asl1_core_desc_lookup(id) == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*out_id = id;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
descs = amduat_enc_asl1_core_descs(&count);
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
if (descs[i].name != NULL && strcmp(descs[i].name, text) == 0) {
|
||||||
|
*out_id = descs[i].profile_id;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_parse_hash_id(const char *text, amduat_hash_id_t *out_id) {
|
||||||
|
uint16_t id;
|
||||||
|
size_t i;
|
||||||
|
size_t count;
|
||||||
|
const amduat_hash_asl1_desc_t *descs;
|
||||||
|
|
||||||
|
if (text == NULL || out_id == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (amduat_asl_parse_u16(text, &id)) {
|
||||||
|
if (amduat_hash_asl1_desc_lookup(id) == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*out_id = id;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
descs = amduat_hash_asl1_descs(&count);
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
if (descs[i].name != NULL && strcmp(descs[i].name, text) == 0) {
|
||||||
|
*out_id = descs[i].hash_id;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool amduat_asl_parse_type_tag(const char *text, amduat_type_tag_t *out_tag) {
|
||||||
|
uint32_t tag_id;
|
||||||
|
|
||||||
|
if (text == NULL || out_tag == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!amduat_asl_parse_u32(text, &tag_id)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*out_tag = amduat_type_tag(tag_id);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
#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/parse.h"
|
||||||
#include "amduat/asl/ref_text.h"
|
#include "amduat/asl/ref_text.h"
|
||||||
#include "amduat/asl/store.h"
|
#include "amduat/asl/store.h"
|
||||||
#include "amduat/enc/asl1_core.h"
|
|
||||||
#include "amduat/enc/asl1_core_codec.h"
|
#include "amduat/enc/asl1_core_codec.h"
|
||||||
#include "amduat/hash/asl1.h"
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -151,115 +149,6 @@ static bool amduat_asl_cli_copy_store_id(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool amduat_asl_cli_parse_u16(const char *text, uint16_t *out) {
|
|
||||||
char *end;
|
|
||||||
unsigned long value;
|
|
||||||
|
|
||||||
if (text == NULL || text[0] == '\0' || out == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
value = strtoul(text, &end, 0);
|
|
||||||
if (errno != 0 || end == text || *end != '\0' || value > UINT16_MAX) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*out = (uint16_t)value;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_parse_u32(const char *text, uint32_t *out) {
|
|
||||||
char *end;
|
|
||||||
unsigned long value;
|
|
||||||
|
|
||||||
if (text == NULL || text[0] == '\0' || out == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
value = strtoul(text, &end, 0);
|
|
||||||
if (errno != 0 || end == text || *end != '\0' || value > UINT32_MAX) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*out = (uint32_t)value;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_parse_profile_id(
|
|
||||||
const char *text,
|
|
||||||
amduat_asl_encoding_profile_id_t *out_id) {
|
|
||||||
uint16_t id;
|
|
||||||
size_t i;
|
|
||||||
size_t count;
|
|
||||||
const amduat_enc_asl1_core_profile_desc_t *descs;
|
|
||||||
|
|
||||||
if (text == NULL || out_id == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (amduat_asl_cli_parse_u16(text, &id)) {
|
|
||||||
if (amduat_enc_asl1_core_desc_lookup(id) == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*out_id = id;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
descs = amduat_enc_asl1_core_descs(&count);
|
|
||||||
for (i = 0; i < count; ++i) {
|
|
||||||
if (descs[i].name != NULL && strcmp(descs[i].name, text) == 0) {
|
|
||||||
*out_id = descs[i].profile_id;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_parse_hash_id(const char *text,
|
|
||||||
amduat_hash_id_t *out_id) {
|
|
||||||
uint16_t id;
|
|
||||||
size_t i;
|
|
||||||
size_t count;
|
|
||||||
const amduat_hash_asl1_desc_t *descs;
|
|
||||||
|
|
||||||
if (text == NULL || out_id == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (amduat_asl_cli_parse_u16(text, &id)) {
|
|
||||||
if (amduat_hash_asl1_desc_lookup(id) == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*out_id = id;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
descs = amduat_hash_asl1_descs(&count);
|
|
||||||
for (i = 0; i < count; ++i) {
|
|
||||||
if (descs[i].name != NULL && strcmp(descs[i].name, text) == 0) {
|
|
||||||
*out_id = descs[i].hash_id;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_parse_type_tag(const char *text,
|
|
||||||
amduat_type_tag_t *out_tag) {
|
|
||||||
uint32_t tag_id;
|
|
||||||
|
|
||||||
if (text == NULL || out_tag == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!amduat_asl_cli_parse_u32(text, &tag_id)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*out_tag = amduat_type_tag(tag_id);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool amduat_asl_cli_parse_ref_format(
|
static bool amduat_asl_cli_parse_ref_format(
|
||||||
const char *text,
|
const char *text,
|
||||||
amduat_asl_cli_ref_format_t *out_fmt) {
|
amduat_asl_cli_ref_format_t *out_fmt) {
|
||||||
|
|
@ -557,7 +446,7 @@ static int amduat_asl_cli_cmd_init(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (opts.profile != NULL) {
|
if (opts.profile != NULL) {
|
||||||
if (!amduat_asl_cli_parse_profile_id(
|
if (!amduat_asl_parse_profile_id(
|
||||||
opts.profile,
|
opts.profile,
|
||||||
&cfg_in.config.encoding_profile_id)) {
|
&cfg_in.config.encoding_profile_id)) {
|
||||||
fprintf(stderr, "error: unknown profile: %s\n", opts.profile);
|
fprintf(stderr, "error: unknown profile: %s\n", opts.profile);
|
||||||
|
|
@ -565,7 +454,7 @@ static int amduat_asl_cli_cmd_init(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (opts.hash != NULL) {
|
if (opts.hash != NULL) {
|
||||||
if (!amduat_asl_cli_parse_hash_id(opts.hash, &cfg_in.config.hash_id)) {
|
if (!amduat_asl_parse_hash_id(opts.hash, &cfg_in.config.hash_id)) {
|
||||||
fprintf(stderr, "error: unknown hash: %s\n", opts.hash);
|
fprintf(stderr, "error: unknown hash: %s\n", opts.hash);
|
||||||
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
||||||
}
|
}
|
||||||
|
|
@ -625,7 +514,7 @@ static int amduat_asl_cli_cmd_put(int argc, char **argv) {
|
||||||
fprintf(stderr, "error: --type-tag requires a value\n");
|
fprintf(stderr, "error: --type-tag requires a value\n");
|
||||||
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
||||||
}
|
}
|
||||||
if (!amduat_asl_cli_parse_type_tag(argv[++i], &opts.type_tag)) {
|
if (!amduat_asl_parse_type_tag(argv[++i], &opts.type_tag)) {
|
||||||
fprintf(stderr, "error: invalid type-tag\n");
|
fprintf(stderr, "error: invalid type-tag\n");
|
||||||
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
||||||
}
|
}
|
||||||
|
|
@ -838,7 +727,7 @@ static int amduat_asl_cli_cmd_get(int argc, char **argv) {
|
||||||
fprintf(stderr, "error: --expect-type-tag requires a value\n");
|
fprintf(stderr, "error: --expect-type-tag requires a value\n");
|
||||||
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
||||||
}
|
}
|
||||||
if (!amduat_asl_cli_parse_type_tag(argv[++i],
|
if (!amduat_asl_parse_type_tag(argv[++i],
|
||||||
&opts.expect_type_tag)) {
|
&opts.expect_type_tag)) {
|
||||||
fprintf(stderr, "error: invalid expect-type-tag\n");
|
fprintf(stderr, "error: invalid expect-type-tag\n");
|
||||||
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
return AMDUAT_ASL_CLI_EXIT_USAGE;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue