moddef-c
Loading...
Searching...
No Matches
desc.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2
3/* Compact point descriptor (spec §7–§15): the codec's view of one point,
4 * expanded from the wire by md_point_parse into ~130 stack bytes. Scalar
5 * fields are decoded eagerly; repeated sections (na_values, selector
6 * cases, flags, packed fields, allowed_values) stay as wire ranges with
7 * on-demand iterators — nothing is allocated.
8 *
9 * Kind/precedence decisions mirror the Go/TS/Rust/Py implementations:
10 * composed > flags > fields > string/bytes > primitive (default: raw
11 * enum integer, signed if the storage is). */
12#ifndef MODDEF_DESC_H
13#define MODDEF_DESC_H
14
15#include "moddef/doc.h"
16#include "moddef/err.h"
17#include "moddef/str.h"
18#include "moddef/wire.h"
19
20/* §7 address spaces (wire values). */
27
28/* §8.2 storage types (wire values). */
50
51/* §11.1 access modes (wire values). */
58
59/* Logical value interpretation (derived, not a wire enum). */
60typedef enum md_vkind {
61 MD_VK_DECIMAL = 0, /* scaled numeric (§10) */
65 MD_VK_ENUM, /* raw integer; caller maps via the profile enum */
66 MD_VK_FLAGS, /* §13.2 */
67 MD_VK_FIELDS, /* §13/§13.1 packed window */
68 MD_VK_STRING, /* §15 — use md_decode_string */
70 MD_VK_DATETIME, /* §8.5 */
71 MD_VK_COMPOSED /* §14 mantissa/exponent */
73
74typedef struct md_rational {
75 int64_t num;
76 int64_t den; /* den == 0 → unset */
78
79typedef struct md_point_desc {
81 md_bytes_t point_raw; /* the Point message; iterators re-walk it */
82
83 uint8_t space; /* effective (mapping's, else the block's) */
84 uint8_t storage; /* md_storage_t */
85 uint8_t access; /* md_access_t; 0 → treated as read-only */
86 uint8_t vkind; /* md_vkind_t */
87
88 uint16_t offset;
90 uint8_t length_words;
91 bool byte_big; /* §9.1: big-endian unless LITTLE_ENDIAN */
92 bool word_big; /* §9.2 */
93
94 md_rational_t scale; /* §10.2 */
96
97 bool has_scale_ref; /* §10.4 */
99 uint8_t sref_mode; /* 2 = MULTIPLY, else POW10 */
100 int64_t sref_den;
101
102 bool has_selector; /* §10.5; cases iterated from the wire */
104 md_bytes_t sel_raw; /* SelectorRef message */
105
106 bool has_na; /* §8.4; entries iterated from point_raw */
107
108 uint8_t str_padding; /* §15 wire Padding (0 = unset → none) */
109 uint8_t str_termination; /* wire Termination (0 = unset → fixed) */
110 uint8_t dt_encoding; /* §8.5 wire DateTimeEncoding (0 → epoch_s) */
111
112 bool has_composed; /* §14 */
113 int64_t comp_base;
116
117 bool has_constraints; /* §11.4 */
119 md_bytes_t w_allowed; /* packed int64 payload; may be empty */
120
121 bool in_discovery_block; /* resolve offset via the block's discovery */
124
125/* Expand a point view into a descriptor. */
127
128/* Register count to read/write (mapping length or storage default). */
130
133
134/* --- on-demand iterators over the wire ranges ------------------------------ */
135
140
141/* §8.4 sentinels: (raw, meaning) pairs. */
143bool md_na_next(md_kv_iter_t *it, int64_t *raw, md_str_t *meaning);
144
145/* §13.2 flags: (bit, name) pairs, wire order. */
147bool md_flag_next(md_kv_iter_t *it, uint32_t *bit, md_str_t *name);
148
149/* §13 packed sub-fields: legacy bit_fields first, then fields. */
150typedef struct md_field_iter {
152 uint8_t pass; /* 0 = bit_fields (60), 1 = fields (61) */
155
157bool md_field_next(md_field_iter_t *it, md_str_t *field_id, uint32_t *bit_offset,
158 uint32_t *bit_length);
159
160/* §10.5 selector cases: (key, scale, offset). */
162bool md_case_next(md_kv_iter_t *it, int64_t *key, md_rational_t *scale,
163 md_rational_t *offset);
164
165/* §11.4 allowed_values (packed int64). */
166bool md_allowed_next(md_wire_t *w, int64_t *v);
167
168#endif /* MODDEF_DESC_H */
struct md_field_iter md_field_iter_t
enum md_access md_access_t
md_kv_iter_t md_case_iter(const md_point_desc_t *d)
md_kv_iter_t md_na_iter(const md_point_desc_t *d)
enum md_storage md_storage_t
struct md_kv_iter md_kv_iter_t
md_err_t md_point_parse(const md_point_t *pt, md_point_desc_t *out)
bool md_na_next(md_kv_iter_t *it, int64_t *raw, md_str_t *meaning)
bool md_flag_next(md_kv_iter_t *it, uint32_t *bit, md_str_t *name)
md_access
Definition desc.h:52
@ MD_ACCESS_CMD
Definition desc.h:56
@ MD_ACCESS_RW
Definition desc.h:55
@ MD_ACCESS_RO
Definition desc.h:53
@ MD_ACCESS_WO
Definition desc.h:54
bool md_point_writable(const md_point_desc_t *d)
enum md_space md_space_t
bool md_case_next(md_kv_iter_t *it, int64_t *key, md_rational_t *scale, md_rational_t *offset)
struct md_point_desc md_point_desc_t
enum md_vkind md_vkind_t
bool md_point_readable(const md_point_desc_t *d)
md_vkind
Definition desc.h:60
@ MD_VK_DECIMAL
Definition desc.h:61
@ MD_VK_BYTES
Definition desc.h:69
@ MD_VK_INT
Definition desc.h:64
@ MD_VK_UINT
Definition desc.h:63
@ MD_VK_DATETIME
Definition desc.h:70
@ MD_VK_COMPOSED
Definition desc.h:71
@ MD_VK_FIELDS
Definition desc.h:67
@ MD_VK_BOOL
Definition desc.h:62
@ MD_VK_ENUM
Definition desc.h:65
@ MD_VK_STRING
Definition desc.h:68
@ MD_VK_FLAGS
Definition desc.h:66
md_space
Definition desc.h:21
@ MD_SPACE_HOLDING
Definition desc.h:25
@ MD_SPACE_COIL
Definition desc.h:22
@ MD_SPACE_INPUT
Definition desc.h:24
@ MD_SPACE_DISCRETE
Definition desc.h:23
struct md_rational md_rational_t
bool md_allowed_next(md_wire_t *w, int64_t *v)
md_kv_iter_t md_flag_iter(const md_point_desc_t *d)
uint16_t md_point_words(const md_point_desc_t *d)
md_storage
Definition desc.h:29
@ MD_ST_UNSPECIFIED
Definition desc.h:30
@ MD_ST_STRING_UTF8
Definition desc.h:41
@ MD_ST_S32
Definition desc.h:35
@ MD_ST_F64
Definition desc.h:39
@ MD_ST_BCD
Definition desc.h:43
@ MD_ST_U16
Definition desc.h:32
@ MD_ST_BYTES_RAW
Definition desc.h:42
@ MD_ST_U48
Definition desc.h:47
@ MD_ST_F32
Definition desc.h:38
@ MD_ST_U32
Definition desc.h:34
@ MD_ST_U24
Definition desc.h:46
@ MD_ST_S64
Definition desc.h:37
@ MD_ST_COMPOSED
Definition desc.h:45
@ MD_ST_S16
Definition desc.h:33
@ MD_ST_STRING_ASCII
Definition desc.h:40
@ MD_ST_S48
Definition desc.h:48
@ MD_ST_BIT
Definition desc.h:31
@ MD_ST_FIXED_POINT
Definition desc.h:44
@ MD_ST_U64
Definition desc.h:36
bool md_field_next(md_field_iter_t *it, md_str_t *field_id, uint32_t *bit_offset, uint32_t *bit_length)
enum md_err md_err_t
Definition str.h:33
Definition desc.h:150
uint8_t pass
Definition desc.h:152
md_bytes_t msg
Definition desc.h:153
md_wire_t w
Definition desc.h:151
Definition desc.h:136
uint32_t field
Definition desc.h:138
md_wire_t w
Definition desc.h:137
Definition desc.h:79
uint8_t length_words
Definition desc.h:90
md_rational_t w_max
Definition desc.h:118
md_rational_t w_step
Definition desc.h:118
bool has_composed
Definition desc.h:112
uint8_t str_termination
Definition desc.h:109
int64_t sref_den
Definition desc.h:100
bool has_selector
Definition desc.h:102
md_str_t id
Definition desc.h:80
uint8_t str_padding
Definition desc.h:108
uint8_t storage
Definition desc.h:84
uint8_t sref_mode
Definition desc.h:99
uint8_t dt_encoding
Definition desc.h:110
bool has_constraints
Definition desc.h:117
md_bytes_t point_raw
Definition desc.h:81
md_rational_t offset_add
Definition desc.h:95
bool byte_big
Definition desc.h:91
uint8_t space
Definition desc.h:83
bool has_scale_ref
Definition desc.h:97
uint8_t access
Definition desc.h:85
bool word_big
Definition desc.h:92
md_rational_t scale
Definition desc.h:94
int64_t comp_base
Definition desc.h:113
md_bytes_t w_allowed
Definition desc.h:119
uint16_t comp_eoff
Definition desc.h:114
md_str_t sref_id
Definition desc.h:98
uint16_t comp_moff
Definition desc.h:114
int8_t discovery_slot
Definition desc.h:122
uint8_t vkind
Definition desc.h:86
md_bytes_t sel_raw
Definition desc.h:104
md_str_t sel_id
Definition desc.h:103
uint8_t comp_mwords
Definition desc.h:115
bool has_na
Definition desc.h:106
md_rational_t w_min
Definition desc.h:118
uint16_t model_relative_offset
Definition desc.h:89
bool in_discovery_block
Definition desc.h:121
uint16_t offset
Definition desc.h:88
uint8_t comp_ewords
Definition desc.h:115
Definition doc.h:40
Definition desc.h:74
int64_t num
Definition desc.h:75
int64_t den
Definition desc.h:76
Definition str.h:13
Definition wire.h:15