From b0acce3b858715a04fba154a23c6ea5fac083a74 Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 22 Jul 2025 19:29:21 +0200 Subject: Add option to test suite to auto-adjust expected output in definition Signed-off-by: Mel --- boot/common.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'boot/common.c') diff --git a/boot/common.c b/boot/common.c index 7416696..6a95bb6 100644 --- a/boot/common.c +++ b/boot/common.c @@ -254,6 +254,78 @@ string_format(struct String s, const ascii* format, ...) va_end(args); } +enum String_Concat_Arg +{ + ARG_END, + ARG_STRING, + ARG_ASCII, +}; + +#define MAX_STRING_CONCAT_LENGTH 2048 + +struct String +string_concatenate(enum String_Concat_Arg type1, ...) +{ + va_list args; + va_start(args, type1); + uint total_length = 0; + enum String_Concat_Arg type = type1; + while (type != ARG_END) { + switch (type) { + case ARG_STRING: { + struct String s = va_arg(args, struct String); + if (!string_is_empty(s)) total_length += s.length; + break; + } + case ARG_ASCII: { + ascii* str = va_arg(args, ascii*); + if (str) total_length += strlen(str); + break; + } + default: + break; + } + type = va_arg(args, enum String_Concat_Arg); + } + va_end(args); + + if (total_length == 0) return string_empty(); + + check(total_length < MAX_STRING_CONCAT_LENGTH - 1, "string concatenation too long"); + ascii buffer[MAX_STRING_CONCAT_LENGTH]; + + ascii* cursor = buffer; + va_start(args, type1); + type = type1; + while (type != ARG_END) { + switch (type) { + case ARG_STRING: { + struct String s = va_arg(args, struct String); + if (!string_is_empty(s)) { + memcpy(cursor, s.data, s.length); + cursor += s.length; + } + break; + } + case ARG_ASCII: { + ascii* str = va_arg(args, ascii*); + if (str) { + uint length = strlen(str); + memcpy(cursor, str, length); + cursor += length; + } + break; + } + default: + break; + } + type = va_arg(args, enum String_Concat_Arg); + } + va_end(args); + + return string_new(buffer, total_length); +} + struct String_View string_substring(struct String s, uint start, uint end) { -- cgit 1.4.1