Branch data Line data Source code
1 : : /* SPDX-FileCopyrightText: Copyright 2026 Cozens Software Solutions Limited
2 : : * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0 OR LicenseRef-COSOSO-Commercial
3 : : */
4 : :
5 : : #include "SolidSyslogSdElementPrivate.h"
6 : :
7 : : #include <stddef.h>
8 : :
9 : : #include "SolidSyslogFormatter.h"
10 : :
11 : : enum
12 : : {
13 : : SDELEMENT_NAME_MAX = 32
14 : : };
15 : :
16 : : static inline void SdElement_CloseOpenValue(struct SolidSyslogSdElement* element);
17 : : static inline struct SolidSyslogSdValue* SdElement_SkipParam(struct SolidSyslogSdElement* element);
18 : :
19 : 6712 : void SolidSyslogSdElement_FromFormatter(struct SolidSyslogSdElement* element, struct SolidSyslogFormatter* formatter)
20 : : {
21 : 6712 : element->Formatter = formatter;
22 : 6712 : element->DropFormatter = SolidSyslogFormatter_Create(element->DropStorage, 0);
23 : 6712 : element->ValueOpen = false;
24 : 6712 : element->Suppressed = false;
25 : 6712 : }
26 : :
27 : 7048 : void SolidSyslogSdElement_Begin(struct SolidSyslogSdElement* element, const char* name, uint32_t enterpriseNumber)
28 : : {
29 : 7048 : element->ValueOpen = false;
30 : 7048 : element->Suppressed = (name == NULL);
31 [ + + ]: 7048 : if (!element->Suppressed)
32 : : {
33 : 7047 : SolidSyslogFormatter_AsciiCharacter(element->Formatter, '[');
34 : 7047 : SolidSyslogFormatter_PrintUsAsciiString(element->Formatter, name, SDELEMENT_NAME_MAX);
35 [ + + ]: 7047 : if (enterpriseNumber != 0U)
36 : : {
37 : 459 : SolidSyslogFormatter_AsciiCharacter(element->Formatter, '@');
38 : 459 : SolidSyslogFormatter_Uint32(element->Formatter, enterpriseNumber);
39 : : }
40 : : }
41 : 7048 : }
42 : :
43 : 8262 : struct SolidSyslogSdValue* SolidSyslogSdElement_Param(struct SolidSyslogSdElement* element, const char* name)
44 : : {
45 : 8262 : struct SolidSyslogSdValue* sink = NULL;
46 : 8262 : SdElement_CloseOpenValue(element);
47 [ + + + + ]: 8262 : if (element->Suppressed || (name == NULL))
48 : : {
49 : 3 : sink = SdElement_SkipParam(element);
50 : : }
51 : : else
52 : : {
53 : 8259 : SolidSyslogFormatter_AsciiCharacter(element->Formatter, ' ');
54 : 8259 : SolidSyslogFormatter_PrintUsAsciiString(element->Formatter, name, SDELEMENT_NAME_MAX);
55 : 8259 : SolidSyslogFormatter_AsciiCharacter(element->Formatter, '=');
56 : 8259 : SolidSyslogFormatter_AsciiCharacter(element->Formatter, '"');
57 : 8259 : SolidSyslogSdValue_FromFormatter(&element->Value, element->Formatter);
58 : 8259 : element->ValueOpen = true;
59 : 8259 : sink = &element->Value;
60 : : }
61 : 8262 : return sink;
62 : : }
63 : :
64 : : /* A skipped param (NULL name, or a suppressed element) opens no framing and
65 : : * hands back a sink over the drop formatter, so the caller's value writes are
66 : : * absorbed without disturbing the element. ValueOpen stays false - there is no
67 : : * quote for the next SolidSyslogSdElement_Param / SolidSyslogSdElement_End to
68 : : * close. */
69 : 3 : static inline struct SolidSyslogSdValue* SdElement_SkipParam(struct SolidSyslogSdElement* element)
70 : : {
71 : 3 : SolidSyslogSdValue_FromFormatter(&element->Value, element->DropFormatter);
72 : 3 : return &element->Value;
73 : : }
74 : :
75 : : /* Closes an open param value: flushes any held UTF-8 tail (one U+FFFD) and
76 : : * emits the closing quote. Idempotent when no value is open, so both
77 : : * SolidSyslogSdElement_Param (before the next param) and
78 : : * SolidSyslogSdElement_End can call it unconditionally. */
79 : 15306 : static inline void SdElement_CloseOpenValue(struct SolidSyslogSdElement* element)
80 : : {
81 [ + + ]: 15306 : if (element->ValueOpen)
82 : : {
83 : 8257 : SolidSyslogSdValue_Close(&element->Value);
84 : 8257 : SolidSyslogFormatter_AsciiCharacter(element->Formatter, '"');
85 : 8257 : element->ValueOpen = false;
86 : : }
87 : 15306 : }
88 : :
89 : 7044 : void SolidSyslogSdElement_End(struct SolidSyslogSdElement* element)
90 : : {
91 : 7044 : SdElement_CloseOpenValue(element);
92 [ + + ]: 7044 : if (!element->Suppressed)
93 : : {
94 : 7043 : SolidSyslogFormatter_AsciiCharacter(element->Formatter, ']');
95 : : }
96 : 7044 : }
|