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 "SolidSyslogHeaderFieldPrivate.h"
6 : :
7 : : #include <stddef.h>
8 : :
9 : : #include "SolidSyslogFormatter.h"
10 : :
11 : : static inline size_t HeaderField_Consumed(const struct SolidSyslogHeaderField* field, size_t before);
12 : :
13 : 19908 : void SolidSyslogHeaderField_FromFormatter(
14 : : struct SolidSyslogHeaderField* field,
15 : : struct SolidSyslogFormatter* formatter,
16 : : size_t maxLength
17 : : )
18 : : {
19 : 19908 : field->Formatter = formatter;
20 : 19908 : field->Remaining = maxLength;
21 : 19908 : }
22 : :
23 : 429 : void SolidSyslogHeaderField_PrintUsAscii(struct SolidSyslogHeaderField* field, const char* source, size_t maxLength)
24 : : {
25 : 429 : size_t limit = (maxLength < field->Remaining) ? maxLength : field->Remaining;
26 : 429 : size_t before = SolidSyslogFormatter_Length(field->Formatter);
27 : :
28 : 429 : SolidSyslogFormatter_PrintUsAsciiString(field->Formatter, source, limit);
29 : 429 : field->Remaining -= HeaderField_Consumed(field, before);
30 : 429 : }
31 : :
32 : 4 : void SolidSyslogHeaderField_Uint32(struct SolidSyslogHeaderField* field, uint32_t value)
33 : : {
34 : : /* Unlike SolidSyslogHeaderField_PrintUsAscii, SolidSyslogHeaderField_Uint32
35 : : * cannot pre-clamp its output to the field budget (the formatter writes the
36 : : * whole number), so guard the budget
37 : : * directly: skip once the field is full, and clamp to zero rather than
38 : : * letting the size_t subtraction underflow when this number alone overruns
39 : : * the remainder. A header-field callback may mix any number of appends. */
40 [ + + ]: 4 : if (field->Remaining > 0U)
41 : : {
42 : 3 : size_t before = SolidSyslogFormatter_Length(field->Formatter);
43 : :
44 : 3 : SolidSyslogFormatter_Uint32(field->Formatter, value);
45 : 3 : size_t consumed = HeaderField_Consumed(field, before);
46 [ + + ]: 3 : field->Remaining = (consumed >= field->Remaining) ? 0U : (field->Remaining - consumed);
47 : : }
48 : 4 : }
49 : :
50 : 432 : static inline size_t HeaderField_Consumed(const struct SolidSyslogHeaderField* field, size_t before)
51 : : {
52 : 432 : return SolidSyslogFormatter_Length(field->Formatter) - before;
53 : : }
|