19void put_u(
DetSb *b, uint32_t v)
25 tmp[n++] = (char)(
'0' + (
int)(v % 10));
29 for (
int i = 0; i < n; i++)
30 out[i] = tmp[n - 1 - i];
36size_t detws_utmc_request(
const char *object_id,
char *out,
size_t cap)
38 DetSb b = {out, cap, 0, out !=
nullptr && cap > 0};
39 det_sb_put(&b,
"<?xml version=\"1.0\"?><UTMCRequest><object id=\"");
45size_t detws_utmc_response(
const char *object_id,
const char *value, uint8_t quality,
const char *timestamp,
char *out,
48 DetSb b = {out, cap, 0, out !=
nullptr && cap > 0};
49 det_sb_put(&b,
"<?xml version=\"1.0\"?><UTMCResponse><object id=\"");
61size_t detws_utmc_parse_request(
const char *xml,
size_t len,
char *out,
size_t cap)
63 if (!xml || !out || cap == 0)
66 const char *key =
"id=\"";
68 for (
size_t i = 0; i + kl < len; i++)
70 if (memcmp(xml + i, key, kl) != 0)
74 while (j < len && xml[j] !=
'"')
Bounded no-heap string builder that fails closed on overflow (one shared copy).
size_t det_sb_finish(DetSb *b)
NUL-terminate and return the built length, or 0 if the build overflowed.
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.
void det_sb_xml(DetSb *b, const char *s)
Append s XML-escaped (& < > "); a NULL s appends nothing.
Bump-append target; ok latches false once an append would overflow cap.
UTMC (Urban Traffic Management and Control) common-database codec (DETWS_ENABLE_UTMC).