DeterministicESPAsyncWebServer v6.28.0
Zero-allocation, bounded-execution async HTTP server for ESP32
Loading...
Searching...
No Matches
utmc.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4/**
5 * @file utmc.cpp
6 * @brief UTMC common-database codec (see utmc.h).
7 */
8
10
11#if DETWS_ENABLE_UTMC
12
13#include <string.h>
14
16
17namespace
18{
19void put_u(DetSb *b, uint32_t v)
20{
21 char tmp[11];
22 int n = 0;
23 do
24 {
25 tmp[n++] = (char)('0' + (int)(v % 10));
26 v /= 10;
27 } while (v);
28 char out[12];
29 for (int i = 0; i < n; i++)
30 out[i] = tmp[n - 1 - i];
31 out[n] = '\0';
32 det_sb_put(b, out);
33}
34} // namespace
35
36size_t detws_utmc_request(const char *object_id, char *out, size_t cap)
37{
38 DetSb b = {out, cap, 0, out != nullptr && cap > 0};
39 det_sb_put(&b, "<?xml version=\"1.0\"?><UTMCRequest><object id=\"");
40 det_sb_xml(&b, object_id);
41 det_sb_put(&b, "\"/></UTMCRequest>");
42 return det_sb_finish(&b);
43}
44
45size_t detws_utmc_response(const char *object_id, const char *value, uint8_t quality, const char *timestamp, char *out,
46 size_t cap)
47{
48 DetSb b = {out, cap, 0, out != nullptr && cap > 0};
49 det_sb_put(&b, "<?xml version=\"1.0\"?><UTMCResponse><object id=\"");
50 det_sb_xml(&b, object_id);
51 det_sb_put(&b, "\" value=\"");
52 det_sb_xml(&b, value);
53 det_sb_put(&b, "\" quality=\"");
54 put_u(&b, quality);
55 det_sb_put(&b, "\" timestamp=\"");
56 det_sb_xml(&b, timestamp);
57 det_sb_put(&b, "\"/></UTMCResponse>");
58 return det_sb_finish(&b);
59}
60
61size_t detws_utmc_parse_request(const char *xml, size_t len, char *out, size_t cap)
62{
63 if (!xml || !out || cap == 0)
64 return 0;
65 // Find `id="` and copy up to the next quote.
66 const char *key = "id=\"";
67 size_t kl = 4;
68 for (size_t i = 0; i + kl < len; i++)
69 {
70 if (memcmp(xml + i, key, kl) != 0)
71 continue;
72 size_t j = i + kl;
73 size_t k = 0;
74 while (j < len && xml[j] != '"')
75 {
76 if (k + 1 >= cap)
77 return 0;
78 out[k++] = xml[j++];
79 }
80 if (j >= len) // unterminated
81 return 0;
82 out[k] = '\0';
83 return k;
84 }
85 return 0;
86}
87
88#endif // DETWS_ENABLE_UTMC
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.
Definition strbuf.h:90
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.
Definition strbuf.h:36
void det_sb_xml(DetSb *b, const char *s)
Append s XML-escaped (& < > "); a NULL s appends nothing.
Definition strbuf.h:51
Bump-append target; ok latches false once an append would overflow cap.
Definition strbuf.h:28
UTMC (Urban Traffic Management and Control) common-database codec (DETWS_ENABLE_UTMC).