19void put_json_str(
DetSb *b,
const char *s)
22 for (
const char *p = s ? s :
""; *p; p++)
24 if (*p ==
'"' || *p ==
'\\')
26 char esc[3] = {
'\\', *p,
'\0'};
42void put_u8(
DetSb *b, uint8_t v)
48 t[n++] = (char)(
'0' + v % 10);
52 for (
int i = 0; i < n; i++)
59void put_array(
DetSb *b,
const AtcFieldIo *io,
bool outputs)
63 for (
size_t i = 0; i < io->count; i++)
65 if (io->points[i].is_output != outputs)
71 put_json_str(b, io->points[i].name);
73 put_u8(b, io->points[i].value);
80size_t detws_atc_snapshot_json(
const AtcFieldIo *io,
char *out,
size_t cap)
82 if (!io || !out || (io->count && !io->points))
84 DetSb b = {out, cap, 0, cap > 0};
86 put_array(&b, io,
false);
88 put_array(&b, io,
true);
96bool detws_atc_set_output(AtcFieldIo *io,
const char *name, uint8_t value)
98 if (!io || !name || !io->points)
100 for (
size_t i = 0; i < io->count; i++)
101 if (io->points[i].is_output && io->points[i].name && strcmp(io->points[i].name, name) == 0)
103 io->points[i].value = value;
109uint8_t detws_atc_get(
const AtcFieldIo *io,
const char *name,
bool *found)
113 if (!io || !name || !io->points)
115 for (
size_t i = 0; i < io->count; i++)
116 if (io->points[i].name && strcmp(io->points[i].name, name) == 0)
120 return io->points[i].value;
ATC (Advanced Traffic Controller) field-I/O interop snapshot (DETWS_ENABLE_ATC).
Bounded no-heap string builder that fails closed on overflow (one shared copy).
void det_sb_put(DetSb *b, const char *s)
Append NUL-terminated s; leaves the buffer untouched and clears ok if it would not fit.
Bump-append target; ok latches false once an append would overflow cap.