18void put_json_str(
pc_sb *b,
const char *s)
21 for (
const char *p = s ? s :
""; *p; p++)
23 if (*p ==
'"' || *p ==
'\\')
25 char esc[3] = {
'\\', *p,
'\0'};
41void put_u8(
pc_sb *b, uint8_t v)
47 t[n++] = (char)(
'0' + v % 10);
51 for (
int i = 0; i < n; i++)
60void put_array(
pc_sb *b,
const AtcFieldIo *io,
bool outputs)
64 for (
size_t i = 0; i < io->count; i++)
66 if (io->points[i].is_output != outputs)
76 put_json_str(b, io->points[i].name);
78 put_u8(b, io->points[i].value);
85size_t pc_atc_snapshot_json(
const AtcFieldIo *io,
char *out,
size_t cap)
87 if (!io || !out || (io->count && !io->points))
91 pc_sb b = {out, cap, 0, cap > 0};
93 put_array(&b, io,
false);
95 put_array(&b, io,
true);
105bool pc_atc_set_output(AtcFieldIo *io,
const char *name, uint8_t value)
107 if (!io || !name || !io->points)
111 for (
size_t i = 0; i < io->count; i++)
113 if (io->points[i].is_output && io->points[i].name && strcmp(io->points[i].name, name) == 0)
115 io->points[i].value = value;
122uint8_t pc_atc_get(
const AtcFieldIo *io,
const char *name,
bool *found)
128 if (!io || !name || !io->points)
132 for (
size_t i = 0; i < io->count; i++)
134 if (io->points[i].name && strcmp(io->points[i].name, name) == 0)
140 return io->points[i].value;
ATC (Advanced Traffic Controller) field-I/O interop snapshot (PC_ENABLE_ATC).
Bounded no-heap string builder that fails closed on overflow (one shared copy).
void pc_sb_put(pc_sb *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.